From: "Serge E. Hallyn" <serge@hallyn.com>
To: Alban Crequy <alban.crequy@gmail.com>
Cc: alban@kinvolk.io, dongsu@kinvolk.io, iago@kinvolk.io,
linux-kernel@vger.kernel.org, linux-integrity@vger.kernel.org,
linux-security-module@vger.kernel.org,
linux-fsdevel@vger.kernel.org, miklos@szeredi.hu,
viro@zeniv.linux.org.uk, zohar@linux.vnet.ibm.com,
dmitry.kasatkin@gmail.com, james.l.morris@oracle.com,
serge@hallyn.com, seth.forshee@canonical.com, hch@infradead.org
Subject: Re: [RFC PATCH v3 2/2] ima: force re-appraisal on filesystems with FS_IMA_NO_CACHE
Date: Wed, 24 Jan 2018 11:52:34 -0600 [thread overview]
Message-ID: <20180124175234.GA29811@mail.hallyn.com> (raw)
In-Reply-To: <20180122162452.8756-3-alban@kinvolk.io>
Quoting Alban Crequy (alban.crequy@gmail.com):
> From: Alban Crequy <alban@kinvolk.io>
>
> This patch forces files to be re-measured, re-appraised and re-audited
> on file systems with the feature flag FS_IMA_NO_CACHE. In that way,
> cached integrity results won't be used.
>
> How to test this:
>
> The test I did was using a patched version of the memfs FUSE driver
> [1][2] and two very simple "hello-world" programs [4] (prog1 prints
> "hello world: 1" and prog2 prints "hello world: 2").
>
> I copy prog1 and prog2 in the fuse-memfs mount point, execute them and
> check the sha1 hash in
> "/sys/kernel/security/ima/ascii_runtime_measurements".
>
> My patch on the memfs FUSE driver added a backdoor command to serve
> prog1 when the kernel asks for prog2 or vice-versa. In this way, I can
> exec prog1 and get it to print "hello world: 2" without ever replacing
> the file via the VFS, so the kernel is not aware of the change.
>
> The test was done using the branch "alban/fuse-flag-ima-nocache-v3" [3].
>
> Step by step test procedure:
>
> 1. Mount the memfs FUSE using [2]:
> rm -f /tmp/memfs-switch* ; memfs -L DEBUG /mnt/memfs
>
> 2. Copy prog1 and prog2 using [4]
> cp prog1 /mnt/memfs/prog1
> cp prog2 /mnt/memfs/prog2
>
> 3. Lookup the files and let the FUSE driver to keep the handles open:
> dd if=/mnt/memfs/prog1 bs=1 | (read -n 1 x ; sleep 3600 ) &
> dd if=/mnt/memfs/prog2 bs=1 | (read -n 1 x ; sleep 3600 ) &
>
> 4. Check the 2 programs work correctly:
> $ /mnt/memfs/prog1
> hello world: 1
> $ /mnt/memfs/prog2
> hello world: 2
>
> 5. Check the measurements for prog1 and prog2:
> $ sudo cat /sys/kernel/security/ima/ascii_runtime_measurements \
> | grep /mnt/memfs/prog
> 10 [...] ima-ng sha1:ac14c9268cd2[...] /mnt/memfs/prog1
> 10 [...] ima-ng sha1:799cb5d1e06d[...] /mnt/memfs/prog2
>
> 6. Use the backdoor command in my patched memfs to redirect file
> operations on file handle 3 to file handle 2:
> rm -f /tmp/memfs-switch* ; touch /tmp/memfs-switch-3-2
>
> 7. Check how the FUSE driver serves different content for the files:
> $ /mnt/memfs/prog1
> hello world: 2
> $ /mnt/memfs/prog2
> hello world: 2
>
> 8. Check the measurements:
> sudo cat /sys/kernel/security/ima/ascii_runtime_measurements \
> | grep /mnt/memfs/prog
>
> Without the patch, there are no new measurements, despite the FUSE
> driver having served different executables.
>
> With the patch, I can see additional measurements for prog1 and prog2
> with the hashes reversed when the FUSE driver served the alternative
> content.
>
> [1] https://github.com/bbengfort/memfs
> [2] https://github.com/kinvolk/memfs/commits/alban/switch-files
> [3] https://github.com/kinvolk/linux/commits/alban/fuse-flag-ima-nocache-v3
> [4] https://github.com/kinvolk/fuse-userns-patches/commit/cf1f5750cab0
>
> Cc: linux-kernel@vger.kernel.org
> Cc: linux-integrity@vger.kernel.org
> Cc: linux-security-module@vger.kernel.org
> Cc: linux-fsdevel@vger.kernel.org
> Cc: Miklos Szeredi <miklos@szeredi.hu>
> Cc: Alexander Viro <viro@zeniv.linux.org.uk>
> Cc: Mimi Zohar <zohar@linux.vnet.ibm.com>
> Cc: Dmitry Kasatkin <dmitry.kasatkin@gmail.com>
> Cc: James Morris <james.l.morris@oracle.com>
> Cc: "Serge E. Hallyn" <serge@hallyn.com>
Acked-by: Serge Hallyn <serge@hallyn.com>
to both.
> Cc: Seth Forshee <seth.forshee@canonical.com>
> Cc: Christoph Hellwig <hch@infradead.org>
> Tested-by: Dongsu Park <dongsu@kinvolk.io>
> Signed-off-by: Alban Crequy <alban@kinvolk.io>
> ---
> security/integrity/ima/ima_main.c | 24 ++++++++++++++++++++++--
> 1 file changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c
> index 6d78cb26784d..8870a7bbe9b9 100644
> --- a/security/integrity/ima/ima_main.c
> +++ b/security/integrity/ima/ima_main.c
> @@ -24,6 +24,7 @@
> #include <linux/slab.h>
> #include <linux/xattr.h>
> #include <linux/ima.h>
> +#include <linux/fs.h>
>
> #include "ima.h"
>
> @@ -228,9 +229,28 @@ static int process_measurement(struct file *file, char *buf, loff_t size,
> IMA_APPRAISE_SUBMASK | IMA_APPRAISED_SUBMASK |
> IMA_ACTION_FLAGS);
>
> - if (test_and_clear_bit(IMA_CHANGE_XATTR, &iint->atomic_flags))
> - /* reset all flags if ima_inode_setxattr was called */
> + /*
> + * Reset the measure, appraise and audit cached flags either if:
> + * - ima_inode_setxattr was called, or
> + * - based on filesystem feature flag
> + * forcing the file to be re-evaluated.
> + */
> + if (test_and_clear_bit(IMA_CHANGE_XATTR, &iint->atomic_flags)) {
> iint->flags &= ~IMA_DONE_MASK;
> + } else if (inode->i_sb->s_type->fs_flags & FS_IMA_NO_CACHE) {
> + if (action & IMA_MEASURE) {
> + iint->measured_pcrs = 0;
> + iint->flags &=
> + ~(IMA_COLLECTED | IMA_MEASURE | IMA_MEASURED);
> + }
> + if (action & IMA_APPRAISE)
> + iint->flags &=
> + ~(IMA_COLLECTED | IMA_APPRAISE | IMA_APPRAISED |
> + IMA_APPRAISE_SUBMASK | IMA_APPRAISED_SUBMASK);
> + if (action & IMA_AUDIT)
> + iint->flags &=
> + ~(IMA_COLLECTED | IMA_AUDIT | IMA_AUDITED);
> + }
>
> /* Determine if already appraised/measured based on bitmask
> * (IMA_MEASURE, IMA_MEASURED, IMA_XXXX_APPRAISE, IMA_XXXX_APPRAISED,
> --
> 2.13.6
next prev parent reply other threads:[~2018-01-24 17:52 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-22 16:24 [RFC PATCH v3 0/2] ima,fuse: introduce new fs flag FS_IMA_NO_CACHE Alban Crequy
2018-01-22 16:24 ` [RFC PATCH v3 1/2] fuse: introduce new fs_type " Alban Crequy
2018-01-22 16:24 ` [RFC PATCH v3 2/2] ima: force re-appraisal on filesystems with FS_IMA_NO_CACHE Alban Crequy
2018-01-22 22:24 ` Seth Forshee
2018-01-24 17:53 ` Serge E. Hallyn
2018-01-24 17:52 ` Serge E. Hallyn [this message]
2018-01-25 11:56 ` Mimi Zohar
2018-01-29 16:33 ` Mimi Zohar
2018-01-29 17:40 ` Dongsu Park
2018-01-30 18:13 ` Dongsu Park
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180124175234.GA29811@mail.hallyn.com \
--to=serge@hallyn.com \
--cc=alban.crequy@gmail.com \
--cc=alban@kinvolk.io \
--cc=dmitry.kasatkin@gmail.com \
--cc=dongsu@kinvolk.io \
--cc=hch@infradead.org \
--cc=iago@kinvolk.io \
--cc=james.l.morris@oracle.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-integrity@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=miklos@szeredi.hu \
--cc=seth.forshee@canonical.com \
--cc=viro@zeniv.linux.org.uk \
--cc=zohar@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).