From patchwork Wed Oct 14 12:41:57 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Pawelczyk X-Patchwork-Id: 7394571 Return-Path: X-Original-To: patchwork-linux-fsdevel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 6CC949F1B9 for ; Wed, 14 Oct 2015 12:59:53 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 58332206F3 for ; Wed, 14 Oct 2015 12:59:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 85873206E2 for ; Wed, 14 Oct 2015 12:59:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753580AbbJNM7G (ORCPT ); Wed, 14 Oct 2015 08:59:06 -0400 Received: from mailout3.w1.samsung.com ([210.118.77.13]:9708 "EHLO mailout3.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753285AbbJNMmb (ORCPT ); Wed, 14 Oct 2015 08:42:31 -0400 Received: from eucpsbgm1.samsung.com (unknown [203.254.199.244]) by mailout3.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0NW7004RXNASWU00@mailout3.w1.samsung.com>; Wed, 14 Oct 2015 13:42:28 +0100 (BST) X-AuditID: cbfec7f4-f79c56d0000012ee-fe-561e4db367d2 Received: from eusync2.samsung.com ( [203.254.199.212]) by eucpsbgm1.samsung.com (EUCPMTA) with SMTP id 33.C2.04846.3BD4E165; Wed, 14 Oct 2015 13:42:28 +0100 (BST) Received: from amdc2143.DIGITAL.local ([106.120.53.33]) by eusync2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0NW700BB0NAK6E50@eusync2.samsung.com>; Wed, 14 Oct 2015 13:42:27 +0100 (BST) From: Lukasz Pawelczyk To: "David S. Miller" , "Eric W. Biederman" , "Serge E. Hallyn" , Al Viro , Alexey Dobriyan , Andrew Morton , Andy Lutomirski , Calvin Owens , Casey Schaufler , David Howells , Eric Dumazet , Eric Paris , Greg Kroah-Hartman , James Morris , Jann Horn , Jiri Slaby , Joe Perches , John Johansen , Jonathan Corbet , Kees Cook , Lukasz Pawelczyk , Mauro Carvalho Chehab , NeilBrown , Paul Moore , Serge Hallyn , Stephen Smalley , Tejun Heo , Tetsuo Handa , containers@lists.linuxfoundation.org, linux-doc@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-security-module@vger.kernel.org, selinux@tycho.nsa.gov Cc: Lukasz Pawelczyk Subject: [PATCH v4 03/11] lsm: add file opener's cred to a setprocattr arguments Date: Wed, 14 Oct 2015 14:41:57 +0200 Message-id: <1444826525-9758-4-git-send-email-l.pawelczyk@samsung.com> X-Mailer: git-send-email 2.4.3 In-reply-to: <1444826525-9758-1-git-send-email-l.pawelczyk@samsung.com> References: <1444826525-9758-1-git-send-email-l.pawelczyk@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAAzWRa0hTYRjHe3fenR1Xk9O0OmgZzCKyMiM/PESZ0sVDEEmWURI19aTmZnam Q/vSTK28L2eYm+a9iykzESkvGJppF51WGJVaeQtTTG2leG3T+vZ7/heeD3+KkJqwAxUaHsnx 4XKFjBTj1wst73dUHXXyc9MVCyAr9gjkGMtIMOZvhN7qGRJeLzwQwcCzGwhyTPEYxq7NYlis jhfB4Is+ESR+ayMgrshIwuLIdkjrPw6tQ4NCMHzpx9BqTiAhs2JcAG+SlfAmo0AABdeLMdTV v8TwriaHhPGUPhJMNeVCeDQUDfV5GgyfM7IwGOLHhNBUW0SAbqARQ3vsdwymjnYRzNxvRmCa bxF6OrN6TSrJGjSdmK16+FHA3oobE7FP9T0iNr8yiu2qPc0+LS8VsJWliSTbemcWsw25ZSJ2 dlqH2KI0nZCdGPxkaaZb8m2/z/isPyPeG8QpQtUcv9PjvDikuqsTRdzbHZ3y4C2hQTddkpAN xdDuTFLtJ3KZ1zIdvUYLiykpXYKY5MpevHzECpivf54T1hRJuzFTHfWE1bCntWImXvt+qU7Q W5gSQxy2sh3tw3QmFwitjOnNjLZwZEmX0IeZkpLaf++cmHaj2aJTlA3tzVQl7LPKUkukQduD tUiSj1aUojVcVGCEKiBYuctVJVeqosKDXQMvKSvR8szmJ6joxZ5GRFNItkoS8miDn1QoV6ti lI2IoQiZvWTOzclPKgmSx1zh+Evn+CgFp2pEjhSWrZPk1vw8IaWD5ZFcGMdFcPx/V0DZOGiQ YqutPz33waO70BSm71rM7a5WNwc5N2i8FDW+qStLB+5e1kXa+nyYvKgxKvlhta9hevXoVa9j +50nVnSYix1HXx46+2qbecyl3XBwS+ipJx7e2dHpJ935ReVt/vGB2Ylfw55US0/ApsG6H3q1 XeYFzXzFlN5fEZc3GaEtHmnK3i3DqhD5LheCV8n/Ak1zb9biAgAA Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP setprocattr hook for Smack's label_map attribute needs to know the capabilities of file opener. Add those credentials to the hook's arguments. While at it add documentation on get/setprocattr hooks. Signed-off-by: Lukasz Pawelczyk Acked-by: Serge Hallyn Acked-by: Casey Schaufler --- fs/proc/base.c | 2 +- include/linux/lsm_hooks.h | 18 ++++++++++++++++-- include/linux/security.h | 7 +++++-- security/apparmor/lsm.c | 5 +++-- security/security.c | 6 ++++-- security/selinux/hooks.c | 2 +- security/smack/smack_lsm.c | 4 ++-- 7 files changed, 32 insertions(+), 12 deletions(-) diff --git a/fs/proc/base.c b/fs/proc/base.c index 9ec88b8..2b38969 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -2447,7 +2447,7 @@ static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf, if (length < 0) goto out_free; - length = security_setprocattr(task, + length = security_setprocattr(task, file->f_cred, (char*)file->f_path.dentry->d_name.name, (void*)page, count); mutex_unlock(&task->signal->cred_guard_mutex); diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index 7049db0..4f16640 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -1220,6 +1220,20 @@ * Return 0 if @name is to be handled by seq, EOPNOTSUPP if getprocattr() * should be used. Other errors will be passed to user-space. * + * @getprocattr: + * Get a value of a proc security attribute in /proc/$PID/attr/. + * @p a task associated with the proc file. + * @name a name of the file in question. + * @value a pointer where to return the attribute's value. + * + * @setprocattr: + * Set a value of a proc security attribute in /proc/$PID/attr/. + * @p a task associated with the proc file. + * @f_cred credentials of a file's opener. + * @name a name of the file in question. + * @value a pointer where a value to set is kept. + * @size a number of bytes to read from the @value pointer. + * * @secid_to_secctx: * Convert secid to security context. If secdata is NULL the length of * the result will be returned in seclen, but no secdata will be returned. @@ -1540,8 +1554,8 @@ union security_list_options { int (*getprocattr_seq)(struct task_struct *p, const char *name, const struct seq_operations **ops); int (*getprocattr)(struct task_struct *p, char *name, char **value); - int (*setprocattr)(struct task_struct *p, char *name, void *value, - size_t size); + int (*setprocattr)(struct task_struct *p, const struct cred *f_cred, + char *name, void *value, size_t size); int (*ismaclabel)(const char *name); int (*secid_to_secctx)(u32 secid, char **secdata, u32 *seclen); int (*secctx_to_secid)(const char *secdata, u32 seclen, u32 *secid); diff --git a/include/linux/security.h b/include/linux/security.h index dddea2f..12bd011 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -348,7 +348,8 @@ void security_d_instantiate(struct dentry *dentry, struct inode *inode); int security_getprocattr_seq(struct task_struct *p, const char *name, const struct seq_operations **ops); int security_getprocattr(struct task_struct *p, char *name, char **value); -int security_setprocattr(struct task_struct *p, char *name, void *value, size_t size); +int security_setprocattr(struct task_struct *p, const struct cred *f_cred, + char *name, void *value, size_t size); int security_netlink_send(struct sock *sk, struct sk_buff *skb); int security_ismaclabel(const char *name); int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen); @@ -1071,7 +1072,9 @@ static inline int security_getprocattr(struct task_struct *p, char *name, char * return -EINVAL; } -static inline int security_setprocattr(struct task_struct *p, char *name, void *value, size_t size) +static inline int security_setprocattr(struct task_struct *p, + const struct cred *f_cred, + char *name, void *value, size_t size) { return -EINVAL; } diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index dec607c..1212927 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -518,8 +518,9 @@ static int apparmor_getprocattr(struct task_struct *task, char *name, return error; } -static int apparmor_setprocattr(struct task_struct *task, char *name, - void *value, size_t size) +static int apparmor_setprocattr(struct task_struct *task, + const struct cred *f_cred, + char *name, void *value, size_t size) { struct common_audit_data sa; struct apparmor_audit_data aad = {0,}; diff --git a/security/security.c b/security/security.c index da2bcd4..abfc207 100644 --- a/security/security.c +++ b/security/security.c @@ -1132,9 +1132,11 @@ int security_getprocattr(struct task_struct *p, char *name, char **value) return call_int_hook(getprocattr, -EINVAL, p, name, value); } -int security_setprocattr(struct task_struct *p, char *name, void *value, size_t size) +int security_setprocattr(struct task_struct *p, const struct cred *f_cred, + char *name, void *value, size_t size) { - return call_int_hook(setprocattr, -EINVAL, p, name, value, size); + return call_int_hook(setprocattr, -EINVAL, p, f_cred, + name, value, size); } int security_netlink_send(struct sock *sk, struct sk_buff *skb) diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index e4369d8..470eff8 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -5603,7 +5603,7 @@ invalid: return -EINVAL; } -static int selinux_setprocattr(struct task_struct *p, +static int selinux_setprocattr(struct task_struct *p, const struct cred *f_cred, char *name, void *value, size_t size) { struct task_security_struct *tsec; diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index c2d66ca..c439370 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -3549,8 +3549,8 @@ static int smack_getprocattr(struct task_struct *p, char *name, char **value) * * Returns the length of the smack label or an error code */ -static int smack_setprocattr(struct task_struct *p, char *name, - void *value, size_t size) +static int smack_setprocattr(struct task_struct *p, const struct cred *f_cred, + char *name, void *value, size_t size) { struct task_smack *tsp; struct cred *new;