From: Casey Schaufler <casey@schaufler-ca.com>
To: Igor Zhbanov <i.zhbanov@samsung.com>
Cc: linux-kernel@vger.kernel.org,
Kyungmin Park <kyungmin.park@samsung.com>,
Casey Schaufler <casey@schaufler-ca.com>,
LSM <linux-security-module@vger.kernel.org>
Subject: Re: [PATCH] Fix common_audit_data type for smack_inode_unlink() and smack_inode_rmdir()
Date: Wed, 20 Mar 2013 08:00:31 -0700 [thread overview]
Message-ID: <5149CF0F.1000204@schaufler-ca.com> (raw)
In-Reply-To: <1363002636-14158-1-git-send-email-i.zhbanov@samsung.com>
On 3/11/2013 4:50 AM, Igor Zhbanov wrote:
> This patch fixes kernel Oops because of wrong common_audit_data type
> in smack_inode_unlink() and smack_inode_rmdir().
>
> When SMACK security module is enabled and SMACK logging is on (/smack/logging
> is not zero) and you try to delete the file which
> 1) you cannot delete due to SMACK rules and logging of failures is on
> or
> 2) you can delete and logging of success is on,
>
> you will see following:
>
> Unable to handle kernel NULL pointer dereference at virtual address 000002d7
>
> [<...>] (strlen+0x0/0x28)
> [<...>] (audit_log_untrustedstring+0x14/0x28)
> [<...>] (common_lsm_audit+0x108/0x6ac)
> [<...>] (smack_log+0xc4/0xe4)
> [<...>] (smk_curacc+0x80/0x10c)
> [<...>] (smack_inode_unlink+0x74/0x80)
> [<...>] (security_inode_unlink+0x2c/0x30)
> [<...>] (vfs_unlink+0x7c/0x100)
> [<...>] (do_unlinkat+0x144/0x16c)
>
> The function smack_inode_unlink() (and smack_inode_rmdir()) need
> to log two structures of different types. First of all it does:
>
> smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_DENTRY);
> smk_ad_setfield_u_fs_path_dentry(&ad, dentry);
>
> This will set common audit data type to LSM_AUDIT_DATA_DENTRY
> and store dentry for auditing (by function smk_curacc(), which in turn calls
> dump_common_audit_data(), which is actually uses provided data and logs it).
>
> /*
> * You need write access to the thing you're unlinking
> */
> rc = smk_curacc(smk_of_inode(ip), MAY_WRITE, &ad);
> if (rc == 0) {
> /*
> * You also need write access to the containing directory
> */
>
> Then this function wants to log anoter data:
>
> smk_ad_setfield_u_fs_path_dentry(&ad, NULL);
> smk_ad_setfield_u_fs_inode(&ad, dir);
>
> The function sets inode field, but don't change common_audit_data type.
>
> rc = smk_curacc(smk_of_inode(dir), MAY_WRITE, &ad);
> }
>
> So the dump_common_audit() function incorrectly interprets inode structure
> as dentry, and Oops will happen.
>
> This patch reinitializes common_audit_data structures with correct type.
> Also I removed unneeded
> smk_ad_setfield_u_fs_path_dentry(&ad, NULL);
> initialization, because both dentry and inode pointers are stored
> in the same union.
>
> Signed-off-by: Igor Zhbanov <i.zhbanov@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Applied to git://git.gitorious.org/smack-next/kernel.git#stage-for-3.10
> ---
> security/smack/smack_lsm.c | 4 ++--
> 1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
> index fa64740..d52c780 100644
> --- a/security/smack/smack_lsm.c
> +++ b/security/smack/smack_lsm.c
> @@ -654,7 +654,7 @@ static int smack_inode_unlink(struct inode *dir, struct dentry *dentry)
> /*
> * You also need write access to the containing directory
> */
> - smk_ad_setfield_u_fs_path_dentry(&ad, NULL);
> + smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_INODE);
> smk_ad_setfield_u_fs_inode(&ad, dir);
> rc = smk_curacc(smk_of_inode(dir), MAY_WRITE, &ad);
> }
> @@ -685,7 +685,7 @@ static int smack_inode_rmdir(struct inode *dir, struct dentry *dentry)
> /*
> * You also need write access to the containing directory
> */
> - smk_ad_setfield_u_fs_path_dentry(&ad, NULL);
> + smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_INODE);
> smk_ad_setfield_u_fs_inode(&ad, dir);
> rc = smk_curacc(smk_of_inode(dir), MAY_WRITE, &ad);
> }
prev parent reply other threads:[~2013-03-20 15:00 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-11 11:50 [PATCH] Fix common_audit_data type for smack_inode_unlink() and smack_inode_rmdir() Igor Zhbanov
2013-03-11 17:20 ` Casey Schaufler
2013-03-12 9:30 ` Igor Zhbanov
2013-03-20 15:00 ` Casey Schaufler [this message]
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=5149CF0F.1000204@schaufler-ca.com \
--to=casey@schaufler-ca.com \
--cc=i.zhbanov@samsung.com \
--cc=kyungmin.park@samsung.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.