From: Casey Schaufler <casey@schaufler-ca.com>
To: casey.schaufler@intel.com, jmorris@namei.org,
linux-security-module@vger.kernel.org, selinux@vger.kernel.org
Cc: casey@schaufler-ca.com, keescook@chromium.org,
john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp,
paul@paul-moore.com, sds@tycho.nsa.gov
Subject: [PATCH v11 16/25] LSM: Use lsmcontext in security_dentry_init_security
Date: Wed, 13 Nov 2019 09:57:12 -0800 [thread overview]
Message-ID: <20191113175721.2317-17-casey@schaufler-ca.com> (raw)
In-Reply-To: <20191113175721.2317-1-casey@schaufler-ca.com>
Change the security_dentry_init_security() interface to
fill an lsmcontext structure instead of a void * data area
and a length. The lone caller of this interface is NFS4,
which may make copies of the data using its own mechanisms.
A rework of the nfs4 code to use the lsmcontext properly
is a significant project, so the coward's way out is taken,
and the lsmcontext data from security_dentry_init_security()
is copied, then released directly.
This interface does not use the "display". There is currently
not case where that is useful or reasonable.
Reviewed-by: Kees Cook <keescook@chromium.org>
Reviewed-by: John Johansen <john.johansen@canonical.com>
Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
---
fs/nfs/nfs4proc.c | 26 ++++++++++++++++----------
include/linux/security.h | 7 +++----
security/security.c | 29 +++++++++++++++++++++++++----
3 files changed, 44 insertions(+), 18 deletions(-)
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 74e9f4b7cc07..2f76741ee528 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -113,6 +113,7 @@ static inline struct nfs4_label *
nfs4_label_init_security(struct inode *dir, struct dentry *dentry,
struct iattr *sattr, struct nfs4_label *label)
{
+ struct lsmcontext context;
int err;
if (label == NULL)
@@ -122,21 +123,26 @@ nfs4_label_init_security(struct inode *dir, struct dentry *dentry,
return NULL;
err = security_dentry_init_security(dentry, sattr->ia_mode,
- &dentry->d_name, (void **)&label->label, &label->len);
- if (err == 0)
- return label;
+ &dentry->d_name, &context);
+
+ if (err)
+ return NULL;
+
+ label->label = kmemdup(context.context, context.len, GFP_KERNEL);
+ if (label->label == NULL)
+ label = NULL;
+ else
+ label->len = context.len;
+
+ security_release_secctx(&context);
+
+ return label;
- return NULL;
}
static inline void
nfs4_label_release_security(struct nfs4_label *label)
{
- struct lsmcontext scaff; /* scaffolding */
-
- if (label) {
- lsmcontext_init(&scaff, label->label, label->len, 0);
- security_release_secctx(&scaff);
- }
+ kfree(label->label);
}
static inline u32 *nfs4_bitmask(struct nfs_server *server, struct nfs4_label *label)
{
diff --git a/include/linux/security.h b/include/linux/security.h
index e47cef3d62f0..3e333104720d 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -396,8 +396,8 @@ int security_add_mnt_opt(const char *option, const char *val,
int len, void **mnt_opts);
int security_move_mount(const struct path *from_path, const struct path *to_path);
int security_dentry_init_security(struct dentry *dentry, int mode,
- const struct qstr *name, void **ctx,
- u32 *ctxlen);
+ const struct qstr *name,
+ struct lsmcontext *ctx);
int security_dentry_create_files_as(struct dentry *dentry, int mode,
struct qstr *name,
const struct cred *old,
@@ -788,8 +788,7 @@ static inline void security_inode_free(struct inode *inode)
static inline int security_dentry_init_security(struct dentry *dentry,
int mode,
const struct qstr *name,
- void **ctx,
- u32 *ctxlen)
+ struct lsmcontext *ctx)
{
return -EOPNOTSUPP;
}
diff --git a/security/security.c b/security/security.c
index 618d4f90936b..6f43dafe1249 100644
--- a/security/security.c
+++ b/security/security.c
@@ -1011,12 +1011,33 @@ void security_inode_free(struct inode *inode)
inode_free_by_rcu);
}
+/*
+ * security_dentry_init_security - initial context for a dentry
+ * @dentry: directory entry
+ * @mode: access mode
+ * @name: path name
+ * @context: resulting security context
+ *
+ * Use at most one security module to get the initial
+ * security context. Do not use the "display".
+ *
+ * Returns -EOPNOTSUPP if not supplied by any module or the module result.
+ */
int security_dentry_init_security(struct dentry *dentry, int mode,
- const struct qstr *name, void **ctx,
- u32 *ctxlen)
+ const struct qstr *name,
+ struct lsmcontext *cp)
{
- return call_int_hook(dentry_init_security, -EOPNOTSUPP, dentry, mode,
- name, ctx, ctxlen);
+ struct security_hook_list *hp;
+
+ hlist_for_each_entry(hp, &security_hook_heads.dentry_init_security,
+ list) {
+ cp->slot = hp->lsmid->slot;
+ return hp->hook.dentry_init_security(dentry, mode, name,
+ (void **)&cp->context,
+ &cp->len);
+ }
+
+ return -EOPNOTSUPP;
}
EXPORT_SYMBOL(security_dentry_init_security);
--
2.20.1
next prev parent reply other threads:[~2019-11-13 17:58 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20191113175721.2317-1-casey.ref@schaufler-ca.com>
2019-11-13 17:56 ` [PATCH v11 00/25] LSM: Module stacking for AppArmor Casey Schaufler
2019-11-13 17:56 ` [PATCH v11 01/25] LSM: Infrastructure management of the sock security Casey Schaufler
2019-11-13 17:56 ` [PATCH v11 02/25] LSM: Create and manage the lsmblob data structure Casey Schaufler
2019-11-21 5:36 ` James Morris
2019-11-13 17:56 ` [PATCH v11 03/25] LSM: Use lsmblob in security_audit_rule_match Casey Schaufler
2019-11-21 5:38 ` James Morris
2019-11-13 17:57 ` [PATCH v11 04/25] LSM: Use lsmblob in security_kernel_act_as Casey Schaufler
2019-11-13 17:57 ` [PATCH v11 05/25] net: Prepare UDS for security module stacking Casey Schaufler
2019-11-13 17:57 ` [PATCH v11 06/25] LSM: Use lsmblob in security_secctx_to_secid Casey Schaufler
2019-11-13 17:57 ` [PATCH v11 07/25] LSM: Use lsmblob in security_secid_to_secctx Casey Schaufler
2019-11-13 17:57 ` [PATCH v11 08/25] LSM: Use lsmblob in security_ipc_getsecid Casey Schaufler
2019-11-13 17:57 ` [PATCH v11 09/25] LSM: Use lsmblob in security_task_getsecid Casey Schaufler
2019-11-13 17:57 ` [PATCH v11 10/25] LSM: Use lsmblob in security_inode_getsecid Casey Schaufler
2019-11-13 17:57 ` [PATCH v11 11/25] LSM: Use lsmblob in security_cred_getsecid Casey Schaufler
2019-11-13 17:57 ` [PATCH v11 12/25] IMA: Change internal interfaces to use lsmblobs Casey Schaufler
2019-11-13 17:57 ` [PATCH v11 13/25] LSM: Specify which LSM to display Casey Schaufler
2019-11-13 17:57 ` [PATCH v11 14/25] LSM: Ensure the correct LSM context releaser Casey Schaufler
2019-11-13 17:57 ` [PATCH v11 15/25] LSM: Use lsmcontext in security_secid_to_secctx Casey Schaufler
2019-11-13 17:57 ` Casey Schaufler [this message]
2019-11-13 17:57 ` [PATCH v11 17/25] LSM: Use lsmcontext in security_inode_getsecctx Casey Schaufler
2019-11-21 5:50 ` James Morris
2019-11-13 17:57 ` [PATCH v11 18/25] LSM: security_secid_to_secctx in netlink netfilter Casey Schaufler
2019-11-13 18:19 [PATCH v11 00/25] LSM: Module stacking for AppArmor Casey Schaufler
2019-11-13 18:19 ` [PATCH v11 16/25] LSM: Use lsmcontext in security_dentry_init_security Casey Schaufler
2019-11-21 19:00 ` John Johansen
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=20191113175721.2317-17-casey@schaufler-ca.com \
--to=casey@schaufler-ca.com \
--cc=casey.schaufler@intel.com \
--cc=jmorris@namei.org \
--cc=john.johansen@canonical.com \
--cc=keescook@chromium.org \
--cc=linux-security-module@vger.kernel.org \
--cc=paul@paul-moore.com \
--cc=penguin-kernel@i-love.sakura.ne.jp \
--cc=sds@tycho.nsa.gov \
--cc=selinux@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 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).