From patchwork Thu May 13 20:07:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256415 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 53E5FC43460 for ; Thu, 13 May 2021 20:09:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 359826143E for ; Thu, 13 May 2021 20:09:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232412AbhEMUKf (ORCPT ); Thu, 13 May 2021 16:10:35 -0400 Received: from sonic307-15.consmr.mail.ne1.yahoo.com ([66.163.190.38]:36276 "EHLO sonic307-15.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232466AbhEMUKe (ORCPT ); Thu, 13 May 2021 16:10:34 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620936564; bh=19RMxIyybk30yCLApkULBDjSG+dMsAX2/yF1SvlrLZw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=pqPNNmF5ihbEXY4iXxXbykb0kXFlXzq3FAvi/SC94vlCDfZjBq3nrAkZgoKmbZJsAqpCIGPH+l4crrCU+CN0A8PKHPjg5PEaY/McPanJnicso60sIbfaHZge0k2exywd52h21RVkVZACTqQYf0cMT/CALigBc/YXui+xa0T1rZRL5bH821VBkmxlIuAK+niFitM3kXoL2nz3C53o6Z8ukGgeLSxanSNmizQZ2v5n+KJmtJanDgRKnoY5FfwMi2F2hV+DRUHpamlpuIamC8nEnVO/lW+plgcG1STyqmD4rhiiIUHjwZwgAX5Lusdfzd71Occmsqtwn2fG50LTPAMXew== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620936564; bh=UFjuz4ZNehj9kK679P482A4MRadU4FuFRjUxirfnzXY=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=JjL13k3LpvZ3P7CZFjLXDxFNnn6uD28y0othUi14v5pJr3hyMz9dvz1ojfnH5+hxp1538tuj/+Kwq28Kt2lRGFj2JtWiqG5khKWfB2gek/bKaalt71yri4dpAQHjgitNV3czF4Zo6zb+dQYi+fJ0aS2DJrfoixArUTXwvt/OvRXhDypHR1hFWZSzeH9nSIMc3Tm0TDDA326/mOEdOBm2TyZs6PE7kgOy8SIM0NNdMSUeHcszM18uvSO86CcnwNlaGBTQNZi8qCQ2A2MIewQJnUI4+44bYBarg8Xhn6At+xD42CBYb5sYNf9xjMDxwIisGFFj3WxHjZC8U9KP4uOdWg== X-YMail-OSG: EcMigI8VM1nQ3U_s3L4tZy1E_3CJkWBwQgBUqsfuKlO43KPM2ncCbwRgCw0sAm9 uh2HBaW2RtRKkYehi88ignc2.x9l4rYNlk7Zzh3bXr8.HmgOEqq38bdE2hMuzzLTkUQge.Rx__R7 xHzccdVmefyWSIj8nNJ7Blu8x5ZnoqMxd.4Ivd7YLrBymboPkwuTmTul4VhNp55uDz4ixiVMqvw2 AMi8_rwAPOXoOHQhTbm6T2TfO0BafUVjV3HkVCaIMp_w42w2upmMH_.PhoEkmtqk_qorIojUljG9 HdQDiYuhXd.ThR56WuTcSK7Dg6hINd3Qkei6oyVn5AJqR0mJ2CVCR5lLJnIpkbLXvSdA96z9rGUg 2NPZNdWmTc51Y.X2hBuc3HdyMJmHMBNkNwzTwMx4fDZ0_HOVx.fwwTDRCYZyHR2Xs5pDliwOb7Mg _5zo1Q94XC_Wn6tI6WjwhTp1VQzLSGUFMU6GejzWQc0HaK7iHG1WwAg6zL9vY8PHmlw0XdJ_5t5D 2B.ZmNTbwEKd2PxcDDVJSNTcMM02X8ECho6lx4lty7x6VhoKQmg41.LNwB3j4M6KiCb8btnW9SH6 g9RJFGWwGecIPiOAFl4kQW6dwBZsJmELk1xxPnKi1HWHtjTEO0Xl_qEoRLaWAvjKSmMJNBYrajer omTfnLlmUAVdCoVnp6TULBE2G8jepncFWwX9y59aBS..ATuOiCZkr3nNvCMFjky8.Ox0_Mbx4zzq 6e0mKStwhkKDgWjj2WAD8PjSqgwnCDzcg56e3XJkTTcjXoB59yygZdioJEWhl47j.p7_HG18WNlc 1pRVyTa7d4cDSvgn6RHXl9bQWGAlLJnDPGDvAeDRnGDoGmo40IPj_mzgB3Dbf6uC412aXK1rfIk2 aSLxoNOaGPFTPyrUZgGWFokc1OQNVEDDUFtc27LjypVbhRl9JKWQ.hVNB68Lv_d14C6acO_JYlSF FxFZW5GFxEBqca9nw2i0CHHvEYrNIBrWAi0itc6i2BUA5vb1kL.aJMhlfMCj_HdOWmbkxk5pupyb pD_3Fm1uA6MudCwSTcb1AnPZ3SlQKbbDJBeQzR1_tU90JnwjZUhc1zMWE1FnFHefwZnKuAukkBRg vvAHs06APaCBzW8LcWLbGpihHiITtKSNsk0GK9ZZHCSiJqY27Gadgf4e71YOAa.B6wloI6EXnn3o Ch2tV5k7ISGpybc40DfMs8x3JKLAQGYVMIFfDHl9HuRevR5wOpAd1hTiZjxzFI0QT5nGfUaBwcZn PUxxhtMBag8EAVjvc1h.4jJt7N24dRs4xsNvnZKKTHAQSDJJV63mm0Vf8sK3LLEmuFNOxb9i5L0j q5Ngqu8IJWebsjSetEaAARIxedPHI2rNLCSZF3_jY7I6maCJ.9XD7GGQIq.T9ODqMPvVzol2ySw5 D0hWfjL2UN0BgHl_u8ZvmMW8nqmz6wBOkLjRX5MKwqxBU3arjHj9JPfo5McldDpBsSpKY9EUPcfG TfC2NJGevK.EaMe_ynGDiINktZyWieIXNaemD1CNHHDCjPypZF9gq6zjmaVogOe4dUhIOLtboA2Q eB4JNFgzXvuIaPZbl2ckZsxAYQSQmGOfN1hwGvuTT2FimAB6N3wyFt0lnEc_u_pMKEntAJIk7sQm IEhtFuZLL4pZfQlpWfL2AXtj.nUhx_DbTKGzcQ4VTYxB68VHEcohPV7aYRr7R_9n4VQNWGPBTS5D GVEkfLq0.dMInUO0mDnLxTh7vSxpG3macFHt_lC2qh0Jtffhp7ZjsV9hQ7I1uM2RngEW7BlDnDZi YM9ClWXuPfbrhekEO72iwljoXGMJpjAE50gsmQwO.4ybR2TqpdUCbzyTwCmVzUb.r1SBGtNr5uq3 a22h7w69TMzdPpsAX2MezrWHF4GQHS15hIgGujQD3aCzZXgohEGf68ZT0QQGXaGWQ62HXUKtvbt7 9lBRrvXfsjbfAPGRg9y41icvjkk3xeViCvtaTBd5qA2._R0ckurVZ_wkWZX7mHxpo.GeP58mzA48 QK3AYXsjYmIIKOfX07qaZpEnNnDKlNI1cqVjIwVgg0EULQJlXQjh5NfFVllpu7rkv9FCPqrEcfCH CPIfwYC4A7XDZAmMqpWpdfHclI46t5._wBJK21F8x55LWe9vaDinB1_TJ66rZZAzTaIED_6s2sFb _UdxhMqvoDpowI1ldzrfs2KZQt3D6TFYamCaKQlYNx38WAiU5ZMw9NO1HwAIgIop6O6yxCCFnOqs Dk6k2hIyrKpcqSoKTi8wQBXNF4D0TaC60wRPFCN5RtOmB3kmVle8WW7qBE2juLtnD_m1eUnSVjXo mkVF4Fe6CYV0C1pomxzvxrFS7VAIRPFAPyvZHRZEQmYNotafCMfy5eIllCCOQA9b1EcSv7KkqV9P PN5fBP_P7MSQmxxyULuz8QGP24pnBQNk5ibatsYq4o0vJ06GCawllQVc1QsXriTmYZeI0G5rSLgS NMsdRQzd1beumCfp53OCxxfSo33vaqHVN1V7CrLW.mIcEuwSJ0Zq_u5jw0aFcvTfMSFIz.PRf8Cg bFHu5a6LZ1QAXavIULHcySFhnltJCq9d3GaKVkHArsLmpFh3i4UtZ3bCZT7L_KIpUaM44AJNSKoJ GJpVCxmP.0_sCvZhKadgcIrPYEy3fYg4t4YlCemnE3nXJ7ymGVVaFRj7qwz2Tj6p_IMmGUG.361C xRHjwrlWMJlWsfu_ROe0eLZgYMxrHg42meP58jHyJE9MCybRibTykiktfIC_EDQabXQy8jBG2Ie3 puJ6Db7nN0ja2oDnJzh2rZo9xHWPr97TtXo9YXwUHHLxUo9OSPPdHriMR4wJSelcpAXwIIV3flDe 7AQIVaG.AwLkPQ.WhJGuX3MkENUixCV6Rm4u67iq2ch9FsTEYluBvjjSgSubl23l4wNtU8RsQQz5 RB4ZSBZxxXOUurH2.M3dZZ8QQ8PMaf_4dlonktfv6eF3FTDysvIGH22qYA_m27z0sB8cdWZ7YoWM 8xnK0iwrBRXG5IeZ1CkLPApDSUA5oazFMOawAuhw7kkXq0u4btDEgxb7D0U6i4DDvIQDFUbBWcAh 6yV5fFMTbydvQbqlHLuXei1PUjd2zWYba8X.heLWcMVc3BYypDt6ueYm0rfOJNw4Zw5E3ginnUvg WsNP.TR.bf3F3aKV7x3OgDc3HteFLbyg7J1RuxVSl9QEBhYg- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic307.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:09:24 +0000 Received: by kubenode566.mail-prod1.omega.bf1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID b5f129de9f83bca0bee28926fe3fc1fa; Thu, 13 May 2021 20:09:21 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org Subject: [PATCH v26 01/25] LSM: Infrastructure management of the sock security Date: Thu, 13 May 2021 13:07:43 -0700 Message-Id: <20210513200807.15910-2-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Move management of the sock->sk_security blob out of the individual security modules and into the security infrastructure. Instead of allocating the blobs from within the modules the modules tell the infrastructure how much space is required, and the space is allocated there. Acked-by: Paul Moore Reviewed-by: Kees Cook Reviewed-by: John Johansen Acked-by: Stephen Smalley Signed-off-by: Casey Schaufler --- include/linux/lsm_hooks.h | 1 + security/apparmor/include/net.h | 6 ++- security/apparmor/lsm.c | 38 ++++----------- security/security.c | 36 +++++++++++++- security/selinux/hooks.c | 78 +++++++++++++++---------------- security/selinux/include/objsec.h | 5 ++ security/selinux/netlabel.c | 23 ++++----- security/smack/smack.h | 5 ++ security/smack/smack_lsm.c | 66 ++++++++++++-------------- security/smack/smack_netfilter.c | 8 ++-- 10 files changed, 145 insertions(+), 121 deletions(-) diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index 5c4c5c0602cb..afd3b16875b0 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -1588,6 +1588,7 @@ struct lsm_blob_sizes { int lbs_cred; int lbs_file; int lbs_inode; + int lbs_sock; int lbs_superblock; int lbs_ipc; int lbs_msg_msg; diff --git a/security/apparmor/include/net.h b/security/apparmor/include/net.h index aadb4b29fb66..fac8999ba7a3 100644 --- a/security/apparmor/include/net.h +++ b/security/apparmor/include/net.h @@ -51,7 +51,11 @@ struct aa_sk_ctx { struct aa_label *peer; }; -#define SK_CTX(X) ((X)->sk_security) +static inline struct aa_sk_ctx *aa_sock(const struct sock *sk) +{ + return sk->sk_security + apparmor_blob_sizes.lbs_sock; +} + #define SOCK_ctx(X) SOCK_INODE(X)->i_security #define DEFINE_AUDIT_NET(NAME, OP, SK, F, T, P) \ struct lsm_network_audit NAME ## _net = { .sk = (SK), \ diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index f72406fe1bf2..4113516fb62e 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -775,33 +775,15 @@ static int apparmor_task_kill(struct task_struct *target, struct kernel_siginfo return error; } -/** - * apparmor_sk_alloc_security - allocate and attach the sk_security field - */ -static int apparmor_sk_alloc_security(struct sock *sk, int family, gfp_t flags) -{ - struct aa_sk_ctx *ctx; - - ctx = kzalloc(sizeof(*ctx), flags); - if (!ctx) - return -ENOMEM; - - SK_CTX(sk) = ctx; - - return 0; -} - /** * apparmor_sk_free_security - free the sk_security field */ static void apparmor_sk_free_security(struct sock *sk) { - struct aa_sk_ctx *ctx = SK_CTX(sk); + struct aa_sk_ctx *ctx = aa_sock(sk); - SK_CTX(sk) = NULL; aa_put_label(ctx->label); aa_put_label(ctx->peer); - kfree(ctx); } /** @@ -810,8 +792,8 @@ static void apparmor_sk_free_security(struct sock *sk) static void apparmor_sk_clone_security(const struct sock *sk, struct sock *newsk) { - struct aa_sk_ctx *ctx = SK_CTX(sk); - struct aa_sk_ctx *new = SK_CTX(newsk); + struct aa_sk_ctx *ctx = aa_sock(sk); + struct aa_sk_ctx *new = aa_sock(newsk); if (new->label) aa_put_label(new->label); @@ -867,7 +849,7 @@ static int apparmor_socket_post_create(struct socket *sock, int family, label = aa_get_current_label(); if (sock->sk) { - struct aa_sk_ctx *ctx = SK_CTX(sock->sk); + struct aa_sk_ctx *ctx = aa_sock(sock->sk); aa_put_label(ctx->label); ctx->label = aa_get_label(label); @@ -1052,7 +1034,7 @@ static int apparmor_socket_shutdown(struct socket *sock, int how) */ static int apparmor_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) { - struct aa_sk_ctx *ctx = SK_CTX(sk); + struct aa_sk_ctx *ctx = aa_sock(sk); if (!skb->secmark) return 0; @@ -1065,7 +1047,7 @@ static int apparmor_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) static struct aa_label *sk_peer_label(struct sock *sk) { - struct aa_sk_ctx *ctx = SK_CTX(sk); + struct aa_sk_ctx *ctx = aa_sock(sk); if (ctx->peer) return ctx->peer; @@ -1149,7 +1131,7 @@ static int apparmor_socket_getpeersec_dgram(struct socket *sock, */ static void apparmor_sock_graft(struct sock *sk, struct socket *parent) { - struct aa_sk_ctx *ctx = SK_CTX(sk); + struct aa_sk_ctx *ctx = aa_sock(sk); if (!ctx->label) ctx->label = aa_get_current_label(); @@ -1159,7 +1141,7 @@ static void apparmor_sock_graft(struct sock *sk, struct socket *parent) static int apparmor_inet_conn_request(const struct sock *sk, struct sk_buff *skb, struct request_sock *req) { - struct aa_sk_ctx *ctx = SK_CTX(sk); + struct aa_sk_ctx *ctx = aa_sock(sk); if (!skb->secmark) return 0; @@ -1176,6 +1158,7 @@ struct lsm_blob_sizes apparmor_blob_sizes __lsm_ro_after_init = { .lbs_cred = sizeof(struct aa_task_ctx *), .lbs_file = sizeof(struct aa_file_ctx), .lbs_task = sizeof(struct aa_task_ctx), + .lbs_sock = sizeof(struct aa_sk_ctx), }; static struct security_hook_list apparmor_hooks[] __lsm_ro_after_init = { @@ -1212,7 +1195,6 @@ static struct security_hook_list apparmor_hooks[] __lsm_ro_after_init = { LSM_HOOK_INIT(getprocattr, apparmor_getprocattr), LSM_HOOK_INIT(setprocattr, apparmor_setprocattr), - LSM_HOOK_INIT(sk_alloc_security, apparmor_sk_alloc_security), LSM_HOOK_INIT(sk_free_security, apparmor_sk_free_security), LSM_HOOK_INIT(sk_clone_security, apparmor_sk_clone_security), @@ -1764,7 +1746,7 @@ static unsigned int apparmor_ip_postroute(void *priv, if (sk == NULL) return NF_ACCEPT; - ctx = SK_CTX(sk); + ctx = aa_sock(sk); if (!apparmor_secmark_check(ctx->label, OP_SENDMSG, AA_MAY_SEND, skb->secmark, sk)) return NF_ACCEPT; diff --git a/security/security.c b/security/security.c index b38155b2de83..e12a7c463468 100644 --- a/security/security.c +++ b/security/security.c @@ -29,6 +29,7 @@ #include #include #include +#include #define MAX_LSM_EVM_XATTR 2 @@ -203,6 +204,7 @@ static void __init lsm_set_blob_sizes(struct lsm_blob_sizes *needed) lsm_set_blob_size(&needed->lbs_inode, &blob_sizes.lbs_inode); lsm_set_blob_size(&needed->lbs_ipc, &blob_sizes.lbs_ipc); lsm_set_blob_size(&needed->lbs_msg_msg, &blob_sizes.lbs_msg_msg); + lsm_set_blob_size(&needed->lbs_sock, &blob_sizes.lbs_sock); lsm_set_blob_size(&needed->lbs_superblock, &blob_sizes.lbs_superblock); lsm_set_blob_size(&needed->lbs_task, &blob_sizes.lbs_task); } @@ -339,6 +341,7 @@ static void __init ordered_lsm_init(void) init_debug("inode blob size = %d\n", blob_sizes.lbs_inode); init_debug("ipc blob size = %d\n", blob_sizes.lbs_ipc); init_debug("msg_msg blob size = %d\n", blob_sizes.lbs_msg_msg); + init_debug("sock blob size = %d\n", blob_sizes.lbs_sock); init_debug("superblock blob size = %d\n", blob_sizes.lbs_superblock); init_debug("task blob size = %d\n", blob_sizes.lbs_task); @@ -658,6 +661,28 @@ static int lsm_msg_msg_alloc(struct msg_msg *mp) return 0; } +/** + * lsm_sock_alloc - allocate a composite sock blob + * @sock: the sock that needs a blob + * @priority: allocation mode + * + * Allocate the sock blob for all the modules + * + * Returns 0, or -ENOMEM if memory can't be allocated. + */ +static int lsm_sock_alloc(struct sock *sock, gfp_t priority) +{ + if (blob_sizes.lbs_sock == 0) { + sock->sk_security = NULL; + return 0; + } + + sock->sk_security = kzalloc(blob_sizes.lbs_sock, priority); + if (sock->sk_security == NULL) + return -ENOMEM; + return 0; +} + /** * lsm_early_task - during initialization allocate a composite task blob * @task: the task that needs a blob @@ -2258,12 +2283,21 @@ EXPORT_SYMBOL(security_socket_getpeersec_dgram); int security_sk_alloc(struct sock *sk, int family, gfp_t priority) { - return call_int_hook(sk_alloc_security, 0, sk, family, priority); + int rc = lsm_sock_alloc(sk, priority); + + if (unlikely(rc)) + return rc; + rc = call_int_hook(sk_alloc_security, 0, sk, family, priority); + if (unlikely(rc)) + security_sk_free(sk); + return rc; } void security_sk_free(struct sock *sk) { call_void_hook(sk_free_security, sk); + kfree(sk->sk_security); + sk->sk_security = NULL; } void security_sk_clone(const struct sock *sk, struct sock *newsk) diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index eaea837d89d1..84ddcec6322e 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -4652,7 +4652,7 @@ static int socket_sockcreate_sid(const struct task_security_struct *tsec, static int sock_has_perm(struct sock *sk, u32 perms) { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); struct common_audit_data ad; struct lsm_network_audit net = {0,}; @@ -4709,7 +4709,7 @@ static int selinux_socket_post_create(struct socket *sock, int family, isec->initialized = LABEL_INITIALIZED; if (sock->sk) { - sksec = sock->sk->sk_security; + sksec = selinux_sock(sock->sk); sksec->sclass = sclass; sksec->sid = sid; /* Allows detection of the first association on this socket */ @@ -4725,8 +4725,8 @@ static int selinux_socket_post_create(struct socket *sock, int family, static int selinux_socket_socketpair(struct socket *socka, struct socket *sockb) { - struct sk_security_struct *sksec_a = socka->sk->sk_security; - struct sk_security_struct *sksec_b = sockb->sk->sk_security; + struct sk_security_struct *sksec_a = selinux_sock(socka->sk); + struct sk_security_struct *sksec_b = selinux_sock(sockb->sk); sksec_a->peer_sid = sksec_b->sid; sksec_b->peer_sid = sksec_a->sid; @@ -4741,7 +4741,7 @@ static int selinux_socket_socketpair(struct socket *socka, static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen) { struct sock *sk = sock->sk; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); u16 family; int err; @@ -4876,7 +4876,7 @@ static int selinux_socket_connect_helper(struct socket *sock, struct sockaddr *address, int addrlen) { struct sock *sk = sock->sk; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); int err; err = sock_has_perm(sk, SOCKET__CONNECT); @@ -5055,9 +5055,9 @@ static int selinux_socket_unix_stream_connect(struct sock *sock, struct sock *other, struct sock *newsk) { - struct sk_security_struct *sksec_sock = sock->sk_security; - struct sk_security_struct *sksec_other = other->sk_security; - struct sk_security_struct *sksec_new = newsk->sk_security; + struct sk_security_struct *sksec_sock = selinux_sock(sock); + struct sk_security_struct *sksec_other = selinux_sock(other); + struct sk_security_struct *sksec_new = selinux_sock(newsk); struct common_audit_data ad; struct lsm_network_audit net = {0,}; int err; @@ -5089,8 +5089,8 @@ static int selinux_socket_unix_stream_connect(struct sock *sock, static int selinux_socket_unix_may_send(struct socket *sock, struct socket *other) { - struct sk_security_struct *ssec = sock->sk->sk_security; - struct sk_security_struct *osec = other->sk->sk_security; + struct sk_security_struct *ssec = selinux_sock(sock->sk); + struct sk_security_struct *osec = selinux_sock(other->sk); struct common_audit_data ad; struct lsm_network_audit net = {0,}; @@ -5132,7 +5132,7 @@ static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb, u16 family) { int err = 0; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); u32 sk_sid = sksec->sid; struct common_audit_data ad; struct lsm_network_audit net = {0,}; @@ -5165,7 +5165,7 @@ static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb, static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) { int err; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); u16 family = sk->sk_family; u32 sk_sid = sksec->sid; struct common_audit_data ad; @@ -5233,13 +5233,15 @@ static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) return err; } -static int selinux_socket_getpeersec_stream(struct socket *sock, char __user *optval, - int __user *optlen, unsigned len) +static int selinux_socket_getpeersec_stream(struct socket *sock, + char __user *optval, + int __user *optlen, + unsigned int len) { int err = 0; char *scontext; u32 scontext_len; - struct sk_security_struct *sksec = sock->sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sock->sk); u32 peer_sid = SECSID_NULL; if (sksec->sclass == SECCLASS_UNIX_STREAM_SOCKET || @@ -5299,34 +5301,27 @@ static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff * static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority) { - struct sk_security_struct *sksec; - - sksec = kzalloc(sizeof(*sksec), priority); - if (!sksec) - return -ENOMEM; + struct sk_security_struct *sksec = selinux_sock(sk); sksec->peer_sid = SECINITSID_UNLABELED; sksec->sid = SECINITSID_UNLABELED; sksec->sclass = SECCLASS_SOCKET; selinux_netlbl_sk_security_reset(sksec); - sk->sk_security = sksec; return 0; } static void selinux_sk_free_security(struct sock *sk) { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); - sk->sk_security = NULL; selinux_netlbl_sk_security_free(sksec); - kfree(sksec); } static void selinux_sk_clone_security(const struct sock *sk, struct sock *newsk) { - struct sk_security_struct *sksec = sk->sk_security; - struct sk_security_struct *newsksec = newsk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); + struct sk_security_struct *newsksec = selinux_sock(newsk); newsksec->sid = sksec->sid; newsksec->peer_sid = sksec->peer_sid; @@ -5340,7 +5335,7 @@ static void selinux_sk_getsecid(struct sock *sk, u32 *secid) if (!sk) *secid = SECINITSID_ANY_SOCKET; else { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); *secid = sksec->sid; } @@ -5350,7 +5345,7 @@ static void selinux_sock_graft(struct sock *sk, struct socket *parent) { struct inode_security_struct *isec = inode_security_novalidate(SOCK_INODE(parent)); - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); if (sk->sk_family == PF_INET || sk->sk_family == PF_INET6 || sk->sk_family == PF_UNIX) @@ -5365,7 +5360,7 @@ static void selinux_sock_graft(struct sock *sk, struct socket *parent) static int selinux_sctp_assoc_request(struct sctp_endpoint *ep, struct sk_buff *skb) { - struct sk_security_struct *sksec = ep->base.sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(ep->base.sk); struct common_audit_data ad; struct lsm_network_audit net = {0,}; u8 peerlbl_active; @@ -5516,8 +5511,8 @@ static int selinux_sctp_bind_connect(struct sock *sk, int optname, static void selinux_sctp_sk_clone(struct sctp_endpoint *ep, struct sock *sk, struct sock *newsk) { - struct sk_security_struct *sksec = sk->sk_security; - struct sk_security_struct *newsksec = newsk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); + struct sk_security_struct *newsksec = selinux_sock(newsk); /* If policy does not support SECCLASS_SCTP_SOCKET then call * the non-sctp clone version. @@ -5534,7 +5529,7 @@ static void selinux_sctp_sk_clone(struct sctp_endpoint *ep, struct sock *sk, static int selinux_inet_conn_request(const struct sock *sk, struct sk_buff *skb, struct request_sock *req) { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); int err; u16 family = req->rsk_ops->family; u32 connsid; @@ -5555,7 +5550,7 @@ static int selinux_inet_conn_request(const struct sock *sk, struct sk_buff *skb, static void selinux_inet_csk_clone(struct sock *newsk, const struct request_sock *req) { - struct sk_security_struct *newsksec = newsk->sk_security; + struct sk_security_struct *newsksec = selinux_sock(newsk); newsksec->sid = req->secid; newsksec->peer_sid = req->peer_secid; @@ -5572,7 +5567,7 @@ static void selinux_inet_csk_clone(struct sock *newsk, static void selinux_inet_conn_established(struct sock *sk, struct sk_buff *skb) { u16 family = sk->sk_family; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); /* handle mapped IPv4 packets arriving via IPv6 sockets */ if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP)) @@ -5656,7 +5651,7 @@ static int selinux_tun_dev_attach_queue(void *security) static int selinux_tun_dev_attach(struct sock *sk, void *security) { struct tun_security_struct *tunsec = security; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); /* we don't currently perform any NetLabel based labeling here and it * isn't clear that we would want to do so anyway; while we could apply @@ -5800,7 +5795,7 @@ static unsigned int selinux_ip_output(struct sk_buff *skb, return NF_ACCEPT; /* standard practice, label using the parent socket */ - sksec = sk->sk_security; + sksec = selinux_sock(sk); sid = sksec->sid; } else sid = SECINITSID_KERNEL; @@ -5839,7 +5834,7 @@ static unsigned int selinux_ip_postroute_compat(struct sk_buff *skb, if (sk == NULL) return NF_ACCEPT; - sksec = sk->sk_security; + sksec = selinux_sock(sk); ad.type = LSM_AUDIT_DATA_NET; ad.u.net = &net; @@ -5931,7 +5926,7 @@ static unsigned int selinux_ip_postroute(struct sk_buff *skb, u32 skb_sid; struct sk_security_struct *sksec; - sksec = sk->sk_security; + sksec = selinux_sock(sk); if (selinux_skb_peerlbl_sid(skb, family, &skb_sid)) return NF_DROP; /* At this point, if the returned skb peerlbl is SECSID_NULL @@ -5960,7 +5955,7 @@ static unsigned int selinux_ip_postroute(struct sk_buff *skb, } else { /* Locally generated packet, fetch the security label from the * associated socket. */ - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); peer_sid = sksec->sid; secmark_perm = PACKET__SEND; } @@ -6025,7 +6020,7 @@ static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb) unsigned int data_len = skb->len; unsigned char *data = skb->data; struct nlmsghdr *nlh; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); u16 sclass = sksec->sclass; u32 perm; @@ -7051,6 +7046,7 @@ struct lsm_blob_sizes selinux_blob_sizes __lsm_ro_after_init = { .lbs_inode = sizeof(struct inode_security_struct), .lbs_ipc = sizeof(struct ipc_security_struct), .lbs_msg_msg = sizeof(struct msg_security_struct), + .lbs_sock = sizeof(struct sk_security_struct), .lbs_superblock = sizeof(struct superblock_security_struct), }; diff --git a/security/selinux/include/objsec.h b/security/selinux/include/objsec.h index 2953132408bf..007d1ae7ee27 100644 --- a/security/selinux/include/objsec.h +++ b/security/selinux/include/objsec.h @@ -194,4 +194,9 @@ static inline struct superblock_security_struct *selinux_superblock( return superblock->s_security + selinux_blob_sizes.lbs_superblock; } +static inline struct sk_security_struct *selinux_sock(const struct sock *sock) +{ + return sock->sk_security + selinux_blob_sizes.lbs_sock; +} + #endif /* _SELINUX_OBJSEC_H_ */ diff --git a/security/selinux/netlabel.c b/security/selinux/netlabel.c index abaab7683840..6a94b31b5472 100644 --- a/security/selinux/netlabel.c +++ b/security/selinux/netlabel.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -67,7 +68,7 @@ static int selinux_netlbl_sidlookup_cached(struct sk_buff *skb, static struct netlbl_lsm_secattr *selinux_netlbl_sock_genattr(struct sock *sk) { int rc; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); struct netlbl_lsm_secattr *secattr; if (sksec->nlbl_secattr != NULL) @@ -100,7 +101,7 @@ static struct netlbl_lsm_secattr *selinux_netlbl_sock_getattr( const struct sock *sk, u32 sid) { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); struct netlbl_lsm_secattr *secattr = sksec->nlbl_secattr; if (secattr == NULL) @@ -235,7 +236,7 @@ int selinux_netlbl_skbuff_setsid(struct sk_buff *skb, * being labeled by it's parent socket, if it is just exit */ sk = skb_to_full_sk(skb); if (sk != NULL) { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); if (sksec->nlbl_state != NLBL_REQSKB) return 0; @@ -273,7 +274,7 @@ int selinux_netlbl_sctp_assoc_request(struct sctp_endpoint *ep, { int rc; struct netlbl_lsm_secattr secattr; - struct sk_security_struct *sksec = ep->base.sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(ep->base.sk); struct sockaddr_in addr4; struct sockaddr_in6 addr6; @@ -352,7 +353,7 @@ int selinux_netlbl_inet_conn_request(struct request_sock *req, u16 family) */ void selinux_netlbl_inet_csk_clone(struct sock *sk, u16 family) { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); if (family == PF_INET) sksec->nlbl_state = NLBL_LABELED; @@ -370,8 +371,8 @@ void selinux_netlbl_inet_csk_clone(struct sock *sk, u16 family) */ void selinux_netlbl_sctp_sk_clone(struct sock *sk, struct sock *newsk) { - struct sk_security_struct *sksec = sk->sk_security; - struct sk_security_struct *newsksec = newsk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); + struct sk_security_struct *newsksec = selinux_sock(newsk); newsksec->nlbl_state = sksec->nlbl_state; } @@ -389,7 +390,7 @@ void selinux_netlbl_sctp_sk_clone(struct sock *sk, struct sock *newsk) int selinux_netlbl_socket_post_create(struct sock *sk, u16 family) { int rc; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); struct netlbl_lsm_secattr *secattr; if (family != PF_INET && family != PF_INET6) @@ -504,7 +505,7 @@ int selinux_netlbl_socket_setsockopt(struct socket *sock, { int rc = 0; struct sock *sk = sock->sk; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); struct netlbl_lsm_secattr secattr; if (selinux_netlbl_option(level, optname) && @@ -542,7 +543,7 @@ static int selinux_netlbl_socket_connect_helper(struct sock *sk, struct sockaddr *addr) { int rc; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); struct netlbl_lsm_secattr *secattr; /* connected sockets are allowed to disconnect when the address family @@ -581,7 +582,7 @@ static int selinux_netlbl_socket_connect_helper(struct sock *sk, int selinux_netlbl_socket_connect_locked(struct sock *sk, struct sockaddr *addr) { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); if (sksec->nlbl_state != NLBL_REQSKB && sksec->nlbl_state != NLBL_CONNLABELED) diff --git a/security/smack/smack.h b/security/smack/smack.h index c3cfbdf4944a..b5bdf947792f 100644 --- a/security/smack/smack.h +++ b/security/smack/smack.h @@ -363,6 +363,11 @@ static inline struct superblock_smack *smack_superblock( return superblock->s_security + smack_blob_sizes.lbs_superblock; } +static inline struct socket_smack *smack_sock(const struct sock *sock) +{ + return sock->sk_security + smack_blob_sizes.lbs_sock; +} + /* * Is the directory transmuting? */ diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 223a6da0e6dc..1ee0bf1493f6 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -1429,7 +1429,7 @@ static int smack_inode_getsecurity(struct user_namespace *mnt_userns, if (sock == NULL || sock->sk == NULL) return -EOPNOTSUPP; - ssp = sock->sk->sk_security; + ssp = smack_sock(sock->sk); if (strcmp(name, XATTR_SMACK_IPIN) == 0) isp = ssp->smk_in; @@ -1811,7 +1811,7 @@ static int smack_file_receive(struct file *file) if (inode->i_sb->s_magic == SOCKFS_MAGIC) { sock = SOCKET_I(inode); - ssp = sock->sk->sk_security; + ssp = smack_sock(sock->sk); tsp = smack_cred(current_cred()); /* * If the receiving process can't write to the @@ -2232,11 +2232,7 @@ static void smack_task_to_inode(struct task_struct *p, struct inode *inode) static int smack_sk_alloc_security(struct sock *sk, int family, gfp_t gfp_flags) { struct smack_known *skp = smk_of_current(); - struct socket_smack *ssp; - - ssp = kzalloc(sizeof(struct socket_smack), gfp_flags); - if (ssp == NULL) - return -ENOMEM; + struct socket_smack *ssp = smack_sock(sk); /* * Sockets created by kernel threads receive web label. @@ -2250,11 +2246,10 @@ static int smack_sk_alloc_security(struct sock *sk, int family, gfp_t gfp_flags) } ssp->smk_packet = NULL; - sk->sk_security = ssp; - return 0; } +#ifdef SMACK_IPV6_PORT_LABELING /** * smack_sk_free_security - Free a socket blob * @sk: the socket @@ -2263,7 +2258,6 @@ static int smack_sk_alloc_security(struct sock *sk, int family, gfp_t gfp_flags) */ static void smack_sk_free_security(struct sock *sk) { -#ifdef SMACK_IPV6_PORT_LABELING struct smk_port_label *spp; if (sk->sk_family == PF_INET6) { @@ -2276,9 +2270,8 @@ static void smack_sk_free_security(struct sock *sk) } rcu_read_unlock(); } -#endif - kfree(sk->sk_security); } +#endif /** * smack_ipv4host_label - check host based restrictions @@ -2391,7 +2384,7 @@ static struct smack_known *smack_ipv6host_label(struct sockaddr_in6 *sip) */ static int smack_netlbl_add(struct sock *sk) { - struct socket_smack *ssp = sk->sk_security; + struct socket_smack *ssp = smack_sock(sk); struct smack_known *skp = ssp->smk_out; int rc; @@ -2423,7 +2416,7 @@ static int smack_netlbl_add(struct sock *sk) */ static void smack_netlbl_delete(struct sock *sk) { - struct socket_smack *ssp = sk->sk_security; + struct socket_smack *ssp = smack_sock(sk); /* * Take the label off the socket if one is set. @@ -2455,7 +2448,7 @@ static int smk_ipv4_check(struct sock *sk, struct sockaddr_in *sap) struct smack_known *skp; int rc = 0; struct smack_known *hkp; - struct socket_smack *ssp = sk->sk_security; + struct socket_smack *ssp = smack_sock(sk); struct smk_audit_info ad; rcu_read_lock(); @@ -2528,7 +2521,7 @@ static void smk_ipv6_port_label(struct socket *sock, struct sockaddr *address) { struct sock *sk = sock->sk; struct sockaddr_in6 *addr6; - struct socket_smack *ssp = sock->sk->sk_security; + struct socket_smack *ssp = smack_sock(sock->sk); struct smk_port_label *spp; unsigned short port = 0; @@ -2617,7 +2610,7 @@ static int smk_ipv6_port_check(struct sock *sk, struct sockaddr_in6 *address, int act) { struct smk_port_label *spp; - struct socket_smack *ssp = sk->sk_security; + struct socket_smack *ssp = smack_sock(sk); struct smack_known *skp = NULL; unsigned short port; struct smack_known *object; @@ -2710,7 +2703,7 @@ static int smack_inode_setsecurity(struct inode *inode, const char *name, if (sock == NULL || sock->sk == NULL) return -EOPNOTSUPP; - ssp = sock->sk->sk_security; + ssp = smack_sock(sock->sk); if (strcmp(name, XATTR_SMACK_IPIN) == 0) ssp->smk_in = skp; @@ -2758,7 +2751,7 @@ static int smack_socket_post_create(struct socket *sock, int family, * Sockets created by kernel threads receive web label. */ if (unlikely(current->flags & PF_KTHREAD)) { - ssp = sock->sk->sk_security; + ssp = smack_sock(sock->sk); ssp->smk_in = &smack_known_web; ssp->smk_out = &smack_known_web; } @@ -2783,8 +2776,8 @@ static int smack_socket_post_create(struct socket *sock, int family, static int smack_socket_socketpair(struct socket *socka, struct socket *sockb) { - struct socket_smack *asp = socka->sk->sk_security; - struct socket_smack *bsp = sockb->sk->sk_security; + struct socket_smack *asp = smack_sock(socka->sk); + struct socket_smack *bsp = smack_sock(sockb->sk); asp->smk_packet = bsp->smk_out; bsp->smk_packet = asp->smk_out; @@ -2847,7 +2840,7 @@ static int smack_socket_connect(struct socket *sock, struct sockaddr *sap, if (__is_defined(SMACK_IPV6_SECMARK_LABELING)) rsp = smack_ipv6host_label(sip); if (rsp != NULL) { - struct socket_smack *ssp = sock->sk->sk_security; + struct socket_smack *ssp = smack_sock(sock->sk); rc = smk_ipv6_check(ssp->smk_out, rsp, sip, SMK_CONNECTING); @@ -3575,9 +3568,9 @@ static int smack_unix_stream_connect(struct sock *sock, { struct smack_known *skp; struct smack_known *okp; - struct socket_smack *ssp = sock->sk_security; - struct socket_smack *osp = other->sk_security; - struct socket_smack *nsp = newsk->sk_security; + struct socket_smack *ssp = smack_sock(sock); + struct socket_smack *osp = smack_sock(other); + struct socket_smack *nsp = smack_sock(newsk); struct smk_audit_info ad; int rc = 0; #ifdef CONFIG_AUDIT @@ -3623,8 +3616,8 @@ static int smack_unix_stream_connect(struct sock *sock, */ static int smack_unix_may_send(struct socket *sock, struct socket *other) { - struct socket_smack *ssp = sock->sk->sk_security; - struct socket_smack *osp = other->sk->sk_security; + struct socket_smack *ssp = smack_sock(sock->sk); + struct socket_smack *osp = smack_sock(other->sk); struct smk_audit_info ad; int rc; @@ -3661,7 +3654,7 @@ static int smack_socket_sendmsg(struct socket *sock, struct msghdr *msg, struct sockaddr_in6 *sap = (struct sockaddr_in6 *) msg->msg_name; #endif #ifdef SMACK_IPV6_SECMARK_LABELING - struct socket_smack *ssp = sock->sk->sk_security; + struct socket_smack *ssp = smack_sock(sock->sk); struct smack_known *rsp; #endif int rc = 0; @@ -3873,7 +3866,7 @@ static struct smack_known *smack_from_netlbl(const struct sock *sk, u16 family, netlbl_secattr_init(&secattr); if (sk) - ssp = sk->sk_security; + ssp = smack_sock(sk); if (netlbl_skbuff_getattr(skb, family, &secattr) == 0) { skp = smack_from_secattr(&secattr, ssp); @@ -3895,7 +3888,7 @@ static struct smack_known *smack_from_netlbl(const struct sock *sk, u16 family, */ static int smack_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) { - struct socket_smack *ssp = sk->sk_security; + struct socket_smack *ssp = smack_sock(sk); struct smack_known *skp = NULL; int rc = 0; struct smk_audit_info ad; @@ -3999,7 +3992,7 @@ static int smack_socket_getpeersec_stream(struct socket *sock, int slen = 1; int rc = 0; - ssp = sock->sk->sk_security; + ssp = smack_sock(sock->sk); if (ssp->smk_packet != NULL) { rcp = ssp->smk_packet->smk_known; slen = strlen(rcp) + 1; @@ -4048,7 +4041,7 @@ static int smack_socket_getpeersec_dgram(struct socket *sock, switch (family) { case PF_UNIX: - ssp = sock->sk->sk_security; + ssp = smack_sock(sock->sk); s = ssp->smk_out->smk_secid; break; case PF_INET: @@ -4097,7 +4090,7 @@ static void smack_sock_graft(struct sock *sk, struct socket *parent) (sk->sk_family != PF_INET && sk->sk_family != PF_INET6)) return; - ssp = sk->sk_security; + ssp = smack_sock(sk); ssp->smk_in = skp; ssp->smk_out = skp; /* cssp->smk_packet is already set in smack_inet_csk_clone() */ @@ -4117,7 +4110,7 @@ static int smack_inet_conn_request(const struct sock *sk, struct sk_buff *skb, { u16 family = sk->sk_family; struct smack_known *skp; - struct socket_smack *ssp = sk->sk_security; + struct socket_smack *ssp = smack_sock(sk); struct sockaddr_in addr; struct iphdr *hdr; struct smack_known *hskp; @@ -4203,7 +4196,7 @@ static int smack_inet_conn_request(const struct sock *sk, struct sk_buff *skb, static void smack_inet_csk_clone(struct sock *sk, const struct request_sock *req) { - struct socket_smack *ssp = sk->sk_security; + struct socket_smack *ssp = smack_sock(sk); struct smack_known *skp; if (req->peer_secid != 0) { @@ -4697,6 +4690,7 @@ struct lsm_blob_sizes smack_blob_sizes __lsm_ro_after_init = { .lbs_inode = sizeof(struct inode_smack), .lbs_ipc = sizeof(struct smack_known *), .lbs_msg_msg = sizeof(struct smack_known *), + .lbs_sock = sizeof(struct socket_smack), .lbs_superblock = sizeof(struct superblock_smack), }; @@ -4807,7 +4801,9 @@ static struct security_hook_list smack_hooks[] __lsm_ro_after_init = { LSM_HOOK_INIT(socket_getpeersec_stream, smack_socket_getpeersec_stream), LSM_HOOK_INIT(socket_getpeersec_dgram, smack_socket_getpeersec_dgram), LSM_HOOK_INIT(sk_alloc_security, smack_sk_alloc_security), +#ifdef SMACK_IPV6_PORT_LABELING LSM_HOOK_INIT(sk_free_security, smack_sk_free_security), +#endif LSM_HOOK_INIT(sock_graft, smack_sock_graft), LSM_HOOK_INIT(inet_conn_request, smack_inet_conn_request), LSM_HOOK_INIT(inet_csk_clone, smack_inet_csk_clone), diff --git a/security/smack/smack_netfilter.c b/security/smack/smack_netfilter.c index fc7399b45373..635e2339579e 100644 --- a/security/smack/smack_netfilter.c +++ b/security/smack/smack_netfilter.c @@ -28,8 +28,8 @@ static unsigned int smack_ipv6_output(void *priv, struct socket_smack *ssp; struct smack_known *skp; - if (sk && sk->sk_security) { - ssp = sk->sk_security; + if (sk && smack_sock(sk)) { + ssp = smack_sock(sk); skp = ssp->smk_out; skb->secmark = skp->smk_secid; } @@ -46,8 +46,8 @@ static unsigned int smack_ipv4_output(void *priv, struct socket_smack *ssp; struct smack_known *skp; - if (sk && sk->sk_security) { - ssp = sk->sk_security; + if (sk && smack_sock(sk)) { + ssp = smack_sock(sk); skp = ssp->smk_out; skb->secmark = skp->smk_secid; } From patchwork Thu May 13 20:07:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256417 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 95BB2C433ED for ; Thu, 13 May 2021 20:10:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 692B96143C for ; Thu, 13 May 2021 20:10:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232475AbhEMULp (ORCPT ); Thu, 13 May 2021 16:11:45 -0400 Received: from sonic307-15.consmr.mail.ne1.yahoo.com ([66.163.190.38]:40894 "EHLO sonic307-15.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232470AbhEMULo (ORCPT ); Thu, 13 May 2021 16:11:44 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620936634; bh=xolFaMNvm2tIVaWXyA4u0U8669PmDlk7bKd00ve9fDk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=lignkVTJ8dGuQ1J6IRkLpO3kqd+oO7RdZw/yRng5qvpNZqllWyWhxNVkXorE4NSDgoWpuT88tkiQe64uqVD5E/+3qp1ki/Q+MD9B9KSdvQ4ycrDLg+Njo3tTIpZXPkPnnyh/Fjrg5l4dkGQSAHYb1+fCK1umKJKIkBNeDwyn5ILIzeIlBLwX7tKSrthBDYiAHsyJcSonh/+s2WlCCjww5Z0sH4htVg7L28FwK7zS9b0nl/eAnUwIRExy82KtLLOsRwjiz2PJHPH94WFq/45F0ijji8uygVwHTTQg9GMFE5O+cK/sREwx5r4Ywo+JPOCaY4taiMPMDEmakQ19zsR9cQ== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620936634; bh=wR1AnYBj4kPNDmOafcapwAV+hVImkL2ZewE36sYPFp0=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=XtDAAX8xMxJp+bsooiRO0/ythcfNogjAmrOxtRmNRPUCO2nL/pOahJVcnh1xGcPZVGzxiZ/hgaRQs7Ky7wLYj/BTZl19uFJg70F5S3OWHmNVRLkvnf5AtKjOryTLLZtflYz4h+HzRteq6qJrOklqW3R3TTyX9Ut5PqOMPC57FtyNLnISW/hNO8/k8XYGmUEvdjy3oDvJXIoTOKWkdhmeVy6E1mG2Eb/ess0zmsgq252njgrYDbHcxWW9Xb8w/c7saA9FtCsgEmngMmEB1+wgM+SXBM5nqfgp34DkCOC7hLqvMzgaW7E1TlJazvVxYwcwmlSOHP+7FnlrRqmi1vRDKw== X-YMail-OSG: Xy6XT_QVM1n4cVljfSEzVoRj6qUoGo2VupzMWVuccc.w9KDDaaiP46zGuYVqa9Z TyKg2x9VdB8LB8xG6TALsRwBGCgJozFbaHTClM020EuHp77G7IWLivmsHzeyuGDQlgtspjqZjP7C gtGx4jfrdCjwHkJDbUbzTZOSWnyxP_OLpG5AUM71Lk95.7PkU.dHzg1AhGVKFqyc2IK7m914m8Hk nWP9m.NUchOW7A8m92s_Gj_izqY4O6yoRGW7str4umBJXvxWt_vlbAdoHX7eYepHzOzha3ZOEdY9 _4c7KBQ_07eKevL3OHfff2JDRND_nyXpRAmnTw2UNSSGS6_jKzdeZom5nDIVK9xpe083zK0CKN3R 3m9oclH9aJj0Gd9VZozNLnD68X_xRIxDtXsOvr67SE1gBCb1eQEw9.5chp2ONWfwU4grr7Vu_X4q G3Yy.6iCkSyyhzXPdiuSGmSueUU.ye1vnSSQqD_ibSVsRHMtksmTazxAusB4VQd9e1cwrJ0DZroc ROluSk6CHMr.fjD2Yj2WASTyrHs8Gh7.vCpTUxqD.qp3GgdFIqAiQeDwDni0jEHOK7qK7GYatHfr VlQBIe.clJEzhLqgtXCHWrO.wCRAx1eb5EFrCEAZtcZrxPoy0W946LiASuKeiRFEtFfddVSYVjxk 9Top8uMsaEMSaL2jQSEBvAmtJHn7Uhz0MaT6TCwNeOTE339OMtRjoiqdCkvTGEHdAbBGunTMwh5. y43hDyT8.zvRp3yDkj5ERSwkqbTlSK9uLYweUg_S6Scqit.nR.mB2RfYJZt59y.5afRKkobJXGuo lZaNpHimROET0dfz61Bb0jPPXc7fequdTXd0CXBYHx4sv1j_5lA01gcl3YYaQgW5tfBxOXy_eKCM xOqv_cYSJwbwduXPlw7Eno5AvPEO26MV115F3YFjGgyqtNtNqIct71.mYeKqIv78UAjK0yKeMAjZ UJgGlOjk4XFe9HFzPV6Krszu6fJg_nLITlbBWs6aqJibZjm3HT.spTE0JM5P9lYY3KprCgRpEYiY 7uvYtS.brv..Cgnty0CoZ7gz4pU8f09.1qyEsW2PskePFB4KnQGDIhRqdxVbPqaFmAiwYjo3tYzZ 5P9a3iMwoSB58OB0f9fFn1oWufiUSasftSd5e6pfLvFmbVK9NSMfGlIPU1MEdUIxgYInr05YeiP1 1WFJPS4_V1cCR48IeJ7.EJECOBNcZlTWL5FiQ73YxUS4fYBvvgVubKt7c9wR5acvCBNehkrOq0_I i_Zg3DphS0YlrGGCSfvPC8GHh_e0ILHJKBT_9.hDXBSBwzj16bpGezEi1I7RY_zRR.hV3oiSpnBD sjKBQMFpTvEaVFj_PpzILCrFKHoOcOWEWon.0x1I1n2S0q1XGoqXRLcuAk8UJoZe.OZ43333uAZ2 B7RiJ3TPXQaD6n0fRj5YekjuRtbZCE0zsZ4LwwjxN1g1pDruiASMc7.kWfNQ4Fdo6qS2SfR_Uf74 pkT4qC4IA7lASbskrEP8uEN3Q8vDYCmrd48Wl2JW9mVqggI4JVdGpx3kPKUyHkg7RHocMR4yo7hp Eireyy3RCvZBBl3EJP5fqjpOWVfroXL1ZTOfj9SPou00s9Xag7PwBngsUDLh4Kv2OeqhAIPIY65i eIXaMrCYM0tkisjFeYsK3HIkV8T.ojWRq6_FE2CU_ToP4Rj.RcsIUkCf0y4UT7XId2MfIGJZuxVh tCvdD73V7v9NS4nCx63vd2uoPe6xMVuPkr9Qg4IOPQLaSsD73nFaIN.fj4rcslkZh4IzHNQIpuJA LiDO93Hmn30oOTeMcWlZZ.O6WbZpgWe7j9t9hYmKadFItfChZAKfgpCoe6VaF9udwHeHd9L7l1z4 ecJE1snne4_NkEhkCkMWWHmU7BvQZ9nlu7_kMkdDVVHv_pRffxvvvIzlviPPgQjuxTUL63TB4_Sn zhU_cOUyh2SbUIPKnBPJJwTE7r.SLp.254tDoaVUGuY37jKHNk.1KbgVP1asHTLagwsdrxU6UrAy bL18QKLpWQrPsFskyb_gvJKkZFyiKtn_p5OQbw2UVaeK1xOZ3akAjHI9dbBlpG1Qlv_rb6lBsP7o r3sou34DLessM50vA7MkBsEevFNMp3twJCu_bLUAXhZ_Y5f5GFOHtve0Msq6xG6rfH19gyqfoSIJ E4h03gTHUhKwwC4wU.DXdhoYCgPyBO6iz9l.e0o4m5sUKuqTJ9JHSIbJZn_bLYT7MP.q7fIHJHHe TryIHKvyS2B_PUnpoiqFtGIc6Ew3YMl.BH_wIujghqeYtSoFOxy71QWH2j8PyNAIKwM0pxN9yNo. NKJP_Z2Ni6zYzVklIc1f_aJ80t1FYST5r.3Cj4aavFZjXaQ3Gx1L0OCJ.PpFB7kh482j9Iu0Vo.C cd_Hf9DRISBzzJB3AEhliaYAIymFSO_6E4NAM7Vxe4rxabVh08vqMIhMQQMblGwsThExUvyQUZTJ x6DOzFAf7jAlnYM.wM29KN.2z2I_vmSGEhFcou9KGsfj2J0QujoLHvlkzIzpdabg_mEfKTTVS8V1 hRh_EwF880uFcQjxBp0fUK6CMJwMlHDSHgAp5AIJiYI4ctMBdttaX79UXTMvnZPDIzROlArtSkSs TqLiA98g3WH8qs7NdPPO0BfUYWopdwE0gri3HItES_0CcDlDlwKokBBk4WiuZBzsqMprsjQhTtho Ct5PTfYzcVMZLuMK6XtwiJM3j.Va9yn1_eN86q_.qB4f_2ZromakLI8ZxP7ye_1if13Fa0ll3TuI dZg7skemTrH72o4rulfnPkrlSWmsv3TsvZltKAGhCE6P0OZVAZNExrjflkwDkZbw8IvgbkWDxKgC YLr6kcVugP32THqT_6TWk_FRfQZ2hk5PEKNqUZsm95t8rSKBfFV8nUdFnPSuhQFZXKOkm4rkbFX5 inrrdVrWyMnpEinmulyEoqHrvBXTwkJNbP_yCYCQVvdsA.TENRzzML3HDqaHDA27XytOtp.X0K.7 XxqgrgbEq7g0S0F07iL7Y2i_VdEHFO3S2eErys9vqyZ4A8RwQKqOLq0Gl2xGTjGGMdZW.LybX2me kRp9V06TsIN_ZtfUOZ5FwC3.cNDGMo4kxnUHKwACmBYS_mEsLRPdxFWCk1CE5B0jijuZ_puEQhba HyTJuMFfiwdKw8azHi8zbJJ0HtZmnD1bLa1pdMvWz9yYiN1iPvlztTwq7ZOWAb9gDYQs6gCu7I3Y - X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic307.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:10:34 +0000 Received: by kubenode512.mail-prod1.omega.bf1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID c571e24bb6d9bd02ecd96e3664e8c071; Thu, 13 May 2021 20:10:29 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, bpf@vger.kernel.org Subject: [PATCH v26 02/25] LSM: Add the lsmblob data structure. Date: Thu, 13 May 2021 13:07:44 -0700 Message-Id: <20210513200807.15910-3-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: When more than one security module is exporting data to audit and networking sub-systems a single 32 bit integer is no longer sufficient to represent the data. Add a structure to be used instead. The lsmblob structure is currently an array of u32 "secids". There is an entry for each of the security modules built into the system that would use secids if active. The system assigns the module a "slot" when it registers hooks. If modules are compiled in but not registered there will be unused slots. A new lsm_id structure, which contains the name of the LSM and its slot number, is created. There is an instance for each LSM, which assigns the name and passes it to the infrastructure to set the slot. The audit rules data is expanded to use an array of security module data rather than a single instance. Because IMA uses the audit rule functions it is affected as well. Acked-by: Stephen Smalley Acked-by: Paul Moore Acked-by: John Johansen Signed-off-by: Casey Schaufler Cc: Cc: linux-audit@redhat.com Cc: linux-security-module@vger.kernel.org Cc: selinux@vger.kernel.org To: Mimi Zohar To: Mickaël Salaün --- include/linux/audit.h | 4 +- include/linux/lsm_hooks.h | 12 ++++- include/linux/security.h | 67 +++++++++++++++++++++++++-- kernel/auditfilter.c | 24 +++++----- kernel/auditsc.c | 13 +++--- security/apparmor/lsm.c | 7 ++- security/bpf/hooks.c | 12 ++++- security/commoncap.c | 7 ++- security/integrity/ima/ima_policy.c | 40 +++++++++++----- security/landlock/cred.c | 2 +- security/landlock/fs.c | 2 +- security/landlock/ptrace.c | 2 +- security/landlock/setup.c | 4 ++ security/landlock/setup.h | 1 + security/loadpin/loadpin.c | 8 +++- security/lockdown/lockdown.c | 7 ++- security/safesetid/lsm.c | 8 +++- security/security.c | 72 ++++++++++++++++++++++++----- security/selinux/hooks.c | 8 +++- security/smack/smack_lsm.c | 7 ++- security/tomoyo/tomoyo.c | 8 +++- security/yama/yama_lsm.c | 7 ++- 22 files changed, 262 insertions(+), 60 deletions(-) diff --git a/include/linux/audit.h b/include/linux/audit.h index 82b7c1116a85..418a485af114 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -65,8 +66,9 @@ struct audit_field { kuid_t uid; kgid_t gid; struct { + bool lsm_isset; char *lsm_str; - void *lsm_rule; + void *lsm_rules[LSMBLOB_ENTRIES]; }; }; u32 op; diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index afd3b16875b0..c61a16f0a5bc 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -1570,6 +1570,14 @@ struct security_hook_heads { #undef LSM_HOOK } __randomize_layout; +/* + * Information that identifies a security module. + */ +struct lsm_id { + const char *lsm; /* Name of the LSM */ + int slot; /* Slot in lsmblob if one is allocated */ +}; + /* * Security module hook list structure. * For use with generic list macros for common operations. @@ -1578,7 +1586,7 @@ struct security_hook_list { struct hlist_node list; struct hlist_head *head; union security_list_options hook; - char *lsm; + struct lsm_id *lsmid; } __randomize_layout; /* @@ -1614,7 +1622,7 @@ extern struct security_hook_heads security_hook_heads; extern char *lsm_names; extern void security_add_hooks(struct security_hook_list *hooks, int count, - char *lsm); + struct lsm_id *lsmid); #define LSM_FLAG_LEGACY_MAJOR BIT(0) #define LSM_FLAG_EXCLUSIVE BIT(1) diff --git a/include/linux/security.h b/include/linux/security.h index 06f7c50ce77f..62588bc522ba 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -133,6 +133,65 @@ enum lockdown_reason { extern const char *const lockdown_reasons[LOCKDOWN_CONFIDENTIALITY_MAX+1]; +/* + * Data exported by the security modules + * + * Any LSM that provides secid or secctx based hooks must be included. + */ +#define LSMBLOB_ENTRIES ( \ + (IS_ENABLED(CONFIG_SECURITY_SELINUX) ? 1 : 0) + \ + (IS_ENABLED(CONFIG_SECURITY_SMACK) ? 1 : 0) + \ + (IS_ENABLED(CONFIG_SECURITY_APPARMOR) ? 1 : 0) + \ + (IS_ENABLED(CONFIG_BPF_LSM) ? 1 : 0)) + +struct lsmblob { + u32 secid[LSMBLOB_ENTRIES]; +}; + +#define LSMBLOB_INVALID -1 /* Not a valid LSM slot number */ +#define LSMBLOB_NEEDED -2 /* Slot requested on initialization */ +#define LSMBLOB_NOT_NEEDED -3 /* Slot not requested */ + +/** + * lsmblob_init - initialize an lsmblob structure + * @blob: Pointer to the data to initialize + * @secid: The initial secid value + * + * Set all secid for all modules to the specified value. + */ +static inline void lsmblob_init(struct lsmblob *blob, u32 secid) +{ + int i; + + for (i = 0; i < LSMBLOB_ENTRIES; i++) + blob->secid[i] = secid; +} + +/** + * lsmblob_is_set - report if there is an value in the lsmblob + * @blob: Pointer to the exported LSM data + * + * Returns true if there is a secid set, false otherwise + */ +static inline bool lsmblob_is_set(struct lsmblob *blob) +{ + struct lsmblob empty = {}; + + return !!memcmp(blob, &empty, sizeof(*blob)); +} + +/** + * lsmblob_equal - report if the two lsmblob's are equal + * @bloba: Pointer to one LSM data + * @blobb: Pointer to the other LSM data + * + * Returns true if all entries in the two are equal, false otherwise + */ +static inline bool lsmblob_equal(struct lsmblob *bloba, struct lsmblob *blobb) +{ + return !memcmp(bloba, blobb, sizeof(*bloba)); +} + /* These functions are in security/commoncap.c */ extern int cap_capable(const struct cred *cred, struct user_namespace *ns, int cap, unsigned int opts); @@ -1881,8 +1940,8 @@ static inline int security_key_getsecurity(struct key *key, char **_buffer) #ifdef CONFIG_SECURITY int security_audit_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule); int security_audit_rule_known(struct audit_krule *krule); -int security_audit_rule_match(u32 secid, u32 field, u32 op, void *lsmrule); -void security_audit_rule_free(void *lsmrule); +int security_audit_rule_match(u32 secid, u32 field, u32 op, void **lsmrule); +void security_audit_rule_free(void **lsmrule); #else @@ -1898,12 +1957,12 @@ static inline int security_audit_rule_known(struct audit_krule *krule) } static inline int security_audit_rule_match(u32 secid, u32 field, u32 op, - void *lsmrule) + void **lsmrule) { return 0; } -static inline void security_audit_rule_free(void *lsmrule) +static inline void security_audit_rule_free(void **lsmrule) { } #endif /* CONFIG_SECURITY */ diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index db2c6b59dfc3..a2340e81cfa7 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c @@ -74,7 +74,7 @@ static void audit_free_lsm_field(struct audit_field *f) case AUDIT_OBJ_LEV_LOW: case AUDIT_OBJ_LEV_HIGH: kfree(f->lsm_str); - security_audit_rule_free(f->lsm_rule); + security_audit_rule_free(f->lsm_rules); } } @@ -519,9 +519,10 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, goto exit_free; } entry->rule.buflen += f_val; + f->lsm_isset = true; f->lsm_str = str; err = security_audit_rule_init(f->type, f->op, str, - (void **)&f->lsm_rule); + f->lsm_rules); /* Keep currently invalid fields around in case they * become valid after a policy reload. */ if (err == -EINVAL) { @@ -774,7 +775,7 @@ static int audit_compare_rule(struct audit_krule *a, struct audit_krule *b) return 0; } -/* Duplicate LSM field information. The lsm_rule is opaque, so must be +/* Duplicate LSM field information. The lsm_rules is opaque, so must be * re-initialized. */ static inline int audit_dupe_lsm_field(struct audit_field *df, struct audit_field *sf) @@ -788,9 +789,9 @@ static inline int audit_dupe_lsm_field(struct audit_field *df, return -ENOMEM; df->lsm_str = lsm_str; - /* our own (refreshed) copy of lsm_rule */ + /* our own (refreshed) copy of lsm_rules */ ret = security_audit_rule_init(df->type, df->op, df->lsm_str, - (void **)&df->lsm_rule); + df->lsm_rules); /* Keep currently invalid fields around in case they * become valid after a policy reload. */ if (ret == -EINVAL) { @@ -842,7 +843,7 @@ struct audit_entry *audit_dupe_rule(struct audit_krule *old) new->tree = old->tree; memcpy(new->fields, old->fields, sizeof(struct audit_field) * fcount); - /* deep copy this information, updating the lsm_rule fields, because + /* deep copy this information, updating the lsm_rules fields, because * the originals will all be freed when the old rule is freed. */ for (i = 0; i < fcount; i++) { switch (new->fields[i].type) { @@ -1358,11 +1359,12 @@ int audit_filter(int msgtype, unsigned int listtype) case AUDIT_SUBJ_TYPE: case AUDIT_SUBJ_SEN: case AUDIT_SUBJ_CLR: - if (f->lsm_rule) { + if (f->lsm_isset) { security_task_getsecid_subj(current, &sid); result = security_audit_rule_match(sid, - f->type, f->op, f->lsm_rule); + f->type, f->op, + f->lsm_rules); } break; case AUDIT_EXE: @@ -1389,7 +1391,7 @@ int audit_filter(int msgtype, unsigned int listtype) return ret; } -static int update_lsm_rule(struct audit_krule *r) +static int update_lsm_rules(struct audit_krule *r) { struct audit_entry *entry = container_of(r, struct audit_entry, rule); struct audit_entry *nentry; @@ -1421,7 +1423,7 @@ static int update_lsm_rule(struct audit_krule *r) return err; } -/* This function will re-initialize the lsm_rule field of all applicable rules. +/* This function will re-initialize the lsm_rules field of all applicable rules. * It will traverse the filter lists serarching for rules that contain LSM * specific filter fields. When such a rule is found, it is copied, the * LSM field is re-initialized, and the old rule is replaced with the @@ -1436,7 +1438,7 @@ int audit_update_lsm_rules(void) for (i = 0; i < AUDIT_NR_FILTERS; i++) { list_for_each_entry_safe(r, n, &audit_rules_list[i], list) { - int res = update_lsm_rule(r); + int res = update_lsm_rules(r); if (!err) err = res; } diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 175ef6f3ea4e..392afe3e2fd6 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -665,14 +665,13 @@ static int audit_filter_rules(struct task_struct *tsk, match for now to avoid losing information that may be wanted. An error message will also be logged upon error */ - if (f->lsm_rule) { + if (f->lsm_isset) { if (need_sid) { security_task_getsecid_subj(tsk, &sid); need_sid = 0; } result = security_audit_rule_match(sid, f->type, - f->op, - f->lsm_rule); + f->op, f->lsm_rules); } break; case AUDIT_OBJ_USER: @@ -682,21 +681,21 @@ static int audit_filter_rules(struct task_struct *tsk, case AUDIT_OBJ_LEV_HIGH: /* The above note for AUDIT_SUBJ_USER...AUDIT_SUBJ_CLR also applies here */ - if (f->lsm_rule) { + if (f->lsm_isset) { /* Find files that match */ if (name) { result = security_audit_rule_match( name->osid, f->type, f->op, - f->lsm_rule); + f->lsm_rules); } else if (ctx) { list_for_each_entry(n, &ctx->names_list, list) { if (security_audit_rule_match( n->osid, f->type, f->op, - f->lsm_rule)) { + f->lsm_rules)) { ++result; break; } @@ -707,7 +706,7 @@ static int audit_filter_rules(struct task_struct *tsk, break; if (security_audit_rule_match(ctx->ipc.osid, f->type, f->op, - f->lsm_rule)) + f->lsm_rules)) ++result; } break; diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index 4113516fb62e..392e25940d1f 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -1161,6 +1161,11 @@ struct lsm_blob_sizes apparmor_blob_sizes __lsm_ro_after_init = { .lbs_sock = sizeof(struct aa_sk_ctx), }; +static struct lsm_id apparmor_lsmid __lsm_ro_after_init = { + .lsm = "apparmor", + .slot = LSMBLOB_NEEDED +}; + static struct security_hook_list apparmor_hooks[] __lsm_ro_after_init = { LSM_HOOK_INIT(ptrace_access_check, apparmor_ptrace_access_check), LSM_HOOK_INIT(ptrace_traceme, apparmor_ptrace_traceme), @@ -1862,7 +1867,7 @@ static int __init apparmor_init(void) goto buffers_out; } security_add_hooks(apparmor_hooks, ARRAY_SIZE(apparmor_hooks), - "apparmor"); + &apparmor_lsmid); /* Report that AppArmor successfully initialized */ apparmor_initialized = 1; diff --git a/security/bpf/hooks.c b/security/bpf/hooks.c index e5971fa74fd7..7a58fe9ab8c4 100644 --- a/security/bpf/hooks.c +++ b/security/bpf/hooks.c @@ -15,9 +15,19 @@ static struct security_hook_list bpf_lsm_hooks[] __lsm_ro_after_init = { LSM_HOOK_INIT(task_free, bpf_task_storage_free), }; +/* + * slot has to be LSMBLOB_NEEDED because some of the hooks + * supplied by this module require a slot. + */ +struct lsm_id bpf_lsmid __lsm_ro_after_init = { + .lsm = "bpf", + .slot = LSMBLOB_NEEDED +}; + static int __init bpf_lsm_init(void) { - security_add_hooks(bpf_lsm_hooks, ARRAY_SIZE(bpf_lsm_hooks), "bpf"); + security_add_hooks(bpf_lsm_hooks, ARRAY_SIZE(bpf_lsm_hooks), + &bpf_lsmid); pr_info("LSM support for eBPF active\n"); return 0; } diff --git a/security/commoncap.c b/security/commoncap.c index 3f810d37b71b..628685cf20e3 100644 --- a/security/commoncap.c +++ b/security/commoncap.c @@ -1443,6 +1443,11 @@ int cap_mmap_file(struct file *file, unsigned long reqprot, #ifdef CONFIG_SECURITY +static struct lsm_id capability_lsmid __lsm_ro_after_init = { + .lsm = "capability", + .slot = LSMBLOB_NOT_NEEDED +}; + static struct security_hook_list capability_hooks[] __lsm_ro_after_init = { LSM_HOOK_INIT(capable, cap_capable), LSM_HOOK_INIT(settime, cap_settime), @@ -1467,7 +1472,7 @@ static struct security_hook_list capability_hooks[] __lsm_ro_after_init = { static int __init capability_init(void) { security_add_hooks(capability_hooks, ARRAY_SIZE(capability_hooks), - "capability"); + &capability_lsmid); return 0; } diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c index fd5d46e511f1..5c40677e881c 100644 --- a/security/integrity/ima/ima_policy.c +++ b/security/integrity/ima/ima_policy.c @@ -80,7 +80,7 @@ struct ima_rule_entry { bool (*fowner_op)(kuid_t, kuid_t); /* uid_eq(), uid_gt(), uid_lt() */ int pcr; struct { - void *rule; /* LSM file metadata specific */ + void *rules[LSMBLOB_ENTRIES]; /* LSM file metadata specific */ char *args_p; /* audit value */ int type; /* audit type */ } lsm[MAX_LSM_RULES]; @@ -90,6 +90,22 @@ struct ima_rule_entry { struct ima_template_desc *template; }; +/** + * ima_lsm_isset - Is a rule set for any of the active security modules + * @rules: The set of IMA rules to check + * + * If a rule is set for any LSM return true, otherwise return false. + */ +static inline bool ima_lsm_isset(void *rules[]) +{ + int i; + + for (i = 0; i < LSMBLOB_ENTRIES; i++) + if (rules[i]) + return true; + return false; +} + /* * Without LSM specific knowledge, the default policy can only be * written in terms of .action, .func, .mask, .fsmagic, .uid, and .fowner @@ -335,9 +351,11 @@ static void ima_free_rule_opt_list(struct ima_rule_opt_list *opt_list) static void ima_lsm_free_rule(struct ima_rule_entry *entry) { int i; + int r; for (i = 0; i < MAX_LSM_RULES; i++) { - ima_filter_rule_free(entry->lsm[i].rule); + for (r = 0; r < LSMBLOB_ENTRIES; r++) + ima_filter_rule_free(entry->lsm[i].rules[r]); kfree(entry->lsm[i].args_p); } } @@ -388,8 +406,8 @@ static struct ima_rule_entry *ima_lsm_copy_rule(struct ima_rule_entry *entry) ima_filter_rule_init(nentry->lsm[i].type, Audit_equal, nentry->lsm[i].args_p, - &nentry->lsm[i].rule); - if (!nentry->lsm[i].rule) + &nentry->lsm[i].rules[0]); + if (!ima_lsm_isset(nentry->lsm[i].rules)) pr_warn("rule for LSM \'%s\' is undefined\n", nentry->lsm[i].args_p); } @@ -578,7 +596,7 @@ static bool ima_match_rules(struct ima_rule_entry *rule, int rc = 0; u32 osid; - if (!rule->lsm[i].rule) { + if (!ima_lsm_isset(rule->lsm[i].rules)) { if (!rule->lsm[i].args_p) continue; else @@ -591,14 +609,14 @@ static bool ima_match_rules(struct ima_rule_entry *rule, security_inode_getsecid(inode, &osid); rc = ima_filter_rule_match(osid, rule->lsm[i].type, Audit_equal, - rule->lsm[i].rule); + rule->lsm[i].rules); break; case LSM_SUBJ_USER: case LSM_SUBJ_ROLE: case LSM_SUBJ_TYPE: rc = ima_filter_rule_match(secid, rule->lsm[i].type, Audit_equal, - rule->lsm[i].rule); + rule->lsm[i].rules); break; default: break; @@ -994,7 +1012,7 @@ static int ima_lsm_rule_init(struct ima_rule_entry *entry, { int result; - if (entry->lsm[lsm_rule].rule) + if (ima_lsm_isset(entry->lsm[lsm_rule].rules)) return -EINVAL; entry->lsm[lsm_rule].args_p = match_strdup(args); @@ -1004,8 +1022,8 @@ static int ima_lsm_rule_init(struct ima_rule_entry *entry, entry->lsm[lsm_rule].type = audit_type; result = ima_filter_rule_init(entry->lsm[lsm_rule].type, Audit_equal, entry->lsm[lsm_rule].args_p, - &entry->lsm[lsm_rule].rule); - if (!entry->lsm[lsm_rule].rule) { + &entry->lsm[lsm_rule].rules[0]); + if (!ima_lsm_isset(entry->lsm[lsm_rule].rules)) { pr_warn("rule for LSM \'%s\' is undefined\n", entry->lsm[lsm_rule].args_p); @@ -1812,7 +1830,7 @@ int ima_policy_show(struct seq_file *m, void *v) } for (i = 0; i < MAX_LSM_RULES; i++) { - if (entry->lsm[i].rule) { + if (ima_lsm_isset(entry->lsm[i].rules)) { switch (i) { case LSM_OBJ_USER: seq_printf(m, pt(Opt_obj_user), diff --git a/security/landlock/cred.c b/security/landlock/cred.c index 6725af24c684..56b121d65436 100644 --- a/security/landlock/cred.c +++ b/security/landlock/cred.c @@ -42,5 +42,5 @@ static struct security_hook_list landlock_hooks[] __lsm_ro_after_init = { __init void landlock_add_cred_hooks(void) { security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks), - LANDLOCK_NAME); + &landlock_lsmid); } diff --git a/security/landlock/fs.c b/security/landlock/fs.c index 97b8e421f617..319e90e9290c 100644 --- a/security/landlock/fs.c +++ b/security/landlock/fs.c @@ -688,5 +688,5 @@ static struct security_hook_list landlock_hooks[] __lsm_ro_after_init = { __init void landlock_add_fs_hooks(void) { security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks), - LANDLOCK_NAME); + &landlock_lsmid); } diff --git a/security/landlock/ptrace.c b/security/landlock/ptrace.c index f55b82446de2..54ccf55a077a 100644 --- a/security/landlock/ptrace.c +++ b/security/landlock/ptrace.c @@ -116,5 +116,5 @@ static struct security_hook_list landlock_hooks[] __lsm_ro_after_init = { __init void landlock_add_ptrace_hooks(void) { security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks), - LANDLOCK_NAME); + &landlock_lsmid); } diff --git a/security/landlock/setup.c b/security/landlock/setup.c index f8e8e980454c..4a12666a4090 100644 --- a/security/landlock/setup.c +++ b/security/landlock/setup.c @@ -23,6 +23,10 @@ struct lsm_blob_sizes landlock_blob_sizes __lsm_ro_after_init = { .lbs_superblock = sizeof(struct landlock_superblock_security), }; +struct lsm_id landlock_lsmid __lsm_ro_after_init = { + .lsm = LANDLOCK_NAME, +}; + static int __init landlock_init(void) { landlock_add_cred_hooks(); diff --git a/security/landlock/setup.h b/security/landlock/setup.h index 1daffab1ab4b..38bce5b172dc 100644 --- a/security/landlock/setup.h +++ b/security/landlock/setup.h @@ -14,5 +14,6 @@ extern bool landlock_initialized; extern struct lsm_blob_sizes landlock_blob_sizes; +extern struct lsm_id landlock_lsmid; #endif /* _SECURITY_LANDLOCK_SETUP_H */ diff --git a/security/loadpin/loadpin.c b/security/loadpin/loadpin.c index b12f7d986b1e..b569f3bc170b 100644 --- a/security/loadpin/loadpin.c +++ b/security/loadpin/loadpin.c @@ -192,6 +192,11 @@ static int loadpin_load_data(enum kernel_load_data_id id, bool contents) return loadpin_read_file(NULL, (enum kernel_read_file_id) id, contents); } +static struct lsm_id loadpin_lsmid __lsm_ro_after_init = { + .lsm = "loadpin", + .slot = LSMBLOB_NOT_NEEDED +}; + static struct security_hook_list loadpin_hooks[] __lsm_ro_after_init = { LSM_HOOK_INIT(sb_free_security, loadpin_sb_free_security), LSM_HOOK_INIT(kernel_read_file, loadpin_read_file), @@ -239,7 +244,8 @@ static int __init loadpin_init(void) pr_info("ready to pin (currently %senforcing)\n", enforce ? "" : "not "); parse_exclude(); - security_add_hooks(loadpin_hooks, ARRAY_SIZE(loadpin_hooks), "loadpin"); + security_add_hooks(loadpin_hooks, ARRAY_SIZE(loadpin_hooks), + &loadpin_lsmid); return 0; } diff --git a/security/lockdown/lockdown.c b/security/lockdown/lockdown.c index 87cbdc64d272..4e24ea3f7b7e 100644 --- a/security/lockdown/lockdown.c +++ b/security/lockdown/lockdown.c @@ -75,6 +75,11 @@ static struct security_hook_list lockdown_hooks[] __lsm_ro_after_init = { LSM_HOOK_INIT(locked_down, lockdown_is_locked_down), }; +static struct lsm_id lockdown_lsmid __lsm_ro_after_init = { + .lsm = "lockdown", + .slot = LSMBLOB_NOT_NEEDED +}; + static int __init lockdown_lsm_init(void) { #if defined(CONFIG_LOCK_DOWN_KERNEL_FORCE_INTEGRITY) @@ -83,7 +88,7 @@ static int __init lockdown_lsm_init(void) lock_kernel_down("Kernel configuration", LOCKDOWN_CONFIDENTIALITY_MAX); #endif security_add_hooks(lockdown_hooks, ARRAY_SIZE(lockdown_hooks), - "lockdown"); + &lockdown_lsmid); return 0; } diff --git a/security/safesetid/lsm.c b/security/safesetid/lsm.c index 1079c6d54784..a2a2f462a821 100644 --- a/security/safesetid/lsm.c +++ b/security/safesetid/lsm.c @@ -241,6 +241,11 @@ static int safesetid_task_fix_setgid(struct cred *new, return -EACCES; } +static struct lsm_id safesetid_lsmid __lsm_ro_after_init = { + .lsm = "safesetid", + .slot = LSMBLOB_NOT_NEEDED +}; + static struct security_hook_list safesetid_security_hooks[] = { LSM_HOOK_INIT(task_fix_setuid, safesetid_task_fix_setuid), LSM_HOOK_INIT(task_fix_setgid, safesetid_task_fix_setgid), @@ -250,7 +255,8 @@ static struct security_hook_list safesetid_security_hooks[] = { static int __init safesetid_security_init(void) { security_add_hooks(safesetid_security_hooks, - ARRAY_SIZE(safesetid_security_hooks), "safesetid"); + ARRAY_SIZE(safesetid_security_hooks), + &safesetid_lsmid); /* Report that SafeSetID successfully initialized */ safesetid_initialized = 1; diff --git a/security/security.c b/security/security.c index e12a7c463468..a3276deb1b8a 100644 --- a/security/security.c +++ b/security/security.c @@ -344,6 +344,7 @@ static void __init ordered_lsm_init(void) init_debug("sock blob size = %d\n", blob_sizes.lbs_sock); init_debug("superblock blob size = %d\n", blob_sizes.lbs_superblock); init_debug("task blob size = %d\n", blob_sizes.lbs_task); + init_debug("lsmblob size = %zu\n", sizeof(struct lsmblob)); /* * Create any kmem_caches needed for blobs @@ -471,21 +472,36 @@ static int lsm_append(const char *new, char **result) return 0; } +/* + * Current index to use while initializing the lsmblob secid list. + */ +static int lsm_slot __lsm_ro_after_init; + /** * security_add_hooks - Add a modules hooks to the hook lists. * @hooks: the hooks to add * @count: the number of hooks to add - * @lsm: the name of the security module + * @lsmid: the identification information for the security module * * Each LSM has to register its hooks with the infrastructure. + * If the LSM is using hooks that export secids allocate a slot + * for it in the lsmblob. */ void __init security_add_hooks(struct security_hook_list *hooks, int count, - char *lsm) + struct lsm_id *lsmid) { int i; + if (lsmid->slot == LSMBLOB_NEEDED) { + if (lsm_slot >= LSMBLOB_ENTRIES) + panic("%s Too many LSMs registered.\n", __func__); + lsmid->slot = lsm_slot++; + init_debug("%s assigned lsmblob slot %d\n", lsmid->lsm, + lsmid->slot); + } + for (i = 0; i < count; i++) { - hooks[i].lsm = lsm; + hooks[i].lsmid = lsmid; hlist_add_tail_rcu(&hooks[i].list, hooks[i].head); } @@ -494,7 +510,7 @@ void __init security_add_hooks(struct security_hook_list *hooks, int count, * and fix this up afterwards. */ if (slab_is_available()) { - if (lsm_append(lsm, &lsm_names) < 0) + if (lsm_append(lsmid->lsm, &lsm_names) < 0) panic("%s - Cannot get early memory.\n", __func__); } } @@ -2070,7 +2086,7 @@ int security_getprocattr(struct task_struct *p, const char *lsm, char *name, struct security_hook_list *hp; hlist_for_each_entry(hp, &security_hook_heads.getprocattr, list) { - if (lsm != NULL && strcmp(lsm, hp->lsm)) + if (lsm != NULL && strcmp(lsm, hp->lsmid->lsm)) continue; return hp->hook.getprocattr(p, name, value); } @@ -2083,7 +2099,7 @@ int security_setprocattr(const char *lsm, const char *name, void *value, struct security_hook_list *hp; hlist_for_each_entry(hp, &security_hook_heads.setprocattr, list) { - if (lsm != NULL && strcmp(lsm, hp->lsm)) + if (lsm != NULL && strcmp(lsm, hp->lsmid->lsm)) continue; return hp->hook.setprocattr(name, value, size); } @@ -2576,7 +2592,24 @@ int security_key_getsecurity(struct key *key, char **_buffer) int security_audit_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule) { - return call_int_hook(audit_rule_init, 0, field, op, rulestr, lsmrule); + struct security_hook_list *hp; + bool one_is_good = false; + int rc = 0; + int trc; + + hlist_for_each_entry(hp, &security_hook_heads.audit_rule_init, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + trc = hp->hook.audit_rule_init(field, op, rulestr, + &lsmrule[hp->lsmid->slot]); + if (trc == 0) + one_is_good = true; + else + rc = trc; + } + if (one_is_good) + return 0; + return rc; } int security_audit_rule_known(struct audit_krule *krule) @@ -2584,14 +2617,31 @@ int security_audit_rule_known(struct audit_krule *krule) return call_int_hook(audit_rule_known, 0, krule); } -void security_audit_rule_free(void *lsmrule) +void security_audit_rule_free(void **lsmrule) { - call_void_hook(audit_rule_free, lsmrule); + struct security_hook_list *hp; + + hlist_for_each_entry(hp, &security_hook_heads.audit_rule_free, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + hp->hook.audit_rule_free(lsmrule[hp->lsmid->slot]); + } } -int security_audit_rule_match(u32 secid, u32 field, u32 op, void *lsmrule) +int security_audit_rule_match(u32 secid, u32 field, u32 op, void **lsmrule) { - return call_int_hook(audit_rule_match, 0, secid, field, op, lsmrule); + struct security_hook_list *hp; + int rc; + + hlist_for_each_entry(hp, &security_hook_heads.audit_rule_match, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + rc = hp->hook.audit_rule_match(secid, field, op, + &lsmrule[hp->lsmid->slot]); + if (rc) + return rc; + } + return 0; } #endif /* CONFIG_AUDIT */ diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 84ddcec6322e..0133b142e938 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -7111,6 +7111,11 @@ static int selinux_perf_event_write(struct perf_event *event) } #endif +static struct lsm_id selinux_lsmid __lsm_ro_after_init = { + .lsm = "selinux", + .slot = LSMBLOB_NEEDED +}; + /* * IMPORTANT NOTE: When adding new hooks, please be careful to keep this order: * 1. any hooks that don't belong to (2.) or (3.) below, @@ -7424,7 +7429,8 @@ static __init int selinux_init(void) hashtab_cache_init(); - security_add_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks), "selinux"); + security_add_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks), + &selinux_lsmid); if (avc_add_callback(selinux_netcache_avc_callback, AVC_CALLBACK_RESET)) panic("SELinux: Unable to register AVC netcache callback\n"); diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 1ee0bf1493f6..5c10ad27be37 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -4694,6 +4694,11 @@ struct lsm_blob_sizes smack_blob_sizes __lsm_ro_after_init = { .lbs_superblock = sizeof(struct superblock_smack), }; +static struct lsm_id smack_lsmid __lsm_ro_after_init = { + .lsm = "smack", + .slot = LSMBLOB_NEEDED +}; + static struct security_hook_list smack_hooks[] __lsm_ro_after_init = { LSM_HOOK_INIT(ptrace_access_check, smack_ptrace_access_check), LSM_HOOK_INIT(ptrace_traceme, smack_ptrace_traceme), @@ -4893,7 +4898,7 @@ static __init int smack_init(void) /* * Register with LSM */ - security_add_hooks(smack_hooks, ARRAY_SIZE(smack_hooks), "smack"); + security_add_hooks(smack_hooks, ARRAY_SIZE(smack_hooks), &smack_lsmid); smack_enabled = 1; pr_info("Smack: Initializing.\n"); diff --git a/security/tomoyo/tomoyo.c b/security/tomoyo/tomoyo.c index 1f3cd432d830..22f62c67f2ec 100644 --- a/security/tomoyo/tomoyo.c +++ b/security/tomoyo/tomoyo.c @@ -523,6 +523,11 @@ static void tomoyo_task_free(struct task_struct *task) } } +static struct lsm_id tomoyo_lsmid __lsm_ro_after_init = { + .lsm = "tomoyo", + .slot = LSMBLOB_NOT_NEEDED +}; + /* * tomoyo_security_ops is a "struct security_operations" which is used for * registering TOMOYO. @@ -575,7 +580,8 @@ static int __init tomoyo_init(void) struct tomoyo_task *s = tomoyo_task(current); /* register ourselves with the security framework */ - security_add_hooks(tomoyo_hooks, ARRAY_SIZE(tomoyo_hooks), "tomoyo"); + security_add_hooks(tomoyo_hooks, ARRAY_SIZE(tomoyo_hooks), + &tomoyo_lsmid); pr_info("TOMOYO Linux initialized\n"); s->domain_info = &tomoyo_kernel_domain; atomic_inc(&tomoyo_kernel_domain.users); diff --git a/security/yama/yama_lsm.c b/security/yama/yama_lsm.c index 06e226166aab..a9639ea541f7 100644 --- a/security/yama/yama_lsm.c +++ b/security/yama/yama_lsm.c @@ -421,6 +421,11 @@ static int yama_ptrace_traceme(struct task_struct *parent) return rc; } +static struct lsm_id yama_lsmid __lsm_ro_after_init = { + .lsm = "yama", + .slot = LSMBLOB_NOT_NEEDED +}; + static struct security_hook_list yama_hooks[] __lsm_ro_after_init = { LSM_HOOK_INIT(ptrace_access_check, yama_ptrace_access_check), LSM_HOOK_INIT(ptrace_traceme, yama_ptrace_traceme), @@ -477,7 +482,7 @@ static inline void yama_init_sysctl(void) { } static int __init yama_init(void) { pr_info("Yama: becoming mindful.\n"); - security_add_hooks(yama_hooks, ARRAY_SIZE(yama_hooks), "yama"); + security_add_hooks(yama_hooks, ARRAY_SIZE(yama_hooks), &yama_lsmid); yama_init_sysctl(); return 0; } From patchwork Thu May 13 20:07:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256419 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 450A9C433B4 for ; Thu, 13 May 2021 20:11:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1A7A661176 for ; Thu, 13 May 2021 20:11:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232519AbhEMUMt (ORCPT ); Thu, 13 May 2021 16:12:49 -0400 Received: from sonic317-38.consmr.mail.ne1.yahoo.com ([66.163.184.49]:37093 "EHLO sonic317-38.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232520AbhEMUMq (ORCPT ); Thu, 13 May 2021 16:12:46 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620936696; bh=qEq8Lj/7uNcH9ecnF3avItFtB/sPchJA6oFxCuhF0rc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=bnrvuvix2PKZCflmUQG6WDCehXPGZjUo6Wgls343NYfdjnOW3iVlF8Y2E6eKp8rdgL4Rw8fSiMoGfP335o9CslehjPBRfvbbOURE9lG5CX7YHfjHZ2wSk994Uc09m5qaOC9IxWKiQRvjDq7hr/OWktPNZOfPOsIbwP00WShlm/zQ3bK98FZ0GmrFUJ9uX2GexNnvYfgTELJtw9JNkdaUugwSC/LfNcjWIB6+vGKzoYsSvl/FrfitI2mV4se7WMLUddWUVlA1BsD8/kHb2ndq/k20smHTWlTn3fRR4FsROlpn/epkIon8SmtHS8yuDzl8hioDeq1ZGxcHySc1rB92zw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620936696; bh=5B7twyjLZh1dM/79rrNWB/DsIghalvjs563on4k0FZ9=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=tN9b8nAjrEBiwaLcYfJmREgevbDMR4iV9w/nMesglGU10YNFZQawUDDACopbjXhzlfqC7TXVcADSYWq1IDdVXQSPJEuih0LDUg5YlQeHPlLnaKLkYmjO0tuZj391VCmgqWzr77SmLzy8RpBEtQT/AJAiPWGtNU7JCCXml/IX7OqsKaYKV9sHun4XpoI3gEOeSi228s+Jj3m2qUNdMPISkhdApK6LrL6H8tCJ6TpMdt7Vki8Cfnt5U3jNAypNYi8KkSVyKQPI7bgaciXhgaLm1OL5KNKZoQkyDnAwpk3EIqJ5k6vKuDDV8ypnCqXbHwn/HZjIFSfs887K2ch5YjUvIw== X-YMail-OSG: qMdUm5MVM1kEy7jpbEmZDl3RfNm.fw.Z2HgqskHVVhEzD8spON4gGWxCvf4Fxq5 tEtDXTafBgXUOsIm33DNhpYF_aqqCSbYA9TDGX55wlMKGSRvjZ_gC4lA_ZyOqNdZX_R3fRU4u2v8 hfU9GiVBMr1GZKUKC6inrHodI6o14PPkEgCOYjA4z3Vy08_sxvwhoahoIMkAuQpvU9TdJMZSVgkt bTW_YXgz_fVjga_7zBY6FVN0olY4WUUKhfL.wghN7pDtv4sV3Pu6J8ynuRvPsxkTFQsqnpK35it5 Xow1t1BKIs.OT9Os6RI9DFXSwjZvhcnhkVNWEZk881t1sWGPT6rmO3VwYvUNX4cPrRa.HthuT_O8 6Lw4PdWYC7rNXK12WZQQucdWjuk0TPTIWqrsoumwjfILuvPL6bpyCPzZSZ3IRiibBjbJvgW.eewS 0yvMZpsKVZMlaJXLf6f38VI9qntiTK6.OWfF_PuBGt3QcszFYxnYScPapOXM6sy40jq4Mj3xb_S2 _WNBwClCxILo6o6XxRXbZs9LO.Dr3u5b1R6YY.IpJ0bDsSfnWBGK2iE89av2RVveJ6empsj8LtS3 .1oNqTBJ1RMAHIQjeD7bSr0hKtx4OfZlAT679eMpbb03oysjYneifGUp7w7EC6yzVTlG_Wo8TsxT lYNRNfxfKgLyLzStcoWDFfC8naYwYeEGrKibUxrtrJupe3rEWmtJrbCEISIbgT5_kC8qat6UjYgH 3rrjAreO0GvoaNFgVfhjK6NQj1fFd8tSiboiHXyImekAbNCWtk3ef_Ij7pkTJIALBnnXNAXRJq7s bFtmNAe.ryM5NIY75UokYzXj8mXUFxsx5AduM2g.1zjCEUVSnSFPP8HhFdPRYx.HDd_sjk5S3lzT dUFJJmOFtmdpVT7brVH3k47DIgWTMxgV.U1oM90mVCwq1nlKv6YdmSuywAj75Pw6ouf_0JKKFp.i mwkAdr0wEKW_61MbJ9bQ_hBbhRkRAsHgOnAQGuvNRUq78GJQx.ZFOEyeqh397gzgS308CC7DwZyy gpWrpN5mT3dc5IBbRMxV.Cwtj.I3sa36Ox3_15FNZuVbFMei6XtwV0INYgn_qgGN3PN1cAuq4_I1 FP_hRuNmiLXu8vK0OA3ZgcL5LN9w06KAW3V4VucX9GqNYndUp68vx0XTS_nw3a46TfeeZdFFfWS1 pxy4.5dqm2ZrAMV9r7SO.3RJy2Pw96Lw00K8vbBbraNH.O53gIz0HqqPC0MSuXvf6vz2rcf1cN8S Egu23hxgIIW3uzaM5whsGjWE3j0dSKswY.SiVGsxVpIrvFCwEr_gCEARDT_jmohp8dO4MvPyIlp3 9b1x53q1yk3UA5vy_gtGlkVfJIYIkfve5bzCfoIwwtuV0FETAVmxvYAUBw9YQGewU4MhV1sMJpE. bLF.FKyJ6KaBWb1GNz3KwYP4wct_x3o6e7k.QV4Oz0T.71Ey4G17h6B_Y_DmDOR0cMkTrXriR7dU aQ.3vQLiF2TRmOaxHS4fPdhXablmAr9V8vIUVq02Mn5cOOaUGE7h.y8htaWKSqEHKUL3lmAJui9k fWsYfR.4dxs89TCxssHXKeT_EUgtp_dYzF2sUy7kaXXj8JOqm4uXOZa4KlFvVYDX.CSCfPUK.rrz MVRaZt8Y2QxTz24FSpHvoLkcdgNF_xF_P5ZfD9k7XHEwu04uVeoYBcQsMKR8DLHlW.KSc6HlgBuN EVJq42gs4ckWvRsqmhCpkMp8ELCwwZVW3kxjVUTfb9TQKvwVlYpJxsOlg04qw68dtaEXkE_QGWHX keuOoE2TEfv6g4EbXBy0teT5FOe4Uhqls3jyUxi1Yqq1FM3t5l8yYSjnaL2Squ.zdPV6eiNtFWs4 VsAZ7iMRRcxkDfpy2yK7M1RoQRGPGapW2NxaOLuoSReHDbOcvxeEzbLVe5W.tU34pf1i8j2weHwS EaLIqUB82q1qKKPiqH60vEsc5bPfy8kFDK0Q5_.BBJdD8DyMwZNQm2H5Jhphf9eZf8Nt0.StifWS aGrpyZM4mMZ1lITurbO7ArzJ6dA9b1MGtWiWiWSPAx.S9n_00QfHtDGN_BC4NUx21o3pdYMnQhTQ 4mWacgZx8p.JZ6rKrlBMe62hhWbamE8oOLTS4ac9PXT7aORTolmCZm57F2F4vvJu7a4M0RhciWNR kEqoIHPZm22XRxCxfezXraSg0db7a7MR_cTMugiIj3zKqGlwzdlaA2kgmJH8WvT5_6cNxF3t.uIv etilqahXC0qEljJVBk9VcD85DC1svYl4xY3gBG1_8E7JTXKBwdrCEq.vtxGwtB0VTT__bzaMBtvk IaqWdrJjSJ6zUXy2e9d7ZgP33xmqg9IJWDQV.UgmzX4hqN.OqRgAfXiFyXCVZlZBYKStJ81792Sb Rhtq7sIImjp4lg47hgWrh9ST8cyLwVXwIB5vtmEodPfxRCCemkATSf9lkl0fhZPZDfdO2iKSAtxA j4xoV0PRw3YjmXlxpphWX0LLJay2JVmt8Q5uSUxAUkA31xUiO4KZANzi0a6PyPFSxgHytSi0qO3p iqV3FnxCNbXdw4uEmE4ksUHmikvRkuu0a__eElVumZ.35mTSPznnaF3mW3gAvqMlIgaySEfOXcHH MnUM55JIYVu8Uh8RVtNPpRl2bob_4W.Iw5Sqa_YiaEFwnsY_3X_QgXKxNwFmRYmO3ZzwdkqKCG6X SnVSYP31mnRUDuP9wktbYElixfe9mxyKqP2_aEAPsLou.C_bLODWdkMlHcTCcPIdjh_KDs2HWIDo mAKD.EBnwx55ocKkF.p3NaMZZzjy2_t3nmarnOP2gU52WoHNOXqtJFzehdm3DILmFbLSyHEV6Auj oTYDzXQgvAeABCWCBvhin.rTfHjy5tkPCYWC3jyu1jklN0KZFM32w7ZDcMEnCvWkG9.u0zRnrCpY gAnvT4hudISZuALdGDnZpVrSC3y47sLN6cuFtxGotyuPjREBbJPvAvMRrHUzYJVU638sdCj9VDO4 mo1yHuYUxvdmkNtzW9xm3yJVXQSiPV899FhM0n0duwP1b9SBUy8L_26cNQTA4fhszXqHc4jBe8Sh 9qGnMT.RhtzAO_wJJq4X2.lj2YaU3gDITZLMqYVl1RvcDeJDJhw-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic317.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:11:36 +0000 Received: by kubenode512.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID ee9e80ae2ed374cb2f7759e49525aaf2; Thu, 13 May 2021 20:11:35 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org Subject: [PATCH v26 03/25] LSM: provide lsm name and id slot mappings Date: Thu, 13 May 2021 13:07:45 -0700 Message-Id: <20210513200807.15910-4-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Provide interfaces to map LSM slot numbers and LSM names. Update the LSM registration code to save this information. Signed-off-by: Casey Schaufler Reviewed-by: Kees Cook Acked-by: Paul Moore --- include/linux/security.h | 4 ++++ security/security.c | 45 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/include/linux/security.h b/include/linux/security.h index 62588bc522ba..ca9485105f00 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -192,6 +192,10 @@ static inline bool lsmblob_equal(struct lsmblob *bloba, struct lsmblob *blobb) return !memcmp(bloba, blobb, sizeof(*bloba)); } +/* Map lsm names to blob slot numbers */ +extern int lsm_name_to_slot(char *name); +extern const char *lsm_slot_to_name(int slot); + /* These functions are in security/commoncap.c */ extern int cap_capable(const struct cred *cred, struct user_namespace *ns, int cap, unsigned int opts); diff --git a/security/security.c b/security/security.c index a3276deb1b8a..9471bcecc052 100644 --- a/security/security.c +++ b/security/security.c @@ -476,6 +476,50 @@ static int lsm_append(const char *new, char **result) * Current index to use while initializing the lsmblob secid list. */ static int lsm_slot __lsm_ro_after_init; +static struct lsm_id *lsm_slotlist[LSMBLOB_ENTRIES] __lsm_ro_after_init; + +/** + * lsm_name_to_slot - Report the slot number for a security module + * @name: name of the security module + * + * Look up the slot number for the named security module. + * Returns the slot number or LSMBLOB_INVALID if @name is not + * a registered security module name. + */ +int lsm_name_to_slot(char *name) +{ + int i; + + for (i = 0; i < lsm_slot; i++) + if (strcmp(lsm_slotlist[i]->lsm, name) == 0) + return i; + + return LSMBLOB_INVALID; +} + +/** + * lsm_slot_to_name - Get the name of the security module in a slot + * @slot: index into the interface LSM slot list. + * + * Provide the name of the security module associated with + * a interface LSM slot. + * + * If @slot is LSMBLOB_INVALID return the value + * for slot 0 if it has been set, otherwise NULL. + * + * Returns a pointer to the name string or NULL. + */ +const char *lsm_slot_to_name(int slot) +{ + if (slot == LSMBLOB_INVALID) + slot = 0; + else if (slot >= LSMBLOB_ENTRIES || slot < 0) + return NULL; + + if (lsm_slotlist[slot] == NULL) + return NULL; + return lsm_slotlist[slot]->lsm; +} /** * security_add_hooks - Add a modules hooks to the hook lists. @@ -495,6 +539,7 @@ void __init security_add_hooks(struct security_hook_list *hooks, int count, if (lsmid->slot == LSMBLOB_NEEDED) { if (lsm_slot >= LSMBLOB_ENTRIES) panic("%s Too many LSMs registered.\n", __func__); + lsm_slotlist[lsm_slot] = lsmid; lsmid->slot = lsm_slot++; init_debug("%s assigned lsmblob slot %d\n", lsmid->lsm, lsmid->slot); From patchwork Thu May 13 20:07:46 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256421 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 845B3C43460 for ; Thu, 13 May 2021 20:12:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 617E5613DE for ; Thu, 13 May 2021 20:12:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232490AbhEMUN5 (ORCPT ); Thu, 13 May 2021 16:13:57 -0400 Received: from sonic317-38.consmr.mail.ne1.yahoo.com ([66.163.184.49]:34827 "EHLO sonic317-38.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232523AbhEMUN5 (ORCPT ); Thu, 13 May 2021 16:13:57 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620936766; bh=wUB0iYE8Twioo5ZIk6y7nf85VKY6XjvcN02gxsSW0T0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=nSdXTqCUZm1Vp+aW4h4oiIwz+rcxGs57ajQWFQUm6e/+iK8QLXnVgkEkokbgjMI57CrWh/o10ZlfCoKUl6770n/oJN4JIE7zPntl9fcs0917OnGQWJA63SMqEKsNmZejfZwi65rXbdR4HRUoZvgWRz0wtisTJv0Afz72rRn23LwQkUXFWj2ve/7Zr1jmLlpAxw4MZdd5ND9o5a+KvW31kElqX0L6tBedomUvR9J0agkYs1RkOYsXJLpoTH6nWBRfjMjshwSj/wsZyFIiyq9OS26gOlDXw3q+dK5k1hZZdepqhr6EyvPLms/dFyez5XWEAs943wbr21Y9TY0fN70fYw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620936766; bh=tEAjkkTzf9hkTGPbh8mdDK6q/4dxkK9cvxYj2wxIlJI=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=VWB6MCYCCCMY28WkQXgTrB0wx7G46dHfsLlDL6RDPSSD31A8fYfJOPx2iXbQT5wXlmgFaoxrD6Vr5vulbfgx2uUH/FzOgDjXpNVDwa+MQDl9ouqCoy6XqXFKeWnRHktjtUV218WV7lRg9Lvn84brcxpqVeJ1sXi+6L+/M72gNl51tQvzGBH8AoG57CL+n8K1Pcq5aqqMSDRqCsjlbxPw/m/cCKRM5K4cK+NSwqXtnYYAHdup1CFD4CSR3Z6A1X0HPy0TtyegaCdsjUjCp/hfCpzuVT4MZg2cb1CjS13Is7IooutR+zRMZbHAsH0uzMM9PG6kAD2FSbITrpopffFbvQ== X-YMail-OSG: 9kXz4IwVM1lE1GhB.wvWjJgckIFxM_gPc9AYuONZkMGTRzYpOWQYGtAAUYsKzH2 TMgqqPM0ZTF0AeDFmG0oIclSJ3d.BGTJaPsaygYuoekw5BgnRvDbFPFzu_3Qd8djSCgyee4UvpJJ YMfGXW0KAcqXv_rE026aSKmgkzs6F4ndAN4ImdTiI2FP5CK47qKaiL0ynxxfHPeUPZ91d4ZmIkau hKsUfOHRqwbZJZiB7ZNOXKC32HIHT0HGfRqX6lKT3Th2HYw_gvzPNs7NqnGoFAL6gthp1iQb5COb SfALF66dmJubwGDISyIbmfkRcYLaKnsJ_4q2aV_urpfSBy.VoAYoh_MRflD1H86CHwDDbr9_oAhg zlFrFLzm0iQQr_BEfh69qAf4nvYckFUsxDxIZ7TkjaJkXkC4_DhwnNVkJhFLQdTnZFsDGK32y7_1 6GVTBiEzWX4v3H1TGaSoImLogjwNEwGUhLlfcGfktDI9DgzGh5Vab69PjfkFJtrzVZD2LtI.w0xo MsJ4Aa9LcRbmvR01Cx3i_LpMs9MjebdHTjQZcSRPkX7SVbLS7FVk8GWVZbZM7fSG_PzZgCpdpAW1 98Au5CBxkZkje94Xn73NKLCL8kPDgXWbGwOQSG8EetFEIfvRjXxoiuNA35TCfm42Q1A7OK.SQJNw jbz9BT31kJwCFFDt6.WZUQrYg1NF6od_DLBZ7Tc0ALmf_ZFk1Naej1ZuiguZTxwY8ZmGq_HgDB_X 4G2whssJpkzMawQ0pcW6W9BbJol9jEff1xdZz4yt1gVQnh7JUDch4fFXzIyp_K_cf_wk_f5DdmVv PO9E.faL_yVsOVQ27dxOMOjLArRosxHQnb5TpN3ID6NM.qZEoFIc1b6OCsVDRQcBoiVAJ0NoKgfm 7OsYaaA90VrWiw3rb.TtDI95m6m2B4jc7.Gl8.0roRbu8VadUlMpPeA9WhVZrwUNr1q8MFoxVeDu a3ZZsxUy73HPuNDMN8ukcRiyEZkHrTP6eM3VvcrBdzJnFTGAYlXzigHXcrtXEN.RvtiHeAoAV4KJ YIQNRF6Nta0Kkl6Kg.0uBoXB7SooIahWXyq6ybgUT455k_kOvM75qlRQZeVui66rHUSrvnpxIqHP GHLVJBcu5f5m1InF5N7wR4Tnm2uKMR235.AiV7__W_ie_OF3FOfBtVEW0UioYmiPFIogdmbHRhhx ewZNEYygSaqrS4IPflNz8CYA6iI7eo4FrjH84h09u8MTA1dfEiohGtj2TQHNJ9RMuea9JA9_gIQb VI.HDCruk2dY9_zr9VNSfVQ75cSXY_MX7ydVv7Kn6TmeFsR8ykE7MoBUQEZANFTBM6bgBYGulbZ0 7LEGc1Kjq1yZWvFGPdNJDyEG0XmPcGSUeqOOkTDHdz6xZSw5KMGW4Pj3dul7Mq4ezpsdoqrRSL5s NtKfak6s2t.GhVQo6CneZGLV5PqCfqSIVqXl3MFSh.J5UhpvhLScLPUHFnLs012VgeB2j8Ra71yq QHf9ca0fTuxMJjo5tB4yyMWxoXfcet0YTs2.vjRjDAdpUwNiKX7lsrctnsDGRLsxQ1zd1_vY4qjG RT2GT.C_u2dubmS_okdIqkk5tQYtU7Z4OL.NXb5gp3VdRJKfAj1Sv9r_1Lj36dUFub8xPcy1tcFF S2NyBOKCxgox1469xaVs0qIyhi66Mmb58iv7A8EbcwdC9wduQjoDSoEUw7NGVEsGChzko8GhLp_x z9b57jhURZMBreywz.L8HhmMdD7CjYkr.f0oFKPUNzxC5uMqMuy_hA34UXjQHDlQfaTiMdRGafZi QZXanTXm_ckw1TlBzPvIWyjQMKIvlEkqrmbGwUIneonUNIJQ67JRoW6XC7JCWUEAdZbSybAo9a5n 8qbGJyEm.90wpspq6ZzO50MAyiV2rEz1CQLtTXJ8lrLkhqVTRDUNAPvkw23_6x629NBCW9kfc52H x6Li.Xnv88k8NtMCenCLsYLDXIwPId7h54D_zVUAJf6CUDIikV2Tbd18wT3_TFkv2g6cwV2Ynl3_ stk_37rYmWdhkZ8iFl6gyhKt84zWRlatfm1TS_QNSH_tbIgXCOlLUiJm8zHnR4AOh8DdHoGEL.5x FDjUSt_qh71IokuO1nNUIfLtYh.zMUs_lVbhCHPowwLt_QDNBxX_yvrm_iEFwgIcODdZaGwYys2k BC5OiqII4IGw033haOZ9RDVPa7LMbRgjQ.lYzJxZZsdmFX9cpC194yjY29JGirSSR41.f6.6jCmZ _TqGkdfxBP67xSRzRWrsMrn5aNO52t3YwWfO0hRjtt8l7QKljRT3aMRxCqjpunKJiUBTR3uSI.HU vi3IKxmLW1BuxAJAaVmU_6muvOp5jXbCN6zQstDwC_0dFPWC1xXyzkzMRWC943PW6PYjt9Kow9rS 5zDX6iZMCB6QgVnUOdW.kqbtRneacpFcwfKBJIQ5eM60jE4fW3OSY7LTLcZ4NMTEB98kTbTvjusb 4fsla5XUH4oEErRdZa.S_2cO9RKH9G9uImsfEl8ofQVCAns7TN4T1MEdD61PoUTcGbCZfRKyI40_ 4aFb66SZvz9w9lxPAoXUCpI1f8QSV.88y76zjE_yuCMoLHayUM20w0.wk46CEa67mJvc27aVEuU7 Y2smNuA91EyY3aW9oMJTUPXKWrwA8m2A.1lobXK9uWDt3wZUjiLsAVS9jQQkkQrkyklskMRWVoji jolNDYFJdFyiRaFxcto1T21BIc1ntJxg_CSL7HgrPYoSOZX1SWuLpbygWh5ZHjM7F_iw66yrQGLi zxZOKDeJ3q8Goxbgek4ONPJUCNcX4JUTKI7bvV22hsJISL558AjMYqfhrMGfX8TwQtSLjerIpoMt 48KexM5znbnrTVFJViizCjtbevkysoXhYY4YT5vWFA6uQYk923rjdlIDFt4QCpp7W3d2ov11MbhR ary_dM_PiIErYEM7l_6iumf4DrSlPuTavvcQ9G5rs_k3.WJ4oGf1YZUafy7dPEj924JIXc4TFKDV xHXSCEjkQDAGFTj5dl3J_kSA6BueQX_CjdhfxAjim6DqAqZjyBOtsgwSJgUqMqe1Np1QDe6rjWeF m35pzAZpJ4LFdbcZ8dTedfnFF.T7s63ZLCTGbzjV638FecSnqPB3c.S1RmgwdGCEdWKJ4nVmsn1H bkbmKN6aBaoOMrbxZc2hYX3BEovRa4bBWQB2Fl2MNKgOQ.qhEXgl9PKcI4TQ- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic317.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:12:46 +0000 Received: by kubenode532.mail-prod1.omega.bf1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 2180a90ee2d0cc9936d3029a48cc28ba; Thu, 13 May 2021 20:12:42 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org Subject: [PATCH v26 04/25] IMA: avoid label collisions with stacked LSMs Date: Thu, 13 May 2021 13:07:46 -0700 Message-Id: <20210513200807.15910-5-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Integrity measurement may filter on security module information and needs to be clear in the case of multiple active security modules which applies. Provide a boot option ima_rules_lsm= to allow the user to specify an active securty module to apply filters to. If not specified, use the first registered module that supports the audit_rule_match() LSM hook. Allow the user to specify in the IMA policy an lsm= option to specify the security module to use for a particular rule. Signed-off-by: Casey Schaufler To: Mimi Zohar To: linux-integrity@vger.kernel.org Reviewed-by: Kees Cook --- Documentation/ABI/testing/ima_policy | 8 ++- security/integrity/ima/ima_policy.c | 77 ++++++++++++++++++++-------- 2 files changed, 62 insertions(+), 23 deletions(-) diff --git a/Documentation/ABI/testing/ima_policy b/Documentation/ABI/testing/ima_policy index 070779e8d836..84dd19bc4344 100644 --- a/Documentation/ABI/testing/ima_policy +++ b/Documentation/ABI/testing/ima_policy @@ -25,7 +25,7 @@ Description: base: [[func=] [mask=] [fsmagic=] [fsuuid=] [uid=] [euid=] [fowner=] [fsname=]] lsm: [[subj_user=] [subj_role=] [subj_type=] - [obj_user=] [obj_role=] [obj_type=]] + [obj_user=] [obj_role=] [obj_type=] [lsm=]] option: [[appraise_type=]] [template=] [permit_directio] [appraise_flag=] [keyrings=] base: @@ -117,6 +117,12 @@ Description: measure subj_user=_ func=FILE_CHECK mask=MAY_READ + It is possible to explicitly specify which security + module a rule applies to using lsm=. If the security + modules specified is not active on the system the rule + will be rejected. If lsm= is not specified the first + security module registered on the system will be assumed. + Example of measure rules using alternate PCRs:: measure func=KEXEC_KERNEL_CHECK pcr=4 diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c index 5c40677e881c..d804b9a0dd95 100644 --- a/security/integrity/ima/ima_policy.c +++ b/security/integrity/ima/ima_policy.c @@ -79,8 +79,9 @@ struct ima_rule_entry { bool (*uid_op)(kuid_t, kuid_t); /* Handlers for operators */ bool (*fowner_op)(kuid_t, kuid_t); /* uid_eq(), uid_gt(), uid_lt() */ int pcr; + int which_lsm; /* which of the rules to use */ struct { - void *rules[LSMBLOB_ENTRIES]; /* LSM file metadata specific */ + void *rule; /* LSM file metadata specific */ char *args_p; /* audit value */ int type; /* audit type */ } lsm[MAX_LSM_RULES]; @@ -92,17 +93,15 @@ struct ima_rule_entry { /** * ima_lsm_isset - Is a rule set for any of the active security modules - * @rules: The set of IMA rules to check + * @entry: the rule entry to examine + * @lsm_rule: the specific rule type in question * - * If a rule is set for any LSM return true, otherwise return false. + * If a rule is set return true, otherwise return false. */ -static inline bool ima_lsm_isset(void *rules[]) +static inline bool ima_lsm_isset(struct ima_rule_entry *entry, int lsm_rule) { - int i; - - for (i = 0; i < LSMBLOB_ENTRIES; i++) - if (rules[i]) - return true; + if (entry->lsm[lsm_rule].rule) + return true; return false; } @@ -282,6 +281,20 @@ static int __init default_appraise_policy_setup(char *str) } __setup("ima_appraise_tcb", default_appraise_policy_setup); +static int ima_rules_lsm __ro_after_init; + +static int __init ima_rules_lsm_init(char *str) +{ + ima_rules_lsm = lsm_name_to_slot(str); + if (ima_rules_lsm < 0) { + ima_rules_lsm = 0; + pr_err("rule lsm \"%s\" not registered", str); + } + + return 1; +} +__setup("ima_rules_lsm=", ima_rules_lsm_init); + static struct ima_rule_opt_list *ima_alloc_rule_opt_list(const substring_t *src) { struct ima_rule_opt_list *opt_list; @@ -351,11 +364,10 @@ static void ima_free_rule_opt_list(struct ima_rule_opt_list *opt_list) static void ima_lsm_free_rule(struct ima_rule_entry *entry) { int i; - int r; for (i = 0; i < MAX_LSM_RULES; i++) { - for (r = 0; r < LSMBLOB_ENTRIES; r++) - ima_filter_rule_free(entry->lsm[i].rules[r]); + if (entry->lsm[i].rule) + ima_filter_rule_free(entry->lsm[i].rule); kfree(entry->lsm[i].args_p); } } @@ -406,8 +418,8 @@ static struct ima_rule_entry *ima_lsm_copy_rule(struct ima_rule_entry *entry) ima_filter_rule_init(nentry->lsm[i].type, Audit_equal, nentry->lsm[i].args_p, - &nentry->lsm[i].rules[0]); - if (!ima_lsm_isset(nentry->lsm[i].rules)) + &nentry->lsm[i].rule); + if (!ima_lsm_isset(nentry, i)) pr_warn("rule for LSM \'%s\' is undefined\n", nentry->lsm[i].args_p); } @@ -596,7 +608,7 @@ static bool ima_match_rules(struct ima_rule_entry *rule, int rc = 0; u32 osid; - if (!ima_lsm_isset(rule->lsm[i].rules)) { + if (!ima_lsm_isset(rule, i)) { if (!rule->lsm[i].args_p) continue; else @@ -609,14 +621,14 @@ static bool ima_match_rules(struct ima_rule_entry *rule, security_inode_getsecid(inode, &osid); rc = ima_filter_rule_match(osid, rule->lsm[i].type, Audit_equal, - rule->lsm[i].rules); + rule->lsm[i].rule); break; case LSM_SUBJ_USER: case LSM_SUBJ_ROLE: case LSM_SUBJ_TYPE: rc = ima_filter_rule_match(secid, rule->lsm[i].type, Audit_equal, - rule->lsm[i].rules); + rule->lsm[i].rule); break; default: break; @@ -966,7 +978,7 @@ enum { Opt_uid_lt, Opt_euid_lt, Opt_fowner_lt, Opt_appraise_type, Opt_appraise_flag, Opt_permit_directio, Opt_pcr, Opt_template, Opt_keyrings, - Opt_label, Opt_err + Opt_lsm, Opt_label, Opt_err }; static const match_table_t policy_tokens = { @@ -1004,6 +1016,7 @@ static const match_table_t policy_tokens = { {Opt_template, "template=%s"}, {Opt_keyrings, "keyrings=%s"}, {Opt_label, "label=%s"}, + {Opt_lsm, "lsm=%s"}, {Opt_err, NULL} }; @@ -1012,7 +1025,7 @@ static int ima_lsm_rule_init(struct ima_rule_entry *entry, { int result; - if (ima_lsm_isset(entry->lsm[lsm_rule].rules)) + if (ima_lsm_isset(entry, lsm_rule)) return -EINVAL; entry->lsm[lsm_rule].args_p = match_strdup(args); @@ -1022,8 +1035,8 @@ static int ima_lsm_rule_init(struct ima_rule_entry *entry, entry->lsm[lsm_rule].type = audit_type; result = ima_filter_rule_init(entry->lsm[lsm_rule].type, Audit_equal, entry->lsm[lsm_rule].args_p, - &entry->lsm[lsm_rule].rules[0]); - if (!ima_lsm_isset(entry->lsm[lsm_rule].rules)) { + &entry->lsm[lsm_rule].rule); + if (!ima_lsm_isset(entry, lsm_rule)) { pr_warn("rule for LSM \'%s\' is undefined\n", entry->lsm[lsm_rule].args_p); @@ -1561,6 +1574,19 @@ static int ima_parse_rule(char *rule, struct ima_rule_entry *entry) &(template_desc->num_fields)); entry->template = template_desc; break; + case Opt_lsm: + result = lsm_name_to_slot(args[0].from); + if (result == LSMBLOB_INVALID) { + int i; + + for (i = 0; i < MAX_LSM_RULES; i++) + entry->lsm[i].args_p = NULL; + result = -EINVAL; + break; + } + entry->which_lsm = result; + result = 0; + break; case Opt_err: ima_log_string(ab, "UNKNOWN", p); result = -EINVAL; @@ -1597,6 +1623,7 @@ ssize_t ima_parse_add_rule(char *rule) struct ima_rule_entry *entry; ssize_t result, len; int audit_info = 0; + int i; p = strsep(&rule, "\n"); len = strlen(p) + 1; @@ -1614,6 +1641,9 @@ ssize_t ima_parse_add_rule(char *rule) INIT_LIST_HEAD(&entry->list); + for (i = 0; i < MAX_LSM_RULES; i++) + entry->which_lsm = ima_rules_lsm; + result = ima_parse_rule(p, entry); if (result) { ima_free_rule(entry); @@ -1830,7 +1860,7 @@ int ima_policy_show(struct seq_file *m, void *v) } for (i = 0; i < MAX_LSM_RULES; i++) { - if (ima_lsm_isset(entry->lsm[i].rules)) { + if (ima_lsm_isset(entry, i)) { switch (i) { case LSM_OBJ_USER: seq_printf(m, pt(Opt_obj_user), @@ -1872,6 +1902,9 @@ int ima_policy_show(struct seq_file *m, void *v) seq_puts(m, "appraise_flag=check_blacklist "); if (entry->flags & IMA_PERMIT_DIRECTIO) seq_puts(m, "permit_directio "); + if (entry->which_lsm >= 0) + seq_printf(m, pt(Opt_lsm), + lsm_slot_to_name(entry->which_lsm)); rcu_read_unlock(); seq_puts(m, "\n"); return 0; From patchwork Thu May 13 20:07:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256441 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B325DC43460 for ; Thu, 13 May 2021 20:13:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 91F12613B5 for ; Thu, 13 May 2021 20:13:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231690AbhEMUPE (ORCPT ); Thu, 13 May 2021 16:15:04 -0400 Received: from sonic317-38.consmr.mail.ne1.yahoo.com ([66.163.184.49]:40094 "EHLO sonic317-38.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232353AbhEMUPC (ORCPT ); Thu, 13 May 2021 16:15:02 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620936832; bh=OFynm7Fw2GPfTv1ptUt/Gy9TgwZaREJMG/33YxcNKcE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=qJIYnMjoz3yl+1TVYVi9Wrvj3iMuBPS4JT2ai/O1amApdDwfepNLzXlC5CH1auZi1GWbSemrI1oBPoyyh73Tr8q4GdyfxtsXBQ9v7M50tnN1yehdE+MwILYyU3yENg7ZZ9tnSo4TR2tV1uRiVBsO7DojMDiCjb24Lq4FB8zTjRdeZgJK8ohTvzR4VRH4R2ZomC76qtLT1LBq0UkUN1jXotFNAgqw0e2AakLg+fGMer1/mHB3NE05me/ddzlyN5/JGpZpVYv66d0oARoV0yxavbETwrdJ3UKQYqoViuEOKRdCRP9Jzam4KTCA/DjoZP4CrctLb+rGGCo9Xow0JrcEvw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620936832; bh=7ru4Xw1PGwBw+K1Y9dag/fJvO7/sDXFIlqPbH1ITwPk=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=b3jEsJqsrcKJa7QrSeV9HlXw2NCwPTIMZrZI9tj+8xZtVTCR+fSlXz8vaFLYlJu8MLhzdHEsq1DG8nBAIyKKh4EqvZSehv8kf7mY9KepOsZGDFoECoApZX3pk+QKHahJ+e/d6nuDxIV9m4PivdCZd3Kp0OJkcYc2xh8VnwDgbc54UGTTcN96BMqmUkIDpdsM2qAIjIqAO8eIJDZTNJS/L4D4mWCmpS6b4J8PU4UZzd+YRXciMryLM6GRn1cL/lFh7L5jSVsyOi9T9hDSji8DklsvXZLfAeAZAwcSZC68HPSxeuikTBK5Z4iG/1QRRL/4Tn2/Gm/fFqNmfsEeDrcBaA== X-YMail-OSG: 9DpdEtYVM1k9Cgov9oecC6sUIzbTLM5wMHvm8IpSu8hMSiTwQsGppOSmJIJ5Cnw nqPoVyy3kytyY7_AzG_dHQpfH0o_vXszE24.B.JQykGiAvh8ko9XL5ep9qIZrwJOhIQKiqwnt0b9 yFgo9Y6UnkMEEfjsCxX5_kHDKjvGe_G25WO3Do3xZfwnSqzpc2eURT5TTz1L8hPkwS.PG6m8DSt6 tLF99fPaVLqoB6dGIGybYocLu61u6TGwP02fKr.BHvwf3u4Vme50xfYXWCCfrivwU3VtbAboI0mk qFtGymv5eTPr_3YZb03HI.IRpf5utS_ltl5NmdLDZHrY2jKiKUgpRu2MOofPmQkdobx8iZjwUuxc Ls9lPq16_t1HIxtQZcsHkI5c4Vvy_AGhV7_zL5KoKJMBaf41tLDN5aMPWuXpIUg_ruTpwMS9KJnv rCBWgkfvl2f8IHJzxV5V7lZyiNCOfiGlr88tkvjBSZJdgSh0o8KB3K6p2EzvUeV.Jr_8ayri6yaP 6WueH6rgRYthqkH2TEPuSJ5DLovOYOQyF80Mp8PhQxCwVosbs_dQUqhxXCYB5vc7vcGRC71T96ae 6TOsuvobxel54kpqBPIPGP2FxXIpCUpAwNb9ZByWVzaWGgeG_Nb28Fecho53O0icenjoqfJNkRC0 tw8W09bnbkBv6mYd0XSYpA1p1wlrJIrRS1tD6uuGRJONi7hWmrwBcKXqqQzVtXk6Tcc3giruUghZ uvxhbKZlNqu4l62By1TBke5zCCiPHE3bAI0w07LkoZl1O9euk2pIiRmr1GUVcx1HZ0Y3Eu6jGCPj cwQLTYJeIMJgbcCC_r0ZFr46kwM5Kc9NZUSVH5YKG5bCGTKERLTBBAlaXYvSrzkhZMyvLyK5QGSp uOM6oU6ij56HL60rj0rHKluCgTLZ2OvXVBtZNtl.lNfvIQcVPAeJC9r1sSkt3tS_GQuMInbAdVBm FB3FvpVWHTZL8BIAedQY_VEvf.gwnHrhuW.8y.N0Wir0ClRvcHcyuIu0MSnYwlYC8dmX0PdcWHCm DfTJ35FgCjNszlJFC_dky74D9dfO9rnGLxIEKE.YnUCvNlnYYGspqixZ64SGPjNQtDPclEDDoVZf fwhUfe44EUaIavovZrOVg5RMt7C8pRFCP9LaHh5Fu2gQIxguhn1sIfQBTQsjLSFM1rOyplmDsw3d QBkDWdY_KR.XQgEzdgiJ4rm4Wh3zBNnzrKev1W6uO1u9_DrtTZ.kgF0FcnB6wGFSeCnyUZa1qfql IuzeYVB8G_cySHYSQ.x_7i4vgHt.h.ibqmOpQhCbLcFZRrj8FLpFJPeyQED6id0OexjtK9k9ZpXG KZIz8AIqUO2dfecsSQcWIGnhuhQPvq9EKK8cZKx0Y.8tD4tpObd670yBOONHQrRthDLWPo0kv2hg BQhM7DQt5UuiwiqI9oPsdUwNTskezBZg4yiwt7IN0yGHge80onsbBMSIqpLBlap9tZeQG5dAA2Q_ dG4_vIvQMfIh7LwcMy5EdiOuqgJHNowHNxhrve1e1CGRszZqiImuaj.ctxSss.VsBWXXQapMCqjA NASQHCQ3JoyIJCFMe0JogecUFieu4vfh4.7SfGls19uILVGPFUoWBSUWVaJUdskxRAL_R8WNnEKx RrPG2uWiDeQcxd.kAJOvqYoxof_m4o5e0kwHKUzqWbNan8KdfpsrkyDK1XlYVT86tO1O8rrXg0RX ukFxlmvz9jtPCdKwSaKZG3uUJw8p_EYbe7dcbA8GzHPH4n3gxKVaJVsOerjT9kh70Ktdvz5uvE._ GGEzY1snGezJZihmlj3eb8KCMMMKTRasL7oFCy8Qfa4.Dha3NlX_ihv_79K8BpdlyyOxK.AoqvdG EXwtLd2hukZqyeOu843xzuGWKPN2yOgT0PjDINr2JDUn4R4oC8JanAE0bqnKZzXfJW1NTUQ3PdbX gmjitARg2z.kkGC5MKhXACWB5PuXVUu766phzlE7QhP9v8r1pi5ZDcPIdM8CcmqRyefmsW6NZaDK fSnC5bV2B4QjM1Jg.KGllvBbjQt5k0pO7lBiuQAXgG8WtjyyLd2htCz6P99Rmpren84idIFg37Wv ondzAK5xXTnRPGTGEjFXtIA9VDT9YsK__1V62PnQFqe13vrGwMEyos14xxotPWkGtm_HvgEEtjRc HH2I0UQNVyGinGuDJQTap13PNOQlISk6BuB92ZZ.NDxnwD3mUHMIdSReZkzVksXZcTyVkBorv4FG jhgtZ2Jj2lzPuunSOA9rDofXxXiXurdQzMextRefl_d7ltRAvyYvRO2Wu5Db55LnKAuxVlXWE8Pp X5j3H_Zz3ATPAzs2lHE.Yza4ojIF3rY1gEJaIB9fBsQ0pztGqnjtYMRFd_MIR790TPgGODa59SK5 NPJ5v3MCz44F_E3kRry6iWeeJ445sYt6udTHNDhErMbrfDPAz.PDq1Sp_TONdYK34S2tj_bqZRgP 9UVPNdl8R1bkBdQyYGWPX2GLqp8RXHYbmBjyd7sWRbifBQ4B0Zjl7g6qQu.eTSkP4nnGbXerKWnE JfTdfuOf5J3uXngL3z6NofR1tqgwZJrldZtPJOSBBcUfkQlxQ6J8QF2q6jM921s_mY.LVPreguTh 5X2rH9VYzXcN0wLFsjwX0drvSvGxdunfxF_VesPLSbfApw9N_B90pcyChb9e59N2MkMkeKlqLBlm juiJZ4cf2zhaUgkhzfTG0mU0Mjsaavhr.5RBus.KOBB1AU8sm9M9r_7fuHV4L4KePNto3pCfWEm5 YayJKf8erv9VDqN.rYGqWeGzq7YUDLjB3i9wePMCF.0jRWM9lZ.1fYAxHuVELHfJWeRdewiZ68DS INxeOBvoFgNKDsurci_IMNB7ufqQcgpRXs7usDOVzzX0STJzWNQsHzRRrDYZyndVrMWlAj2AaGud NGCbKTrO49Ok2b0Lu6zujPRK6j.tPKo7BpTg_0XZqOc3v7VNSG.SzvwFQOVyzsQyvIVp2NY3hWAZ gjtfAcPgipE.rAq4PDtYc7PzYhZifveOR_Lii4yXmAs.i1nwqAi1nhPODWos_8nKDagXxHyuCJO4 LSISQLgRVZNoyyT2aMGXdf1.Pn1oFbVpKgGxHaGATKhebSSx8qXruJRq3ISRPpn8UnWMbIlGcyF2 YK1R01.NJZ4mWxe5lh0mizVwrh1JD8lRGiwoa_XT_PotM1PGekR6bc1DbP5W23x0_am3X2fEr X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic317.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:13:52 +0000 Received: by kubenode548.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID ceca9e904f329847202ac738b4e9f228; Thu, 13 May 2021 20:13:48 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, linux-integrity@vger.kernel.org Subject: [PATCH v26 05/25] LSM: Use lsmblob in security_audit_rule_match Date: Thu, 13 May 2021 13:07:47 -0700 Message-Id: <20210513200807.15910-6-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Change the secid parameter of security_audit_rule_match to a lsmblob structure pointer. Pass the entry from the lsmblob structure for the approprite slot to the LSM hook. Change the users of security_audit_rule_match to use the lsmblob instead of a u32. The scaffolding function lsmblob_init() fills the blob with the value of the old secid, ensuring that it is available to the appropriate module hook. The sources of the secid, security_task_getsecid() and security_inode_getsecid(), will be converted to use the blob structure later in the series. At the point the use of lsmblob_init() is dropped. Reviewed-by: Kees Cook Reviewed-by: John Johansen Acked-by: Stephen Smalley Acked-by: Paul Moore Signed-off-by: Casey Schaufler Cc: linux-audit@redhat.com Cc: linux-integrity@vger.kernel.org To: Mimi Zohar --- include/linux/security.h | 7 ++++--- kernel/auditfilter.c | 6 ++++-- kernel/auditsc.c | 16 +++++++++++----- security/integrity/ima/ima.h | 4 ++-- security/integrity/ima/ima_policy.c | 7 +++++-- security/security.c | 10 ++++++++-- 6 files changed, 34 insertions(+), 16 deletions(-) diff --git a/include/linux/security.h b/include/linux/security.h index ca9485105f00..916a0f606035 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -1944,7 +1944,8 @@ static inline int security_key_getsecurity(struct key *key, char **_buffer) #ifdef CONFIG_SECURITY int security_audit_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule); int security_audit_rule_known(struct audit_krule *krule); -int security_audit_rule_match(u32 secid, u32 field, u32 op, void **lsmrule); +int security_audit_rule_match(struct lsmblob *blob, u32 field, u32 op, + void **lsmrule); void security_audit_rule_free(void **lsmrule); #else @@ -1960,8 +1961,8 @@ static inline int security_audit_rule_known(struct audit_krule *krule) return 0; } -static inline int security_audit_rule_match(u32 secid, u32 field, u32 op, - void **lsmrule) +static inline int security_audit_rule_match(struct lsmblob *blob, u32 field, + u32 op, void **lsmrule) { return 0; } diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index a2340e81cfa7..6a04d762d272 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c @@ -1331,6 +1331,7 @@ int audit_filter(int msgtype, unsigned int listtype) struct audit_field *f = &e->rule.fields[i]; pid_t pid; u32 sid; + struct lsmblob blob; switch (f->type) { case AUDIT_PID: @@ -1362,8 +1363,9 @@ int audit_filter(int msgtype, unsigned int listtype) if (f->lsm_isset) { security_task_getsecid_subj(current, &sid); - result = security_audit_rule_match(sid, - f->type, f->op, + lsmblob_init(&blob, sid); + result = security_audit_rule_match( + &blob, f->type, f->op, f->lsm_rules); } break; diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 392afe3e2fd6..71d894dcdc01 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -472,6 +472,7 @@ static int audit_filter_rules(struct task_struct *tsk, const struct cred *cred; int i, need_sid = 1; u32 sid; + struct lsmblob blob; unsigned int sessionid; cred = rcu_dereference_check(tsk->cred, tsk == current || task_creation); @@ -670,8 +671,10 @@ static int audit_filter_rules(struct task_struct *tsk, security_task_getsecid_subj(tsk, &sid); need_sid = 0; } - result = security_audit_rule_match(sid, f->type, - f->op, f->lsm_rules); + lsmblob_init(&blob, sid); + result = security_audit_rule_match(&blob, + f->type, f->op, + f->lsm_rules); } break; case AUDIT_OBJ_USER: @@ -684,15 +687,17 @@ static int audit_filter_rules(struct task_struct *tsk, if (f->lsm_isset) { /* Find files that match */ if (name) { + lsmblob_init(&blob, name->osid); result = security_audit_rule_match( - name->osid, + &blob, f->type, f->op, f->lsm_rules); } else if (ctx) { list_for_each_entry(n, &ctx->names_list, list) { + lsmblob_init(&blob, name->osid); if (security_audit_rule_match( - n->osid, + &blob, f->type, f->op, f->lsm_rules)) { @@ -704,7 +709,8 @@ static int audit_filter_rules(struct task_struct *tsk, /* Find ipc objects that match */ if (!ctx || ctx->type != AUDIT_IPC) break; - if (security_audit_rule_match(ctx->ipc.osid, + lsmblob_init(&blob, ctx->ipc.osid); + if (security_audit_rule_match(&blob, f->type, f->op, f->lsm_rules)) ++result; diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h index f0e448ed1f9f..55f3bd4f0b01 100644 --- a/security/integrity/ima/ima.h +++ b/security/integrity/ima/ima.h @@ -433,8 +433,8 @@ static inline void ima_filter_rule_free(void *lsmrule) { } -static inline int ima_filter_rule_match(u32 secid, u32 field, u32 op, - void *lsmrule) +static inline int ima_filter_rule_match(struct lsmblob *blob, u32 field, + u32 op, void *lsmrule) { return -EINVAL; } diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c index d804b9a0dd95..a05841e1012b 100644 --- a/security/integrity/ima/ima_policy.c +++ b/security/integrity/ima/ima_policy.c @@ -607,6 +607,7 @@ static bool ima_match_rules(struct ima_rule_entry *rule, for (i = 0; i < MAX_LSM_RULES; i++) { int rc = 0; u32 osid; + struct lsmblob lsmdata; if (!ima_lsm_isset(rule, i)) { if (!rule->lsm[i].args_p) @@ -619,14 +620,16 @@ static bool ima_match_rules(struct ima_rule_entry *rule, case LSM_OBJ_ROLE: case LSM_OBJ_TYPE: security_inode_getsecid(inode, &osid); - rc = ima_filter_rule_match(osid, rule->lsm[i].type, + lsmblob_init(&lsmdata, osid); + rc = ima_filter_rule_match(&lsmdata, rule->lsm[i].type, Audit_equal, rule->lsm[i].rule); break; case LSM_SUBJ_USER: case LSM_SUBJ_ROLE: case LSM_SUBJ_TYPE: - rc = ima_filter_rule_match(secid, rule->lsm[i].type, + lsmblob_init(&lsmdata, secid); + rc = ima_filter_rule_match(&lsmdata, rule->lsm[i].type, Audit_equal, rule->lsm[i].rule); break; diff --git a/security/security.c b/security/security.c index 9471bcecc052..a5793b4bf684 100644 --- a/security/security.c +++ b/security/security.c @@ -2669,11 +2669,14 @@ void security_audit_rule_free(void **lsmrule) hlist_for_each_entry(hp, &security_hook_heads.audit_rule_free, list) { if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) continue; + if (lsmrule[hp->lsmid->slot] == NULL) + continue; hp->hook.audit_rule_free(lsmrule[hp->lsmid->slot]); } } -int security_audit_rule_match(u32 secid, u32 field, u32 op, void **lsmrule) +int security_audit_rule_match(struct lsmblob *blob, u32 field, u32 op, + void **lsmrule) { struct security_hook_list *hp; int rc; @@ -2681,7 +2684,10 @@ int security_audit_rule_match(u32 secid, u32 field, u32 op, void **lsmrule) hlist_for_each_entry(hp, &security_hook_heads.audit_rule_match, list) { if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) continue; - rc = hp->hook.audit_rule_match(secid, field, op, + if (lsmrule[hp->lsmid->slot] == NULL) + continue; + rc = hp->hook.audit_rule_match(blob->secid[hp->lsmid->slot], + field, op, &lsmrule[hp->lsmid->slot]); if (rc) return rc; From patchwork Thu May 13 20:07:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256443 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E9551C433B4 for ; Thu, 13 May 2021 20:14:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C4CF6613B5 for ; Thu, 13 May 2021 20:14:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232588AbhEMUQG (ORCPT ); Thu, 13 May 2021 16:16:06 -0400 Received: from sonic307-15.consmr.mail.ne1.yahoo.com ([66.163.190.38]:46364 "EHLO sonic307-15.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231433AbhEMUQF (ORCPT ); Thu, 13 May 2021 16:16:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620936895; bh=7GLBJ9q9xynOHHMnv5lf6iZMWnRl8q+xA5RjkGSHJmM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=Ba0n6fCDseURLL0DluqAHVt4uNRdvfhJDGA4B7ZQN0s/UQazTdNAoSmhTSJB7JixcH7KA7PX2+uPYBgmyS68KxprxHZqgY/X6DooMWKOhNhTygquHvIy4Vr2p4wsf9zH0e6C9Iq9caRiFnU15d8xm8j9+0Be/JcpV0fyclHtrJwFczmLTAHnUNNV+CjQg6Bxr3aPLbbFWqFd5I+ZEx2EHQl0KcHc4QN5gF7s7dEUhmhzG68AiN39iAdmBfaMKmRI3tKrR66Fp7UPBogfebnC1SPp9hMxAWbXgWJ2LT6Unpr7Gmxr00DDHcIgvlLOL0RdneQf6wcSTRLykqg7fU9nFQ== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620936895; bh=MY9tdjYo0reChE1POFOHjb/j14T0MdaZ1zLsA9QAAyL=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=KtexYDdB4KVFzkAMo/NN5qkZsdmrgGhY4LZqPz1FJHm3gmA1INqTqeyW7pzgcNO8Olkq9NJVVivCFWSpQ1vjoZ+ZzU1ZPaBZMmY5RgZL7+pHAEyrrclRD3uU5NFOd39m88F357M7OAZQsK3lZzLW4Yk+uJ/BpjcmI3L/EHQ72INNvc4tAmI1llH1bbOkNR5WOiG97g4pp0ewBGdurqrXmslQcaq8enLkvTuDq0nw98etodfiDr8UcuX6FcVZ6TuGksjMuKY4dBZCxqwU3FnCBKmHD3nq6ueI0cHVqiODH1ibBJYDCDxxp4WNScVh6nerhAtq0bzKshAGK7/S5JJ8wQ== X-YMail-OSG: sW0HHFMVM1mQUgJ4sLJk2aQ_5JrRNXK4kXRdp.aTBk5ift9KUZiKmizyl_ccmW9 pD0kELsEJw0ym.AG6.vAin7ynt3AR_.AwbydD4gh3LKvNLpqZQsXuz3aKACwmxbXe9awpJ1z9_Gn GhFs_CGV3WWSvubAi8hJCi.E.BHTWQeO6AIptLrsrjwy63vxZnwafkJ5CQk1LsSsdABrjwhhoEii YaLtTa5edClNkotI9zILyI.EFBHW2gXUqJvql5e9wSMgkRA_MyB40adPrNeXt3ypfaVh6GWDOHsI 6bpPvmVV07Md4KsNFXMSSVKjAb01T66AxRa6pVHsNda.sYucxkjAjdwMwztuu8WhklaJ1d4nMID3 kjspB6ygtZzHDO2JZa..eIUeQtDAy7Pm7BmpbTd.HZvMXCbDiD7014aRuLgh.WSsF44eHbjQWN6c PEpKAHC.CcRS2eaRtU.Zulj3ax0hPnrtKjzS8UkzRa_3hXGWN19JFixHWqbWBaRylGwDJ5VdjtvQ s2mEzGjX3BsLo3Kn0_aJcXhjCPn43Smt.b5OIkmHZf5BnS24asVl4omozqph4oHURol0ZXwfSmoM at.uGbwWIVTw9PEVKFdl7_pN5pefYjjmWKSBfRcw1g81NOVH2ZGO6BmqhAg4jFBGL7fqEWju4_xy hzuAXkGpSBr33Wyvmi24LZuoPGtiLe3txyTirmREiqJz_yO_HtkHW9NkLq5UK8AdxsMg9PMfXL5r Zz0RpXlikUbaDnG2dTeoFUkd8GTpkyG2Rllu0ljD8H6.uHlsdtI14inqasIECpMYafonPqJ5NmtF 4w2HQrWS_H8VbZ6bX02OBxJmVYJR5d2I5pKiUssVguqNHvZFTlGnThntAdgNVntt.45p5x6DeEe8 veWIlkaNKfdE17wkPBvkFnwVBcZl8tApLc59V5NwQFxstiibGQZ3j0_Pl2LMwfkeW0hLGRYjWFtu 3NXMaGDFFhfvCKoJCG3tA0YUKq_Ep.hZlnPsayDS04EFwH7EzZjqM1093krC74Lw8ucHLpWeDV6R gVb.vdEkw7ISboqjQHRnOKW_OA6XXDKOdwFAKox4d1S8o2sYCnWtBjf91jxXiw3b_nN5T0p9FELt ezPBbHhBRocNA046QE1awDsWajXZItvUKwSEusAoP48Mtbwj3WJkPwBRIWy6stad3s95An50SAfF ODNo7pYGrJn9q636.JFiDE6qJwMU2bPsEols1P3cO7M_22mjf47WAyqBZfLx_JW.orXEM8E5yHUN NrAZPB_RHbEOr1n.ScbRHciyLKiKKI4CWWxg8S7yF9WKLFpyDG8DMk0yp2Rs71eqDjvhZU3_MXOu W6H56eoUQGmIqAslhsQBXCP8IBqsNaF2L_MRpzBEBl3Pqy5INGpcyewR10cDP.4adT1zwb4BDhLI 3_ahyU1XDvhdlRbLT.imwJgr3EpikgUipNIXOkJsuI32pjtylWzg4hgiDv7LzgCf3LpihLBD6eQK COWm8OyfaI.nn2rSydCP2X5dSF9vTFMJJL0_YdPrzj8yF59CwlSGITPjPhv8OD5NPGLX4bKKHCvR vEcUlmazTBWtWZRvJfyHVtztV9czzTt_ogVyN6sXLzHKxB27ffDRuXRhmglGOXsFQir_yJ9_hENN VxsygPAfsGJqtpCPjGCW1zAA4syohrueKDRgXjRpNKMhSvnwipbdBApPvIg9xjlaaCKv_dcd6PXu V5GcfjkRI9h24WfTAFgfurs5ztgeTTOiVAYGlrN1tw1VWb8rwaM4rpxcKk8Eq_nQtMOKeSSz3ChG ngjCDeCeYBW0CFqrXigp_P4NBo7TTVd11aOf8EtNPwWeIXeVetarHiHY1WjJHjSUims4sfitykLu 75aGA6GcWhYRMtdbNd.qEIHf9S0FY0FE7_0Ai6GZyOrihAemRuJTF6L45S1y4W4GSU604A79efY9 FeAmjiyAFxaZtR1fpj7clYeAL2_I2VNcRQrD7nH.l7kbNAXUgLXzKc9xt34wAMniiLdKqm1c2rWq utkYgwJ9LBvSb0el4hjJIzemTaMeDpJmJp1wz80KetAFrV6n5zSPOc_KVHZH8CWd81X3i53e.S1I Xq07Q5hmkU3FUCHdQJcs3_q6yU8o8WKmFXiHbjllJ3LnzpSbJZ1CaPKNvVDqAePSYk7TMNXjniQC SPOWqaDcFQt9C5bh0oMnHurQVVeG4xFalgg68.HcKs1djhs0.PCQJ6rTmIg5HdSrsFgEFGBFQ4zc m3sbpOifcXRrQND0r9HzK0KlluPNUrD3WwW8ZCQI1n.DRNjP9XqnToP350cB199QPojxO5EfbXjw rYkH.PPItnuHPnKXK5yOeksqcV74TCyfLjip4s1A80DZfPlW159Y4_hqum4Z2CHQm14MqffctT8W fPmOKpk_EmL6BMGrLrLCBeMiV_Iim2ORDRobjoXlHmDYJ024fMg00MQr5YdNdhWCRafJ0RCriLcR b_Pi4beThY7Uwmjbwb__itrGQ4R_zszBzHFaoPRNg1CksPKFX0LcEl9_O7uStxwsx3xPI3PeSD9K KtxsyfbNA7YCCEds4L2dYG1zA3tXLE88vZH_YA0lFNJOOGbdDk5NIVe7iB8mU60K9OfAJvXsM2Et pPh.exgM_qnwDwP5zXYOjcThz4TFK.0yJ9QdoFKYsHDyJehqp5ff0W.xFY3ZOL031SHlBHhZd8WJ oZWPTqGnSezM.kz0oOIpbYaVrM.5yi6afDYPynOD8e1QMO6td8YHZRdWxm1fkYl7S2I9J6KlX_9i l3mQVPv_DAsTMb2_OS1XZRrmDksTWFnaFtEQxlTAAhMlqUqs9J6i3xrqOG772dQsmd17sSOiUN9z dMeRCpC3hxK9vHSt9a9pOZeSug6KGZEtlFVkgtQF0oacCsosrjs3OnWa1pw19tZwp8obka.I11Qa XkogLnihTHAn6V8RIKco3aypU_JOVit_GORJ2F0zui1T9m2uMj73TJCBl2Im_7LEGBt5eGP0OvHP dHEdeWJXpkA07_6F37kOnupjEr9UyTzQHRuRga2iiw1suhheD89HyKUC5ZD8ToYcO_XqgStPNtFs WxQpx4i8qbXWwFwIca9TO2Bk00n6LZb70TKoCO6kil0BfiHjMA3eRCjGtWrGYkrNZwXUAs4unVS_ rBHMi3DRsnYicffYH9n8sUERTCsxAt4poCVNl3nw- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic307.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:14:55 +0000 Received: by kubenode545.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 736f0a4fea2c7fa7a939d0171f4f5b63; Thu, 13 May 2021 20:14:54 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org Subject: [PATCH v26 06/25] LSM: Use lsmblob in security_kernel_act_as Date: Thu, 13 May 2021 13:07:48 -0700 Message-Id: <20210513200807.15910-7-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Change the security_kernel_act_as interface to use a lsmblob structure in place of the single u32 secid in support of module stacking. Change its only caller, set_security_override, to do the same. Change that one's only caller, set_security_override_from_ctx, to call it with the new parameter type. The security module hook is unchanged, still taking a secid. The infrastructure passes the correct entry from the lsmblob. lsmblob_init() is used to fill the lsmblob structure, however this will be removed later in the series when security_secctx_to_secid() is updated to provide a lsmblob instead of a secid. Reviewed-by: Kees Cook Reviewed-by: John Johansen Acked-by: Stephen Smalley Acked-by: Paul Moore Signed-off-by: Casey Schaufler To: David Howells --- include/linux/cred.h | 3 ++- include/linux/security.h | 5 +++-- kernel/cred.c | 10 ++++++---- security/security.c | 14 ++++++++++++-- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/include/linux/cred.h b/include/linux/cred.h index 14971322e1a0..5a3f0fc3090d 100644 --- a/include/linux/cred.h +++ b/include/linux/cred.h @@ -18,6 +18,7 @@ struct cred; struct inode; +struct lsmblob; /* * COW Supplementary groups list @@ -164,7 +165,7 @@ extern const struct cred *override_creds(const struct cred *); extern void revert_creds(const struct cred *); extern struct cred *prepare_kernel_cred(struct task_struct *); extern int change_create_files_as(struct cred *, struct inode *); -extern int set_security_override(struct cred *, u32); +extern int set_security_override(struct cred *, struct lsmblob *); extern int set_security_override_from_ctx(struct cred *, const char *); extern int set_create_files_as(struct cred *, struct inode *); extern int cred_fscmp(const struct cred *, const struct cred *); diff --git a/include/linux/security.h b/include/linux/security.h index 916a0f606035..5c664ba0fbc3 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -461,7 +461,7 @@ void security_cred_free(struct cred *cred); int security_prepare_creds(struct cred *new, const struct cred *old, gfp_t gfp); void security_transfer_creds(struct cred *new, const struct cred *old); void security_cred_getsecid(const struct cred *c, u32 *secid); -int security_kernel_act_as(struct cred *new, u32 secid); +int security_kernel_act_as(struct cred *new, struct lsmblob *blob); int security_kernel_create_files_as(struct cred *new, struct inode *inode); int security_kernel_module_request(char *kmod_name); int security_kernel_load_data(enum kernel_load_data_id id, bool contents); @@ -1103,7 +1103,8 @@ static inline void security_transfer_creds(struct cred *new, { } -static inline int security_kernel_act_as(struct cred *cred, u32 secid) +static inline int security_kernel_act_as(struct cred *cred, + struct lsmblob *blob) { return 0; } diff --git a/kernel/cred.c b/kernel/cred.c index e1d274cd741b..ad845c99e2d1 100644 --- a/kernel/cred.c +++ b/kernel/cred.c @@ -733,14 +733,14 @@ EXPORT_SYMBOL(prepare_kernel_cred); /** * set_security_override - Set the security ID in a set of credentials * @new: The credentials to alter - * @secid: The LSM security ID to set + * @blob: The LSM security information to set * * Set the LSM security ID in a set of credentials so that the subjective * security is overridden when an alternative set of credentials is used. */ -int set_security_override(struct cred *new, u32 secid) +int set_security_override(struct cred *new, struct lsmblob *blob) { - return security_kernel_act_as(new, secid); + return security_kernel_act_as(new, blob); } EXPORT_SYMBOL(set_security_override); @@ -756,6 +756,7 @@ EXPORT_SYMBOL(set_security_override); */ int set_security_override_from_ctx(struct cred *new, const char *secctx) { + struct lsmblob blob; u32 secid; int ret; @@ -763,7 +764,8 @@ int set_security_override_from_ctx(struct cred *new, const char *secctx) if (ret < 0) return ret; - return set_security_override(new, secid); + lsmblob_init(&blob, secid); + return set_security_override(new, &blob); } EXPORT_SYMBOL(set_security_override_from_ctx); diff --git a/security/security.c b/security/security.c index a5793b4bf684..6a8233d746d3 100644 --- a/security/security.c +++ b/security/security.c @@ -1796,9 +1796,19 @@ void security_cred_getsecid(const struct cred *c, u32 *secid) } EXPORT_SYMBOL(security_cred_getsecid); -int security_kernel_act_as(struct cred *new, u32 secid) +int security_kernel_act_as(struct cred *new, struct lsmblob *blob) { - return call_int_hook(kernel_act_as, 0, new, secid); + struct security_hook_list *hp; + int rc; + + hlist_for_each_entry(hp, &security_hook_heads.kernel_act_as, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + rc = hp->hook.kernel_act_as(new, blob->secid[hp->lsmid->slot]); + if (rc != 0) + return rc; + } + return 0; } int security_kernel_create_files_as(struct cred *new, struct inode *inode) From patchwork Thu May 13 20:07:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256445 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8131EC43461 for ; Thu, 13 May 2021 20:16:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 60405613CB for ; Thu, 13 May 2021 20:16:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232623AbhEMURR (ORCPT ); Thu, 13 May 2021 16:17:17 -0400 Received: from sonic307-15.consmr.mail.ne1.yahoo.com ([66.163.190.38]:42472 "EHLO sonic307-15.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232580AbhEMURP (ORCPT ); Thu, 13 May 2021 16:17:15 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620936965; bh=6peqJfPdN/dXgL1H3NqXlYMZc3JP5XfQeCnyhfKc7RU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=dt14UUH11tAWZzHS+TSilH3Q34L0U+5dKQcRst3667SomT/GwGqI4ZWVOM3xXpafx9O4wdAxHtgUclO6Kir5N1yMj0CwjI2SqIgN/Y8ebsO6Q+NeO2F6behOUcmFCyJArK932BhE2VjPCoXAK0XkVq1z6rinAezGfN8QlfEhWU2WynMPvFZRM/XaQMmDo1LcKCJlZgMXZuDwG5gk515nswUg+z7R7Pt1M8C9q9BB4qsYCMKerTGHLg9ggIEgjDxFecOoIYDnNxqApuuMKs5WMLa5LEwjsX72rfev48B1M5FySRS0bSoK7/hq9Hk3TsT5OahZU6espLy+s3s5RP1yaw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620936965; bh=Gs+ITJ0evIlZvvcfYK7S0hKd0UVk7d8s4XSQRkiQYxW=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=Yrk3hysg8E2B2PcXtwwZDhakLrsjw6SS7R6lRpcAKeKVekEtyebpNtSEY4dyCsWyMb9yXme72QFu7Jfrwrb3IMlzIVXzK4K4IjN7odUI1YbBK7XCtXEIatlaiLNmJ/11kZR/Mr5W8PBZEd5e5GcraLC3Wr10LP9bx28BgLZJVR6VOl+uHW95F/snWuyNHybOkEE1QWaBHUfeZEvj6L8ve/udQPcVJJodt3qXzygzeS3MZCNLbkrXodraO4unhvqE5bW4kpInJvJu4Uvg1jGEphSfmJxvFJvyNb72M0rfePrfmLaCO2gIi7nfxGuKdfz0WgulolaPPrGng0hwXSZ7Sg== X-YMail-OSG: 9WdD2P8VM1nJW7_H5Da1oJY8f9vHcSKGnco5UypsM3YnwuhqLAkjbcvM.4RYfvU FQutqzqRNerSsf4eJPh2rBkSCeOo5lFru.7eZG2UelJfc7g50oJGeYg58ZMBaRtGT1_EXbxfk9d. dtcQMUAbpdSqF6kBF7DBizVsdSQcal.YhuyMD0R7BVO4utLD33J4UIwHY6TeOtKJFhCI8PG0c87s A.R3YeeB09h0B8ljFy1fP_2zDnm2dvXmwDmW11heWfRjEGhoRPSo_3kJWNCymdfl3pAhpcMz63Io 9mSxkCMlO3JligkiC6TZXgL6kZlfkRT8YO1Dhepc8Hi1S.mG5XI_ky4UNVKbcKqtPDyTIVqsRFa3 OMtyaAm488jkgB3hWekGux7USP5QcQVH861kv9u8MDL9a6b9zCgt5LcgofkmQQowDIst0MGK4YOg XffQcZRGlNW8w1ft5sHwebSZbbvBt_FbGdoAh_NpjAQzzSWdHIQYGu0W48.3Z6j7hPpzKKzINzbQ tXFfg6TXNVnevKXuXRiHItFHiKAt7tJOGkLqm6giQhClMO2bdM5X5.1e0NLnsO4Hrrxk69LmlOoJ d5XgFkvEprsK3m3n8DhswP7QGrNO63SrOEDMJZ94BD7aKRXo7_5UoNkvPUOvuOeZs_22tALb5qCW DZjmfHJKVEjBKNWUquSe4DuTztWd5UQdOWQsBJ26DIpOlNKlo_T0JR0v7Y.IRCSqancoyhtNufrz NUKhq16AAkRy65wCTS.sMEvHIrrKi.ReRINxF6aM9e4faGGwoV0LzVvg_JaSurCJ4DV5oA51RCeN wVVnHQt_mrGUETkIn1Yf2u_JkJP8GSPwUfiUB7bPBJTFmeAfdSOVn6K6AXjMALU9_3KOxeOVfVUd g.ZdrGHBc9xPD6nRuWDBr6S.RIbEmeCTwge8TJx0vPVpxp4Cp9oRDaHq9xWbmslCxu22rPA6z1Wz keb_vHfiw4L3b6KSqhpZ7f5byMbq00C48kAsN2QQwFtYDjZDqB93xhFrNpGuv5izpIvb2qkzciT. rwPBFesBMzw2S5qivEpaVChgmaSnATRtMv4MOh7tmlsA9zGW4cZjBYfHEEN_mQf9B58mkOuz6mY9 Nt5fuAk0CYbClbxVNH7MMV3VYKC8aP78tlPmuX97xjyI4OS1Bbvf1v4fI398ngEIgAr4689vHTKs ltDTbIATdu1RFzirBh2pzt4S.h1rWqXO79K5ofhob64oqCZgKVMSanBsSMnZGdB6ckePdBHNrsTW rzESDFHmBj.ThL5I42yqJFOGIfoGymexxyimkmetqhcRvmaGy5afU4A.WroOAdit0SZ459f4NYg4 sVzQugS4tvRwfJ32WgUE2gtKcRdexAle1v.UEPclV3JrxKcqfIqOUsUYYUukGWT5JoRQCPKfmToF sMz_R1zCxVwxeuQGqVciPQDLXWbMXH7coH6gOIJrJ_3HEhyyac1L9WGMMSjYSopFd5DsUleuIRoG o7KCs3CTTqSpdhAmPOq5NYhm1G4.2gUv492Y.fuyfJeDYei_o7TKmYvIvbpHokPDOp0Rrj0wCePD bPosD2okldr5lLTfcrFbhIqSBQk7jq1fOZkp09_S4_4UPx2iTCVTXxHaXVDQNi1sipPZeuTI4xJW H_4zVZpXNlUHB8Tpguu7S7ivpp.IpKY48I3hcJB.wL_KZ.E3zYDKMExUeQrEyl8VmcK7THIbdi1X e_t0dmWov5A4rRD.xy6Zl0ixWdkPq02D3DzRPplKzvtZkpxibB2R30FI4UipGt3pCTjLTt.PC5H2 ydC7I0GXLEZRAvoSN2IfUZT4heY22IDWuMVx2ZtuqXqgNWcMqpOQf8gU5HGeEsoMSvObeloY.jho FecLAKLoJF2gDj77x1wRY3RCu5j.e2SiXvEN3..mu959w6B_1h_MaK2y1zZSw1n39miYy.NixHjc cedOQvjrLzEeAi5NJTvHdthjL4GgZH8LXWQjsPpo8aZcNRmBl4701ktJs_FeaOiSndRJglMp8cZ1 YysuKgVZ.8Jj2TQ2sYZP5gEioG_RV4_Kw3pF1AtSMMJmJSaHZosE10ojPTIyyZzljlsHaVBx82wV UoHJXz.DCP6dejqNwIaikQ4javtXZpuXpU9q8pSK_6.SjYVLtHTlXW.fPIGwRy25H__WLp3FkYhY kW3v9ItHaVU9gVQl9ogf5xmv9d6tPAXxKuvmMVoeVqPDb1h8M8Mbz.xQG2bsFuw75Z.yv_7mr3ey PvUIiKy9YCDSgwvnyslV3_t4znX3zU4Lv0tNm8BqLZ6EKFTwi6jMOOvYVuAjzGMyMlBVkLxEEi51 NZK7ewyL3xhwFxHImbLLCXbTL0x7Y6Li8pjL9w0oFP2jlB6i1wxQgvpf7tZhzsX_kO.Pdom2pzCC JQfKgIhGdCUDcZncdiBWqM2gVZLJ2QnAJODiXEMWg0T_kmKK8odKq2bXm4DN3yBBXxS6MoyXvnNa MFtGoBCZvl3msIRtyU.ZRSG1qN7H7T5_lTAbSYypNMqp5O_3TXuw0QtMs1e66l.8KHAc2beg6dZU mzZ7YShoK_p1Hn6rdGPVq9XdeJzk0e1s2CgZDq71IHTlUYLCzIZKXbzItUkvw2kNRKJjVjsrm6MZ UALwAVIxIeBVv8AMhA6M8hYW3fW5Qn3Uj1vczNaae5fkC6.ueJUCwAJ4lnjNL3w_uP9D9Fz8Ya23 TTemYThQNVTMWbKKuCSvh.ruY6W5JDb76if0jOUfXbhCQCAHylYTnqc3TY21eQbOwD3JTq1V3Kc0 6VjMxdrSK4FFe_WP07wz9UdkZ756I1sM.Jg9UYKVntmpy8y94EGoixLaI4Me7mf_NisDVJDmat5I NSlzuXd5otVcn3.5ihiDI2SYOH3vMRrDlr3VURhuGYjtTx0pd2sWblad1apGBSZkw_MhcoyZHILk 5OUkehQQonHeFl.jooRVPf79ESSj4PjbuJin_ZsWWbSJha4qPTpA_ObNFVKBv4YZ2ubO56WT6h.C ClAyYt4bP9u0_3.xCPJ7dUwCuh0xA2LLXWNRZSGYRLA2IsVZyPnvI7Zjh677mhZxdf5A36QXl3rN kyr0D._eRLOH4qqmT02KFFAWP9lHy_ws1zRk0B2uoBerwgqKSlrIbJaNJZFJixd_oRevfiZ7Q9vF QnBj_nHQ4tnSPPA2edDaXNxTLn.nVSWmulugvH1y6YppovqEBuLVxcG_PDRqpZhrGjM96tP0sZTZ hakti_E63WfHOdwuOjhQwtd6M8vDiAWpXQFhXXJbnXhvjHEr.4kqkraAbmdlFiWI._1o4vk41pP. 05DeC6qThfBCnPeVZw3DaSts.vacVUnIjbp6557loKxDlLMnfJ0_UWQ62PQ-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic307.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:16:05 +0000 Received: by kubenode550.mail-prod1.omega.bf1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 45557b7ca7ac37bcf3f99977e8ab1c0f; Thu, 13 May 2021 20:16:01 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, netfilter-devel@vger.kernel.org Subject: [PATCH v26 07/25] LSM: Use lsmblob in security_secctx_to_secid Date: Thu, 13 May 2021 13:07:49 -0700 Message-Id: <20210513200807.15910-8-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Change the security_secctx_to_secid interface to use a lsmblob structure in place of the single u32 secid in support of module stacking. Change its callers to do the same. The security module hook is unchanged, still passing back a secid. The infrastructure passes the correct entry from the lsmblob. Signed-off-by: Casey Schaufler Cc: netdev@vger.kernel.org Cc: netfilter-devel@vger.kernel.org To: Pablo Neira Ayuso Reviewed-by: Kees Cook Acked-by: Paul Moore --- include/linux/security.h | 26 ++++++++++++++++++-- kernel/cred.c | 4 +--- net/netfilter/nft_meta.c | 10 ++++---- net/netfilter/xt_SECMARK.c | 7 +++++- net/netlabel/netlabel_unlabeled.c | 23 +++++++++++------- security/security.c | 40 ++++++++++++++++++++++++++----- 6 files changed, 85 insertions(+), 25 deletions(-) diff --git a/include/linux/security.h b/include/linux/security.h index 5c664ba0fbc3..dbb1e5f5b591 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -196,6 +196,27 @@ static inline bool lsmblob_equal(struct lsmblob *bloba, struct lsmblob *blobb) extern int lsm_name_to_slot(char *name); extern const char *lsm_slot_to_name(int slot); +/** + * lsmblob_value - find the first non-zero value in an lsmblob structure. + * @blob: Pointer to the data + * + * This needs to be used with extreme caution, as the cases where + * it is appropriate are rare. + * + * Return the first secid value set in the lsmblob. + * There should only be one. + */ +static inline u32 lsmblob_value(const struct lsmblob *blob) +{ + int i; + + for (i = 0; i < LSMBLOB_ENTRIES; i++) + if (blob->secid[i]) + return blob->secid[i]; + + return 0; +} + /* These functions are in security/commoncap.c */ extern int cap_capable(const struct cred *cred, struct user_namespace *ns, int cap, unsigned int opts); @@ -527,7 +548,8 @@ int security_setprocattr(const char *lsm, const char *name, void *value, 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); -int security_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid); +int security_secctx_to_secid(const char *secdata, u32 seclen, + struct lsmblob *blob); void security_release_secctx(char *secdata, u32 seclen); void security_inode_invalidate_secctx(struct inode *inode); int security_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen); @@ -1382,7 +1404,7 @@ static inline int security_secid_to_secctx(u32 secid, char **secdata, u32 *secle static inline int security_secctx_to_secid(const char *secdata, u32 seclen, - u32 *secid) + struct lsmblob *blob) { return -EOPNOTSUPP; } diff --git a/kernel/cred.c b/kernel/cred.c index ad845c99e2d1..b8e15dd371de 100644 --- a/kernel/cred.c +++ b/kernel/cred.c @@ -757,14 +757,12 @@ EXPORT_SYMBOL(set_security_override); int set_security_override_from_ctx(struct cred *new, const char *secctx) { struct lsmblob blob; - u32 secid; int ret; - ret = security_secctx_to_secid(secctx, strlen(secctx), &secid); + ret = security_secctx_to_secid(secctx, strlen(secctx), &blob); if (ret < 0) return ret; - lsmblob_init(&blob, secid); return set_security_override(new, &blob); } EXPORT_SYMBOL(set_security_override_from_ctx); diff --git a/net/netfilter/nft_meta.c b/net/netfilter/nft_meta.c index a7e01e9952f1..f9448e81798e 100644 --- a/net/netfilter/nft_meta.c +++ b/net/netfilter/nft_meta.c @@ -809,21 +809,21 @@ static const struct nla_policy nft_secmark_policy[NFTA_SECMARK_MAX + 1] = { static int nft_secmark_compute_secid(struct nft_secmark *priv) { - u32 tmp_secid = 0; + struct lsmblob blob; int err; - err = security_secctx_to_secid(priv->ctx, strlen(priv->ctx), &tmp_secid); + err = security_secctx_to_secid(priv->ctx, strlen(priv->ctx), &blob); if (err) return err; - if (!tmp_secid) + if (!lsmblob_is_set(&blob)) return -ENOENT; - err = security_secmark_relabel_packet(tmp_secid); + err = security_secmark_relabel_packet(lsmblob_value(&blob)); if (err) return err; - priv->secid = tmp_secid; + priv->secid = lsmblob_value(&blob); return 0; } diff --git a/net/netfilter/xt_SECMARK.c b/net/netfilter/xt_SECMARK.c index 498a0bf6f044..87ca3a537d1c 100644 --- a/net/netfilter/xt_SECMARK.c +++ b/net/netfilter/xt_SECMARK.c @@ -42,13 +42,14 @@ secmark_tg(struct sk_buff *skb, const struct xt_secmark_target_info_v1 *info) static int checkentry_lsm(struct xt_secmark_target_info_v1 *info) { + struct lsmblob blob; int err; info->secctx[SECMARK_SECCTX_MAX - 1] = '\0'; info->secid = 0; err = security_secctx_to_secid(info->secctx, strlen(info->secctx), - &info->secid); + &blob); if (err) { if (err == -EINVAL) pr_info_ratelimited("invalid security context \'%s\'\n", @@ -56,6 +57,10 @@ static int checkentry_lsm(struct xt_secmark_target_info_v1 *info) return err; } + /* xt_secmark_target_info can't be changed to use lsmblobs because + * it is exposed as an API. Use lsmblob_value() to get the one + * value that got set by security_secctx_to_secid(). */ + info->secid = lsmblob_value(&blob); if (!info->secid) { pr_info_ratelimited("unable to map security context \'%s\'\n", info->secctx); diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index 3e6ac9b790b1..dd18b259272f 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c @@ -882,7 +882,7 @@ static int netlbl_unlabel_staticadd(struct sk_buff *skb, void *addr; void *mask; u32 addr_len; - u32 secid; + struct lsmblob blob; struct netlbl_audit audit_info; /* Don't allow users to add both IPv4 and IPv6 addresses for a @@ -906,13 +906,18 @@ static int netlbl_unlabel_staticadd(struct sk_buff *skb, ret_val = security_secctx_to_secid( nla_data(info->attrs[NLBL_UNLABEL_A_SECCTX]), nla_len(info->attrs[NLBL_UNLABEL_A_SECCTX]), - &secid); + &blob); if (ret_val != 0) return ret_val; + /* netlbl_unlhsh_add will be changed to pass a struct lsmblob * + * instead of a u32 later in this patch set. security_secctx_to_secid() + * will only be setting one entry in the lsmblob struct, so it is + * safe to use lsmblob_value() to get that one value. */ + return netlbl_unlhsh_add(&init_net, - dev_name, addr, mask, addr_len, secid, - &audit_info); + dev_name, addr, mask, addr_len, + lsmblob_value(&blob), &audit_info); } /** @@ -933,7 +938,7 @@ static int netlbl_unlabel_staticadddef(struct sk_buff *skb, void *addr; void *mask; u32 addr_len; - u32 secid; + struct lsmblob blob; struct netlbl_audit audit_info; /* Don't allow users to add both IPv4 and IPv6 addresses for a @@ -955,13 +960,15 @@ static int netlbl_unlabel_staticadddef(struct sk_buff *skb, ret_val = security_secctx_to_secid( nla_data(info->attrs[NLBL_UNLABEL_A_SECCTX]), nla_len(info->attrs[NLBL_UNLABEL_A_SECCTX]), - &secid); + &blob); if (ret_val != 0) return ret_val; + /* security_secctx_to_secid() will only put one secid into the lsmblob + * so it's safe to use lsmblob_value() to get the secid. */ return netlbl_unlhsh_add(&init_net, - NULL, addr, mask, addr_len, secid, - &audit_info); + NULL, addr, mask, addr_len, + lsmblob_value(&blob), &audit_info); } /** diff --git a/security/security.c b/security/security.c index 6a8233d746d3..cc61dd46f517 100644 --- a/security/security.c +++ b/security/security.c @@ -2191,10 +2191,22 @@ int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) } EXPORT_SYMBOL(security_secid_to_secctx); -int security_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid) +int security_secctx_to_secid(const char *secdata, u32 seclen, + struct lsmblob *blob) { - *secid = 0; - return call_int_hook(secctx_to_secid, 0, secdata, seclen, secid); + struct security_hook_list *hp; + int rc; + + lsmblob_init(blob, 0); + hlist_for_each_entry(hp, &security_hook_heads.secctx_to_secid, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + rc = hp->hook.secctx_to_secid(secdata, seclen, + &blob->secid[hp->lsmid->slot]); + if (rc != 0) + return rc; + } + return 0; } EXPORT_SYMBOL(security_secctx_to_secid); @@ -2345,10 +2357,26 @@ int security_socket_getpeersec_stream(struct socket *sock, char __user *optval, optval, optlen, len); } -int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) +int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, + u32 *secid) { - return call_int_hook(socket_getpeersec_dgram, -ENOPROTOOPT, sock, - skb, secid); + struct security_hook_list *hp; + int rc = -ENOPROTOOPT; + + /* + * Only one security module should provide a real hook for + * this. A stub or bypass like is used in BPF should either + * (somehow) leave rc unaltered or return -ENOPROTOOPT. + */ + hlist_for_each_entry(hp, &security_hook_heads.socket_getpeersec_dgram, + list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + rc = hp->hook.socket_getpeersec_dgram(sock, skb, secid); + if (rc != -ENOPROTOOPT) + break; + } + return rc; } EXPORT_SYMBOL(security_socket_getpeersec_dgram); From patchwork Thu May 13 20:07:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256447 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A15EAC433ED for ; Thu, 13 May 2021 20:17:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6789D613B5 for ; Thu, 13 May 2021 20:17:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232636AbhEMUSY (ORCPT ); Thu, 13 May 2021 16:18:24 -0400 Received: from sonic317-38.consmr.mail.ne1.yahoo.com ([66.163.184.49]:42334 "EHLO sonic317-38.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231853AbhEMUSW (ORCPT ); Thu, 13 May 2021 16:18:22 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937032; bh=K+g6ymJe1BwDYckxJIENQEgzeJI9bR03NQWSV9PeId4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=DrEPIeikM+mVF85KsdSGoY/aiMiauhJ56o0Af8Plypsc6sswELOiFgg3jzWq2d3Ofp53N5CTW5eD5ZuH9ft3HH/GQLizdjyP1hWNklCU8kloUDS2qgbbanWKPAKejm+RrY8KuTPSrlLlxHe4p0PJw7LiczP7bHaV1JNLcg5pl/E17/MASBivWuZK+BnsZCEKvOeDW/SrJMsJ9cv52SZSjzzjKXQs7fmXlqFipy13H1bh+tpHxBhE7C9tUr8uZGGwrRN9qKYrEBj+zUU7DWv62ImJakl/+3tk9DpiLWfYt3aYOnkAtxLI4TfWUZpiWEA47Dbj18olM/OkghIvcLlH5w== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937032; bh=DAQk3XROJJRhAfhdKRCd2zCtzYCOllSYx4VPu37/k9t=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=L/6x8gyf3dss/6/sfk9CVMxA7inkQqJ9rhkdaqecwMKTJlnZ+wpYo/Q//McqGOTeT63r8plD3cd0AanrnA5MCk+PyctOsGgzvKiztewYRb0sje7WPRv0GVy0rb9SnJucaFAwUdIdt2nzrXJRnseEkcCeaDEi2eEpSlKg8ArEWgMYaccbKDuCJyr5JILrs0zmg0OgbzELm2GO6xH7rlPuqllWg2JHTUhqGrkrh4zrKD0qEEsPkDVaFEXeSB0De3iE4L8EGz1QwA4KgcBjL0DSxtOu1CFljHVHsCITz4yaafc6WIHIJY/MaRmvJDY4s6hHkxNPfiM0JkC0uCwicAOI8Q== X-YMail-OSG: nSPVlT8VM1k86yeXJIWFUsaD1jxHwXWDgTN3Uu9tehskZbdGxZij8zj0cEckzOd .MBjPD41CtV56BRyXZ9BxyMBdqBDH4kPZlXGkBFEzERiAwJO1k8H7FaXaMHfoWPheVEjBYlQlSnM US72gcEK2kN2qelVbJDbYJJV2n3cmkVcRZ82ZiD2t06DmYmewh3IRgaUQIHOHMAb4gbKetZnh29Z n2HM7r3aRCvOPl0dmLNDqzt2bRlvg4LPNxJz2QBiFx0yvA2OfEwrL4lBz17Tv6e1Y9MsyFpL4RIv gQ.eJZuryaHA0EAZTYlwUi1dN1WAoHwbas8thSUCFPn46BwFdljtUeJo5LZBtT0nFXG4EADC.CGQ ul32w8t40z_MuCGnd1ZVfo1QW9gMhifG73y25HdoEZTPY.oJl.0ksrd7h6R.yeDApMfceNm6LJtS ZGiXtv4mHMdK_Wk6ksgAueq8swv1p7Mf1Rt9oN5kWT3VTJqPm_A3IvOYgEH1JXgqskBrRBM_2jnS dwICvItw8FLJEQvgSHKh0shIUie6DSQW9nD4JwvgyCuLefEsv2924OkQ2KF7t80HnCHS9ThKBRJz t1NPCwZh5lNcvvmsII1qB4CA3NuSqIsVjbP9_G_nH39qvMY8P6P78A6Z8qeUNPzT19rclrfTciVS FdDuSjUyKnhWRE95LJ8_DJ6VetbVhWSFsSOyF5228OcaJWZxpFDXydqQStg5i6J.mwG8t8RIwklh lc1dr3lHOBElZQHYUE_cKHsQr7_E1DB93V3Hu2oTXFNROlYdmL23Ik28ASql52ya3XE4HPXapn7E 7ihZm1g3qX7xm1Z7jT13nld59SD4PlMS05pOcvjG.oxVQr359i6aVF2s4E8xuN4nWAIRJHi5oFuV hLiF3wN935az9Q.lljuDBSEGG3OXMJaWFJcU8Zob4x6LMfBv863.x9e9SLiQWLw19f5Unm7M8awx InOiKw2LALLA.PCY4Mam_dHy00vPjb6.sD51lJlEYEY3vpmqPF.MbqbzRW4D82zyv07LPK7LGYhc fqctYMyLXej_ZjsQ9vDFsLxKMd0.N2nflG1B2oWc9agcyv5Rxp2E6IIwn2SCDrxR9IFi4cZcnP4X bz.CUbE.FXumDQdCUc_tv_LjAuUDamefM3G6Z73_hkrOkm2JjtaMdVqscSls4FYJZzDBFSaur4um YWbw6d7UC2ThVDmlSagqVzWUHN2siG0cy.y2OhtSzKt1PCHu95orMWgwaYK9K_eSeZ6oJ94G.72e dNcuYc05fe6GB0XPLqgmz3JDBUKY3ebCFpT6itZZtA6F1gsBBmUFCa9I_2bLqWZxbkIO_Mqn7c5s FKH9Xx2XzV.0k.ndXdAIbjBKTKvkT.oPPZQmixKmTG_6l9CAljqq5gKHeQBEgCfsXLQ_xrgmjeI4 0LPbUxeV_8Kl7oxLcKf8PAqZ2kHybPFuOTMU6sWfKj.HWek.7jm8s1g2JO4a_AC17YYBO54CW2iF j.k8NqoirCYmw4wM04T1QN2i8bdeKK.i3zDW8Oe4ZTGbdOY1bdGEkofmFRJ_VjYAr6wp2IYRMjQ3 nx78MWWXdrNNAVhLLQWt_7PEkVMGOsCn3Na7gbWaDx9939ZbyiXNovlXp9.x0Jc_5ApTgx9N6hyp eedtU0x6Jd1Du4wEHRrj1UDpLSrXgiiR1qrStmwddBOmtUJRwLT6wowc2RjkujEz_C.J9zQimSnf 76im09jfT679QCnLby5FUMQ9MXebuel5ZNKQVHVmZrc9DkAFCUtwyasW1J9uKq7lY3NBm79DbSzl U6ABdygZ6eP39aHKPPVIIM5LE4u_SRxDuAgftKisDNm8XGmc6oz_PqnXildv5Qcc09IF_5NJAj2F 4UKXLPwO1xanh1ptBEqWqMjJW4RQxgwnEy0A8kKUKjQ2x.U4FZx_T3ffFo5QHoycGNv16lPWcEjN fBMemLVSze8uZ9hbImvxIWQXJ8xbHXZCdjqoqT.JhPZbSsOIJYtD5WGcU5X2itfS8Qu7B3GhEwPw wSOj33o0UPg36YE0h1dT7xwEYgH0EzhJw5J_P0AiTgt23LlL93Nvaa7V_0G2ceYIL4dQdpZ0IyPO HMobCRTWCSEJAmm9f_pPX7gJ1aXR_ncj7ABdHfi7oOBjdMfawUosMjsnytQO_wMzdLk3aCVmcmXn yRGVyoxH.q4NLMqwkyRVsx78Rt.GTcQcNrBz0t.p_NUcSEjHZr.lNAykWl0QY_EG1p9DIqI5VpZ. 3Bmi.bFtFY7hTk6YAQQOTKRnIYn3ysfSzYzWAZMLvilE74C9fHOKBc_3ufrCOUe4n.eONRbtS2kp TBW8hE4I9Pfp0TJl653zLjN.KNdvZftcEGy1AkPoyi1CnqSjeMR0JKOKkBK5LYWZPF8qTpzfHFSO AxsVBN87VMexAEYVj8WnSemJint7QBTiu4JV1HQKWA6JcAGoUcJDVrTvOB5WxjyhDmcydWEqCcKw 5jbjtqxVKbn8uDfRjXEoJnrLadUcl.HHmTHDkoRwSG8tzYUVLj9TfmpQgTj5RmMwulJZN0Uh9vBR CwFNOj2m61M4J9_HaNYKR7ohKva68mu3TIMAfSFle2.hswUJRIBekay4v5J7mp7mqwSyoVoF2di7 6iIL2JgvBoyCMKNg_e47D69V8ocjp6Yg.92hKeyoSVfh9ZQZTm99abfHx_w9IouAGks6y0srynaf Fq4EcTZWBKNs4Sf703tmLr9lkVqfJGqGmYj6JoQtaEg5CH5WESMmpAEZ8GISIZ8P30MhC_EJCdz3 RBISUi502h7YbKXCRh9_yvxUw1ZRYjV95aoUmoDL8j_GwO4T3zaeM91h4cMFgJufY4eYBuyhqj0Z xjVzL2Dxxyi9tYMOMcIgqNgJFQe5YazxISzKzEKyMUJrY0nWHGRC9heBH73pLo3UnqVjlYAwwYJE jv5hAn5fL4gwT14HUBsOP5.tx9Lo1NbAhQFnv6_36jhNO1_Dp2NuTHo_eADNV4yjSjqcoDvGo_Ms mG31jafIWKSjS9KyfeLyB2jPAksECEnU58jczHw69hOhptCi5Cc2K1Kt3GIjh2_PQ167ZmTQhXjj hNhytuQ0JINuvW_M95xmBAbDoyTnsqXQT2rsrsiaQvUn0COtJQnspA7MwZ_GacBLARfJT9re4yXV WoP8YTrUbU5YfqgrBJQ1nndEpyYEYz_YRp0DEuQIY3rWadPLoUqvmUx2lpZ4DOoE.ULl_trpqtit 9.tt.yT3JAtpSfWE0hHVTLOHaAEvv2s3sQVrsvgh_cd215_BITspsugxEx..KYtxwIMXPXpxBCVz fng-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic317.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:17:12 +0000 Received: by kubenode508.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID cb03e82022346e6b80364451e06275af; Thu, 13 May 2021 20:17:07 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, netfilter-devel@vger.kernel.org Subject: [PATCH v26 08/25] LSM: Use lsmblob in security_secid_to_secctx Date: Thu, 13 May 2021 13:07:50 -0700 Message-Id: <20210513200807.15910-9-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Change security_secid_to_secctx() to take a lsmblob as input instead of a u32 secid. It will then call the LSM hooks using the lsmblob element allocated for that module. The callers have been updated as well. This allows for the possibility that more than one module may be called upon to translate a secid to a string, as can occur in the audit code. Signed-off-by: Casey Schaufler Cc: netdev@vger.kernel.org Cc: linux-audit@redhat.com Cc: netfilter-devel@vger.kernel.org To: Pablo Neira Ayuso To: Paul Moore Reviewed-by: Kees Cook Acked-by: Paul Moore --- drivers/android/binder.c | 12 +++++++++- include/linux/security.h | 5 +++-- include/net/scm.h | 7 +++++- kernel/audit.c | 20 +++++++++++++++-- kernel/auditsc.c | 28 +++++++++++++++++++---- net/ipv4/ip_sockglue.c | 4 +++- net/netfilter/nf_conntrack_netlink.c | 14 ++++++++++-- net/netfilter/nf_conntrack_standalone.c | 4 +++- net/netfilter/nfnetlink_queue.c | 11 +++++++-- net/netlabel/netlabel_unlabeled.c | 30 +++++++++++++++++++++---- net/netlabel/netlabel_user.c | 6 ++--- security/security.c | 11 +++++---- 12 files changed, 123 insertions(+), 29 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index 61d34e1dc59c..193397a1fece 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -2711,6 +2711,7 @@ static void binder_transaction(struct binder_proc *proc, if (target_node && target_node->txn_security_ctx) { u32 secid; + struct lsmblob blob; size_t added_size; /* @@ -2723,7 +2724,16 @@ static void binder_transaction(struct binder_proc *proc, * case well anyway. */ security_task_getsecid_obj(proc->tsk, &secid); - ret = security_secid_to_secctx(secid, &secctx, &secctx_sz); + /* + * Later in this patch set security_task_getsecid() will + * provide a lsmblob instead of a secid. lsmblob_init + * is used to ensure that all the secids in the lsmblob + * get the value returned from security_task_getsecid(), + * which means that the one expected by + * security_secid_to_secctx() will be set. + */ + lsmblob_init(&blob, secid); + ret = security_secid_to_secctx(&blob, &secctx, &secctx_sz); if (ret) { return_error = BR_FAILED_REPLY; return_error_param = ret; diff --git a/include/linux/security.h b/include/linux/security.h index dbb1e5f5b591..5a8c50a95c46 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -547,7 +547,7 @@ int security_setprocattr(const char *lsm, const 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); +int security_secid_to_secctx(struct lsmblob *blob, char **secdata, u32 *seclen); int security_secctx_to_secid(const char *secdata, u32 seclen, struct lsmblob *blob); void security_release_secctx(char *secdata, u32 seclen); @@ -1397,7 +1397,8 @@ static inline int security_ismaclabel(const char *name) return 0; } -static inline int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) +static inline int security_secid_to_secctx(struct lsmblob *blob, + char **secdata, u32 *seclen) { return -EOPNOTSUPP; } diff --git a/include/net/scm.h b/include/net/scm.h index 1ce365f4c256..23a35ff1b3f2 100644 --- a/include/net/scm.h +++ b/include/net/scm.h @@ -92,12 +92,17 @@ static __inline__ int scm_send(struct socket *sock, struct msghdr *msg, #ifdef CONFIG_SECURITY_NETWORK static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm) { + struct lsmblob lb; char *secdata; u32 seclen; int err; if (test_bit(SOCK_PASSSEC, &sock->flags)) { - err = security_secid_to_secctx(scm->secid, &secdata, &seclen); + /* There can only be one security module using the secid, + * and the infrastructure will know which it is. + */ + lsmblob_init(&lb, scm->secid); + err = security_secid_to_secctx(&lb, &secdata, &seclen); if (!err) { put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, seclen, secdata); diff --git a/kernel/audit.c b/kernel/audit.c index 121d37e700a6..22286163e93e 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -1442,7 +1442,16 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) case AUDIT_SIGNAL_INFO: len = 0; if (audit_sig_sid) { - err = security_secid_to_secctx(audit_sig_sid, &ctx, &len); + struct lsmblob blob; + + /* + * lsmblob_init sets all values in the lsmblob + * to audit_sig_sid. This is temporary until + * audit_sig_sid is converted to a lsmblob, which + * happens later in this patch set. + */ + lsmblob_init(&blob, audit_sig_sid); + err = security_secid_to_secctx(&blob, &ctx, &len); if (err) return err; } @@ -2131,12 +2140,19 @@ int audit_log_task_context(struct audit_buffer *ab) unsigned len; int error; u32 sid; + struct lsmblob blob; security_task_getsecid_subj(current, &sid); if (!sid) return 0; - error = security_secid_to_secctx(sid, &ctx, &len); + /* + * lsmblob_init sets all values in the lsmblob to sid. + * This is temporary until security_task_getsecid is converted + * to use a lsmblob, which happens later in this patch set. + */ + lsmblob_init(&blob, sid); + error = security_secid_to_secctx(&blob, &ctx, &len); if (error) { if (error != -EINVAL) goto error_path; diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 71d894dcdc01..6e977d312acb 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -671,6 +671,13 @@ static int audit_filter_rules(struct task_struct *tsk, security_task_getsecid_subj(tsk, &sid); need_sid = 0; } + /* + * lsmblob_init sets all values in the lsmblob + * to sid. This is temporary until + * security_task_getsecid() is converted to + * provide a lsmblob, which happens later in + * this patch set. + */ lsmblob_init(&blob, sid); result = security_audit_rule_match(&blob, f->type, f->op, @@ -687,6 +694,13 @@ static int audit_filter_rules(struct task_struct *tsk, if (f->lsm_isset) { /* Find files that match */ if (name) { + /* + * lsmblob_init sets all values in the + * lsmblob to sid. This is temporary + * until name->osid is converted to a + * lsmblob, which happens later in + * this patch set. + */ lsmblob_init(&blob, name->osid); result = security_audit_rule_match( &blob, @@ -993,6 +1007,7 @@ static int audit_log_pid_context(struct audit_context *context, pid_t pid, char *ctx = NULL; u32 len; int rc = 0; + struct lsmblob blob; ab = audit_log_start(context, GFP_KERNEL, AUDIT_OBJ_PID); if (!ab) @@ -1002,7 +1017,8 @@ static int audit_log_pid_context(struct audit_context *context, pid_t pid, from_kuid(&init_user_ns, auid), from_kuid(&init_user_ns, uid), sessionid); if (sid) { - if (security_secid_to_secctx(sid, &ctx, &len)) { + lsmblob_init(&blob, sid); + if (security_secid_to_secctx(&blob, &ctx, &len)) { audit_log_format(ab, " obj=(none)"); rc = 1; } else { @@ -1245,7 +1261,10 @@ static void show_special(struct audit_context *context, int *call_panic) if (osid) { char *ctx = NULL; u32 len; - if (security_secid_to_secctx(osid, &ctx, &len)) { + struct lsmblob blob; + + lsmblob_init(&blob, osid); + if (security_secid_to_secctx(&blob, &ctx, &len)) { audit_log_format(ab, " osid=%u", osid); *call_panic = 1; } else { @@ -1398,9 +1417,10 @@ static void audit_log_name(struct audit_context *context, struct audit_names *n, if (n->osid != 0) { char *ctx = NULL; u32 len; + struct lsmblob blob; - if (security_secid_to_secctx( - n->osid, &ctx, &len)) { + lsmblob_init(&blob, n->osid); + if (security_secid_to_secctx(&blob, &ctx, &len)) { audit_log_format(ab, " osid=%u", n->osid); if (call_panic) *call_panic = 2; diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index ec6036713e2c..2f089733ada7 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c @@ -130,6 +130,7 @@ static void ip_cmsg_recv_checksum(struct msghdr *msg, struct sk_buff *skb, static void ip_cmsg_recv_security(struct msghdr *msg, struct sk_buff *skb) { + struct lsmblob lb; char *secdata; u32 seclen, secid; int err; @@ -138,7 +139,8 @@ static void ip_cmsg_recv_security(struct msghdr *msg, struct sk_buff *skb) if (err) return; - err = security_secid_to_secctx(secid, &secdata, &seclen); + lsmblob_init(&lb, secid); + err = security_secid_to_secctx(&lb, &secdata, &seclen); if (err) return; diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 8690fc07030f..caf3ecb5a66b 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -338,8 +338,13 @@ static int ctnetlink_dump_secctx(struct sk_buff *skb, const struct nf_conn *ct) struct nlattr *nest_secctx; int len, ret; char *secctx; + struct lsmblob blob; - ret = security_secid_to_secctx(ct->secmark, &secctx, &len); + /* lsmblob_init() puts ct->secmark into all of the secids in blob. + * security_secid_to_secctx() will know which security module + * to use to create the secctx. */ + lsmblob_init(&blob, ct->secmark); + ret = security_secid_to_secctx(&blob, &secctx, &len); if (ret) return 0; @@ -647,8 +652,13 @@ static inline int ctnetlink_secctx_size(const struct nf_conn *ct) { #ifdef CONFIG_NF_CONNTRACK_SECMARK int len, ret; + struct lsmblob blob; - ret = security_secid_to_secctx(ct->secmark, NULL, &len); + /* lsmblob_init() puts ct->secmark into all of the secids in blob. + * security_secid_to_secctx() will know which security module + * to use to create the secctx. */ + lsmblob_init(&blob, ct->secmark); + ret = security_secid_to_secctx(&blob, NULL, &len); if (ret) return 0; diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index aaa55246d0ca..b02afa0a1516 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c @@ -175,8 +175,10 @@ static void ct_show_secctx(struct seq_file *s, const struct nf_conn *ct) int ret; u32 len; char *secctx; + struct lsmblob blob; - ret = security_secid_to_secctx(ct->secmark, &secctx, &len); + lsmblob_init(&blob, ct->secmark); + ret = security_secid_to_secctx(&blob, &secctx, &len); if (ret) return; diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c index f37a575ebd7f..bdbb0b60bf7b 100644 --- a/net/netfilter/nfnetlink_queue.c +++ b/net/netfilter/nfnetlink_queue.c @@ -305,13 +305,20 @@ static u32 nfqnl_get_sk_secctx(struct sk_buff *skb, char **secdata) { u32 seclen = 0; #if IS_ENABLED(CONFIG_NETWORK_SECMARK) + struct lsmblob blob; + if (!skb || !sk_fullsock(skb->sk)) return 0; read_lock_bh(&skb->sk->sk_callback_lock); - if (skb->secmark) - security_secid_to_secctx(skb->secmark, secdata, &seclen); + if (skb->secmark) { + /* lsmblob_init() puts ct->secmark into all of the secids in + * blob. security_secid_to_secctx() will know which security + * module to use to create the secctx. */ + lsmblob_init(&blob, skb->secmark); + security_secid_to_secctx(&blob, secdata, &seclen); + } read_unlock_bh(&skb->sk->sk_callback_lock); #endif diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index dd18b259272f..534dee9c7b6f 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c @@ -376,6 +376,7 @@ int netlbl_unlhsh_add(struct net *net, struct audit_buffer *audit_buf = NULL; char *secctx = NULL; u32 secctx_len; + struct lsmblob blob; if (addr_len != sizeof(struct in_addr) && addr_len != sizeof(struct in6_addr)) @@ -438,7 +439,11 @@ int netlbl_unlhsh_add(struct net *net, unlhsh_add_return: rcu_read_unlock(); if (audit_buf != NULL) { - if (security_secid_to_secctx(secid, + /* lsmblob_init() puts secid into all of the secids in blob. + * security_secid_to_secctx() will know which security module + * to use to create the secctx. */ + lsmblob_init(&blob, secid); + if (security_secid_to_secctx(&blob, &secctx, &secctx_len) == 0) { audit_log_format(audit_buf, " sec_obj=%s", secctx); @@ -475,6 +480,7 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, struct net_device *dev; char *secctx; u32 secctx_len; + struct lsmblob blob; spin_lock(&netlbl_unlhsh_lock); list_entry = netlbl_af4list_remove(addr->s_addr, mask->s_addr, @@ -494,8 +500,13 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, addr->s_addr, mask->s_addr); if (dev != NULL) dev_put(dev); + /* lsmblob_init() puts entry->secid into all of the secids + * in blob. security_secid_to_secctx() will know which + * security module to use to create the secctx. */ + if (entry != NULL) + lsmblob_init(&blob, entry->secid); if (entry != NULL && - security_secid_to_secctx(entry->secid, + security_secid_to_secctx(&blob, &secctx, &secctx_len) == 0) { audit_log_format(audit_buf, " sec_obj=%s", secctx); security_release_secctx(secctx, secctx_len); @@ -537,6 +548,7 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, struct net_device *dev; char *secctx; u32 secctx_len; + struct lsmblob blob; spin_lock(&netlbl_unlhsh_lock); list_entry = netlbl_af6list_remove(addr, mask, &iface->addr6_list); @@ -555,8 +567,13 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, addr, mask); if (dev != NULL) dev_put(dev); + /* lsmblob_init() puts entry->secid into all of the secids + * in blob. security_secid_to_secctx() will know which + * security module to use to create the secctx. */ + if (entry != NULL) + lsmblob_init(&blob, entry->secid); if (entry != NULL && - security_secid_to_secctx(entry->secid, + security_secid_to_secctx(&blob, &secctx, &secctx_len) == 0) { audit_log_format(audit_buf, " sec_obj=%s", secctx); security_release_secctx(secctx, secctx_len); @@ -1082,6 +1099,7 @@ static int netlbl_unlabel_staticlist_gen(u32 cmd, u32 secid; char *secctx; u32 secctx_len; + struct lsmblob blob; data = genlmsg_put(cb_arg->skb, NETLINK_CB(cb_arg->nl_cb->skb).portid, cb_arg->seq, &netlbl_unlabel_gnl_family, @@ -1136,7 +1154,11 @@ static int netlbl_unlabel_staticlist_gen(u32 cmd, secid = addr6->secid; } - ret_val = security_secid_to_secctx(secid, &secctx, &secctx_len); + /* lsmblob_init() secid into all of the secids in blob. + * security_secid_to_secctx() will know which security module + * to use to create the secctx. */ + lsmblob_init(&blob, secid); + ret_val = security_secid_to_secctx(&blob, &secctx, &secctx_len); if (ret_val != 0) goto list_cb_failure; ret_val = nla_put(cb_arg->skb, diff --git a/net/netlabel/netlabel_user.c b/net/netlabel/netlabel_user.c index 3ed4fea2a2de..893301ae0131 100644 --- a/net/netlabel/netlabel_user.c +++ b/net/netlabel/netlabel_user.c @@ -86,6 +86,7 @@ struct audit_buffer *netlbl_audit_start_common(int type, struct audit_buffer *audit_buf; char *secctx; u32 secctx_len; + struct lsmblob blob; if (audit_enabled == AUDIT_OFF) return NULL; @@ -98,10 +99,9 @@ struct audit_buffer *netlbl_audit_start_common(int type, from_kuid(&init_user_ns, audit_info->loginuid), audit_info->sessionid); + lsmblob_init(&blob, audit_info->secid); if (audit_info->secid != 0 && - security_secid_to_secctx(audit_info->secid, - &secctx, - &secctx_len) == 0) { + security_secid_to_secctx(&blob, &secctx, &secctx_len) == 0) { audit_log_format(audit_buf, " subj=%s", secctx); security_release_secctx(secctx, secctx_len); } diff --git a/security/security.c b/security/security.c index cc61dd46f517..67140d6c17a2 100644 --- a/security/security.c +++ b/security/security.c @@ -2172,17 +2172,16 @@ int security_ismaclabel(const char *name) } EXPORT_SYMBOL(security_ismaclabel); -int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) +int security_secid_to_secctx(struct lsmblob *blob, char **secdata, u32 *seclen) { struct security_hook_list *hp; int rc; - /* - * Currently, only one LSM can implement secid_to_secctx (i.e this - * LSM hook is not "stackable"). - */ hlist_for_each_entry(hp, &security_hook_heads.secid_to_secctx, list) { - rc = hp->hook.secid_to_secctx(secid, secdata, seclen); + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + rc = hp->hook.secid_to_secctx(blob->secid[hp->lsmid->slot], + secdata, seclen); if (rc != LSM_RET_DEFAULT(secid_to_secctx)) return rc; } From patchwork Thu May 13 20:07:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256475 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 419D2C433ED for ; Thu, 13 May 2021 20:18:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 04FB7613CB for ; Thu, 13 May 2021 20:18:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232560AbhEMUT2 (ORCPT ); Thu, 13 May 2021 16:19:28 -0400 Received: from sonic317-38.consmr.mail.ne1.yahoo.com ([66.163.184.49]:46324 "EHLO sonic317-38.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232503AbhEMUT2 (ORCPT ); Thu, 13 May 2021 16:19:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937097; bh=Ve4ALtoFmy9R8CyWffJ7m4ih0LsnI6GwrPudCc/yRhs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=bdT83/q9vZu2qsh5dW8faYjNcQYTRkqaZwDvyDTXtXlDwt6jAZ4UOR/uL1LSfHxmLlWv21Pyl1r9DG3hjd1WHWd0zQ/Tw5m04jZxmURzzBYiIA0lOv4PpLmRqI1qVWokJoVeGVVRIrs3NIqneyjb4PgCanF7JByxlw4RTCniw2hzF0FpMwTlZcpRPVP81W+AxzDRgSUcYkY1N1xD/45Y+j0A5FYMlrDr4w3Qe43s2yfzqaoDMgW72shDyg5gtBYgqup9+61ownAeYyLjZSA9cZw7rs7PllDVAUJE2fyO4ZhVYeNHKqSrwlwQzHcRyh1TC8gKmfA7lZTbtLUDh69FKg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937097; bh=+SH6x3rDbBj5vk0f9T1wUAaDH4sKVPXfrjFBoxxCfyS=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=VtjV69oV43EtwlSC/GwmQnxtkBbPISZ7pZ9/cIOfzgFgdV5IkUfxx6BaH2le7wvkyxjO8KLjUGns26MkvNEAFdNfOcp/d4J8RCI47L5fi5APLAP0up5IIAT00jmSVhVjwZOflGynpID3rbVsx3jm0Eql1EeVKZAmvwRWtUgpWbgw9ztV7RlxfY9KHmHJa3JMVDdFBGb2uuD4Jq+pGgF3FadgDYiiLaBOI56TEcvN3dYST36f/TVWIEtE6F2Zjj1w7504YV7j7GsI1bHiLuhzOtF33u7K/6JjXoYZUrfQFjQgT0Obut9FDu3qZ2WiunQnVVjc8PYxlQSQ4crLrUglaA== X-YMail-OSG: mZi93_MVM1l4bb2HCmkFg47zP7qEf51UygyeMwm6bOp0J7YRuYBgSZuEJDshlvg y_WuPPLL898z_JAF8BJFzc6eXe8HEBUyWd7dpbwF4fDZ1XisVMF9qfUEAA3OVUXHt47YUV4BlYSf AnwBYuHqb9F5LA0lIw0JJvrN336N_5g2xQUXMAD_PWt4O8a._U.T3QeUXjxCy4MfLjU.NrUcagd4 UnUsUK8_VlMKmRxzL0EEaYpz92NrqLdLmbt8Jpii4Hr1EXRQni8XFtpjthDS8nVqdHr5aAtldtza WSG0VaB.k9X7SifL4OUfJFoOhtJDxoFGKetS4cv8qn7PPFm6Vh50BWJiPx_iCT4YVaGkmg_DnHEI xPu3vC2aE1UYXml_u7b7y2RXI8u3OS_NDiV.i6giVH07QJUzr8HI1dNwB1eEw2faFf2pYtkaaPHZ iqaq2WsM2CH.ANekrA.a8GObb21bV2KinP3JBeK20N33YElBHzGEWJpUOBAyp8ao6Il8aMOIjEDM 50BNdOP3AL9znyi_MpNHHlVRpuIupoVH5enOvy1cXmrPW51bZOdICE6qrbIZtLSUq4T933S85H61 2BWXOVv2Mv45smwQAWmCQN8mnOBHw7VGiR.ruZC5OvpKOJy9sohHZG7PhotkOUtdnYVQDQo8MwLl Xwz3GMTIlbyEa_zwZmxObZ1lG5aibocW_x6x2Fovyt5vhhrDGG0RZpUQxjbPe2Yf5Z.G23xLWVEi qdqEH6Y8T78fKTGJiHVgEsXA4kxJydSp2XXLDl5zqOaIIS4LrI2DVHyaaUWrtQ0Ebf0OEItnMkhJ TMAOwOJTbP4lWmuDcoG61Xrz8PLUm3bKBc06MzLWRH2_qrnYkgK4tNh3mBRiskr74nTZWuztXgwx Di9I0BzrbzTYpPlZ4sAB779Ba6kz9wpFJ4fsZ_EsX9RzflLz_4q5JY8SBK3HukqNIIltQZ2AWjCX BT3IQEywNgzCE3Lklw3yyLrNBygOujEvaaUIK_TAPFQrtpJko6Tm6dIMoHO0gGS_Umu6X.vCnnp5 Wz_NWVt9tROFX89nYiViwdDegzNkBOc3oQ31n1MurLJT32rc0yuniZwk51YxUHyiWDbuTxyGjQbD r6YJppJcj.wqiwk4cN5JDLr4Ar7IPx1.jpWnO_tYSLVZs79N0UnVKC8leRK1inRQyoU7p63AMUsY lV2rUlqriGUyUGbx6w3jsTMPFqHoNEG03aCLysTxVbDBh8X4FB9rfSu98eeo25hjxJK3clLd8ums eOpdQaM60YbfRs6oyBF0wUB4MPwxgvu27lBMhsCKUGRlMijjA4ZE4CumMtzO6aU8Q_iffXUHwIAS IcTqhTY_GRuNd.IPDQ_HEfIP74f5VV_tdo5.pWcI_XAH47Nz_NJyBt5YyiTrFFeo3I_jOgdk9Ysg Oq06Vtm.JRJB2BpVlyYJ5ctoOyDQtxDoSvL55VrLYFtUwLokrGbGx77ER4jTEZnuBkxLNU0I69Q_ NmHJAjVPf6Qvx0cDvmlkjLm3mMD7l7ZFfYUpY3JEH1DlbVx6Pf0Jqomi_vrAbix2uWQgw7E5tPkr tNckdeoUtxiSwbVk28GhEMBx7LOTIQbpWiptchOXDGn_ZaXIQIG0XhOtFOLMKwO2LCt0id7YNyfb kqJFHpMm0Suyh.TNUPtz0D711OT37QtQrnXaaAOaW2eZLqJeoWC__mSX9JtnrvUcipyyZJoCC3zW lSqlgA2UG5tpoh.XL.CFxrLbH3k8_64ZurlUhN73FK.lAMRR7p_e_361Ee2KRcH689ZG5s90T0vu C9g_vg2_widJ85S1wAsmpScA5T7L_CvgL6KProxbjuRrUUA9XAQofKHN56Hep4OgqqgZsbJEE6ij 11A_FnmqrxL0Hy_8ZJlud8ROhYeA8DUyPuPVNUY4WcIK_3n3Bbbmqr7oz7kJGOd6JdJxUvWtacpM ezbda4eajQAE9v4vnPhwVzJT8l6sG9L7V_Kia5pwiZhih_V4picLnOCpTrc8c77leggth7YCGVRp r1lwxGQzy3WYgyPB7ie0pt1M9COfAHUKpiFMhZMQWuoq.ptcC.nFjfURcL18CMajdcBVYY..Ij2G FiVDEiK2dWaTy6yGI3HO2wIvjCdP2iSTSrk7SP5ZFtcnWIuyf_OwGf29WJkN8H4QonYqUWf6bd0p nj_tpbHm.KtlT1.Rfn7aCxGUUMLzLgjTR2NTVerN_jGjVeDnuz2KVcvDKZARcGVH2QvKF3ARSmJj puajeq8x5KuCcPBkKo4KLhgA9bDyu7ySXNWWT8sWok8rPy1edubm4bikjAuKxR3Kvd9hpIoCiovM .10WrrbKRy.8SGbeZ2zh8g3CI.SDac1Pj3Mkj6eagluM4AXfDDZx266EpWPZq2.MxZOl299aavlG 0wN6M5CXDLFq_H8LK4JYMbM7WGB7Uwcr4sPvEvHI1_BYIUegWBIf.yRT8n7SsUPVQUY.Pi4BTZSt JRnigCq30hT6apoSTDNm71YZfNIorWawaqp8yqGPKaBORlmffZ6azZ.FC.jDA4tJ.ezjzmjwN.w4 Gl0cklyNCyW5u3CX86oVm7y2pO4Lx_S13NxhMG2TUani57PPv6f9gagd71Z7gzfPwzozP0GViZOz lJe3VsKzGt2qTf_r2vXJEOOgHhSJVobbQO80QfjFd.wy6y70mKHUgwcUaCuAc3KwLIZwa2FVhWfH VdcJbyFsOHnbuMs1F6_elwB29P.2RZFM4HzrLb0iwOOmxkUzI7Ckf0bOryuThJYjajy9IvMmbwzK ymXEEE501bduhS1tsZvE2l_dU8ZbTth4n2jKrdDZVsPZ.YsJ4hiaHvBJm6CWG67MvmRKpLRAvIwN cu3HGLbL9DNubh60cJaJGAJJ9T92Dw6soorDptEwji6o8XR9jm0rj40RXghZvOHOQPhLIt4Vd4Gp 8UN6O1MAMNuwXXgnn7ozj9H68AddgyXhd46_BwH_zAxKeNZ1Ee4KZJIboaoKaXJUlsu1Q0979Z3f Giwbsal4V4KbYOS5RkiwrVbG5B2vnVG9NNwwShuZcNQJXscePoRUW6Xw0LILT_Lr9bBK63mSMNia BmpuOYP15QSQnFS_E07ar9rYf81tjM2JfsdGn_TfK5blBUJr9rso230cIc9NeJMoEeE9pRais3rE vgBUQmXTR2EnHu2oq73eTyEnkfBvJr1zLVtNs X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic317.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:18:17 +0000 Received: by kubenode512.mail-prod1.omega.bf1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID d77a90177361f3e159594f3c8e3bbc3c; Thu, 13 May 2021 20:18:14 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org Subject: [PATCH v26 09/25] LSM: Use lsmblob in security_ipc_getsecid Date: Thu, 13 May 2021 13:07:51 -0700 Message-Id: <20210513200807.15910-10-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: There may be more than one LSM that provides IPC data for auditing. Change security_ipc_getsecid() to fill in a lsmblob structure instead of the u32 secid. The audit data structure containing the secid will be updated later, so there is a bit of scaffolding here. Reviewed-by: Kees Cook Reviewed-by: John Johansen Acked-by: Stephen Smalley Acked-by: Paul Moore Signed-off-by: Casey Schaufler Cc: linux-audit@redhat.com --- include/linux/security.h | 7 ++++--- kernel/auditsc.c | 7 ++++++- security/security.c | 12 +++++++++--- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/include/linux/security.h b/include/linux/security.h index 5a8c50a95c46..bdac0a124052 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -518,7 +518,7 @@ int security_task_prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5); void security_task_to_inode(struct task_struct *p, struct inode *inode); int security_ipc_permission(struct kern_ipc_perm *ipcp, short flag); -void security_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid); +void security_ipc_getsecid(struct kern_ipc_perm *ipcp, struct lsmblob *blob); int security_msg_msg_alloc(struct msg_msg *msg); void security_msg_msg_free(struct msg_msg *msg); int security_msg_queue_alloc(struct kern_ipc_perm *msq); @@ -1275,9 +1275,10 @@ static inline int security_ipc_permission(struct kern_ipc_perm *ipcp, return 0; } -static inline void security_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid) +static inline void security_ipc_getsecid(struct kern_ipc_perm *ipcp, + struct lsmblob *blob) { - *secid = 0; + lsmblob_init(blob, 0); } static inline int security_msg_msg_alloc(struct msg_msg *msg) diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 6e977d312acb..9aeddf881e67 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -2323,11 +2323,16 @@ void __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat) void __audit_ipc_obj(struct kern_ipc_perm *ipcp) { struct audit_context *context = audit_context(); + struct lsmblob blob; context->ipc.uid = ipcp->uid; context->ipc.gid = ipcp->gid; context->ipc.mode = ipcp->mode; context->ipc.has_perm = 0; - security_ipc_getsecid(ipcp, &context->ipc.osid); + security_ipc_getsecid(ipcp, &blob); + /* context->ipc.osid will be changed to a lsmblob later in + * the patch series. This will allow auditing of all the object + * labels associated with the ipc object. */ + context->ipc.osid = lsmblob_value(&blob); context->type = AUDIT_IPC; } diff --git a/security/security.c b/security/security.c index 67140d6c17a2..0364531d92cf 100644 --- a/security/security.c +++ b/security/security.c @@ -1992,10 +1992,16 @@ int security_ipc_permission(struct kern_ipc_perm *ipcp, short flag) return call_int_hook(ipc_permission, 0, ipcp, flag); } -void security_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid) +void security_ipc_getsecid(struct kern_ipc_perm *ipcp, struct lsmblob *blob) { - *secid = 0; - call_void_hook(ipc_getsecid, ipcp, secid); + struct security_hook_list *hp; + + lsmblob_init(blob, 0); + hlist_for_each_entry(hp, &security_hook_heads.ipc_getsecid, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + hp->hook.ipc_getsecid(ipcp, &blob->secid[hp->lsmid->slot]); + } } int security_msg_msg_alloc(struct msg_msg *msg) From patchwork Thu May 13 20:07:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256477 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EE20DC433B4 for ; Thu, 13 May 2021 20:19:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AB19A613CB for ; Thu, 13 May 2021 20:19:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232671AbhEMUUd (ORCPT ); Thu, 13 May 2021 16:20:33 -0400 Received: from sonic307-15.consmr.mail.ne1.yahoo.com ([66.163.190.38]:36009 "EHLO sonic307-15.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230363AbhEMUUc (ORCPT ); Thu, 13 May 2021 16:20:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937162; bh=a7uyTu+wm+XMgRetIvea2zAb2tPOrXH0NpJuMVK9SFg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=dbtNDofc2UjZL1n2GyMLwbu7hydzP+Cntzwuy5cd+yANMBa3CYlfCfnPoDXxoTEuA85GoGH7wgKmZRJvqwfIlQJJkci5BWIQ/58TB5Ct8f08XQJ3cOnyO8HPtAofDn5nOzEknmcfpfhfNK0+VyIsAY9g7K+AiEvXOyenfpasLD6tFasDgE9pq+1ZtCBtF5V+Dxagg09zVK8gtvKGL0VEnkQ/bzbO6yaUuc/SN0ZerZLuVKMofiYmxG8L9aXEzLusfp7C+q2rt0bfpRiOuduVYsqOWff2D4ExRybvqQP2toATV5kzDHjfki1LyigLRU/aKEAGrbT4q+AoAnQRfGiSaw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937162; bh=gUHj7wZjLwTZXUr8mDspBbn1xhRGGxI/meyJWdeql+N=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=nooVRB5hsi3zmw+AK73pNEP8vwpel40zzLcUxy1EzH9QZRAKw5KoEjrEfns6882j6iNCaPcv+/bMtLOQw73Q9QWf6kPklLD+Jr2Qz9hXhbitviur0Az7a/ItzY0Qb7YdXS69OsO9L2cd84eUUEw4qX4fah1yrZPiUbvOoR/f3Ag+6QkeuTvKAOLt1k5YVykGY7oXZ0e3Q2fyht6iebwayTLEKKXzUEiS3uf6K+RwQDu/unibLVsObtjVb5VT6RtugE59ljvxTEUtubQYZNP2dlwFLjkSPgP+NCc9dYEliQOaBIL2ZPCRimVDeOOTc0JrBI6m9vCE7PyWz3oGP5Sqvg== X-YMail-OSG: L97p_SUVM1lmBc0WAHV8fvYKBplreNkdtardHJdOde0z_iZCdAxkTjKb65rCCBH GfYOhzwNh8bHozQLWo.s.jZiNnZwuPCbXEsKsf4OfJXoEmKjXdnzJrC6pcBmh.JwcELy6wxic2LJ GzvmUtfKo2J_jCb2LRKE5ikgkL6X8H5TtbqtQxeZ.2KGTbYoo.QwJQIqcSXu8URgEkDSXDPtalY5 pQmBU1G5VCjtxD39sFOShLJy_EFjpBLeSvz4CGgG.msD6JSiy6LM9934Jhv_bllOuSdXHqP1Zudl zw3F4wJJBV5JbFGUCGBx1tozd0ktoARe5n2YhyDaNc5boNvrt4OzVK9JPl._mP0DrrB3t5q.ACC3 1qQZOmjNS7MuXN6g5ruIbss_1hjXFTGvP79maZiYzWukmiWO7PF2CJiqI3bgOqpJ_j5eiQJT66so E3trA4zxLbnI3rb6dLd5s.hrtlEC9PhwS1MrwNpKWr5ilUgiCezcnUoA.kSOGT0iEN4HnQMEssOF SBdjH7hEI7GD7kPCTzTXgcLX0I9YwDcGDsM.n9Rhc8HyGRLPOVBEFvz1lpSnXOSOM0AaqUwxNIss VN5WoKDxFVGRfUoWHJ3N.tg.c1qtlbV3DYnSF_qT7R4OE0YBvt8ZorClyfxbW7d_nqmXXRQkD81E JreRYI_iekQ1hUTP5XzDWa8afHZfvrBTT7ulPRkJIegdTeglWetGPiriaG5bkYq7FwsLW9IWCjjX XzY9Vikz7AxQHv6_CLL0KddHEB.uIEPQQM2cqRTck1HhQ9H.AIOFKwu.o_nOt6buI.x06dQ51RLS TqMx7wG85Tqm6BhQH9FCiEhaEz0lTM8xE33d8UWNzelzAcpkFkDYNMiWBoRAnLfJ4suzng7PniVB hOx97OjCLLzZlYEm4bav4Qm0gBkpS0kxJkEbaSs.yaS3xwkeQ.7d32LJ04vmG3GhEgK3ynQ4vMET v08i5.chz5YmuoEKmPmEZ9zBvMXM88rSJTshizaWXS5IeahrleMDSd7TZyis_TnbdbFIicajK7xH sXcDUPljpYvi4VSVwCrravn3mwpMykShtBNPFzvyEATHb0WVsxkV6ncrh4TXpMpiXkLjCLxzmm0O TvS1KgflFGOLP2V1Wt0l1YsjkE9Ay4A.Vr0F6qwYAP2wtoC4PmkhHO4NbQzAaxh0tNo9BfVLdfcj 2e8Gck3pbQ7tT1ez7fGGZXgY9kfLDklwxZyhRsBmGOVFjp5muPH3pxnKtqfAuhzTSEWAJu1jUp05 G2kZq1C3B6lytPMM.TQkqaok_RUKDUIEs2wMJUFkDpnTxefjDxrkaUJ05YM8fanM86uJ.tJr9r4B kUKZbKdpq3tNdd34k5H0ZVnXC8XvslFDk8DznefCI3lDbcVIvFXnUKKDEbH5TIdh65cPvEVZTtBA Nyfs_TvMwXxmCPVLlHE37TNjSmTpDryTg4csl6n08CXheT27EzN_TBQxOVgY9mighcKAchUndkOw 5IZHRt9T4zJbMjPDtNH97FwO73894Jk66XH7glEWDHAAk1b4AgPG_evJhwJRg08wjf83HrOEu2e4 R6c2rVY42wWzrHXdapOXZLTiEAEmMbDd2uFk1K0VPlyBSfywjZXbl6.BWd9phc8SesXgV1pqg_P4 OxfMKme3Y1icTHLz6uINSLzK1ToTBD1UF1ztTfLH.ZRa0bbDz2zwctpDpgq8cs387MjXj1GVbglt 5vPc2GmSuCCCurVtr.d2uRmGSm4W7I.wqYNmXNfx9DEaOmugvI_YhU.j0NMzbRsk2nGqAsWTmv02 sMFsbPdkDLJg8jJPjByqroBX1JenX1PRBtm6hmF.dheGAJmzwauEiUkm6zDMXDyp9XI01ekBWKbl ZWox7HLjJ_4Ais3i7TUhVFQfsUFuZrvHlueeYsO0jmYzX84ZB0_HtUm6cBGn.PxejW.haLMRLOt. QVzE9rSNu3I0U6Z5CrMKE8qlKTejE8uxPkZ6mLhT.xTqDDpoVnsiq3rkUONwZlMW4XHxrHBk3x6l 1peSiK_DrbLOMyIleOTNHX2IQPyHBYeo2wI2NOHcldYEScW4wL0kyAzg0geVziBgLpAUhbiaiX.h RQDdTfDRbWTie7L7sZHidjFrSs9KAIZ8XZiIch0K3gm8A4F9ILBYZLAagHR3qqG8nBIfOLQmkGBY K0DswmV4owZhsaCqi54ApkPDRzXxU9Tp346V8GgrocDcW21Iuff6BPAmsbmrRlrHD2LeIaYIiofg F2SiH54jSuJ28D9mdVPceIpxL8cL1s3NJni90gMZXZyBXyWSfrM0fZDJiZYxDnlgjFRWcxrTfNC7 DZVuCk9OVz9eNIMM1Rsm8mYLvaOfb2JPlf0QM83jp5bm3.R.02Z50otJ3bahRXp.3gm_JQ3o9ZSt r8qXJomIyqY_RbbsyONN7a9wZkQOX1pgEHj_8vUzdBXfNDyao1YEOcv8WbtJQ2bXOoIdSyTkRq4j wZLiu.oikKn4VOEMejMPBZ2Tgl.bJUz6AdvxIqmRuhWfHaaCB4GQWys149cauYb3KxvPOtJDqMdJ SbsTANgwgxH23EaWsR11jvJ9FQUg.CvP9kv8GyRqkMtb7F6oE3wnV1zzbdrdd.sWEEo2XduzKPEm kZK8RKvvIfOPMDDETSpuuAWzZEvDGZ3ab2gCvUu9OJV4ZYmYm.pXegKsyvwK4Sr1OLGmyMCMrPOO OeS1qGrcBueyiSwbp3FA_.viK8kGOZ2A2EM6iwuBc5ss7.km1R2M4bHb4syknAD4NCwdDBk3HRH0 Ta1T.aeRdZ2Rm4E_8dnIytnkSEmZTSCtHCmo1ejm68kYFY5B7ZkR6hF5Nu8TaamAvg23.2b3MntX 9CoKB26ZDWYJwFGRXmijSWAnFK3HbTYovHgaLnwp_Wy_VY48imvyOXhbmMCKP882ZxvMpKtQTrnI IIWP45DSJrU0z5rIrA5.VjZEgZ00xz8BA1FLlE6kpQ8CAuey3ZSHzzja8aaAZUTHXan_I6GrThe1 Wve3N1g3HH2MxKKxnnnuviW4xHUNGOP9OJ3RDGqknntrJomAAvGivAosJck1eEOUglxVJGQyXk5Y dLlYHFcld6OzsyUJotKnowzt3AD3S5vNNYBVMxv.jxDQVzDdoWQJ1YtmzSv41t8If_4smVJazE21 bRyABwRHzdMlZkmarrry2hozZjVOFgq.dcqdrcIfrljDH6yOQeWOETzM8YiXhf8hdgJmolod2q9E .4nKGSip_CIUGnlb389Ho.TkFdgFdUJO4pQH_rLSqNPSCZqm5lawGK5lG0Q-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic307.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:19:22 +0000 Received: by kubenode540.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 2b7f8645fde6207f4cb0830c1cd3b2e9; Thu, 13 May 2021 20:19:20 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, linux-integrity@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v26 10/25] LSM: Use lsmblob in security_task_getsecid Date: Thu, 13 May 2021 13:07:52 -0700 Message-Id: <20210513200807.15910-11-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Change the security_task_getsecid_subj() and security_task_getsecid_obj() interfaces to fill in a lsmblob structure instead of a u32 secid in support of LSM stacking. Audit interfaces will need to collect all possible secids for possible reporting. Reviewed-by: Kees Cook Reviewed-by: John Johansen Acked-by: Stephen Smalley Acked-by: Paul Moore Signed-off-by: Casey Schaufler Cc: linux-integrity@vger.kernel.org Cc: linux-audit@redhat.com Cc: netdev@vger.kernel.org --- drivers/android/binder.c | 12 +----- include/linux/security.h | 14 ++++--- kernel/audit.c | 16 +++----- kernel/auditfilter.c | 4 +- kernel/auditsc.c | 25 ++++++------ net/netlabel/netlabel_unlabeled.c | 5 ++- net/netlabel/netlabel_user.h | 6 ++- security/integrity/ima/ima_appraise.c | 10 +++-- security/integrity/ima/ima_main.c | 56 +++++++++++++++------------ security/security.c | 25 +++++++++--- 10 files changed, 94 insertions(+), 79 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index 193397a1fece..ab55358f868b 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -2710,7 +2710,6 @@ static void binder_transaction(struct binder_proc *proc, t->priority = task_nice(current); if (target_node && target_node->txn_security_ctx) { - u32 secid; struct lsmblob blob; size_t added_size; @@ -2723,16 +2722,7 @@ static void binder_transaction(struct binder_proc *proc, * here; however, it isn't clear that binder would handle that * case well anyway. */ - security_task_getsecid_obj(proc->tsk, &secid); - /* - * Later in this patch set security_task_getsecid() will - * provide a lsmblob instead of a secid. lsmblob_init - * is used to ensure that all the secids in the lsmblob - * get the value returned from security_task_getsecid(), - * which means that the one expected by - * security_secid_to_secctx() will be set. - */ - lsmblob_init(&blob, secid); + security_task_getsecid_obj(proc->tsk, &blob); ret = security_secid_to_secctx(&blob, &secctx, &secctx_sz); if (ret) { return_error = BR_FAILED_REPLY; diff --git a/include/linux/security.h b/include/linux/security.h index bdac0a124052..60f4515b9181 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -500,8 +500,8 @@ int security_task_fix_setgid(struct cred *new, const struct cred *old, int security_task_setpgid(struct task_struct *p, pid_t pgid); int security_task_getpgid(struct task_struct *p); int security_task_getsid(struct task_struct *p); -void security_task_getsecid_subj(struct task_struct *p, u32 *secid); -void security_task_getsecid_obj(struct task_struct *p, u32 *secid); +void security_task_getsecid_subj(struct task_struct *p, struct lsmblob *blob); +void security_task_getsecid_obj(struct task_struct *p, struct lsmblob *blob); int security_task_setnice(struct task_struct *p, int nice); int security_task_setioprio(struct task_struct *p, int ioprio); int security_task_getioprio(struct task_struct *p); @@ -1197,14 +1197,16 @@ static inline int security_task_getsid(struct task_struct *p) return 0; } -static inline void security_task_getsecid_subj(struct task_struct *p, u32 *secid) +static inline void security_task_getsecid_subj(struct task_struct *p, + struct lsmblob *blob) { - *secid = 0; + lsmblob_init(blob, 0); } -static inline void security_task_getsecid_obj(struct task_struct *p, u32 *secid) +static inline void security_task_getsecid_obj(struct task_struct *p, + struct lsmblob *blob) { - *secid = 0; + lsmblob_init(blob, 0); } static inline int security_task_setnice(struct task_struct *p, int nice) diff --git a/kernel/audit.c b/kernel/audit.c index 22286163e93e..d92c7b894183 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -2139,19 +2139,12 @@ int audit_log_task_context(struct audit_buffer *ab) char *ctx = NULL; unsigned len; int error; - u32 sid; struct lsmblob blob; - security_task_getsecid_subj(current, &sid); - if (!sid) + security_task_getsecid_subj(current, &blob); + if (!lsmblob_is_set(&blob)) return 0; - /* - * lsmblob_init sets all values in the lsmblob to sid. - * This is temporary until security_task_getsecid is converted - * to use a lsmblob, which happens later in this patch set. - */ - lsmblob_init(&blob, sid); error = security_secid_to_secctx(&blob, &ctx, &len); if (error) { if (error != -EINVAL) @@ -2359,6 +2352,7 @@ int audit_set_loginuid(kuid_t loginuid) int audit_signal_info(int sig, struct task_struct *t) { kuid_t uid = current_uid(), auid; + struct lsmblob blob; if (auditd_test_task(t) && (sig == SIGTERM || sig == SIGHUP || @@ -2369,7 +2363,9 @@ int audit_signal_info(int sig, struct task_struct *t) audit_sig_uid = auid; else audit_sig_uid = uid; - security_task_getsecid_subj(current, &audit_sig_sid); + security_task_getsecid_subj(current, &blob); + /* scaffolding until audit_sig_sid is converted */ + audit_sig_sid = blob.secid[0]; } return audit_signal_info_syscall(t); diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index 6a04d762d272..1ba14a7a38f7 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c @@ -1330,7 +1330,6 @@ int audit_filter(int msgtype, unsigned int listtype) for (i = 0; i < e->rule.field_count; i++) { struct audit_field *f = &e->rule.fields[i]; pid_t pid; - u32 sid; struct lsmblob blob; switch (f->type) { @@ -1362,8 +1361,7 @@ int audit_filter(int msgtype, unsigned int listtype) case AUDIT_SUBJ_CLR: if (f->lsm_isset) { security_task_getsecid_subj(current, - &sid); - lsmblob_init(&blob, sid); + &blob); result = security_audit_rule_match( &blob, f->type, f->op, f->lsm_rules); diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 9aeddf881e67..dd902b68433e 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -471,7 +471,6 @@ static int audit_filter_rules(struct task_struct *tsk, { const struct cred *cred; int i, need_sid = 1; - u32 sid; struct lsmblob blob; unsigned int sessionid; @@ -668,17 +667,9 @@ static int audit_filter_rules(struct task_struct *tsk, logged upon error */ if (f->lsm_isset) { if (need_sid) { - security_task_getsecid_subj(tsk, &sid); + security_task_getsecid_subj(tsk, &blob); need_sid = 0; } - /* - * lsmblob_init sets all values in the lsmblob - * to sid. This is temporary until - * security_task_getsecid() is converted to - * provide a lsmblob, which happens later in - * this patch set. - */ - lsmblob_init(&blob, sid); result = security_audit_rule_match(&blob, f->type, f->op, f->lsm_rules); @@ -2422,12 +2413,15 @@ int __audit_sockaddr(int len, void *a) void __audit_ptrace(struct task_struct *t) { struct audit_context *context = audit_context(); + struct lsmblob blob; context->target_pid = task_tgid_nr(t); context->target_auid = audit_get_loginuid(t); context->target_uid = task_uid(t); context->target_sessionid = audit_get_sessionid(t); - security_task_getsecid_obj(t, &context->target_sid); + security_task_getsecid_obj(t, &blob); + /* scaffolding - until target_sid is converted */ + context->target_sid = blob.secid[0]; memcpy(context->target_comm, t->comm, TASK_COMM_LEN); } @@ -2443,6 +2437,7 @@ int audit_signal_info_syscall(struct task_struct *t) struct audit_aux_data_pids *axp; struct audit_context *ctx = audit_context(); kuid_t t_uid = task_uid(t); + struct lsmblob blob; if (!audit_signals || audit_dummy_context()) return 0; @@ -2454,7 +2449,9 @@ int audit_signal_info_syscall(struct task_struct *t) ctx->target_auid = audit_get_loginuid(t); ctx->target_uid = t_uid; ctx->target_sessionid = audit_get_sessionid(t); - security_task_getsecid_obj(t, &ctx->target_sid); + security_task_getsecid_obj(t, &blob); + /* scaffolding until target_sid is converted */ + ctx->target_sid = blob.secid[0]; memcpy(ctx->target_comm, t->comm, TASK_COMM_LEN); return 0; } @@ -2475,7 +2472,9 @@ int audit_signal_info_syscall(struct task_struct *t) axp->target_auid[axp->pid_count] = audit_get_loginuid(t); axp->target_uid[axp->pid_count] = t_uid; axp->target_sessionid[axp->pid_count] = audit_get_sessionid(t); - security_task_getsecid_obj(t, &axp->target_sid[axp->pid_count]); + security_task_getsecid_obj(t, &blob); + /* scaffolding until target_sid is converted */ + axp->target_sid[axp->pid_count] = blob.secid[0]; memcpy(axp->target_comm[axp->pid_count], t->comm, TASK_COMM_LEN); axp->pid_count++; diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index 534dee9c7b6f..b08442582874 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c @@ -1564,11 +1564,14 @@ int __init netlbl_unlabel_defconf(void) int ret_val; struct netlbl_dom_map *entry; struct netlbl_audit audit_info; + struct lsmblob blob; /* Only the kernel is allowed to call this function and the only time * it is called is at bootup before the audit subsystem is reporting * messages so don't worry to much about these values. */ - security_task_getsecid_subj(current, &audit_info.secid); + security_task_getsecid_subj(current, &blob); + /* scaffolding until audit_info.secid is converted */ + audit_info.secid = blob.secid[0]; audit_info.loginuid = GLOBAL_ROOT_UID; audit_info.sessionid = 0; diff --git a/net/netlabel/netlabel_user.h b/net/netlabel/netlabel_user.h index b9ba8112b3c5..11f6da93f31b 100644 --- a/net/netlabel/netlabel_user.h +++ b/net/netlabel/netlabel_user.h @@ -34,7 +34,11 @@ static inline void netlbl_netlink_auditinfo(struct sk_buff *skb, struct netlbl_audit *audit_info) { - security_task_getsecid_subj(current, &audit_info->secid); + struct lsmblob blob; + + security_task_getsecid_subj(current, &blob); + /* scaffolding until secid is converted */ + audit_info->secid = blob.secid[0]; audit_info->loginuid = audit_get_loginuid(current); audit_info->sessionid = audit_get_sessionid(current); } diff --git a/security/integrity/ima/ima_appraise.c b/security/integrity/ima/ima_appraise.c index 4e5eb0236278..f8c7b593175f 100644 --- a/security/integrity/ima/ima_appraise.c +++ b/security/integrity/ima/ima_appraise.c @@ -71,14 +71,16 @@ bool is_ima_appraise_enabled(void) int ima_must_appraise(struct user_namespace *mnt_userns, struct inode *inode, int mask, enum ima_hooks func) { - u32 secid; + struct lsmblob blob; if (!ima_appraise) return 0; - security_task_getsecid_subj(current, &secid); - return ima_match_policy(mnt_userns, inode, current_cred(), secid, func, - mask, IMA_APPRAISE | IMA_HASH, NULL, NULL, NULL); + security_task_getsecid_subj(current, &blob); + /* scaffolding the .secid[0] */ + return ima_match_policy(mnt_userns, inode, current_cred(), + blob.secid[0], func, mask, + IMA_APPRAISE | IMA_HASH, NULL, NULL, NULL); } static int ima_fix_xattr(struct dentry *dentry, diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c index 906c1d8e0b71..9d1ed00eb349 100644 --- a/security/integrity/ima/ima_main.c +++ b/security/integrity/ima/ima_main.c @@ -388,12 +388,13 @@ static int process_measurement(struct file *file, const struct cred *cred, */ int ima_file_mmap(struct file *file, unsigned long prot) { - u32 secid; + struct lsmblob blob; if (file && (prot & PROT_EXEC)) { - security_task_getsecid_subj(current, &secid); - return process_measurement(file, current_cred(), secid, NULL, - 0, MAY_EXEC, MMAP_CHECK); + security_task_getsecid_subj(current, &blob); + /* scaffolding - until process_measurement changes */ + return process_measurement(file, current_cred(), blob.secid[0], + NULL, 0, MAY_EXEC, MMAP_CHECK); } return 0; @@ -419,9 +420,9 @@ int ima_file_mprotect(struct vm_area_struct *vma, unsigned long prot) char *pathbuf = NULL; const char *pathname = NULL; struct inode *inode; + struct lsmblob blob; int result = 0; int action; - u32 secid; int pcr; /* Is mprotect making an mmap'ed file executable? */ @@ -429,11 +430,12 @@ int ima_file_mprotect(struct vm_area_struct *vma, unsigned long prot) !(prot & PROT_EXEC) || (vma->vm_flags & VM_EXEC)) return 0; - security_task_getsecid_subj(current, &secid); + security_task_getsecid_subj(current, &blob); inode = file_inode(vma->vm_file); + /* scaffolding */ action = ima_get_action(file_mnt_user_ns(vma->vm_file), inode, - current_cred(), secid, MAY_EXEC, MMAP_CHECK, - &pcr, &template, 0); + current_cred(), blob.secid[0], MAY_EXEC, + MMAP_CHECK, &pcr, &template, 0); /* Is the mmap'ed file in policy? */ if (!(action & (IMA_MEASURE | IMA_APPRAISE_SUBMASK))) @@ -469,10 +471,12 @@ int ima_bprm_check(struct linux_binprm *bprm) { int ret; u32 secid; + struct lsmblob blob; - security_task_getsecid_subj(current, &secid); - ret = process_measurement(bprm->file, current_cred(), secid, NULL, 0, - MAY_EXEC, BPRM_CHECK); + security_task_getsecid_subj(current, &blob); + /* scaffolding until process_measurement changes */ + ret = process_measurement(bprm->file, current_cred(), blob.secid[0], + NULL, 0, MAY_EXEC, BPRM_CHECK); if (ret) return ret; @@ -493,10 +497,11 @@ int ima_bprm_check(struct linux_binprm *bprm) */ int ima_file_check(struct file *file, int mask) { - u32 secid; + struct lsmblob blob; - security_task_getsecid_subj(current, &secid); - return process_measurement(file, current_cred(), secid, NULL, 0, + security_task_getsecid_subj(current, &blob); + /* scaffolding until process_measurement changes */ + return process_measurement(file, current_cred(), blob.secid[0], NULL, 0, mask & (MAY_READ | MAY_WRITE | MAY_EXEC | MAY_APPEND), FILE_CHECK); } @@ -672,7 +677,7 @@ int ima_read_file(struct file *file, enum kernel_read_file_id read_id, bool contents) { enum ima_hooks func; - u32 secid; + struct lsmblob blob; /* * Do devices using pre-allocated memory run the risk of the @@ -692,8 +697,9 @@ int ima_read_file(struct file *file, enum kernel_read_file_id read_id, /* Read entire file for all partial reads. */ func = read_idmap[read_id] ?: FILE_CHECK; - security_task_getsecid_subj(current, &secid); - return process_measurement(file, current_cred(), secid, NULL, + security_task_getsecid_subj(current, &blob); + /* scaffolding - until process_measurement changes */ + return process_measurement(file, current_cred(), blob.secid[0], NULL, 0, MAY_READ, func); } @@ -722,7 +728,7 @@ int ima_post_read_file(struct file *file, void *buf, loff_t size, enum kernel_read_file_id read_id) { enum ima_hooks func; - u32 secid; + struct lsmblob blob; /* permit signed certs */ if (!file && read_id == READING_X509_CERTIFICATE) @@ -735,9 +741,10 @@ int ima_post_read_file(struct file *file, void *buf, loff_t size, } func = read_idmap[read_id] ?: FILE_CHECK; - security_task_getsecid_subj(current, &secid); - return process_measurement(file, current_cred(), secid, buf, size, - MAY_READ, func); + security_task_getsecid_subj(current, &blob); + /* scaffolding until process_measurement changes */ + return process_measurement(file, current_cred(), blob.secid[0], buf, + size, MAY_READ, func); } /** @@ -859,7 +866,7 @@ void process_buffer_measurement(struct user_namespace *mnt_userns, int digest_hash_len = hash_digest_size[ima_hash_algo]; int violation = 0; int action = 0; - u32 secid; + struct lsmblob blob; if (!ima_policy_flag) return; @@ -879,9 +886,10 @@ void process_buffer_measurement(struct user_namespace *mnt_userns, * buffer measurements. */ if (func) { - security_task_getsecid_subj(current, &secid); + security_task_getsecid_subj(current, &blob); + /* scaffolding */ action = ima_get_action(mnt_userns, inode, current_cred(), - secid, 0, func, &pcr, &template, + blob.secid[0], 0, func, &pcr, &template, func_data); if (!(action & IMA_MEASURE)) return; diff --git a/security/security.c b/security/security.c index 0364531d92cf..f3b985f76dab 100644 --- a/security/security.c +++ b/security/security.c @@ -1902,17 +1902,30 @@ int security_task_getsid(struct task_struct *p) return call_int_hook(task_getsid, 0, p); } -void security_task_getsecid_subj(struct task_struct *p, u32 *secid) +void security_task_getsecid_subj(struct task_struct *p, struct lsmblob *blob) { - *secid = 0; - call_void_hook(task_getsecid_subj, p, secid); + struct security_hook_list *hp; + + lsmblob_init(blob, 0); + hlist_for_each_entry(hp, &security_hook_heads.task_getsecid_subj, + list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + hp->hook.task_getsecid_subj(p, &blob->secid[hp->lsmid->slot]); + } } EXPORT_SYMBOL(security_task_getsecid_subj); -void security_task_getsecid_obj(struct task_struct *p, u32 *secid) +void security_task_getsecid_obj(struct task_struct *p, struct lsmblob *blob) { - *secid = 0; - call_void_hook(task_getsecid_obj, p, secid); + struct security_hook_list *hp; + + lsmblob_init(blob, 0); + hlist_for_each_entry(hp, &security_hook_heads.task_getsecid_obj, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + hp->hook.task_getsecid_obj(p, &blob->secid[hp->lsmid->slot]); + } } EXPORT_SYMBOL(security_task_getsecid_obj); From patchwork Thu May 13 20:07:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256479 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8279CC43461 for ; Thu, 13 May 2021 20:20:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5A0B9613B5 for ; Thu, 13 May 2021 20:20:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232788AbhEMUVl (ORCPT ); Thu, 13 May 2021 16:21:41 -0400 Received: from sonic317-38.consmr.mail.ne1.yahoo.com ([66.163.184.49]:36768 "EHLO sonic317-38.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232756AbhEMUVk (ORCPT ); Thu, 13 May 2021 16:21:40 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937230; bh=7GtHe3J5TFyvgnmWVe7l+HjNIkfgPM3b5UFEgLeQXE0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=cxzFGgkbqxphC/jGth9MelT9TfSCALjojXD+yIfLTflkgwCdNyg2XFQQUSR7hdL2MP4AP8/75V3hvjlpewX03VtAIq55enr0rWBBiKlAOPpGh4vapxaNQbxWgtlX26+RRFeQx+FxAR/jgef3yYaXGfWhguV1i/35FYb3FJsASVjpC5pUrjK6PCZwagdjPOChhCOc5cwSj+sIjvd1/scDF+6cQSLmlps1nCFX5YnWCagHW3MbC4OEBOFye/86HRxlVyQDhCaqpthQ56VWqdG4Y926uklOq4ZVlSDhZNfQncoorVKH6s369kmZKY/MzVueVww4D5HFNaFDlldZMbMf3g== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937230; bh=CoaNrB3CRBpk6LX9pfQp7CMPBksU3zn51/3s1lo3MoX=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=M6vyo22m24h85yXycefGyxIJPDWXxKP554WioNQMuuhuMCpfI4/Jyndb0n0WXR7lJQzqgALplHMubyy3DOJKz5ziq+Z1YsnxYNXJht4xHphWkh7pyRcUf8H9Vb5xFcs+PsBv/XNrRC7fm8WustF6gzhnRJsD9C5GL+NLJ44VBaPiT98c5y5t27gD7F8aXzD0+UY4N3aCJdoTifiNn3cMcsyneEO+K4EVPv6lPpUSmi32zudFp75y3iWRwmCGFGjjGaxUnJejv+5DJNRlexojqP5bE8Qu6LD7tD2IhiGmPo0mXF51U2adhYlJyL4ru9A28e1Sdrt5ks0ZlpFDUm4YcA== X-YMail-OSG: oVSiAMsVM1l2nqAKLeraETLGtxNHRDHFFqouEU1bEPPhiDmAQNGNZgPMU6Z76St SjvpBF2v6rRrkH7sP.K2iKs4c4qCWRNZIiX6f8_f3RrbJiLDAicE9Ta48TdcoCCO4Sa3CkKx.LWw et9nSrkVpjTsypeeir0UqGFKWMzhQ.whO_.5dopMgf_k0DYY0FkQA0c2MGiQsT_irjJx4Fg_jO0I YynhG4GMQKuO2hIDvdI5aZviKHcoiCokWTMQThB9eBOtNZeeDX3uGBnLnHw05dxnYy7I2jXi7F_a tfaV6I3wny0xKeydacQYHKa1zW0Tg1rQjXNkrSOzLQSeuhBB4hhusxrqDw7OL5BgGRZeR8_CU_9p sYyZokKdQW9XtEWIh6CsLO74_I9qvDCBnpVce2PWJPyoiyv_gR5DUZAm5zluBJjUMYYTcaPwOyEu 1Sfgl9PSCd_pJQE_2OlVdiT4PTHKl60lAiHcf2ScXwO_qa5JSfrnl64CrbsvYiJOf1ol4kCnl_Rj ctQ4CzwSuAxN2HeJ61Q0IIVfGyvOLmQ.cYT5Wp_voVPUAUZ99ccuUE3Y2t3PJOOPiLpt0k7neHg6 yQZBVrWngwF.TYwGpu5a8E44U5OUcOyMBRV2bJ1rJt.0TYfDBobkTJwYrkSH9LRJPrE5Mt4pG3fo Fa8QXM3bs6Dkefuo4hXmeLabEfAp8c3.HlDKiDct_D05v5SbsGCFThdjSNlCvjykY4fBV0QV7QrE WP5xbFBM5lE.eF8l5qiW0m2N4oFB2Bx8LQmZpghrOmsGewvweYwnYrnCDjuxTeM786cUdtjkRii4 cefa6SbwYL7jDPpN7_DQUGdCYXUV5i1uvKPqQkh_t33nMiVdScBx2mpYOTkR1kNoLBK8BG6rKHsg 5IBZ8NNh5fZ0EMcVRsoxF5jQPJw.VbB2IjPf2CXdI74hP8O.zz43OfezPOm5FIm_RfWGcTSwsPba lk1rFKI4WBhGmlg9pD.c3zD_ZlhQAr.5tE5DARn.7GioxfIVCL1_9UBQFhNeii2AlvtOZLM0yLm4 RZRm6dyBBMqiIejVZLzrBzMMbbkxmFzTTUq9R3LIS935boHPPem1o4WnYSlnPzjHMkiz8OBQQNwz QuXgFlFYbj6WZWqD2WjrVQtT88oO4IL23hNR05KNMxVX1AhqL5wMN9Tinx72R9pyup5VTZb64XV7 ecmM6iUH8luYqZhSkYsRTsP7X8zl.SxdsR8.S2qas_TeqSxYPbZ3gPdEeeyQfOYHU127lZmxouYU wgT3Pobm_aWkRmy6CFbs4jLWk6skwBVKdatwLZ77lunuJXmpLGCusm4BPSIyD_UcWv4EtkmRpaFh y.uW9ojBw32Wc9QPRdZv12fLoS8H2lpNjMSBNTRKAR54v7qh0QgTvo3SnQ_.8BTjEDrWqJGWLmi5 UhofzDLX.8y3Z4YPJAdIx3DEEFUyrYUEZ_KmL79obET4i8w9N9dj4azF2nDcEFi4PkTyEPtfcfp7 Vm.om1pRXUk0mK2HNlHxpQLzVGtsU9EjkBv6_l7kOyxHMaeNNQ_CEB.rL.T4e1JW3Q2TQmwQ9foP q7LViFeSWVtKetMuwOSHF3fvc92g5LTjGZVye8ZkatdJjsMWVyUYOYxnriFr15ixlHih6mz5_nxg eZ4mSc0mg3JbQnZ.zSI7NEyJnDxXJWpHs0I.qq9Nd7kWyprDobNuekRN1e.R2T5Zz9Vf6RkQ2sVJ 8xt2_4DEAz2e7HSaJwc.QmC.LKxSI8b8egqFP.2EqDTS8qNqDwNH7.FV9s1j5rLx.0kBfSME_yhX MiYHDIuLCA8cqGfqq_lUsy0AoFUW3vGJn3BgHL940Qbj34TX_TzPDwfLuqiMIJV.Jf.VtGqr6lB8 Yy6NB1KmPEmENLOVT0Wcej0SnHlcFk54mP4sXg4Fop0SgGgVDM7advhAeudJUs8Cfxn_DcbU32_t gXuFsuO6SG.4Bkm8AEPz9Cp6jAASw3HpwytX4ehbLbXmsDX3ezr0OCJXhToeL9dPV2R8dousAcQv 8PItVbCEAnlPDc3z.ik7ibS5BSGa0GpKME_gTE5IHXlEV1joR9lCpZOK..VJoCgtu8fHNAkB1PaI mYXBoz1Ti2LucOydNuQvsPRippuiPdmy_D_3A_5uyvEjxBreij1BNm8fBsW5LdamKlauV.kdM2kt z6ozLtbnKew183IqbXwngzAQMBz3xBRnlKZrrmuUtbicNrRbW8Z5kmzkH0k92u6XK47D_n5gsJe9 RAWb4oe6LR_JJL3WUGPJYBAmQl7nrs8oIWeqsjHuDEB8HerJc41fXl46vLTiBhJ9xdsx3JD0T2jq nlpNOTimAZPCr3UEnaelz.0xI2INMsxmCSd8bD0HN6V7p1CaXYN2lgw.0iFT_eJ8edg9kl26RhYQ AxT81Fa6BjjGH66nGvRqwc8Fv9.gSo7zfas2ps2xUKue3CTK_Ets9JaPkDU9RGVkMAPyJqj7ngc6 Z3zK1uVZD._eYiZezqV2ikl5TPjyONNaihxmzwiL_1WwzcpH_Meyz.jAZXdnrTKlvHEekxCFGQTR PXfHM8N1jfTbazHFw564UICeOkQdbyQvjVphfjshQ6Wu8_oasPYUjRv7CXQCWbgj0pC7d7I3G.jA PMd7cDpr6L.94zgeknG0o_9wO7dY946e7MVDQFoa6GgJDfpymRTg8l0gA3DXH8FTnjkQkvBjywu. 6TBSaMJSsUcayuCd63e5XJyP7pxmU.Jc5LvYSRmCiHBnR926XxmKFVipyHPpoai.F.a2_jn4_.yy F4xhmn_Co7eDpqZdhL1NLSU6DKRGFSX2GWAySVlcY2lwgUMcQ54pKrCFgBSjLN2uvP4P6p7dLygZ igY5e0X2KjSVuCgKvu7cBD.VBroLYrcbjTCGNAvxEpjasdU4bQzBTqICyKnyMevlqEu3XkhRE_kW 4TpQ1j0sDlsV_MnMINCVcKkZzNuOlwYETJXwAs3D54aeByGdYCtLukuci_5zau8QHyRowU8CPmTR _ZLPHHNIGlhEUaAeU2ad.L6_IhRjGA8_3z3xhNufnSSTI6x6M22bM.stgqqEeyA8a78X7c0768Uu IQaTOgrYv5At6HBpviHZi8f8gTrDUi2x6LnXwlpCBCP9jJVOErfyxNZkZ9MVc7.uSnoh1bg3WNL3 EZi.6A1soydGG6yymLSK8mMCrXh8kGlEyZcqWJFmGnVj.W9PaeC2FVRq8hrg.w5j0zF_N._ZvtYi _o.WurloS61pjq_o6vdmjO7LLY6UGzHXlwbLd25rplzdHVMATqw-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic317.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:20:30 +0000 Received: by kubenode566.mail-prod1.omega.bf1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 884178ba24598ea363d74a2dc49a1ae8; Thu, 13 May 2021 20:20:26 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, linux-integrity@vger.kernel.org Subject: [PATCH v26 11/25] LSM: Use lsmblob in security_inode_getsecid Date: Thu, 13 May 2021 13:07:53 -0700 Message-Id: <20210513200807.15910-12-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Change the security_inode_getsecid() interface to fill in a lsmblob structure instead of a u32 secid. This allows for its callers to gather data from all registered LSMs. Data is provided for IMA and audit. Reviewed-by: Kees Cook Reviewed-by: John Johansen Acked-by: Stephen Smalley Acked-by: Paul Moore Signed-off-by: Casey Schaufler Cc: linux-integrity@vger.kernel.org Cc: linux-audit@redhat.com --- include/linux/security.h | 7 ++++--- kernel/auditsc.c | 6 +++++- security/integrity/ima/ima_policy.c | 4 +--- security/security.c | 11 +++++++++-- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/include/linux/security.h b/include/linux/security.h index 60f4515b9181..64f898e5e854 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -454,7 +454,7 @@ int security_inode_getsecurity(struct user_namespace *mnt_userns, void **buffer, bool alloc); int security_inode_setsecurity(struct inode *inode, const char *name, const void *value, size_t size, int flags); int security_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size); -void security_inode_getsecid(struct inode *inode, u32 *secid); +void security_inode_getsecid(struct inode *inode, struct lsmblob *blob); int security_inode_copy_up(struct dentry *src, struct cred **new); int security_inode_copy_up_xattr(const char *name); int security_kernfs_init_security(struct kernfs_node *kn_dir, @@ -1005,9 +1005,10 @@ static inline int security_inode_listsecurity(struct inode *inode, char *buffer, return 0; } -static inline void security_inode_getsecid(struct inode *inode, u32 *secid) +static inline void security_inode_getsecid(struct inode *inode, + struct lsmblob *blob) { - *secid = 0; + lsmblob_init(blob, 0); } static inline int security_inode_copy_up(struct dentry *src, struct cred **new) diff --git a/kernel/auditsc.c b/kernel/auditsc.c index dd902b68433e..6684927f12fc 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -1962,13 +1962,17 @@ static void audit_copy_inode(struct audit_names *name, const struct dentry *dentry, struct inode *inode, unsigned int flags) { + struct lsmblob blob; + name->ino = inode->i_ino; name->dev = inode->i_sb->s_dev; name->mode = inode->i_mode; name->uid = inode->i_uid; name->gid = inode->i_gid; name->rdev = inode->i_rdev; - security_inode_getsecid(inode, &name->osid); + security_inode_getsecid(inode, &blob); + /* scaffolding until osid is updated */ + name->osid = blob.secid[0]; if (flags & AUDIT_INODE_NOEVAL) { name->fcap_ver = -1; return; diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c index a05841e1012b..5ee7629fd782 100644 --- a/security/integrity/ima/ima_policy.c +++ b/security/integrity/ima/ima_policy.c @@ -606,7 +606,6 @@ static bool ima_match_rules(struct ima_rule_entry *rule, return false; for (i = 0; i < MAX_LSM_RULES; i++) { int rc = 0; - u32 osid; struct lsmblob lsmdata; if (!ima_lsm_isset(rule, i)) { @@ -619,8 +618,7 @@ static bool ima_match_rules(struct ima_rule_entry *rule, case LSM_OBJ_USER: case LSM_OBJ_ROLE: case LSM_OBJ_TYPE: - security_inode_getsecid(inode, &osid); - lsmblob_init(&lsmdata, osid); + security_inode_getsecid(inode, &lsmdata); rc = ima_filter_rule_match(&lsmdata, rule->lsm[i].type, Audit_equal, rule->lsm[i].rule); diff --git a/security/security.c b/security/security.c index f3b985f76dab..54f4a4ead69f 100644 --- a/security/security.c +++ b/security/security.c @@ -1546,9 +1546,16 @@ int security_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer } EXPORT_SYMBOL(security_inode_listsecurity); -void security_inode_getsecid(struct inode *inode, u32 *secid) +void security_inode_getsecid(struct inode *inode, struct lsmblob *blob) { - call_void_hook(inode_getsecid, inode, secid); + struct security_hook_list *hp; + + lsmblob_init(blob, 0); + hlist_for_each_entry(hp, &security_hook_heads.inode_getsecid, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + hp->hook.inode_getsecid(inode, &blob->secid[hp->lsmid->slot]); + } } int security_inode_copy_up(struct dentry *src, struct cred **new) From patchwork Thu May 13 20:07:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256481 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E3539C43460 for ; Thu, 13 May 2021 20:21:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A97AF613B5 for ; Thu, 13 May 2021 20:21:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232300AbhEMUWs (ORCPT ); Thu, 13 May 2021 16:22:48 -0400 Received: from sonic307-15.consmr.mail.ne1.yahoo.com ([66.163.190.38]:42428 "EHLO sonic307-15.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232371AbhEMUWr (ORCPT ); Thu, 13 May 2021 16:22:47 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937297; bh=0WWcwuwGjN8XC9PA6SxswcZEHx4sWKSep230V5PI4fc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=FNvRNE1VUwtgVFrYGImHg96cGeOsdcGMOCK8gc1u+Aly3+bVUPCAyYnUZYUS9iEdAITxCUD1U3qR3D2RZIJxKeLMVqeSL+ppRhCGCJwGUJzE5v25cWHublKQ6weKxbbXxOlm6Txo5t42mFvgFIUNOqWcVomdmZOewx5gDviXPsYKzCU4zIPskh5Zwyw3tCegG5evxpMv0hXCfUuiyE4dMgKew71T0KUvoME9+gL3HXbIFXaoO9wx6AvjR+DXNcw7Wl4qg/pJ4AFwnsoG/pbjP/Hkn8hKBJqT2LvqpkCvtAVmbTu2M4O5QuRMK3GV1pF/9shd/w8qrFAKIcJRhWlKLw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937297; bh=uYHXWQUZ3oupDcT3yb+kqHjWYt7LPeJbIhqTUiGgl0N=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=XnNeT3SBQ2e6fAXcr4sWC1pVyOmeSDr4MKaW/9OnKOWRCWnybkUW5z1mXjiSMg10RAnMuo6sJVmJQpWaLWGreyjiZLVZH0WXB5UsIPkuXKxwaytJkpzRSTdCRYzNMOQp7xKWFQiSIaOB1pNZ5u6YTF1LoMbo/Gy4XsXRix5ShDjH5+Zsx/93ARY0browm1wzq3XGXH8+h9UOUpPc3U0RUUk0D04nyG28vrSaQj0qMw2Ls5mTrjSPSKzvMPHhXSFNpG1e4ofUcxlPEHSvOiP88SkwGKeNZAkBgAtGo5rWi6suNEA5zQ6LVGKYP2NOEg5dBxcN18tVQY3LD5/EpYLuWg== X-YMail-OSG: pcZpkisVM1kdsNfxhV.fBkJQTCPcAVIf3tXzmrwSj7p7YddoIDXeZj4al3jOS_Z V_vAONui18HGqxUiuMtYn8llkAY6Egqq1CxLCvxkPKVzHw6lwvAVXIiIkzoD1XkfJrob4bVwdrUE wNGVuT6sPp9T907AYp2Wr0kcep8iOgWMyHZSleIvcVwR73M5DH4OFZmaA1QkgSupq1uAPaq.Wro7 YNH5D7_3611OzlhIUQ1UpM1Xs4_pQo_WL6eYk9VrziXelfXCJv97iKiqtfFfs._59byaI2Mgz.bx zQ7xCstY1RKj8zo0lPR5s2Ukt5oidzFaQzNbbij9H4Bi1i66DOIwKwOA2k1YkX766tPG1BR8DoJb p9Gmni0aDNet11.CTuQwxaqOmTS4PTSJlmtM1nnI1s23xU5zYZKIFAlPk80KUwvlUE2.n8b1s3xv n7GtfmPccKSs04lSF0OaEqKkqNEauK6eg9IFmlIL9Yipk8SoY5D.fhxL.nkH6mrn2ql8t1hPMyqa aZ3jGHrS1nhJQ1_TtkI9UUAAVLmAacWmTNf7y6OBd66ZuZP7HUK5wJu88RpA7bx7s9XVy7CzB8CY pckjBIX7xYxmCxC1Zo47sKPhSCDdPe9byqDKJ35DMMuNtP7E2Utw99qpjif7sSCs41sXm9CuhlOt 813YmIMAiPXoCoY04PmJCbAMTWS14FQGDiCcND.k40NSMpdfULaAZnLmN9MT5oqPah38CJbROR_W eLXTsgRtIcZEwgM3HZ62J26iH8TqG4e623PvcfUVheafcQhTBhWakFcFoULndGN.00UWpmDgpYxK 4JiJ6AsM8Y5qKBM2V1PBvPMZd6bVEJLNDYMXOJPCV5eiqgWid5InyIkuGAK770DMtG0SXsc6Pvts Ja0d6aBTvpTYmfOTlFAqCwHlL7waDfrVReYhOtXNgy.KEsRPMxEty6QksKtVx.UdtVik_YSUx6F. OWTfu_iHxBgitkb_PhvKW9Jkoecr4A0nKPOJNdvdulZvLgoSb4Kg3JCE4dARktuJe8zZ9wUXKqeW Q.dwBH9FL8UfTmCoWnxSl5RVPSnr5xBuRxSmKN3Lzxe_seqa5skMjxo6QNCgiLk6NFn05M6GFV4A I9Qv_GzB.Fpc_ibgDjKUSlBufZNhC6wG0h8CweORPcTNx8blMM4ooo9Z7iTIkoU0aBMrz6XHviNo xtOYRcFSbSxxgC1Z8mith_v3G0y_IkJYO5V8ETa5hYIPC37_VUZXWS5UMsRO07Ew.6T4JS4p80X5 Uip1Q_rOiDacX5F3kCR6ETMXtSAtKIGNVz2_GEDEYFI3VEgToSIwZ9KFaxttiv6opJKesb.L5I_P LoPPZiV97BG2c9ydMpQg_FiVjJYiqdbTQkVq1k3man2ZzDO8fLeNpXs7BFL1NazS.OqOVVZ3Kpfu AiD8cfwN4bhCb.wvxSphH5n_YVBzwjl53hfkr7UtmypyI5mamKBs8hlvKFwRZZ7HgUv5zCKPpdpv obxHk8Fa2_Fr.8Fm.VCO4TcHxfBMK3xe_oJC.RjndRdbkmjeAcVEH_OF5Wbxw1NYg3s1tsWAEFZn fl7R7QXGX03sV0Qrv03Cgzx6VEJp6vvjAvmwkHjG69pAFndeNnJVjYjN9Ei.rOnSiX5tXVjrTu5D j.LWNRXTugLGx1i87VGj6X1gyNbX962eEd7vjC.DQGM9fuwHqAlSmjKMXEqJmKxlRK4Urgf1BT6L 6EC5G6NgkHw63Ts4khhAfNc0EE0Ms1FBAPgrdvVAxbRbjVhuAwtyyrb.Ocmort4MtucpXbZjklmG SgWKv6ShXevXGfizLp_m_XQlDrUdXWdM75CHpdKKyZs3XfIOdFB9tLGa.2CvAoGCccvsdNDbStgl b2Iwuz2WBbh9DKxyeyfmudkrguBWbo3VJdPIcJYejabg0KZBuhexUE.xFizXddM8wJr7ghGbFlCx 3gtLMuIaZnKDUy9p3rQbhjS4U21Qsuxs4uDXdvJrOqw.mkeM0D5YjrOYbWwoFk0ojW52bxkL4Djg KzQBVguy8IEI9fD2cTvnuJHf26xu_jGobwAzQ4D4F7xSRov6E6bt.zXDTEf9_DYGIVzwjmPk2Q13 NX9scnkUSo3oM_w1sFTGacbKZ0mIZJ62ffyvW95kFKiyBpQF1EHXehyi3TY07NK9S4ukY7TJEi5x .7HEzrpbB.3p4MxflpCB9iWstqXw3YmInEa1.6xO9OZg5igw_Q_K3pyT0tBe8UedvhJWdMYb0.yK 0TKnIHT2YiZyBvSssvE8iGJbdkPM4l7.IdUpLwo1hMWsf_S1w7zjGX5WBfxWZYwMj.MMK9UHCfaI 3KebMcb_cQ70d7tmQnjVvv9katnUbplrpVJ4wvTfHpmkjjbB1Ew9.sgPTFEKQ5SI04wTdtUQ3j4Z UmUynfvGzFpQmKvrF_sjSZkUNbb4D3skK3NS6umNPotbY9am7AJPGzsrdTYb.5pyNsw5_uebBR50 PZ_wnu43mFaHanMZM6tR_dnu3wl4aMBK.hT1JmHiOgijDfHumLmGhRTbWmTy5IKAmpdi4vBwkmlC _acam4xnjwvLJiLtYeOcJ0wgMg.aKfFjavD4nc9kDGS31XYUJnLX158xhP2HlALXlhEgBNgvb12x 4pxWFgOCss2P53SbZ2ckX0RvaBmAakCKgVXfHSTMihM4ZcuWHDHM0rOAhOMHJHk0Y6ekF1wpF.9B gf7D48q0uFGktYenBuLAY2UL8HuDQ5ax6qCLEzZ2m3dW8dGnmjy8JCyVqwm1PPBEUNJkYjBrEY5r x4JV3f3oWMRDsWECWVZVezO6bMLhMzX00IxAOEZ_1tUoN._GQYFS_Xo5T._pXjVGVGquxXr6duP4 KW35XDipABjk4sg1hksfPhabZWbnUEcyUNBzdM3B5Vm5vMX3CmioTlr3kW3P_BO4RrsUOu4EYGWB xzAGjTvsJHW3A16R3EO5XHqJar.trF6NKLpA6Cor18b2s8tdaY7pRSiSDk92iUjYKbvw.2VyVb90 ckY5mdySnMEw1pikLiM.EU0Bapf.touQceV5ndQolBwcHMoTSlhDFAX2mvmYmJ.m6coLKkYnkuqw YfNZPEa.EuRCglnW2zVN16wkvyonVWESLWYZ2FusDgTN5SBFMVqISmKrlIDMF2QntGrS7iGZ5NCc lW2Iw4bn0FrozdWKtyHD3Jtq0mqfrTwVEh.WtVEAbWnuDuQPynOtPPRW0l_0ZRsJMFmKhrt7ojj. buJIGNNdJ53XY00_uQ6.T5AnfkqfbVQ9UhRJwUWScSule8lnbuQ-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic307.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:21:37 +0000 Received: by kubenode549.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID d3f3576f9dc925e37a27218e0790434c; Thu, 13 May 2021 20:21:32 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, linux-integrity@vger.kernel.org Subject: [PATCH v26 12/25] LSM: Use lsmblob in security_cred_getsecid Date: Thu, 13 May 2021 13:07:54 -0700 Message-Id: <20210513200807.15910-13-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Change the security_cred_getsecid() interface to fill in a lsmblob instead of a u32 secid. The associated data elements in the audit sub-system are changed from a secid to a lsmblob to accommodate multiple possible LSM audit users. Reviewed-by: Kees Cook Reviewed-by: John Johansen Acked-by: Stephen Smalley Acked-by: Paul Moore Signed-off-by: Casey Schaufler Cc: linux-integrity@vger.kernel.org Cc: linux-audit@redhat.com --- include/linux/security.h | 2 +- kernel/audit.c | 25 +++++++---------------- kernel/audit.h | 3 ++- kernel/auditsc.c | 34 ++++++++++++------------------- security/integrity/ima/ima_main.c | 8 ++++---- security/security.c | 12 ++++++++--- 6 files changed, 36 insertions(+), 48 deletions(-) diff --git a/include/linux/security.h b/include/linux/security.h index 64f898e5e854..c1c31eb23859 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -481,7 +481,7 @@ int security_cred_alloc_blank(struct cred *cred, gfp_t gfp); void security_cred_free(struct cred *cred); int security_prepare_creds(struct cred *new, const struct cred *old, gfp_t gfp); void security_transfer_creds(struct cred *new, const struct cred *old); -void security_cred_getsecid(const struct cred *c, u32 *secid); +void security_cred_getsecid(const struct cred *c, struct lsmblob *blob); int security_kernel_act_as(struct cred *new, struct lsmblob *blob); int security_kernel_create_files_as(struct cred *new, struct inode *inode); int security_kernel_module_request(char *kmod_name); diff --git a/kernel/audit.c b/kernel/audit.c index d92c7b894183..8ec64e6e8bc0 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -125,7 +125,7 @@ static u32 audit_backlog_wait_time = AUDIT_BACKLOG_WAIT_TIME; /* The identity of the user shutting down the audit system. */ static kuid_t audit_sig_uid = INVALID_UID; static pid_t audit_sig_pid = -1; -static u32 audit_sig_sid; +struct lsmblob audit_sig_lsm; /* Records can be lost in several ways: 0) [suppressed in audit_alloc] @@ -1441,29 +1441,21 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) } case AUDIT_SIGNAL_INFO: len = 0; - if (audit_sig_sid) { - struct lsmblob blob; - - /* - * lsmblob_init sets all values in the lsmblob - * to audit_sig_sid. This is temporary until - * audit_sig_sid is converted to a lsmblob, which - * happens later in this patch set. - */ - lsmblob_init(&blob, audit_sig_sid); - err = security_secid_to_secctx(&blob, &ctx, &len); + if (lsmblob_is_set(&audit_sig_lsm)) { + err = security_secid_to_secctx(&audit_sig_lsm, &ctx, + &len); if (err) return err; } sig_data = kmalloc(sizeof(*sig_data) + len, GFP_KERNEL); if (!sig_data) { - if (audit_sig_sid) + if (lsmblob_is_set(&audit_sig_lsm)) security_release_secctx(ctx, len); return -ENOMEM; } sig_data->uid = from_kuid(&init_user_ns, audit_sig_uid); sig_data->pid = audit_sig_pid; - if (audit_sig_sid) { + if (lsmblob_is_set(&audit_sig_lsm)) { memcpy(sig_data->ctx, ctx, len); security_release_secctx(ctx, len); } @@ -2352,7 +2344,6 @@ int audit_set_loginuid(kuid_t loginuid) int audit_signal_info(int sig, struct task_struct *t) { kuid_t uid = current_uid(), auid; - struct lsmblob blob; if (auditd_test_task(t) && (sig == SIGTERM || sig == SIGHUP || @@ -2363,9 +2354,7 @@ int audit_signal_info(int sig, struct task_struct *t) audit_sig_uid = auid; else audit_sig_uid = uid; - security_task_getsecid_subj(current, &blob); - /* scaffolding until audit_sig_sid is converted */ - audit_sig_sid = blob.secid[0]; + security_task_getsecid_subj(current, &audit_sig_lsm); } return audit_signal_info_syscall(t); diff --git a/kernel/audit.h b/kernel/audit.h index 1522e100fd17..23a85a470121 100644 --- a/kernel/audit.h +++ b/kernel/audit.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -134,7 +135,7 @@ struct audit_context { kuid_t target_auid; kuid_t target_uid; unsigned int target_sessionid; - u32 target_sid; + struct lsmblob target_lsm; char target_comm[TASK_COMM_LEN]; struct audit_tree_refs *trees, *first_trees; diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 6684927f12fc..573c6a8e505f 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -111,7 +111,7 @@ struct audit_aux_data_pids { kuid_t target_auid[AUDIT_AUX_PIDS]; kuid_t target_uid[AUDIT_AUX_PIDS]; unsigned int target_sessionid[AUDIT_AUX_PIDS]; - u32 target_sid[AUDIT_AUX_PIDS]; + struct lsmblob target_lsm[AUDIT_AUX_PIDS]; char target_comm[AUDIT_AUX_PIDS][TASK_COMM_LEN]; int pid_count; }; @@ -991,14 +991,14 @@ static inline void audit_free_context(struct audit_context *context) } static int audit_log_pid_context(struct audit_context *context, pid_t pid, - kuid_t auid, kuid_t uid, unsigned int sessionid, - u32 sid, char *comm) + kuid_t auid, kuid_t uid, + unsigned int sessionid, + struct lsmblob *blob, char *comm) { struct audit_buffer *ab; char *ctx = NULL; u32 len; int rc = 0; - struct lsmblob blob; ab = audit_log_start(context, GFP_KERNEL, AUDIT_OBJ_PID); if (!ab) @@ -1007,9 +1007,8 @@ static int audit_log_pid_context(struct audit_context *context, pid_t pid, audit_log_format(ab, "opid=%d oauid=%d ouid=%d oses=%d", pid, from_kuid(&init_user_ns, auid), from_kuid(&init_user_ns, uid), sessionid); - if (sid) { - lsmblob_init(&blob, sid); - if (security_secid_to_secctx(&blob, &ctx, &len)) { + if (lsmblob_is_set(blob)) { + if (security_secid_to_secctx(blob, &ctx, &len)) { audit_log_format(ab, " obj=(none)"); rc = 1; } else { @@ -1580,7 +1579,7 @@ static void audit_log_exit(void) axs->target_auid[i], axs->target_uid[i], axs->target_sessionid[i], - axs->target_sid[i], + &axs->target_lsm[i], axs->target_comm[i])) call_panic = 1; } @@ -1589,7 +1588,7 @@ static void audit_log_exit(void) audit_log_pid_context(context, context->target_pid, context->target_auid, context->target_uid, context->target_sessionid, - context->target_sid, context->target_comm)) + &context->target_lsm, context->target_comm)) call_panic = 1; if (context->pwd.dentry && context->pwd.mnt) { @@ -1765,7 +1764,7 @@ void __audit_syscall_exit(int success, long return_code) context->aux = NULL; context->aux_pids = NULL; context->target_pid = 0; - context->target_sid = 0; + lsmblob_init(&context->target_lsm, 0); context->sockaddr_len = 0; context->type = 0; context->fds[0] = -1; @@ -2319,6 +2318,7 @@ void __audit_ipc_obj(struct kern_ipc_perm *ipcp) { struct audit_context *context = audit_context(); struct lsmblob blob; + context->ipc.uid = ipcp->uid; context->ipc.gid = ipcp->gid; context->ipc.mode = ipcp->mode; @@ -2417,15 +2417,12 @@ int __audit_sockaddr(int len, void *a) void __audit_ptrace(struct task_struct *t) { struct audit_context *context = audit_context(); - struct lsmblob blob; context->target_pid = task_tgid_nr(t); context->target_auid = audit_get_loginuid(t); context->target_uid = task_uid(t); context->target_sessionid = audit_get_sessionid(t); - security_task_getsecid_obj(t, &blob); - /* scaffolding - until target_sid is converted */ - context->target_sid = blob.secid[0]; + security_task_getsecid_obj(t, &context->target_lsm); memcpy(context->target_comm, t->comm, TASK_COMM_LEN); } @@ -2441,7 +2438,6 @@ int audit_signal_info_syscall(struct task_struct *t) struct audit_aux_data_pids *axp; struct audit_context *ctx = audit_context(); kuid_t t_uid = task_uid(t); - struct lsmblob blob; if (!audit_signals || audit_dummy_context()) return 0; @@ -2453,9 +2449,7 @@ int audit_signal_info_syscall(struct task_struct *t) ctx->target_auid = audit_get_loginuid(t); ctx->target_uid = t_uid; ctx->target_sessionid = audit_get_sessionid(t); - security_task_getsecid_obj(t, &blob); - /* scaffolding until target_sid is converted */ - ctx->target_sid = blob.secid[0]; + security_task_getsecid_obj(t, &ctx->target_lsm); memcpy(ctx->target_comm, t->comm, TASK_COMM_LEN); return 0; } @@ -2476,9 +2470,7 @@ int audit_signal_info_syscall(struct task_struct *t) axp->target_auid[axp->pid_count] = audit_get_loginuid(t); axp->target_uid[axp->pid_count] = t_uid; axp->target_sessionid[axp->pid_count] = audit_get_sessionid(t); - security_task_getsecid_obj(t, &blob); - /* scaffolding until target_sid is converted */ - axp->target_sid[axp->pid_count] = blob.secid[0]; + security_task_getsecid_obj(t, &axp->target_lsm[axp->pid_count]); memcpy(axp->target_comm[axp->pid_count], t->comm, TASK_COMM_LEN); axp->pid_count++; diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c index 9d1ed00eb349..b3e00340a97c 100644 --- a/security/integrity/ima/ima_main.c +++ b/security/integrity/ima/ima_main.c @@ -470,7 +470,6 @@ int ima_file_mprotect(struct vm_area_struct *vma, unsigned long prot) int ima_bprm_check(struct linux_binprm *bprm) { int ret; - u32 secid; struct lsmblob blob; security_task_getsecid_subj(current, &blob); @@ -480,9 +479,10 @@ int ima_bprm_check(struct linux_binprm *bprm) if (ret) return ret; - security_cred_getsecid(bprm->cred, &secid); - return process_measurement(bprm->file, bprm->cred, secid, NULL, 0, - MAY_EXEC, CREDS_CHECK); + security_cred_getsecid(bprm->cred, &blob); + /* scaffolding until process_measurement changes */ + return process_measurement(bprm->file, bprm->cred, blob.secid[0], + NULL, 0, MAY_EXEC, CREDS_CHECK); } /** diff --git a/security/security.c b/security/security.c index 54f4a4ead69f..f5407a85641e 100644 --- a/security/security.c +++ b/security/security.c @@ -1796,10 +1796,16 @@ void security_transfer_creds(struct cred *new, const struct cred *old) call_void_hook(cred_transfer, new, old); } -void security_cred_getsecid(const struct cred *c, u32 *secid) +void security_cred_getsecid(const struct cred *c, struct lsmblob *blob) { - *secid = 0; - call_void_hook(cred_getsecid, c, secid); + struct security_hook_list *hp; + + lsmblob_init(blob, 0); + hlist_for_each_entry(hp, &security_hook_heads.cred_getsecid, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + hp->hook.cred_getsecid(c, &blob->secid[hp->lsmid->slot]); + } } EXPORT_SYMBOL(security_cred_getsecid); From patchwork Thu May 13 20:07:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256483 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4FEBCC43460 for ; Thu, 13 May 2021 20:22:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 12A1A611CC for ; Thu, 13 May 2021 20:22:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231343AbhEMUXv (ORCPT ); Thu, 13 May 2021 16:23:51 -0400 Received: from sonic317-38.consmr.mail.ne1.yahoo.com ([66.163.184.49]:42861 "EHLO sonic317-38.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232537AbhEMUXu (ORCPT ); Thu, 13 May 2021 16:23:50 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937360; bh=vmPLppdW1T7Yboao5H0X3j8apQPb/Sk4zDvbIPEe/TI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=Nzr94B0plmXhWvSHvVe6tsVpR/5A/eH7PLnXlZ4g0DuuYPd0Xs97ZDIb0CSjy6+nh8RZx4+co6lfv+aN0/qDeJ9vb81GaOdjIMtRBxYU7wdFJsHOTYzi5jUOSFRUv0p5lWaLgJlp1KXZ4qJ630cSmFoVgb6hkejktzKwl8HxcE1kiuZNBFyJsj08Zg5WLKveb1do7rIUoQQmDpLKPpazBD7mvkSftXPNH0+svbK5QamV0qpUKJa9F2Ud3rkI/WcPM1R9GCRQX/hktinOb4ax5YkgR3fbjYN8itkg6l8wtLWH7SkLyyvI98xDVR4bFY0RkGR7vReq3Br4YjCoOsJQzA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937360; bh=kKK7XGcid1ZQdSCKgsXOWu5Vd1av9IWciSS11b2SlZz=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=fV3IxsuofQLMo6PNZQaShF4jval0tM7D9xUOn5vNqo/7FPFVII/Ug781RY00VWfPe1nuwKKxqsXjREynB0m5DDCeHprrbh0gtukd+eXml8pA1HsRjMYshXTNgHYWS5Yhfpv2V0wCqw6j/x7PhwgqEfUw2U41oLqn/zrZVa00bQaU/h7YuVZnM192Z9O7VBDTzwceUQdUmldeSbZ+TQiGG/0DAVK8G2+FzLp+IK1/mK4F97ZZXJBnuQWwBWjXinhnSTfZIGepadX/7BjCNfakadVWe8x/h3A/raO1lp/hBVW0KV8skqUn69r86OGYmgOHCK+pilqrmd+Vx0AytaMZcg== X-YMail-OSG: RLwmkZgVM1l_rvF2S7Nc0QNJciDSv_f0lE8hFU15dfa6qegMeHf8bNoubERbEaB dymSJbA7F90t9.YBQF.7X.3Vx5zVMznNCdjdk5lw0Uh3LEd2_dIMiKEysNXLQ1DeHjDTjzIotcqV m0TrnoswqHl0TyqDcXpttwnyDVIjZZyDdFoLN8j7YWoylAIYQRisYKxTPCw5.VBo4bFLdHZqd6KR AbgcloWlQOA0n4LamA7KhTahLiHCLOnRFveAx7DI_nudShsXJQsIkY5D3xpsn0UbuWWKwW2QopHo 6kI5zqfe.MjSwbkAwsClDk33BLM64lnp9ws4N_7m_sRFG.LAw7RN0GMuPIgqAnSw7cM4TXgUupH_ HLg_I.9fJf9cDdzw3e5Ou8OY4TqVv_MsmNvnp.QYIzRDGtraeM67oTx4LHTCBasnCmJta5XqfPWJ SZtyRzHKe3rpW5.DeCX6bMe6wVMVDWKXWhO.c20Onfj.2f6h7l20yUIRzWOrgRmqDDpFRD_evtwj d4.X9YlNx.zDWsns01eoJ3BgwHcNNxIvvodW8A6S8AjtJ0.N6jlFOZirwDsqk8oEh0pE6f_zQcn0 IVja534ewDsKzuve6KA7XbqyE.qU3akk6YBfz1oyihB4joNVSCTFcrepTSNqrtdaU.s0QoOyEwck bk1_w1dwkZZrpBXi7U67EeesHWfU1a0CNuzqBeQ6wMbXwhl_5yeYP2Hq_Bgk6yNhuILhcseYA6Yj LvnEus9oXu009I1WqPkJ0FBW5XSQ6S.DuRFwSmS_36TmSeIBE3L1ALhtRxeIhy3xGW5mAcComr8i t.xe1gdyng1QofHu6F3S5Ui6KWmBo_8WyoR5uCtjfrHmpjLU37Pcy7fhZ_1goBj9dFu.STZmust. 6f4kHjNVvNu3trSPA0v3Jats5XXKB.qAUPuiPQcfgJb_ftQwdSBlPlMtmq6Zi.l3cibuOTi0U2lB rEoFPnxy4s4w3dtxY1mxvMbUnlZ5O75tXGx2T.2pUzHOBIpJiutvKoyWsdysYreMStIuO57KJmQp q2Qix5ynvomXwYrGUYtmc5U_zcvAVPAc4yh_A8m0Sq9hANRi2.61L5orBkCeX.PRRmPKbrVoto7S idrkVo0jS2zFhcpIAW.w6MFTWX3Es0NLZvHrOUn.tnxe6.3_d2lCVwsraEMPz_ZnsOSr4Ada42pU 8kDxCzDvArwKQGVNNJnTD_7UPEpV6RTQoBI2U.MNyEKsbx5X4wjkICVK7i14nt5o6FI75epgHrH8 8aI0sBVRiaSvbVj2C1euiVH8oI0Ln6iPBsIZ0PMgzR5T6hSdSQWuITV84ZVp09zrt8mbh3BC1uOb rnhslL.evXfjkxx67mTAygtPYTqZ7.kZiFoF5jr6bHHBVTGZs7aQBldInXJj8KJFiVIzR0MMKohP KejAZSi0mmJ1_8EixQentuj_K8c8e6olFA0hyCgw._jFBneJaLlh2fClA5je_auhcZI7x9FeQhgg KzkadtVdIAnoIeYagr7K7po7sVlllE3EtayM_65ylzU0OKNxxW3iVwetHftZPKk5_Z5gn0vJKdmM uOGJC4.aVWwZQWbvCR4j2Xou.s9cqvNuLF8AuLB8R.JQkYinetOOD_9ZodQ72jeeU4pySGCzhvHn asdvTQHkN0TVLClYTt8dzjMEMATxyKuDqrkzl2DXbF_5Ehfd4v9WZZeQYXDeiUqBEAaWIUdlNVeH jW5MG9IwjkkVrK_F.Kcxn0JJpejDdl3.uI6o95VD0jtRdkBKfMhii0Hh_iTwHSfM86094GWIuA.6 NB8LTWWHLJCylHXnQYlugSJYbKbDo5IpU8Sa462IT_B0.WC62yc3uYuoQbz27q.a12H6EeeeZzN6 rwzouiwX0X0gmEphEjICX7SZUCYnoQSwzyi2YXXZb3nUwe0eWHvWVBYuR2F.wb9pmtRLwBOpbp0I 1YtN5B_IpdZS8xyaXcczvKqLBahyOoeh_7AgAJ3KMNr4X0ud_Xf9fTxQLszWwOZu5esZS0AImCCB vSuF5PAEB1o0VQ5OcbJsUtkqCQN2nyCFdoW58QHMHFqWtLieklmP4QXIpo25h1HpEOOjcHGxMfui jdwpJyqOYg7a9Qe0LpYOqyvAdpGYodnQ_Hw9zC.6Oo6VFouIGKrgeuvhuLHKUsAJzSVhyuONDXa0 ECzaNlFT3baMGotQxmKkpmPkDiJCiMVMgYmxsEXJGrfWf2naPnYWS1LPj5XJNkAYS7cTQ4L2bvtV ckJEwljlI0QWxPBSV4wdxboBsTaYR4jMQFW0Xju9Y4JXV2V.HKp5JzTei3ZsNtWOdDChc0YI1lpu Kj_XVzeNoBdV4lCYXaMW8JyB0APRhKY6vZgXFoqzdoh7Ch8LPj20Bg_L2Q0epsJ.A8SeVSFkjZwb u4TNIAKPRYzrRcDZfFtcxhnJU2jdI2.FkzPU4PDQPVBhtRxmOF_lrzc6yRHTcG6LIup.16kSQVDb an0cZDfrs.DymTpC5MBhCZbqPVAHNdi5gtKYgWm7fgPfb5KUcv.0_J7xOTm_xx3g4S1tb2Oks7Mr 8CrEPh71jAf1bxCLIEGQB894M7x.QsT.32rdRukyIGW8a.T2eRxXi9.T5Ra25Oldoc6VM6982Ebi sde8mTcNXCO_5.dpj6vyZjg1N0BamzK9fM5YfNBYOVHz1LKWRJH4IRwBjNd8laiAC5OHRSgEcJyw .FDQWuY4KzenR5TJhOdH47Je5KvJdh6SKsHWtai1tVAubpAtxE_u3FoMtPaP5JMto86wd6vCDVIV ZiSbGGVSyhPKtCOMvWczHHMJWATaYYRh0tD1.noD4DVRoM10fgxRSFA99hLlFEoiTCfpo7Ldu.pf 2Z3HnkvvqcirLaNzvCvHra14XEwvHotapffPkbAAOsQWFa6fGbqeGvQAt54E4ug5_O46W.XiDc14 TbqIdB9J7i94K2MA6u8HKymmuGk3v8NOOWjEfGfDdVeHUoS56ycjZAUGFHhDtcmtDQE66Jhuog2W moMTQ2bfZ80L6YFI9Zj0DdGXYXwK4qrtH7r7_BrA5MwCNMd5sHwMTHg9aG.NErPfvTtwJ9P.V95I UwEhnUQZpbKrNxJZ1hmIgR2Gvu3zfrL3VwSi4eyo7AkC6TRnMs3ssSJq6b7OFr4vTQPkAKB2ORYt 0ivqdaXlJ1z6cnjKiuG4X3njK32lPyAFb4JyZOmCe45ZqxgOeYhHRBipAdwbfyffr4pD4erOSDmK azfv2Eb7kcvykiX28gxxaJqtf5eXC0foRfYXZPd_WyAPEJdyDFBCTieGK X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic317.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:22:40 +0000 Received: by kubenode563.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 2c2e2ab30ddd755d1597eb2aefb2afac; Thu, 13 May 2021 20:22:37 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, linux-integrity@vger.kernel.org Subject: [PATCH v26 13/25] IMA: Change internal interfaces to use lsmblobs Date: Thu, 13 May 2021 13:07:55 -0700 Message-Id: <20210513200807.15910-14-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: The IMA interfaces ima_get_action() and ima_match_policy() call LSM functions that use lsmblobs. Change the IMA functions to pass the lsmblob to be compatible with the LSM functions. Reviewed-by: Kees Cook Reviewed-by: John Johansen Acked-by: Stephen Smalley Signed-off-by: Casey Schaufler Cc: linux-integrity@vger.kernel.org To: Mimi Zohar --- security/integrity/ima/ima.h | 6 ++--- security/integrity/ima/ima_api.c | 6 ++--- security/integrity/ima/ima_appraise.c | 5 ++-- security/integrity/ima/ima_main.c | 36 +++++++++++---------------- security/integrity/ima/ima_policy.c | 17 ++++++------- 5 files changed, 31 insertions(+), 39 deletions(-) diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h index 55f3bd4f0b01..a6b59fcaf62a 100644 --- a/security/integrity/ima/ima.h +++ b/security/integrity/ima/ima.h @@ -251,7 +251,7 @@ static inline void ima_process_queued_keys(void) {} /* LIM API function definitions */ int ima_get_action(struct user_namespace *mnt_userns, struct inode *inode, - const struct cred *cred, u32 secid, int mask, + const struct cred *cred, struct lsmblob *blob, int mask, enum ima_hooks func, int *pcr, struct ima_template_desc **template_desc, const char *func_data); @@ -282,8 +282,8 @@ const char *ima_d_path(const struct path *path, char **pathbuf, char *filename); /* IMA policy related functions */ int ima_match_policy(struct user_namespace *mnt_userns, struct inode *inode, - const struct cred *cred, u32 secid, enum ima_hooks func, - int mask, int flags, int *pcr, + const struct cred *cred, struct lsmblob *blob, + enum ima_hooks func, int mask, int flags, int *pcr, struct ima_template_desc **template_desc, const char *func_data); void ima_init_policy(void); diff --git a/security/integrity/ima/ima_api.c b/security/integrity/ima/ima_api.c index d8e321cc6936..691f68d478f1 100644 --- a/security/integrity/ima/ima_api.c +++ b/security/integrity/ima/ima_api.c @@ -165,7 +165,7 @@ void ima_add_violation(struct file *file, const unsigned char *filename, * @mnt_userns: user namespace of the mount the inode was found from * @inode: pointer to the inode associated with the object being validated * @cred: pointer to credentials structure to validate - * @secid: secid of the task being validated + * @blob: LSM data of the task being validated * @mask: contains the permission mask (MAY_READ, MAY_WRITE, MAY_EXEC, * MAY_APPEND) * @func: caller identifier @@ -185,7 +185,7 @@ void ima_add_violation(struct file *file, const unsigned char *filename, * */ int ima_get_action(struct user_namespace *mnt_userns, struct inode *inode, - const struct cred *cred, u32 secid, int mask, + const struct cred *cred, struct lsmblob *blob, int mask, enum ima_hooks func, int *pcr, struct ima_template_desc **template_desc, const char *func_data) @@ -194,7 +194,7 @@ int ima_get_action(struct user_namespace *mnt_userns, struct inode *inode, flags &= ima_policy_flag; - return ima_match_policy(mnt_userns, inode, cred, secid, func, mask, + return ima_match_policy(mnt_userns, inode, cred, blob, func, mask, flags, pcr, template_desc, func_data); } diff --git a/security/integrity/ima/ima_appraise.c b/security/integrity/ima/ima_appraise.c index f8c7b593175f..b2af72289f00 100644 --- a/security/integrity/ima/ima_appraise.c +++ b/security/integrity/ima/ima_appraise.c @@ -77,10 +77,9 @@ int ima_must_appraise(struct user_namespace *mnt_userns, struct inode *inode, return 0; security_task_getsecid_subj(current, &blob); - /* scaffolding the .secid[0] */ return ima_match_policy(mnt_userns, inode, current_cred(), - blob.secid[0], func, mask, - IMA_APPRAISE | IMA_HASH, NULL, NULL, NULL); + &blob, func, mask, IMA_APPRAISE | IMA_HASH, + NULL, NULL, NULL); } static int ima_fix_xattr(struct dentry *dentry, diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c index b3e00340a97c..b63f73d43bd2 100644 --- a/security/integrity/ima/ima_main.c +++ b/security/integrity/ima/ima_main.c @@ -194,8 +194,8 @@ void ima_file_free(struct file *file) } static int process_measurement(struct file *file, const struct cred *cred, - u32 secid, char *buf, loff_t size, int mask, - enum ima_hooks func) + struct lsmblob *blob, char *buf, loff_t size, + int mask, enum ima_hooks func) { struct inode *inode = file_inode(file); struct integrity_iint_cache *iint = NULL; @@ -218,7 +218,7 @@ static int process_measurement(struct file *file, const struct cred *cred, * bitmask based on the appraise/audit/measurement policy. * Included is the appraise submask. */ - action = ima_get_action(file_mnt_user_ns(file), inode, cred, secid, + action = ima_get_action(file_mnt_user_ns(file), inode, cred, blob, mask, func, &pcr, &template_desc, NULL); violation_check = ((func == FILE_CHECK || func == MMAP_CHECK) && (ima_policy_flag & IMA_MEASURE)); @@ -392,8 +392,7 @@ int ima_file_mmap(struct file *file, unsigned long prot) if (file && (prot & PROT_EXEC)) { security_task_getsecid_subj(current, &blob); - /* scaffolding - until process_measurement changes */ - return process_measurement(file, current_cred(), blob.secid[0], + return process_measurement(file, current_cred(), &blob, NULL, 0, MAY_EXEC, MMAP_CHECK); } @@ -434,7 +433,7 @@ int ima_file_mprotect(struct vm_area_struct *vma, unsigned long prot) inode = file_inode(vma->vm_file); /* scaffolding */ action = ima_get_action(file_mnt_user_ns(vma->vm_file), inode, - current_cred(), blob.secid[0], MAY_EXEC, + current_cred(), &blob, MAY_EXEC, MMAP_CHECK, &pcr, &template, 0); /* Is the mmap'ed file in policy? */ @@ -473,16 +472,14 @@ int ima_bprm_check(struct linux_binprm *bprm) struct lsmblob blob; security_task_getsecid_subj(current, &blob); - /* scaffolding until process_measurement changes */ - ret = process_measurement(bprm->file, current_cred(), blob.secid[0], - NULL, 0, MAY_EXEC, BPRM_CHECK); + ret = process_measurement(bprm->file, current_cred(), &blob, NULL, 0, + MAY_EXEC, BPRM_CHECK); if (ret) return ret; security_cred_getsecid(bprm->cred, &blob); - /* scaffolding until process_measurement changes */ - return process_measurement(bprm->file, bprm->cred, blob.secid[0], - NULL, 0, MAY_EXEC, CREDS_CHECK); + return process_measurement(bprm->file, bprm->cred, &blob, NULL, 0, + MAY_EXEC, CREDS_CHECK); } /** @@ -500,8 +497,7 @@ int ima_file_check(struct file *file, int mask) struct lsmblob blob; security_task_getsecid_subj(current, &blob); - /* scaffolding until process_measurement changes */ - return process_measurement(file, current_cred(), blob.secid[0], NULL, 0, + return process_measurement(file, current_cred(), &blob, NULL, 0, mask & (MAY_READ | MAY_WRITE | MAY_EXEC | MAY_APPEND), FILE_CHECK); } @@ -698,9 +694,8 @@ int ima_read_file(struct file *file, enum kernel_read_file_id read_id, /* Read entire file for all partial reads. */ func = read_idmap[read_id] ?: FILE_CHECK; security_task_getsecid_subj(current, &blob); - /* scaffolding - until process_measurement changes */ - return process_measurement(file, current_cred(), blob.secid[0], NULL, - 0, MAY_READ, func); + return process_measurement(file, current_cred(), &blob, NULL, 0, + MAY_READ, func); } const int read_idmap[READING_MAX_ID] = { @@ -742,9 +737,8 @@ int ima_post_read_file(struct file *file, void *buf, loff_t size, func = read_idmap[read_id] ?: FILE_CHECK; security_task_getsecid_subj(current, &blob); - /* scaffolding until process_measurement changes */ - return process_measurement(file, current_cred(), blob.secid[0], buf, - size, MAY_READ, func); + return process_measurement(file, current_cred(), &blob, buf, size, + MAY_READ, func); } /** @@ -889,7 +883,7 @@ void process_buffer_measurement(struct user_namespace *mnt_userns, security_task_getsecid_subj(current, &blob); /* scaffolding */ action = ima_get_action(mnt_userns, inode, current_cred(), - blob.secid[0], 0, func, &pcr, &template, + &blob, 0, func, &pcr, &template, func_data); if (!(action & IMA_MEASURE)) return; diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c index 5ee7629fd782..caacd8bf0462 100644 --- a/security/integrity/ima/ima_policy.c +++ b/security/integrity/ima/ima_policy.c @@ -546,7 +546,7 @@ static bool ima_match_rule_data(struct ima_rule_entry *rule, * @mnt_userns: user namespace of the mount the inode was found from * @inode: a pointer to an inode * @cred: a pointer to a credentials structure for user validation - * @secid: the secid of the task to be validated + * @blob: the lsm data of the task to be validated * @func: LIM hook identifier * @mask: requested action (MAY_READ | MAY_WRITE | MAY_APPEND | MAY_EXEC) * @func_data: func specific data, may be NULL @@ -556,8 +556,8 @@ static bool ima_match_rule_data(struct ima_rule_entry *rule, static bool ima_match_rules(struct ima_rule_entry *rule, struct user_namespace *mnt_userns, struct inode *inode, const struct cred *cred, - u32 secid, enum ima_hooks func, int mask, - const char *func_data) + struct lsmblob *blob, enum ima_hooks func, + int mask, const char *func_data) { int i; @@ -626,8 +626,7 @@ static bool ima_match_rules(struct ima_rule_entry *rule, case LSM_SUBJ_USER: case LSM_SUBJ_ROLE: case LSM_SUBJ_TYPE: - lsmblob_init(&lsmdata, secid); - rc = ima_filter_rule_match(&lsmdata, rule->lsm[i].type, + rc = ima_filter_rule_match(blob, rule->lsm[i].type, Audit_equal, rule->lsm[i].rule); break; @@ -671,7 +670,7 @@ static int get_subaction(struct ima_rule_entry *rule, enum ima_hooks func) * @inode: pointer to an inode for which the policy decision is being made * @cred: pointer to a credentials structure for which the policy decision is * being made - * @secid: LSM secid of the task to be validated + * @blob: LSM data of the task to be validated * @func: IMA hook identifier * @mask: requested action (MAY_READ | MAY_WRITE | MAY_APPEND | MAY_EXEC) * @pcr: set the pcr to extend @@ -686,8 +685,8 @@ static int get_subaction(struct ima_rule_entry *rule, enum ima_hooks func) * than writes so ima_match_policy() is classical RCU candidate. */ int ima_match_policy(struct user_namespace *mnt_userns, struct inode *inode, - const struct cred *cred, u32 secid, enum ima_hooks func, - int mask, int flags, int *pcr, + const struct cred *cred, struct lsmblob *blob, + enum ima_hooks func, int mask, int flags, int *pcr, struct ima_template_desc **template_desc, const char *func_data) { @@ -703,7 +702,7 @@ int ima_match_policy(struct user_namespace *mnt_userns, struct inode *inode, if (!(entry->action & actmask)) continue; - if (!ima_match_rules(entry, mnt_userns, inode, cred, secid, + if (!ima_match_rules(entry, mnt_userns, inode, cred, blob, func, mask, func_data)) continue; From patchwork Thu May 13 20:07:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256515 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 58C1DC43461 for ; Thu, 13 May 2021 20:23:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0903161421 for ; Thu, 13 May 2021 20:23:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232812AbhEMUZA (ORCPT ); Thu, 13 May 2021 16:25:00 -0400 Received: from sonic309-27.consmr.mail.ne1.yahoo.com ([66.163.184.153]:33813 "EHLO sonic309-27.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232803AbhEMUZA (ORCPT ); Thu, 13 May 2021 16:25:00 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937430; bh=Zq4W92YeBuA58oXkspU+JhIQ6/hA4PmRYGD55l6DVQ0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=nV+WwM91Iu8s666FNDl2/eUk9eMe2yDqDmWgEkSeXoxCdQH6tgxQsH4WILRWDxCoQ5iA8W/OTNT47pJitzMQZ6E91at9EZO9oX2+vr8+hNvF8CVU1QGdm3sA1LBMMshxD1w46zoHJ4sD6/I05is59lPvwQIcwvJd+zkRHdVirycFv8JHG9o5wfX5Y/Cqs+RAgxPu908kXG2AjRcwd1Vxssn4/LBJbq3AcC423lbZXP0xsFuoBoCpzmX2cEdAR45o+hCBOEhKQOOy94B0vP2rns4vAvqDQTvBdqfBa5lOQKO0QGr8CsoMnb8bk8oDqvpFRn6LLQZ5vo+YSswMZD9xzA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937430; bh=pv+DmM2q3X0gXdmRKlnN+oUDCQQ7yDoDDmzBUZStMqk=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=kS3cV9+xY47fwvvL02abY6beupIvrwJ3Rbb0agG48JEQttLQ6PP1sa7NGHwpNbQcLMg9a2m/SpHSyk8cYT87+OlJi+MYhp1R/574KacJH8I7qOnW1XPBqhGF5AYPPOfIw69sseRHti5W/vT2bNaWq0VqSPr0DqX+ubH4gCYsHIbgSqXRWYylwPlxodWYs9vpsnp0uGv71jUw/7TZGwhpxlUVRVGqToFWXd/AhWg7Pt2AuzNd6Hl+yA6XDX5aGxu50Kihy6ibKoV4NevVI6L5Fx04F176+JCdaZuykk2XacTNLjCX+BneTnkvK8x6BwumY/nqQ7cc52VSHB/x/qyfMg== X-YMail-OSG: tnLViMEVM1k4slzGJlSJM4MJidMCNu25kip8F5x118KcKkPABs0jTJDXsks2foG GHfPopPUTn5odjx9rppVBOxO_u1yn5lEmfZmHyWkoHisLo4_eG9j3Z4mw83eSbjYJixAVyk3TbSW 17qgjk1bLODgxFlN2NCn5BqFXbHNuaRUOaDUiKm79I_gSjZi9bWAfi7m3cYeQWqj_X_S.5XjEQpP lZN86o7A30ugupZxpp3fkAusFCIUbZnjv7LpnD4gJ_Pg9Zz3RhncJOjwPuNydA.iRVbNO5k7BXpl JrlpFKKJrdZI6nmoJozuKCvCaEnVvadX.l6yiwHHbxX_MgyHX2hxfZDQfXMiZtc4I6vjRsV.0l_M JVZVGNa70vd4atqhA1vA.gotRQax7af0VhmHdHXkkKWtq0uSH317.lzYtvVOicQYSbOcvqHaTw10 HQHY8z0ZY8jzjh8vKku3qmiAfKvhGyIqIi9r.IIGX4zFSnMiqjeBEBl1inDtUk2HEhh1MewKpTOE UBu87Ww8RgzsYqgymRbr45taQkxHiXrxf0iYmx6wg3Zjj_FZSSeOw2jZTWDpDUkzKJAai8bM1UsZ qvZWtKXCsNuz4FFUatIbtSIhQZl69KEyi_HERslsDf1xgpPdqgji4DkI0tAsMLwOuBSbfkR9D1Ad Tdfbn6B4KXiee3LijMQRCCqDQwe6KCmJh0cYA.v0FpTLmL7D.A4lyAVtodd_Sw1NGKl4xldA3vFs MQmJw9v2mOiFXSTfQkkrBB1uippmjwSFkHXaGcKcKoQgjcq8qqrVmoXIoqMNcOiyxUU83pbAFAtG 2GrX56QEDvJksOH9zyRvve_oAGPz8tQlhqgG.NJQS75mglc1H8xg4jEPbDzw18OMKsww37vscpiA ShMHmQ6_5Ew54gm8H5NMcLHhlaQVerQUUqxyopVuPoFnhETABsbZ.vcDcoR6UaO8e9MTH6NuPG7. e7xP.isn8LwquAsojng2DilIW2GFfPUWrv7ttX1v6mFjJFQXsA.JQq5LYsOxzNm4K.3u3QO.T4JI JTQ4qcx_DWSFfI1t.kFLo2SOyMa3W7wh5V8A.BZTG68zV5hCUK4vF2NzCAwqINRVuTi8OxSlSMOg UwP1c.Sv5meocJ.sF0kCyEMKnMUk4WPYl3x4piuKsM2iGpxkU1rp3g1gN2oJUcKItGGxqjEfDshI U5piRbSur5FojNamju2c8hP9E1S22ws1bVD2XWzv1yRdlH53JdQfi..KDmloZFSYHMqVscev9Efy jgrTPjoz92h5Y3HEjjllP2duNYFk4YW4ZAfvt4W34ntoPw2nB_MFzYRhivfyHmBU3YAV_1u3eid8 qUyPnaId3WPusrc9N3y0bTPgE4hdBCgoe4j5AZa4KzMKEwsPpnQInTlZLzwMaA9BcUrhIvvQ4bbU T_etkdqYpkQfRmDWHLZr.c27rQp2Dq8Qv5ZjSm7pXmRjukmWcs0rCt_56KgoKsFXceUQudGlsFXB Qd.Lt3DacL1bMaRJ0_5eFKe13Or6_7u53YkhY9TQNGm1B8qGsQodv_6APnvhXQicKSnodsOhZEwY hTdN2NrY59rpm.ggJF4rMclaXcNIvm0sew9EoK0oDsoMvbPQKna5AZCfhadfFIZ1FpqBI7njHV3X MifNKUsGByeJsDMaPt3CbBF9zHN7iKA.Zc1bXqsnFzomRRuS_O2RiFGE.lo1Fp4sJ2VCC4oNBrUN PCThGc1mhXTmvU_X9K_vtXqwszSsPnI3ZVdIv.2Jk9wyZew3nfmgBQ.V7KMYVeBM1OnsY6IY0Iu0 cfZvgnsDSe0ezMx_2.QSPSOC7QxLcudMYsLG2xFx8eXr7nmEiE9IBMZTUU6SMzhqJ5wyqKqcleyz FaGOeryntCt7cGqqMGKXCtjuqHCOQ1Dufo0aucU4gQBzW8Tdf4q.Ynvosnd4jCzUorq42295hl8v VY4x9EGKP9GRycxglyJsRL11aaWOaXQNTEAYVraofmgYTKw56QBhhMjMtHhvKf9REeCE11HPaL4h YWsjHfV_bQLZTzJE2WhSXGHGzT4neB9neAedfYz5YFenm2jbOPrrXPr8U6mb8MmaMHyYOa0drkyN pvf9nPw0qr6JrkxGXkTmfoM.0j2GPgXaaYUvzg2YUMsfNpkVrvJMUqmKwxWGaZ4pA.LCJMh7uxZ8 as91JH8zVqASaT4g55MPFUn_xn9JMe02YRGhbpiY8cd3iFeEsV_w.Oa2x6BxOPxUJDSxznJyMXY0 u_xyQx99_LuoOoyWtRqdJRvt4qCh2q9Ka1oqWl._sSVHt1AQypf61jQWqQq0GmUFbd8LRWB_TRuO fTeI8Oqd9x822Q3joO1uTMbEWOGDHh4reuFSxTtRcgtsS3GmNqXXnR5WVLZs6klsI0LsfBL2bblE srxm2XU7QcNjeKSQb9vBYgQQ86Gj5seOTMaB.MFoqSc_PvsRx9xAyBIOL8beSMJGlYG0YXlnx9Z2 xYo9vGBIhb_YrTTvguW_MqzOwhZzVh.r__RElAfvBpytRjdtKMg_ek9ANslcMAVYUq2Tz4TcNLak zA70j88uJTxH4WKq9NX1DCWaAGeLduVS9bTAFYUgRVJJBSeE6yyim5fqRcuULAQDbO.ztfE9GAD. loIpUfT9UejVGjocbiFEt.eHAUFO2MLAWOHws5jFaUVXhQNiqDnkn0NYKo5r91KJ2ysK8DFZcDM9 LqD31BKrumNBydI35CBbFRxQ9M.MDGhk9LrHBdmIanrAhHpfr8VYEk7JwMFbTJ_7BXFt6HCNU6ZL yvQzB4CkQ1w6yAFlr9E5_VrX8Xe_aNEEORWWcI7C0SHuh4TvrvyDi38sDvtex7JOAsYdvTqEUVQt IWXKIFgjxKPm4wAkFU4ILhLnEK_UBJvl7vIFhsj_E9W.8ikWzIUZqTXfLfJ8ge0uk8moWkk8JP_G ULvkGuwjn7K4w8u12YSdYSGZkCEaZSu_5RHIz2vF_nmcbdMi_1rgI2tZDRsxYSVyaQDLzPaSzuuz 59PrPLWaijGsGFQoUdEaMW47njSOUVnbeu5FpCH8xT4JSb.6uGGXJY14ilBL5ThIdkqghjTMVe0u IB0r9Hai2xPP3IIWht897ya65zGXihIkeNNef23I2dXPqtoakBwH8KYACE3YlvydZ5GtZLWmqPTY YDAjBd87LSy7T1CNcGZtiV0RZo8TifH1Qs.wx3yRYA_OeANPzyf4xKCTPNRV9.S4kzUYZrZ74eeN lYFmBl6ggPjWNqT1csqiGuEl37CcV5Tsn8m_Brsb9WQ0ZdwIRpoe7zDcpRVaFv8x7Ddva9DXPHSD lw0d1Q_Yanz_EasW4GGp9oAZuNonG3syzJ.qLs1a78bUuIkkTaZPvXbWm330m3xpwNkaYHwIE7Ej S7a7X..WonwbbfRTB7VlORokbKOWz1YcnP4zFq61jqMsJFAByhHAW2m1Ik75QytqIE1yKpcK7YGN JL4zdOdaF7yaQWfboUQ014JFZhdT29nNtCYi2zsc.pFEpR37CKVzXbi70Ck9sZSUw3Ru8vp2M X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic309.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:23:50 +0000 Received: by kubenode588.mail-prod1.omega.bf1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 2993821783ee5dab8d9867a07230f58e; Thu, 13 May 2021 20:23:44 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, Stephen Smalley , Greg Kroah-Hartman , linux-api@vger.kernel.org, linux-doc@vger.kernel.org Subject: [PATCH v26 14/25] LSM: Specify which LSM to display Date: Thu, 13 May 2021 13:07:56 -0700 Message-Id: <20210513200807.15910-15-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Create a new entry "interface_lsm" in the procfs attr directory for controlling which LSM security information is displayed for a process. A process can only read or write its own display value. The name of an active LSM that supplies hooks for human readable data may be written to "interface_lsm" to set the value. The name of the LSM currently in use can be read from "interface_lsm". At this point there can only be one LSM capable of display active. A helper function lsm_task_ilsm() is provided to get the interface lsm slot for a task_struct. Setting the "interface_lsm" requires that all security modules using setprocattr hooks allow the action. Each security module is responsible for defining its policy. AppArmor hook provided by John Johansen SELinux hook provided by Stephen Smalley Signed-off-by: Casey Schaufler Cc: Kees Cook Cc: Stephen Smalley Cc: Paul Moore Cc: John Johansen Cc: Greg Kroah-Hartman Cc: linux-api@vger.kernel.org Cc: linux-doc@vger.kernel.org Acked-by: Paul Moore --- .../ABI/testing/procfs-attr-lsm_display | 22 +++ Documentation/security/lsm.rst | 14 ++ fs/proc/base.c | 1 + include/linux/lsm_hooks.h | 17 ++ security/apparmor/include/apparmor.h | 3 +- security/apparmor/lsm.c | 32 ++++ security/security.c | 166 ++++++++++++++++-- security/selinux/hooks.c | 11 ++ security/selinux/include/classmap.h | 2 +- security/smack/smack_lsm.c | 7 + 10 files changed, 256 insertions(+), 19 deletions(-) create mode 100644 Documentation/ABI/testing/procfs-attr-lsm_display diff --git a/Documentation/ABI/testing/procfs-attr-lsm_display b/Documentation/ABI/testing/procfs-attr-lsm_display new file mode 100644 index 000000000000..0f60005c235c --- /dev/null +++ b/Documentation/ABI/testing/procfs-attr-lsm_display @@ -0,0 +1,22 @@ +What: /proc/*/attr/lsm_display +Contact: linux-security-module@vger.kernel.org, +Description: The name of the Linux security module (LSM) that will + provide information in the /proc/*/attr/current, + /proc/*/attr/prev and /proc/*/attr/exec interfaces. + The details of permissions required to read from + this interface are dependent on the LSMs active on the + system. + A process cannot write to this interface unless it + refers to itself. + The other details of permissions required to write to + this interface are dependent on the LSMs active on the + system. + The format of the data used by this interface is a + text string identifying the name of an LSM. The values + accepted are: + selinux - the SELinux LSM + smack - the Smack LSM + apparmor - The AppArmor LSM + By convention the LSM names are lower case and do not + contain special characters. +Users: LSM user-space diff --git a/Documentation/security/lsm.rst b/Documentation/security/lsm.rst index 6a2a2e973080..b77b4a540391 100644 --- a/Documentation/security/lsm.rst +++ b/Documentation/security/lsm.rst @@ -129,3 +129,17 @@ to identify it as the first security module to be registered. The capabilities security module does not use the general security blobs, unlike other modules. The reasons are historical and are based on overhead, complexity and performance concerns. + +LSM External Interfaces +======================= + +The LSM infrastructure does not generally provide external interfaces. +The individual security modules provide what external interfaces they +require. + +The file ``/sys/kernel/security/lsm`` provides a comma +separated list of the active security modules. + +The file ``/proc/pid/attr/interface_lsm`` contains the name of the security +module for which the ``/proc/pid/attr/current`` interface will +apply. This interface can be written to. diff --git a/fs/proc/base.c b/fs/proc/base.c index 3851bfcdba56..10de522f3112 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -2807,6 +2807,7 @@ static const struct pid_entry attr_dir_stuff[] = { ATTR(NULL, "fscreate", 0666), ATTR(NULL, "keycreate", 0666), ATTR(NULL, "sockcreate", 0666), + ATTR(NULL, "interface_lsm", 0666), #ifdef CONFIG_SECURITY_SMACK DIR("smack", 0555, proc_smack_attr_dir_inode_ops, proc_smack_attr_dir_ops), diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index c61a16f0a5bc..d2c4bc94d47f 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -1686,4 +1686,21 @@ static inline void security_delete_hooks(struct security_hook_list *hooks, extern int lsm_inode_alloc(struct inode *inode); +/** + * lsm_task_ilsm - the "interface_lsm" for this task + * @task: The task to report on + * + * Returns the task's interface LSM slot. + */ +static inline int lsm_task_ilsm(struct task_struct *task) +{ +#ifdef CONFIG_SECURITY + int *ilsm = task->security; + + if (ilsm) + return *ilsm; +#endif + return LSMBLOB_INVALID; +} + #endif /* ! __LINUX_LSM_HOOKS_H */ diff --git a/security/apparmor/include/apparmor.h b/security/apparmor/include/apparmor.h index 1fbabdb565a8..b1622fcb4394 100644 --- a/security/apparmor/include/apparmor.h +++ b/security/apparmor/include/apparmor.h @@ -28,8 +28,9 @@ #define AA_CLASS_SIGNAL 10 #define AA_CLASS_NET 14 #define AA_CLASS_LABEL 16 +#define AA_CLASS_DISPLAY_LSM 17 -#define AA_CLASS_LAST AA_CLASS_LABEL +#define AA_CLASS_LAST AA_CLASS_DISPLAY_LSM /* Control parameters settable through module/boot flags */ extern enum audit_mode aa_g_audit; diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index 392e25940d1f..4237536106aa 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -621,6 +621,25 @@ static int apparmor_getprocattr(struct task_struct *task, char *name, return error; } + +static int profile_interface_lsm(struct aa_profile *profile, + struct common_audit_data *sa) +{ + struct aa_perms perms = { }; + unsigned int state; + + state = PROFILE_MEDIATES(profile, AA_CLASS_DISPLAY_LSM); + if (state) { + aa_compute_perms(profile->policy.dfa, state, &perms); + aa_apply_modes_to_perms(profile, &perms); + aad(sa)->label = &profile->label; + + return aa_check_perms(profile, &perms, AA_MAY_WRITE, sa, NULL); + } + + return 0; +} + static int apparmor_setprocattr(const char *name, void *value, size_t size) { @@ -632,6 +651,19 @@ static int apparmor_setprocattr(const char *name, void *value, if (size == 0) return -EINVAL; + /* LSM infrastructure does actual setting of interface_lsm if allowed */ + if (!strcmp(name, "interface_lsm")) { + struct aa_profile *profile; + struct aa_label *label; + + aad(&sa)->info = "set interface lsm"; + label = begin_current_label_crit_section(); + error = fn_for_each_confined(label, profile, + profile_interface_lsm(profile, &sa)); + end_current_label_crit_section(label); + return error; + } + /* AppArmor requires that the buffer must be null terminated atm */ if (args[size - 1] != '\0') { /* null terminate */ diff --git a/security/security.c b/security/security.c index f5407a85641e..1ce125c01782 100644 --- a/security/security.c +++ b/security/security.c @@ -77,7 +77,16 @@ static struct kmem_cache *lsm_file_cache; static struct kmem_cache *lsm_inode_cache; char *lsm_names; -static struct lsm_blob_sizes blob_sizes __lsm_ro_after_init; + +/* + * The task blob includes the "interface_lsm" slot used for + * chosing which module presents contexts. + * Using a long to avoid potential alignment issues with + * module assigned task blobs. + */ +static struct lsm_blob_sizes blob_sizes __lsm_ro_after_init = { + .lbs_task = sizeof(long), +}; /* Boot-time LSM user choice */ static __initdata const char *chosen_lsm_order; @@ -669,6 +678,8 @@ int lsm_inode_alloc(struct inode *inode) */ static int lsm_task_alloc(struct task_struct *task) { + int *ilsm; + if (blob_sizes.lbs_task == 0) { task->security = NULL; return 0; @@ -677,6 +688,15 @@ static int lsm_task_alloc(struct task_struct *task) task->security = kzalloc(blob_sizes.lbs_task, GFP_KERNEL); if (task->security == NULL) return -ENOMEM; + + /* + * The start of the task blob contains the "interface" LSM slot number. + * Start with it set to the invalid slot number, indicating that the + * default first registered LSM be displayed. + */ + ilsm = task->security; + *ilsm = LSMBLOB_INVALID; + return 0; } @@ -1732,14 +1752,26 @@ int security_file_open(struct file *file) int security_task_alloc(struct task_struct *task, unsigned long clone_flags) { + int *oilsm = current->security; + int *nilsm; int rc = lsm_task_alloc(task); - if (rc) + if (unlikely(rc)) return rc; + rc = call_int_hook(task_alloc, 0, task, clone_flags); - if (unlikely(rc)) + if (unlikely(rc)) { security_task_free(task); - return rc; + return rc; + } + + if (oilsm) { + nilsm = task->security; + if (nilsm) + *nilsm = *oilsm; + } + + return 0; } void security_task_free(struct task_struct *task) @@ -2171,23 +2203,110 @@ int security_getprocattr(struct task_struct *p, const char *lsm, char *name, char **value) { struct security_hook_list *hp; + int ilsm = lsm_task_ilsm(current); + int slot = 0; + + if (!strcmp(name, "interface_lsm")) { + /* + * lsm_slot will be 0 if there are no displaying modules. + */ + if (lsm_slot == 0) + return -EINVAL; + + /* + * Only allow getting the current process' interface_lsm. + * There are too few reasons to get another process' + * interface_lsm and too many LSM policy issues. + */ + if (current != p) + return -EINVAL; + + ilsm = lsm_task_ilsm(p); + if (ilsm != LSMBLOB_INVALID) + slot = ilsm; + *value = kstrdup(lsm_slotlist[slot]->lsm, GFP_KERNEL); + if (*value) + return strlen(*value); + return -ENOMEM; + } hlist_for_each_entry(hp, &security_hook_heads.getprocattr, list) { if (lsm != NULL && strcmp(lsm, hp->lsmid->lsm)) continue; + if (lsm == NULL && ilsm != LSMBLOB_INVALID && + ilsm != hp->lsmid->slot) + continue; return hp->hook.getprocattr(p, name, value); } return LSM_RET_DEFAULT(getprocattr); } +/** + * security_setprocattr - Set process attributes via /proc + * @lsm: name of module involved, or NULL + * @name: name of the attribute + * @value: value to set the attribute to + * @size: size of the value + * + * Set the process attribute for the specified security module + * to the specified value. Note that this can only be used to set + * the process attributes for the current, or "self" process. + * The /proc code has already done this check. + * + * Returns 0 on success, an appropriate code otherwise. + */ int security_setprocattr(const char *lsm, const char *name, void *value, size_t size) { struct security_hook_list *hp; + char *termed; + char *copy; + int *ilsm = current->security; + int rc = -EINVAL; + int slot = 0; + + if (!strcmp(name, "interface_lsm")) { + /* + * Change the "interface_lsm" value only if all the security + * modules that support setting a procattr allow it. + * It is assumed that all such security modules will be + * cooperative. + */ + if (size == 0) + return -EINVAL; + + hlist_for_each_entry(hp, &security_hook_heads.setprocattr, + list) { + rc = hp->hook.setprocattr(name, value, size); + if (rc < 0) + return rc; + } + + rc = -EINVAL; + + copy = kmemdup_nul(value, size, GFP_KERNEL); + if (copy == NULL) + return -ENOMEM; + + termed = strsep(©, " \n"); + + for (slot = 0; slot < lsm_slot; slot++) + if (!strcmp(termed, lsm_slotlist[slot]->lsm)) { + *ilsm = lsm_slotlist[slot]->slot; + rc = size; + break; + } + + kfree(termed); + return rc; + } hlist_for_each_entry(hp, &security_hook_heads.setprocattr, list) { if (lsm != NULL && strcmp(lsm, hp->lsmid->lsm)) continue; + if (lsm == NULL && *ilsm != LSMBLOB_INVALID && + *ilsm != hp->lsmid->slot) + continue; return hp->hook.setprocattr(name, value, size); } return LSM_RET_DEFAULT(setprocattr); @@ -2207,15 +2326,15 @@ EXPORT_SYMBOL(security_ismaclabel); int security_secid_to_secctx(struct lsmblob *blob, char **secdata, u32 *seclen) { struct security_hook_list *hp; - int rc; + int ilsm = lsm_task_ilsm(current); hlist_for_each_entry(hp, &security_hook_heads.secid_to_secctx, list) { if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) continue; - rc = hp->hook.secid_to_secctx(blob->secid[hp->lsmid->slot], - secdata, seclen); - if (rc != LSM_RET_DEFAULT(secid_to_secctx)) - return rc; + if (ilsm == LSMBLOB_INVALID || ilsm == hp->lsmid->slot) + return hp->hook.secid_to_secctx( + blob->secid[hp->lsmid->slot], + secdata, seclen); } return LSM_RET_DEFAULT(secid_to_secctx); @@ -2226,16 +2345,15 @@ int security_secctx_to_secid(const char *secdata, u32 seclen, struct lsmblob *blob) { struct security_hook_list *hp; - int rc; + int ilsm = lsm_task_ilsm(current); lsmblob_init(blob, 0); hlist_for_each_entry(hp, &security_hook_heads.secctx_to_secid, list) { if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) continue; - rc = hp->hook.secctx_to_secid(secdata, seclen, - &blob->secid[hp->lsmid->slot]); - if (rc != 0) - return rc; + if (ilsm == LSMBLOB_INVALID || ilsm == hp->lsmid->slot) + return hp->hook.secctx_to_secid(secdata, seclen, + &blob->secid[hp->lsmid->slot]); } return 0; } @@ -2243,7 +2361,14 @@ EXPORT_SYMBOL(security_secctx_to_secid); void security_release_secctx(char *secdata, u32 seclen) { - call_void_hook(release_secctx, secdata, seclen); + struct security_hook_list *hp; + int ilsm = lsm_task_ilsm(current); + + hlist_for_each_entry(hp, &security_hook_heads.release_secctx, list) + if (ilsm == LSMBLOB_INVALID || ilsm == hp->lsmid->slot) { + hp->hook.release_secctx(secdata, seclen); + return; + } } EXPORT_SYMBOL(security_release_secctx); @@ -2384,8 +2509,15 @@ EXPORT_SYMBOL(security_sock_rcv_skb); int security_socket_getpeersec_stream(struct socket *sock, char __user *optval, int __user *optlen, unsigned len) { - return call_int_hook(socket_getpeersec_stream, -ENOPROTOOPT, sock, - optval, optlen, len); + int ilsm = lsm_task_ilsm(current); + struct security_hook_list *hp; + + hlist_for_each_entry(hp, &security_hook_heads.socket_getpeersec_stream, + list) + if (ilsm == LSMBLOB_INVALID || ilsm == hp->lsmid->slot) + return hp->hook.socket_getpeersec_stream(sock, optval, + optlen, len); + return -ENOPROTOOPT; } int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 0133b142e938..dba867721336 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -6510,6 +6510,17 @@ static int selinux_setprocattr(const char *name, void *value, size_t size) /* * Basic control over ability to set these attributes at all. */ + + /* + * For setting interface_lsm, we only perform a permission check; + * the actual update to the interface_lsm value is handled by the + * LSM framework. + */ + if (!strcmp(name, "interface_lsm")) + return avc_has_perm(&selinux_state, + mysid, mysid, SECCLASS_PROCESS2, + PROCESS2__SETDISPLAY, NULL); + if (!strcmp(name, "exec")) error = avc_has_perm(&selinux_state, mysid, mysid, SECCLASS_PROCESS, diff --git a/security/selinux/include/classmap.h b/security/selinux/include/classmap.h index 62d19bccf3de..8f4b0dd6dd78 100644 --- a/security/selinux/include/classmap.h +++ b/security/selinux/include/classmap.h @@ -53,7 +53,7 @@ struct security_class_mapping secclass_map[] = { "execmem", "execstack", "execheap", "setkeycreate", "setsockcreate", "getrlimit", NULL } }, { "process2", - { "nnp_transition", "nosuid_transition", NULL } }, + { "nnp_transition", "nosuid_transition", "setdisplay", NULL } }, { "system", { "ipc_info", "syslog_read", "syslog_mod", "syslog_console", "module_request", "module_load", NULL } }, diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 5c10ad27be37..7aa7ea38f627 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -3508,6 +3508,13 @@ static int smack_setprocattr(const char *name, void *value, size_t size) struct smack_known_list_elem *sklep; int rc; + /* + * Allow the /proc/.../attr/current and SO_PEERSEC "interface_lsm" + * to be reset at will. + */ + if (strcmp(name, "interface_lsm") == 0) + return 0; + if (!smack_privileged(CAP_MAC_ADMIN) && list_empty(&tsp->smk_relabel)) return -EPERM; From patchwork Thu May 13 20:07:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256517 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 04FBAC43461 for ; Thu, 13 May 2021 20:24:58 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BC79A6143C for ; Thu, 13 May 2021 20:24:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232805AbhEMU0G (ORCPT ); Thu, 13 May 2021 16:26:06 -0400 Received: from sonic309-27.consmr.mail.ne1.yahoo.com ([66.163.184.153]:46736 "EHLO sonic309-27.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232837AbhEMU0F (ORCPT ); Thu, 13 May 2021 16:26:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937495; bh=HEKDnSOsr5dIFPnVk7iUYZ7liKQS915UhYcg8nARtyw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=BbalSgCDfzWDuDi+XRvAZUpAfv3sLjyOzEjJJErhw3ukiiAu0RactSC2FmsTUYp+TPz8xcE+tRxJwwyxdlJej1K4OaoygmSRBkApsJsufSCgI/yJWv/JhJ/22gxkULgPa/l78tjw5LcGccJATBeobXEEaHVE2tesaLFYCmRwDQv4pL74C1xOe3Z7+zFAMNrpJZ9Ti+B+XFD1abM0vPYmLbSGUPCW9ML/2PFy8K4ptNpPfbR0U5LNR6GgrAo5uoe7m0xHA223Va1Y1vbY9s47+dFqVGuxJ6lH5Svx333y4olc4hemBkmH3kpQnOZlyQAkCHjisdIjBrTnFqvW9FxCrw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937495; bh=eiHrSYKSvQAlxtj3mb09JmCS2y6EawkaHusS8IiyEfa=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=SOGiOCMpM2fb5y7kPkFkY3n7XWLLHZF1uRmktDhFGhIn4TxeD78uooRF1ZwijJBfvasXmUbzlPP/mAQ3/R49KR9fgpWl6I/YBA3AmongFAxLe67KcKXPM9hRgmgfp/pBrNX3axxHSvSUpUsfSzr3AtfkyIHBMQgyi0ExPueVmV6uRLSRJCzEKJkzJxvPy+mHQ8cMog0oTPmV5VvwZL5BnD/2Byce1zF87DzSv4kMc/WvcB1vljMskzaUCRhK7SXYZhFvtSdXASLZo/UB0Mj4NnHUw99g3mHt7iAh9rOJkqeGtDVkzZWmaVAqWiGsjjuuHuVFEJG5gEr+CZ1bvPh+NA== X-YMail-OSG: L4ONLuQVM1m0RYOa9Ivx6NQT29rx48s4hQWIAEFkL99wnhI9ZrZv9jkwSPzJC28 s_Ey1OxBFVtg8POVVFHwBjOkHwSBbTzp4gvPCWOUjwHm9DO5FcvRMw6gzmTt7nH8Bu8.GkMJNbV0 aRg3XeeIez6HjryjQk0oF9OpgMAjihQCC1_MqvmiQaoCYpHeg5ICO0dYXGvn41KhwIE4UqjZIwWw TSDy9ugmXt1epRhGBMP6L77U1RgMP7_3QfHUOmEg6sEgomIqs0Q.nI64R.OX9Pm2fRHU8np0XVC7 jGjJEo4CbjWECl14TCwBozmc28R3eZtaNU4G9BdVV3W6lXakX2wXeceCCVcXVnYf2J9W4tbdGCT9 oRD4tl3MOb2EfahORhQ1WDmMVTkA4EUt9ZCCc1xBn4MAy2cUscFL13dtCGteQNWayHEpLYN3se_U zPaCiDG198lLMddQ5WUDTaU2qjVDqHGNLFwqFmlC6H93r7ESZnpyAMJzJp.3Eedkn.dLv9tLzK9M Dbr.LlcWdQ0BYoP2ZKjCspWhuncXeehkbft83V88ZN4TYnBauG8o2XyKiMElYyySErvrEzBtQdsI gfrz5f_WEFRjZ8OLXouej8cufteaKh5fmG_gEQVyKlWpe.DqldiDOOAd1nbJbACwyiCeoOGCLaar eLlzTzf8mSUwd7TQ653oJA90ZALvF69le3pAa.E3k7bVlS.FYgme2ZGoanszDRIa1h9znu5qqW6C 2xXeuRgVXSH4BFxITWvgvLk4cw2xAMYHNzWWAJspxHPdctrvwHnBh0M4o3rM3z6nF4bSRZsaiCZQ sE.bvcyGXN3BQDdO2C4v9LOLmq7lwQ4WFxs4GN1pbI_mQvgidjw1ve9_slM_Gl54L2LcsqlENoy_ bbmh_rlrAkwocr0IjJWzioy4WBCLfSFI3Jfev427EUVHYjihuGwe6oX.XTBDTYv7pgdrd_4yG8zI WqYP29vQhjjXn51EN7FeNzPv.qd_dV3m9o.7ZhA4ygUCJ9t4_Yy8nNIHuIp7Utu0Nu2GhxnsXh1K OuTouabohdVFqs2hcOp.GzN.Z31GJfL82mMR_jr5n6RLp7j55T.0WdarMgv7EPUy.u.O7tHaPI9R AFd7o4XXxQA2.iMN59YRhK3Bpvaa_ZOVT1UOeMOnjEBHPU_.RtzEAPpB7eZa1lbNI2onAcFR0QzO OZp3xmEUWV0rzemNJScfp85UkZhMFq3.hlGuIgWZTpLADwGY4UteNCmJFnsUEaWYErCgRVFAul.9 TAhZfIsNl.l.TgX30zVP7BjTAikQ535bGRQahyyjMZ2bRhFbch85KLFJEPRsnlOf.WPn1bLrXtnH FIGi2z8UUfPqhY8bOJLx6w5soG17S_XeZ2ETkDbouV6XY0evfYIpKGbHyx06nCnA8ycU5yYVtj8B WdyTReJIMh9w9qdJR5qO4fR.spO1mWk12NciwQsgXL_EaJDxcyjTSzq08w_Lu_3OymFeVKMujKGY M6ud6gA5cSK0fCnQXrX_foI5Sm2WSixnH0eL5G61wFZb1CFOilbTy94MTyJf3f0.MJLVIQ0u1RDD SzlJpnp1qsOqTBZUhmWkybTCKy9CKl0rq3ISr5SLw9PDWusx7UPv5xPpVtSSilRqom8wYsFFg0BV J35upPK7PXYDmq2Z488kpuzIk6a8E6XMDFvHn8Inb6ummvj5w5RAunOiwEQBPfphhTBrxVopCsWc o6oDkgBqYvnr1XLh79ub5yv6IESoFd8Prdvd0RUJIzScJ0KDP1h_QNqjf4y67s50hY1v2hsrfj3q 8omY5XvoYxQffV0QPrwoT.Wu6v2qxUo_msak777AI9xVMLZtkN1MBGpJRRvDOW.Y8YvQRPqFcoGk WQeKMgZzyD8HpUD6DC4U5RE.qbGCs3rudKDUDfz46UNf1i_q6eW_fM0Qe_iqXi74hKiIxHL9dax9 ySUQis8gvd8XaaiPxZSNjQMOUydcg5td2m3GUp9I94o_JleldVIOhv1QQDGvPnI1ck35y91Y2Bf7 vBEeEU5N9YXBDRS.a9Ioi426tY4kRMMdhLqlaGdypcH2BQyyLkxzRO2GEtpRiN.pSXdeYJklQVk9 uHk2BBcHja_WaoIG0lV7eaaRDtNqLTEMvFxUyGt.1BVWXjdOudNQjllwwHhd6kZ5UaVuicer7cyy JcrK_55cWprb7ofgNz1s2GFmVVPK_guMuz4dbsBDHGs5ABcmBriwRTRLfbya3q7SwvCCkKCgGdN8 lsjicmux_sLNIOBnYdea36aL6VDR2_Cb04PpVjMZMNYfBGzkfUVHvyyP_xyfQAsDRejwb_RllauX IOLrwCwB_7JZFBVUTJpB9cmYnqyVdFEl5hmwW3vznkDcPDKiEIlCp8Agg0YCv.rU1OFPvjaOf4dW e4rtVKUMa3eLp8CrItbMAgkDlYgRwPSDKcU4Ln6BUGJXgnmBdO6Dac2.DmAei.ACkxwP_NbbsYrp UMGO50Qs5QQqUEA6zjtYayRMen2UExy_gTEYYB3wVn.T.IZEoZB3iVH_JJkQ.HBdyGCEWMyWBd2W XCNfs2S3LxQz74zO0I7JHW9fLihKPa.KnJ_Ac703vglLCmE623cAE1y4xVASKQLWNei3nBVFi24d E2dXzEMW_r69xdad6F7nH7WgvYqGgLwE45lqa3vNwG6K3xE0qhTcq3aGj37tAIx7oc6e6S8SfLbz OoHhnLRwAPoSClFIZCcypGCzpD0fhN32wCnRiOjo3_SaPbzcTi6eXrX0UyVAQvEZcWMQght6YzBU EO_3tmVNMOSqOA1g56FLs_MEw7iyzePTTCmaMRRWNxcDZVDeL6hfDgnx2T7XophrfW7CWr2wDVgw H9Y9uZZbGJZ.II0.ccRg7mniiJqTwBXLfSUApHt0KPu3rrtfRzM.XKYXpZZzDqi8gJhk8R_rZaQq NzGE4IP.MKb1dbfaYjTh4WNz63hvoFeezJRfcvvtoPfk_UFBvdt_M1o.KbadjyaFFD4dRbgbA2yX NKLnLqOeSMyIiNlt1R2ziMymwVcnzzjTEP5Y6ky_WhwerNXCt2VTB8S6nrbxWG9zKqbludyMliCI tDfAai2wlHwLfCo4aJ1d7CbHYOTKS3QEkNYJxvB_fVXkIsyyNWtuf_KNvxw0ataKxYx8EDe5wQgn lBlpUq2Iu1GQCm86XjQvNdk72e1qJ6tkvgk0eXC6jnfoKv9QCUhCV2QX6FWDc1Xzhzc_cDuc6.oA iuHI4WOK37BaUuQH_2LE1loKanSKauG7Evm_jVM.E1Pd3shvZqI3TDLyGl3jSZI1_HJIJGsMD0WS J8x61kAoJj6eOeYq6UPslIFIvF2tHfb3N0dkvYrpkKJKMzbYyNAG4mNgvjSHTwQK2GpHSyVl4OiK 5IfWIzE33k8tCa1.ixJrCYh_aS.4D.45oDKGpfjDIRwOPwTctFNRcvDtmjRLx4FeRHGOODEbaNEt ErXZrcOSBRJorj4e5WuYVGcz.INaE866xYkmccXwPxmmVu6KHWtXDwUZEagxZq9hEkRn.FoY2Rs3 ikuvvBw3K X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic309.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:24:55 +0000 Received: by kubenode512.mail-prod1.omega.bf1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 5f07466c1e228d479742e3c8b2251e2f; Thu, 13 May 2021 20:24:52 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, Chuck Lever , linux-integrity@vger.kernel.org, netdev@vger.kernel.org, netfilter-devel@vger.kernel.org, linux-nfs@vger.kernel.org Subject: [PATCH v26 15/25] LSM: Ensure the correct LSM context releaser Date: Thu, 13 May 2021 13:07:57 -0700 Message-Id: <20210513200807.15910-16-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Add a new lsmcontext data structure to hold all the information about a "security context", including the string, its size and which LSM allocated the string. The allocation information is necessary because LSMs have different policies regarding the lifecycle of these strings. SELinux allocates and destroys them on each use, whereas Smack provides a pointer to an entry in a list that never goes away. Reviewed-by: Kees Cook Reviewed-by: John Johansen Acked-by: Stephen Smalley Acked-by: Chuck Lever Signed-off-by: Casey Schaufler Cc: linux-integrity@vger.kernel.org Cc: netdev@vger.kernel.org Cc: linux-audit@redhat.com Cc: netfilter-devel@vger.kernel.org To: Pablo Neira Ayuso Cc: linux-nfs@vger.kernel.org Acked-by: Paul Moore --- drivers/android/binder.c | 10 ++++--- fs/ceph/xattr.c | 6 ++++- fs/nfs/nfs4proc.c | 8 ++++-- fs/nfsd/nfs4xdr.c | 7 +++-- include/linux/security.h | 35 +++++++++++++++++++++++-- include/net/scm.h | 5 +++- kernel/audit.c | 14 +++++++--- kernel/auditsc.c | 12 ++++++--- net/ipv4/ip_sockglue.c | 4 ++- net/netfilter/nf_conntrack_netlink.c | 4 ++- net/netfilter/nf_conntrack_standalone.c | 4 ++- net/netfilter/nfnetlink_queue.c | 13 ++++++--- net/netlabel/netlabel_unlabeled.c | 19 +++++++++++--- net/netlabel/netlabel_user.c | 4 ++- security/security.c | 11 ++++---- 15 files changed, 121 insertions(+), 35 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index ab55358f868b..eca789340ef6 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -2461,6 +2461,7 @@ static void binder_transaction(struct binder_proc *proc, int t_debug_id = atomic_inc_return(&binder_last_id); char *secctx = NULL; u32 secctx_sz = 0; + struct lsmcontext scaff; /* scaffolding */ e = binder_transaction_log_add(&binder_transaction_log); e->debug_id = t_debug_id; @@ -2772,7 +2773,8 @@ static void binder_transaction(struct binder_proc *proc, t->security_ctx = 0; WARN_ON(1); } - security_release_secctx(secctx, secctx_sz); + lsmcontext_init(&scaff, secctx, secctx_sz, 0); + security_release_secctx(&scaff); secctx = NULL; } t->buffer->debug_id = t->debug_id; @@ -3114,8 +3116,10 @@ static void binder_transaction(struct binder_proc *proc, binder_alloc_free_buf(&target_proc->alloc, t->buffer); err_binder_alloc_buf_failed: err_bad_extra_size: - if (secctx) - security_release_secctx(secctx, secctx_sz); + if (secctx) { + lsmcontext_init(&scaff, secctx, secctx_sz, 0); + security_release_secctx(&scaff); + } err_get_secctx_failed: kfree(tcomplete); binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE); diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c index 1242db8d3444..b867089e1aa4 100644 --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c @@ -1356,12 +1356,16 @@ int ceph_security_init_secctx(struct dentry *dentry, umode_t mode, void ceph_release_acl_sec_ctx(struct ceph_acl_sec_ctx *as_ctx) { +#ifdef CONFIG_CEPH_FS_SECURITY_LABEL + struct lsmcontext scaff; /* scaffolding */ +#endif #ifdef CONFIG_CEPH_FS_POSIX_ACL posix_acl_release(as_ctx->acl); posix_acl_release(as_ctx->default_acl); #endif #ifdef CONFIG_CEPH_FS_SECURITY_LABEL - security_release_secctx(as_ctx->sec_ctx, as_ctx->sec_ctxlen); + lsmcontext_init(&scaff, as_ctx->sec_ctx, as_ctx->sec_ctxlen, 0); + security_release_secctx(&scaff); #endif if (as_ctx->pagelist) ceph_pagelist_release(as_ctx->pagelist); diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 87d04f2c9385..a179d70eeb7e 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -136,8 +136,12 @@ nfs4_label_init_security(struct inode *dir, struct dentry *dentry, static inline void nfs4_label_release_security(struct nfs4_label *label) { - if (label) - security_release_secctx(label->label, label->len); + struct lsmcontext scaff; /* scaffolding */ + + if (label) { + lsmcontext_init(&scaff, label->label, label->len, 0); + security_release_secctx(&scaff); + } } static inline u32 *nfs4_bitmask(struct nfs_server *server, struct nfs4_label *label) { diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 7abeccb975b2..089ec4b61ef1 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -2844,6 +2844,7 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp, int err; struct nfs4_acl *acl = NULL; #ifdef CONFIG_NFSD_V4_SECURITY_LABEL + struct lsmcontext scaff; /* scaffolding */ void *context = NULL; int contextlen; #endif @@ -3345,8 +3346,10 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp, out: #ifdef CONFIG_NFSD_V4_SECURITY_LABEL - if (context) - security_release_secctx(context, contextlen); + if (context) { + lsmcontext_init(&scaff, context, contextlen, 0); /*scaffolding*/ + security_release_secctx(&scaff); + } #endif /* CONFIG_NFSD_V4_SECURITY_LABEL */ kfree(acl); if (tempfh) { diff --git a/include/linux/security.h b/include/linux/security.h index c1c31eb23859..3b2ffef65b05 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -133,6 +133,37 @@ enum lockdown_reason { extern const char *const lockdown_reasons[LOCKDOWN_CONFIDENTIALITY_MAX+1]; +/* + * A "security context" is the text representation of + * the information used by LSMs. + * This structure contains the string, its length, and which LSM + * it is useful for. + */ +struct lsmcontext { + char *context; /* Provided by the module */ + u32 len; + int slot; /* Identifies the module */ +}; + +/** + * lsmcontext_init - initialize an lsmcontext structure. + * @cp: Pointer to the context to initialize + * @context: Initial context, or NULL + * @size: Size of context, or 0 + * @slot: Which LSM provided the context + * + * Fill in the lsmcontext from the provided information. + * This is a scaffolding function that will be removed when + * lsmcontext integration is complete. + */ +static inline void lsmcontext_init(struct lsmcontext *cp, char *context, + u32 size, int slot) +{ + cp->slot = slot; + cp->context = context; + cp->len = size; +} + /* * Data exported by the security modules * @@ -550,7 +581,7 @@ int security_ismaclabel(const char *name); int security_secid_to_secctx(struct lsmblob *blob, char **secdata, u32 *seclen); int security_secctx_to_secid(const char *secdata, u32 seclen, struct lsmblob *blob); -void security_release_secctx(char *secdata, u32 seclen); +void security_release_secctx(struct lsmcontext *cp); void security_inode_invalidate_secctx(struct inode *inode); int security_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen); int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen); @@ -1414,7 +1445,7 @@ static inline int security_secctx_to_secid(const char *secdata, return -EOPNOTSUPP; } -static inline void security_release_secctx(char *secdata, u32 seclen) +static inline void security_release_secctx(struct lsmcontext *cp) { } diff --git a/include/net/scm.h b/include/net/scm.h index 23a35ff1b3f2..f273c4d777ec 100644 --- a/include/net/scm.h +++ b/include/net/scm.h @@ -92,6 +92,7 @@ static __inline__ int scm_send(struct socket *sock, struct msghdr *msg, #ifdef CONFIG_SECURITY_NETWORK static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm) { + struct lsmcontext context; struct lsmblob lb; char *secdata; u32 seclen; @@ -106,7 +107,9 @@ static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct sc if (!err) { put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, seclen, secdata); - security_release_secctx(secdata, seclen); + /*scaffolding*/ + lsmcontext_init(&context, secdata, seclen, 0); + security_release_secctx(&context); } } } diff --git a/kernel/audit.c b/kernel/audit.c index 8ec64e6e8bc0..c17ec23158c4 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -1192,6 +1192,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) struct audit_sig_info *sig_data; char *ctx = NULL; u32 len; + struct lsmcontext scaff; /* scaffolding */ err = audit_netlink_ok(skb, msg_type); if (err) @@ -1449,15 +1450,18 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) } sig_data = kmalloc(sizeof(*sig_data) + len, GFP_KERNEL); if (!sig_data) { - if (lsmblob_is_set(&audit_sig_lsm)) - security_release_secctx(ctx, len); + if (lsmblob_is_set(&audit_sig_lsm)) { + lsmcontext_init(&scaff, ctx, len, 0); + security_release_secctx(&scaff); + } return -ENOMEM; } sig_data->uid = from_kuid(&init_user_ns, audit_sig_uid); sig_data->pid = audit_sig_pid; if (lsmblob_is_set(&audit_sig_lsm)) { memcpy(sig_data->ctx, ctx, len); - security_release_secctx(ctx, len); + lsmcontext_init(&scaff, ctx, len, 0); + security_release_secctx(&scaff); } audit_send_reply(skb, seq, AUDIT_SIGNAL_INFO, 0, 0, sig_data, sizeof(*sig_data) + len); @@ -2132,6 +2136,7 @@ int audit_log_task_context(struct audit_buffer *ab) unsigned len; int error; struct lsmblob blob; + struct lsmcontext scaff; /* scaffolding */ security_task_getsecid_subj(current, &blob); if (!lsmblob_is_set(&blob)) @@ -2145,7 +2150,8 @@ int audit_log_task_context(struct audit_buffer *ab) } audit_log_format(ab, " subj=%s", ctx); - security_release_secctx(ctx, len); + lsmcontext_init(&scaff, ctx, len, 0); + security_release_secctx(&scaff); return 0; error_path: diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 573c6a8e505f..3fb9d3639123 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -996,6 +996,7 @@ static int audit_log_pid_context(struct audit_context *context, pid_t pid, struct lsmblob *blob, char *comm) { struct audit_buffer *ab; + struct lsmcontext lsmcxt; char *ctx = NULL; u32 len; int rc = 0; @@ -1013,7 +1014,8 @@ static int audit_log_pid_context(struct audit_context *context, pid_t pid, rc = 1; } else { audit_log_format(ab, " obj=%s", ctx); - security_release_secctx(ctx, len); + lsmcontext_init(&lsmcxt, ctx, len, 0); /*scaffolding*/ + security_release_secctx(&lsmcxt); } } audit_log_format(ab, " ocomm="); @@ -1226,6 +1228,7 @@ static void audit_log_fcaps(struct audit_buffer *ab, struct audit_names *name) static void show_special(struct audit_context *context, int *call_panic) { + struct lsmcontext lsmcxt; struct audit_buffer *ab; int i; @@ -1259,7 +1262,8 @@ static void show_special(struct audit_context *context, int *call_panic) *call_panic = 1; } else { audit_log_format(ab, " obj=%s", ctx); - security_release_secctx(ctx, len); + lsmcontext_init(&lsmcxt, ctx, len, 0); + security_release_secctx(&lsmcxt); } } if (context->ipc.has_perm) { @@ -1408,6 +1412,7 @@ static void audit_log_name(struct audit_context *context, struct audit_names *n, char *ctx = NULL; u32 len; struct lsmblob blob; + struct lsmcontext lsmcxt; lsmblob_init(&blob, n->osid); if (security_secid_to_secctx(&blob, &ctx, &len)) { @@ -1416,7 +1421,8 @@ static void audit_log_name(struct audit_context *context, struct audit_names *n, *call_panic = 2; } else { audit_log_format(ab, " obj=%s", ctx); - security_release_secctx(ctx, len); + lsmcontext_init(&lsmcxt, ctx, len, 0); /* scaffolding */ + security_release_secctx(&lsmcxt); } } diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index 2f089733ada7..a7e4c1b34b6c 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c @@ -130,6 +130,7 @@ static void ip_cmsg_recv_checksum(struct msghdr *msg, struct sk_buff *skb, static void ip_cmsg_recv_security(struct msghdr *msg, struct sk_buff *skb) { + struct lsmcontext context; struct lsmblob lb; char *secdata; u32 seclen, secid; @@ -145,7 +146,8 @@ static void ip_cmsg_recv_security(struct msghdr *msg, struct sk_buff *skb) return; put_cmsg(msg, SOL_IP, SCM_SECURITY, seclen, secdata); - security_release_secctx(secdata, seclen); + lsmcontext_init(&context, secdata, seclen, 0); /* scaffolding */ + security_release_secctx(&context); } static void ip_cmsg_recv_dstaddr(struct msghdr *msg, struct sk_buff *skb) diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index caf3ecb5a66b..914ab6a96573 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -339,6 +339,7 @@ static int ctnetlink_dump_secctx(struct sk_buff *skb, const struct nf_conn *ct) int len, ret; char *secctx; struct lsmblob blob; + struct lsmcontext context; /* lsmblob_init() puts ct->secmark into all of the secids in blob. * security_secid_to_secctx() will know which security module @@ -359,7 +360,8 @@ static int ctnetlink_dump_secctx(struct sk_buff *skb, const struct nf_conn *ct) ret = 0; nla_put_failure: - security_release_secctx(secctx, len); + lsmcontext_init(&context, secctx, len, 0); /* scaffolding */ + security_release_secctx(&context); return ret; } #else diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index b02afa0a1516..b039445f3efc 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c @@ -176,6 +176,7 @@ static void ct_show_secctx(struct seq_file *s, const struct nf_conn *ct) u32 len; char *secctx; struct lsmblob blob; + struct lsmcontext context; lsmblob_init(&blob, ct->secmark); ret = security_secid_to_secctx(&blob, &secctx, &len); @@ -184,7 +185,8 @@ static void ct_show_secctx(struct seq_file *s, const struct nf_conn *ct) seq_printf(s, "secctx=%s ", secctx); - security_release_secctx(secctx, len); + lsmcontext_init(&context, secctx, len, 0); /* scaffolding */ + security_release_secctx(&context); } #else static inline void ct_show_secctx(struct seq_file *s, const struct nf_conn *ct) diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c index bdbb0b60bf7b..06b7751c7668 100644 --- a/net/netfilter/nfnetlink_queue.c +++ b/net/netfilter/nfnetlink_queue.c @@ -397,6 +397,7 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue, enum ip_conntrack_info ctinfo; struct nfnl_ct_hook *nfnl_ct; bool csum_verify; + struct lsmcontext scaff; /* scaffolding */ char *secdata = NULL; u32 seclen = 0; @@ -626,8 +627,10 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue, } nlh->nlmsg_len = skb->len; - if (seclen) - security_release_secctx(secdata, seclen); + if (seclen) { + lsmcontext_init(&scaff, secdata, seclen, 0); + security_release_secctx(&scaff); + } return skb; nla_put_failure: @@ -635,8 +638,10 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue, kfree_skb(skb); net_err_ratelimited("nf_queue: error creating packet message\n"); nlmsg_failure: - if (seclen) - security_release_secctx(secdata, seclen); + if (seclen) { + lsmcontext_init(&scaff, secdata, seclen, 0); + security_release_secctx(&scaff); + } return NULL; } diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index b08442582874..8ca1e2b33dcf 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c @@ -374,6 +374,7 @@ int netlbl_unlhsh_add(struct net *net, struct net_device *dev; struct netlbl_unlhsh_iface *iface; struct audit_buffer *audit_buf = NULL; + struct lsmcontext context; char *secctx = NULL; u32 secctx_len; struct lsmblob blob; @@ -447,7 +448,9 @@ int netlbl_unlhsh_add(struct net *net, &secctx, &secctx_len) == 0) { audit_log_format(audit_buf, " sec_obj=%s", secctx); - security_release_secctx(secctx, secctx_len); + /* scaffolding */ + lsmcontext_init(&context, secctx, secctx_len, 0); + security_release_secctx(&context); } audit_log_format(audit_buf, " res=%u", ret_val == 0 ? 1 : 0); audit_log_end(audit_buf); @@ -478,6 +481,7 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, struct netlbl_unlhsh_addr4 *entry; struct audit_buffer *audit_buf; struct net_device *dev; + struct lsmcontext context; char *secctx; u32 secctx_len; struct lsmblob blob; @@ -509,7 +513,9 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, security_secid_to_secctx(&blob, &secctx, &secctx_len) == 0) { audit_log_format(audit_buf, " sec_obj=%s", secctx); - security_release_secctx(secctx, secctx_len); + /* scaffolding */ + lsmcontext_init(&context, secctx, secctx_len, 0); + security_release_secctx(&context); } audit_log_format(audit_buf, " res=%u", entry != NULL ? 1 : 0); audit_log_end(audit_buf); @@ -546,6 +552,7 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, struct netlbl_unlhsh_addr6 *entry; struct audit_buffer *audit_buf; struct net_device *dev; + struct lsmcontext context; char *secctx; u32 secctx_len; struct lsmblob blob; @@ -576,7 +583,8 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, security_secid_to_secctx(&blob, &secctx, &secctx_len) == 0) { audit_log_format(audit_buf, " sec_obj=%s", secctx); - security_release_secctx(secctx, secctx_len); + lsmcontext_init(&context, secctx, secctx_len, 0); + security_release_secctx(&context); } audit_log_format(audit_buf, " res=%u", entry != NULL ? 1 : 0); audit_log_end(audit_buf); @@ -1095,6 +1103,7 @@ static int netlbl_unlabel_staticlist_gen(u32 cmd, int ret_val = -ENOMEM; struct netlbl_unlhsh_walk_arg *cb_arg = arg; struct net_device *dev; + struct lsmcontext context; void *data; u32 secid; char *secctx; @@ -1165,7 +1174,9 @@ static int netlbl_unlabel_staticlist_gen(u32 cmd, NLBL_UNLABEL_A_SECCTX, secctx_len, secctx); - security_release_secctx(secctx, secctx_len); + /* scaffolding */ + lsmcontext_init(&context, secctx, secctx_len, 0); + security_release_secctx(&context); if (ret_val != 0) goto list_cb_failure; diff --git a/net/netlabel/netlabel_user.c b/net/netlabel/netlabel_user.c index 893301ae0131..ef139d8ae7cd 100644 --- a/net/netlabel/netlabel_user.c +++ b/net/netlabel/netlabel_user.c @@ -84,6 +84,7 @@ struct audit_buffer *netlbl_audit_start_common(int type, struct netlbl_audit *audit_info) { struct audit_buffer *audit_buf; + struct lsmcontext context; char *secctx; u32 secctx_len; struct lsmblob blob; @@ -103,7 +104,8 @@ struct audit_buffer *netlbl_audit_start_common(int type, if (audit_info->secid != 0 && security_secid_to_secctx(&blob, &secctx, &secctx_len) == 0) { audit_log_format(audit_buf, " subj=%s", secctx); - security_release_secctx(secctx, secctx_len); + lsmcontext_init(&context, secctx, secctx_len, 0);/*scaffolding*/ + security_release_secctx(&context); } return audit_buf; diff --git a/security/security.c b/security/security.c index 1ce125c01782..f6a33bf2a7fc 100644 --- a/security/security.c +++ b/security/security.c @@ -2359,16 +2359,17 @@ int security_secctx_to_secid(const char *secdata, u32 seclen, } EXPORT_SYMBOL(security_secctx_to_secid); -void security_release_secctx(char *secdata, u32 seclen) +void security_release_secctx(struct lsmcontext *cp) { struct security_hook_list *hp; - int ilsm = lsm_task_ilsm(current); hlist_for_each_entry(hp, &security_hook_heads.release_secctx, list) - if (ilsm == LSMBLOB_INVALID || ilsm == hp->lsmid->slot) { - hp->hook.release_secctx(secdata, seclen); - return; + if (cp->slot == hp->lsmid->slot) { + hp->hook.release_secctx(cp->context, cp->len); + break; } + + memset(cp, 0, sizeof(*cp)); } EXPORT_SYMBOL(security_release_secctx); From patchwork Thu May 13 20:07:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256519 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY, URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A7A9BC433ED for ; Thu, 13 May 2021 20:26:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 66977611CC for ; Thu, 13 May 2021 20:26:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232859AbhEMU1L (ORCPT ); Thu, 13 May 2021 16:27:11 -0400 Received: from sonic309-27.consmr.mail.ne1.yahoo.com ([66.163.184.153]:36679 "EHLO sonic309-27.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232723AbhEMU1K (ORCPT ); Thu, 13 May 2021 16:27:10 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937560; bh=58TrarWqrWx19kx0PD1EPD70n63T+nBmry7xCis3tXs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=OlHuYhIb6Tfhu4n4QfF134108Rj/KGIhluSQvZCRCL4Chf3hlibP9YOS/ORmndH5IhQXgVCP5TH7rlfw/SRLVV5koUX31gJoEsrfPFADmfnw3AAYZ2u0JnKZahzCG8i3nFbfRvDdeUlRBf1K8F4y9Q7vve5aXR44g5Cdn9X1OlmJvvwUlKZvRvSaps0Je1PHypr2J85ahvy9NUXGwF0vrnUKpRHZVSXKIXdyT60TcE6dDQn9OzqbWeu2EdxArSdzKohm6mqDdmIP+/vEtk8m/MqJSTTjZ+DD/sn90jCK4pEnazuKkbwVq/37GTZsJspfURpazKuKWbNeiHd5+weg4g== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937560; bh=ifPUHRm2iqQFgiD5jpWcWIQrdpNmFN447rBcN+3woH1=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=RYQesP6yOWkZ/yb1aeGSiwM6O6oL1yL2EKwwhO4f9nxXGOWV5GXGyV/1tCaft0P1VyTACQxTjUc6YkDTlPXLtloD1r4ZOu/h9pXNv3uRDiY1rEE+5jMWD82v0htKyqpc5RGWFcr568x77lt0ZGIOZL3ahMlv9tcRDmalrLzcHJ5rX7D9ASZ+OD9jcHpzq1kj1MbrsAeD8V6vSM0S3m0NNHuE2thb4/2VvDlaRvdLGmKdy/qLYo8LwkabIBNfQRlEHcdOLn8S5MCzEboP+wvhWjQ6fNVjJuk9xqWrR4lb8uZKeQ4r8r3K1tT/DlhTW0ZKK0ftxig+rp0MPUMQQtF3Ng== X-YMail-OSG: C4PA2x0VM1klmEe7Mptwb_ubcq7SV5aMN5Xe5Ds5qasZoMtX415U740LgeLn9TA ID062NGzeKp4mrnnLxYFh1TYbuun99VZ.iWfsZEgL0c4MgkMhC0P5O6iioyGzdnFVjm7sHbwqhPg b1VP5VgcteJvakT9j2xyf2odCVnj6_liE4mO_FslJ6S3qyoDmQilYz1cvQsgoCwOhIzy8_1vcbZw gbEuP7GAkQOaBj81fjOgAzKM4uO.y9s4NpXbrRTk2K9lnvA9Eaoo5mPhGVmsk6slHbYRLFa_34xZ x8dZHDZrrlK.uxl5n5zLPWegss1AUKhMJPjy1QgR58yRptWHnn_YuZkqft2PhHuYMnSAd1GlMtkN jLO1KnQYJLp2QgwS4K4V4iWQm8NdLzUAfJdpaN_uy37nGTTUpsVMudnoNl0uD9WFOFdlP8S6FdVr BmdbNuNCQ.13ftcufBiSeRvgAhkLG.OEiN7yoL6CbGQNtcGMLvrGainy7dCPw.pboCcV.PUSlTBN jR31eM3wJmhk.WVRubwHPEhzfuaWOjZZvFoptHBwIVNNLGuixty9op8amCsw8uQc4kxY88mEo00J F4EPG1Arym.piB.Lg6EqC7yorWEw0yuqbChnL7KnUoKS_XYbEJGwmSPysMrd11afXt2l2umd_roy fu.nBRZvdHoWnUgyRWoRRBfaA65lUPQff0uX4HcxdHx9GLmjSNDFasGq4HRiLn0Y_iYeEgqCMps5 jqoMr7J860sojCybbpco7xnqha6wVxb8qMJWdjlswURBwi2g9YUEuDYyFojSJuFfgKBwjGHkQnjP VynJpouDmIBJ4xY_Uoh3mTE.0kxIyifh32la2bhuWb3zWunwl1yXYsrJ7SLe0SvFZeI1mYIkzfX4 KA3DL6zzGy6yGV4vIsgYcX11Ha4da7xYfiuYKHfOS2xXN_xyhV.Q7WBKAWGG9RAOck7av7xxkeiR qw7VKSR4Uim10gw32cioMLTobHB62cGClrSalpPGBsHut.9mKNhghhxqdTgygEW1vJqTC3ekJXcB su6r.qTC0HjpXc_TxaiB6_R1inp..NCzMKYI3d545sibw_4Hv_TLTp_oIfZyymxV_QSQXDubg_xM M4rBfXj41sPu_AzKvZg98Py5KuJEAlkfyNfvPOQ8A2HSHURimaHlK4A3H0M1qb8ZKpt9ulZUzMp7 Guwoay8ebKXnatfgwWZ4wbFvc4n64frrkw.ub0q1hKgTU5N7vP1L9HSrOlzT4KEXehNS7GEMXzuj 4orLLLyanqoUxZOE8fK90uvVOcVvEAW_FCHREHtWwc20jnzGgyLZwCuujX2nGXk_WbRLpyrS09V3 Jb1h84dxoZ5j5NLhRHqrV4sh2X_ctl6dideYkAxlMMV9fGZCDEC9fYwX.7wXghSE1lw7girFx2i2 HIU5sjv4nk23YkHip4sQ5rKbL3Dto1T1cEWsLJI3pgXkVXC2whR8gkev2q_m0dWtqbTHy9Fiw8Pn ZnqCZ69M7eZEJLFkm6toF_iARO_UU27c8x1XsZxHqlwLV_lvT5zvWyXW6xaDvvJSJWQpk4llVE5_ uoJConH7h0RLMydOu.msAB7PUn.OLUM7gGsGx5JuIui7e01.5cqGyiD8KO82Ch3_2s9yqDON.JqJ QIEdnsL1CmE7nWDaPL1oA0KllOo4qIN94AGbBUYFMqOrASdPWcph46bjvGRejFXKZLrpYqPxhmV6 HZf4WMRO1SjxEg.v3Bv6n81mUGLAxd3weeu4PSFO8U9Vk3eGBy0ueIW3EKzlq8XygpONLHW4zzh5 6wuCMwbTe7Hgsx8z8feSPSKnAEHopgrWNeAEpdARDFwwIT2R5SYniGlSVZHLcC4_YE7qS2smYaZS atXkRkXa3TnMiZ1eHXhQxoEjFHlkn9yJJQmF.vHmg3sTujdc55wjzE7pFlzkEPCJiqHf2R34Qq1G R5bQ3ydFqUTiWdkGCwhmOuEOtw_7qomtwSd2LmHxWiV1yCabYimj11wpniiS0wG1qA6T9egK5u2Q bgdeXIajnt0KsWgAX1zjMQORnJMGLTmj0TNEEzh9XCNVraxEIL2jwlBu.xtt9SqnWHL.oGH_n76q JXzQ7Ml2mxNdvI1daXY0XU.G_BV4mDwyAwWOooadhSz9RdJp0x4Kgu.pZfcYbwdzjUtg.7KvihFo xeHL3Tv2SH1YdQYoPfWdhIwIK.luDEMIsFyNWrtX_EfW3yq5Znc7KAXLQxetq39pxWgiQ5SS0Gt0 TaOxPPVDW8Mr.UfHDlm2uRnOXihv6hbsOzqy2J0LKR0iV2U7FKClUIjDea8UXdvhIAWHv3n1rhDY xCPz6DN8ASMzz.zyN9b5FowfLAfW2ba45kNywZguqf45HgqWOTUc9Cbmya8IYfNvP44sp65.D1dl kokvgkha.Xs8DvQhewwvyrT2Z3SzB4v_bQ9vof7XQo4z7q4jwhQc1XHmsaHgL71uGzweZ_XdusFU w2X.1_2Vn6H_3qfJhutqS6yJGObijMHtaFpj7b1G.nMQTv8urh2X4nRFsLGSWLjq94ULPadHY4E3 liHCCfCL7Z2NVGIzsSfx4REi9r.sfFDL1krzzD9cqgSI.g6tFw5vl3MnAQhu44xUpVEAggtpClsT 7uzM1oyB72vcg.Gg8wShzSRbnj5ypaEeDHDmlh9uWH40xRTcb4f22zzEeBkM__crDKt8gIE7tZ1t gud9_csRsdz4jDT4es2Uinv8JC_EjAH1Ibs_5MYqlbbmkNEnxhb04ow5xYC00TtaA5EsO9_RlvYz tpAU3bRouRNnjDhnyNfS8SU57kp2G1bW8rcb6mKxba4HTD_Fbdv_KGUXtEjFtTV7aREMAO4eXBhH zk8BkuY6W.2fbCeHwteHD3uVoUvj3gmNBYPtZbQbl8FIpVAxe3IDwsWzWsip8u.3R9d6A_Mom.Hn qLWX1t2b5UjHvdGlzuY3m_gbnmLHYRxrMxZd5MKPsoW34sZJDrF7waDSgBlQHhFT990RsrOtRK8k RDvcAUUuaxZHR8YNvmuhc_nAVfT2gu5kyP_55rPN9xWLRp_6tPldmsNo7YeNUjx19bMH.gI1yAPh LqXUM0Vm72PMOJ8CMSmEMukunJcjF0z3taFUbTpfEEVhlhfo0s3QDksugUMO508jIsmJzEx2qMee QDirQ7fd27QEM4V8SUuX2KiqWV71I8zfRRQePjJcZNU1dIns_6FafI.GhN4CcCK__Cg7zLbN8WfO 5YpeRqssZsUNCLvTol42jTdeYp6iR79ig99RMzJ5HkWZxqQql4BwaCVfS7FszuYbhgdSecZ.D1Or uOPQjbw-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic309.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:26:00 +0000 Received: by kubenode512.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID ed75b12c0acb1fadc13d01a4b8163364; Thu, 13 May 2021 20:25:58 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, netfilter-devel@vger.kernel.org Subject: [PATCH v26 16/25] LSM: Use lsmcontext in security_secid_to_secctx Date: Thu, 13 May 2021 13:07:58 -0700 Message-Id: <20210513200807.15910-17-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Replace the (secctx,seclen) pointer pair with a single lsmcontext pointer to allow return of the LSM identifier along with the context and context length. This allows security_release_secctx() to know how to release the context. Callers have been modified to use or save the returned data from the new structure. Reviewed-by: Kees Cook Acked-by: Stephen Smalley Acked-by: Paul Moore Signed-off-by: Casey Schaufler Cc: netdev@vger.kernel.org Cc: linux-audit@redhat.com Cc: netfilter-devel@vger.kernel.org --- drivers/android/binder.c | 26 +++++++--------- include/linux/security.h | 4 +-- include/net/scm.h | 9 ++---- kernel/audit.c | 39 +++++++++++------------- kernel/auditsc.c | 31 +++++++------------ net/ipv4/ip_sockglue.c | 8 ++--- net/netfilter/nf_conntrack_netlink.c | 18 +++++------ net/netfilter/nf_conntrack_standalone.c | 7 ++--- net/netfilter/nfnetlink_queue.c | 5 +++- net/netlabel/netlabel_unlabeled.c | 40 ++++++++----------------- net/netlabel/netlabel_user.c | 7 ++--- security/security.c | 10 +++++-- 12 files changed, 81 insertions(+), 123 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index eca789340ef6..f2a27bbbbe4d 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -2459,9 +2459,7 @@ static void binder_transaction(struct binder_proc *proc, binder_size_t last_fixup_min_off = 0; struct binder_context *context = proc->context; int t_debug_id = atomic_inc_return(&binder_last_id); - char *secctx = NULL; - u32 secctx_sz = 0; - struct lsmcontext scaff; /* scaffolding */ + struct lsmcontext lsmctx = { }; e = binder_transaction_log_add(&binder_transaction_log); e->debug_id = t_debug_id; @@ -2724,14 +2722,14 @@ static void binder_transaction(struct binder_proc *proc, * case well anyway. */ security_task_getsecid_obj(proc->tsk, &blob); - ret = security_secid_to_secctx(&blob, &secctx, &secctx_sz); + ret = security_secid_to_secctx(&blob, &lsmctx); if (ret) { return_error = BR_FAILED_REPLY; return_error_param = ret; return_error_line = __LINE__; goto err_get_secctx_failed; } - added_size = ALIGN(secctx_sz, sizeof(u64)); + added_size = ALIGN(lsmctx.len, sizeof(u64)); extra_buffers_size += added_size; if (extra_buffers_size < added_size) { /* integer overflow of extra_buffers_size */ @@ -2758,24 +2756,22 @@ static void binder_transaction(struct binder_proc *proc, t->buffer = NULL; goto err_binder_alloc_buf_failed; } - if (secctx) { + if (lsmctx.context) { int err; size_t buf_offset = ALIGN(tr->data_size, sizeof(void *)) + ALIGN(tr->offsets_size, sizeof(void *)) + ALIGN(extra_buffers_size, sizeof(void *)) - - ALIGN(secctx_sz, sizeof(u64)); + ALIGN(lsmctx.len, sizeof(u64)); t->security_ctx = (uintptr_t)t->buffer->user_data + buf_offset; err = binder_alloc_copy_to_buffer(&target_proc->alloc, t->buffer, buf_offset, - secctx, secctx_sz); + lsmctx.context, lsmctx.len); if (err) { t->security_ctx = 0; WARN_ON(1); } - lsmcontext_init(&scaff, secctx, secctx_sz, 0); - security_release_secctx(&scaff); - secctx = NULL; + security_release_secctx(&lsmctx); } t->buffer->debug_id = t->debug_id; t->buffer->transaction = t; @@ -2832,7 +2828,7 @@ static void binder_transaction(struct binder_proc *proc, off_end_offset = off_start_offset + tr->offsets_size; sg_buf_offset = ALIGN(off_end_offset, sizeof(void *)); sg_buf_end_offset = sg_buf_offset + extra_buffers_size - - ALIGN(secctx_sz, sizeof(u64)); + ALIGN(lsmctx.len, sizeof(u64)); off_min = 0; for (buffer_offset = off_start_offset; buffer_offset < off_end_offset; buffer_offset += sizeof(binder_size_t)) { @@ -3116,10 +3112,8 @@ static void binder_transaction(struct binder_proc *proc, binder_alloc_free_buf(&target_proc->alloc, t->buffer); err_binder_alloc_buf_failed: err_bad_extra_size: - if (secctx) { - lsmcontext_init(&scaff, secctx, secctx_sz, 0); - security_release_secctx(&scaff); - } + if (lsmctx.context) + security_release_secctx(&lsmctx); err_get_secctx_failed: kfree(tcomplete); binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE); diff --git a/include/linux/security.h b/include/linux/security.h index 3b2ffef65b05..666bd85e142b 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -578,7 +578,7 @@ int security_setprocattr(const char *lsm, const 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(struct lsmblob *blob, char **secdata, u32 *seclen); +int security_secid_to_secctx(struct lsmblob *blob, struct lsmcontext *cp); int security_secctx_to_secid(const char *secdata, u32 seclen, struct lsmblob *blob); void security_release_secctx(struct lsmcontext *cp); @@ -1433,7 +1433,7 @@ static inline int security_ismaclabel(const char *name) } static inline int security_secid_to_secctx(struct lsmblob *blob, - char **secdata, u32 *seclen) + struct lsmcontext *cp) { return -EOPNOTSUPP; } diff --git a/include/net/scm.h b/include/net/scm.h index f273c4d777ec..b77a52f93389 100644 --- a/include/net/scm.h +++ b/include/net/scm.h @@ -94,8 +94,6 @@ static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct sc { struct lsmcontext context; struct lsmblob lb; - char *secdata; - u32 seclen; int err; if (test_bit(SOCK_PASSSEC, &sock->flags)) { @@ -103,12 +101,11 @@ static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct sc * and the infrastructure will know which it is. */ lsmblob_init(&lb, scm->secid); - err = security_secid_to_secctx(&lb, &secdata, &seclen); + err = security_secid_to_secctx(&lb, &context); if (!err) { - put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, seclen, secdata); - /*scaffolding*/ - lsmcontext_init(&context, secdata, seclen, 0); + put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, context.len, + context.context); security_release_secctx(&context); } } diff --git a/kernel/audit.c b/kernel/audit.c index c17ec23158c4..841123390d41 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -1190,9 +1190,6 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) struct audit_buffer *ab; u16 msg_type = nlh->nlmsg_type; struct audit_sig_info *sig_data; - char *ctx = NULL; - u32 len; - struct lsmcontext scaff; /* scaffolding */ err = audit_netlink_ok(skb, msg_type); if (err) @@ -1440,33 +1437,34 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) kfree(new); break; } - case AUDIT_SIGNAL_INFO: - len = 0; + case AUDIT_SIGNAL_INFO: { + struct lsmcontext context = { }; + int len = 0; + if (lsmblob_is_set(&audit_sig_lsm)) { - err = security_secid_to_secctx(&audit_sig_lsm, &ctx, - &len); + err = security_secid_to_secctx(&audit_sig_lsm, + &context); if (err) return err; } - sig_data = kmalloc(sizeof(*sig_data) + len, GFP_KERNEL); + sig_data = kmalloc(sizeof(*sig_data) + context.len, GFP_KERNEL); if (!sig_data) { - if (lsmblob_is_set(&audit_sig_lsm)) { - lsmcontext_init(&scaff, ctx, len, 0); - security_release_secctx(&scaff); - } + if (lsmblob_is_set(&audit_sig_lsm)) + security_release_secctx(&context); return -ENOMEM; } sig_data->uid = from_kuid(&init_user_ns, audit_sig_uid); sig_data->pid = audit_sig_pid; if (lsmblob_is_set(&audit_sig_lsm)) { - memcpy(sig_data->ctx, ctx, len); - lsmcontext_init(&scaff, ctx, len, 0); - security_release_secctx(&scaff); + len = context.len; + memcpy(sig_data->ctx, context.context, len); + security_release_secctx(&context); } audit_send_reply(skb, seq, AUDIT_SIGNAL_INFO, 0, 0, sig_data, sizeof(*sig_data) + len); kfree(sig_data); break; + } case AUDIT_TTY_GET: { struct audit_tty_status s; unsigned int t; @@ -2132,26 +2130,23 @@ void audit_log_key(struct audit_buffer *ab, char *key) int audit_log_task_context(struct audit_buffer *ab) { - char *ctx = NULL; - unsigned len; int error; struct lsmblob blob; - struct lsmcontext scaff; /* scaffolding */ + struct lsmcontext context; security_task_getsecid_subj(current, &blob); if (!lsmblob_is_set(&blob)) return 0; - error = security_secid_to_secctx(&blob, &ctx, &len); + error = security_secid_to_secctx(&blob, &context); if (error) { if (error != -EINVAL) goto error_path; return 0; } - audit_log_format(ab, " subj=%s", ctx); - lsmcontext_init(&scaff, ctx, len, 0); - security_release_secctx(&scaff); + audit_log_format(ab, " subj=%s", context.context); + security_release_secctx(&context); return 0; error_path: diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 3fb9d3639123..67da23f6bebd 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -996,9 +996,7 @@ static int audit_log_pid_context(struct audit_context *context, pid_t pid, struct lsmblob *blob, char *comm) { struct audit_buffer *ab; - struct lsmcontext lsmcxt; - char *ctx = NULL; - u32 len; + struct lsmcontext lsmctx; int rc = 0; ab = audit_log_start(context, GFP_KERNEL, AUDIT_OBJ_PID); @@ -1009,13 +1007,12 @@ static int audit_log_pid_context(struct audit_context *context, pid_t pid, from_kuid(&init_user_ns, auid), from_kuid(&init_user_ns, uid), sessionid); if (lsmblob_is_set(blob)) { - if (security_secid_to_secctx(blob, &ctx, &len)) { + if (security_secid_to_secctx(blob, &lsmctx)) { audit_log_format(ab, " obj=(none)"); rc = 1; } else { - audit_log_format(ab, " obj=%s", ctx); - lsmcontext_init(&lsmcxt, ctx, len, 0); /*scaffolding*/ - security_release_secctx(&lsmcxt); + audit_log_format(ab, " obj=%s", lsmctx.context); + security_release_secctx(&lsmctx); } } audit_log_format(ab, " ocomm="); @@ -1228,7 +1225,6 @@ static void audit_log_fcaps(struct audit_buffer *ab, struct audit_names *name) static void show_special(struct audit_context *context, int *call_panic) { - struct lsmcontext lsmcxt; struct audit_buffer *ab; int i; @@ -1252,17 +1248,15 @@ static void show_special(struct audit_context *context, int *call_panic) from_kgid(&init_user_ns, context->ipc.gid), context->ipc.mode); if (osid) { - char *ctx = NULL; - u32 len; + struct lsmcontext lsmcxt; struct lsmblob blob; lsmblob_init(&blob, osid); - if (security_secid_to_secctx(&blob, &ctx, &len)) { + if (security_secid_to_secctx(&blob, &lsmcxt)) { audit_log_format(ab, " osid=%u", osid); *call_panic = 1; } else { - audit_log_format(ab, " obj=%s", ctx); - lsmcontext_init(&lsmcxt, ctx, len, 0); + audit_log_format(ab, " obj=%s", lsmcxt.context); security_release_secctx(&lsmcxt); } } @@ -1409,20 +1403,17 @@ static void audit_log_name(struct audit_context *context, struct audit_names *n, MAJOR(n->rdev), MINOR(n->rdev)); if (n->osid != 0) { - char *ctx = NULL; - u32 len; struct lsmblob blob; - struct lsmcontext lsmcxt; + struct lsmcontext lsmctx; lsmblob_init(&blob, n->osid); - if (security_secid_to_secctx(&blob, &ctx, &len)) { + if (security_secid_to_secctx(&blob, &lsmctx)) { audit_log_format(ab, " osid=%u", n->osid); if (call_panic) *call_panic = 2; } else { - audit_log_format(ab, " obj=%s", ctx); - lsmcontext_init(&lsmcxt, ctx, len, 0); /* scaffolding */ - security_release_secctx(&lsmcxt); + audit_log_format(ab, " obj=%s", lsmctx.context); + security_release_secctx(&lsmctx); } } diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index a7e4c1b34b6c..ae073b642fa7 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c @@ -132,8 +132,7 @@ static void ip_cmsg_recv_security(struct msghdr *msg, struct sk_buff *skb) { struct lsmcontext context; struct lsmblob lb; - char *secdata; - u32 seclen, secid; + u32 secid; int err; err = security_socket_getpeersec_dgram(NULL, skb, &secid); @@ -141,12 +140,11 @@ static void ip_cmsg_recv_security(struct msghdr *msg, struct sk_buff *skb) return; lsmblob_init(&lb, secid); - err = security_secid_to_secctx(&lb, &secdata, &seclen); + err = security_secid_to_secctx(&lb, &context); if (err) return; - put_cmsg(msg, SOL_IP, SCM_SECURITY, seclen, secdata); - lsmcontext_init(&context, secdata, seclen, 0); /* scaffolding */ + put_cmsg(msg, SOL_IP, SCM_SECURITY, context.len, context.context); security_release_secctx(&context); } diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 914ab6a96573..215d3f9e9715 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -336,8 +336,7 @@ static int ctnetlink_dump_mark(struct sk_buff *skb, const struct nf_conn *ct) static int ctnetlink_dump_secctx(struct sk_buff *skb, const struct nf_conn *ct) { struct nlattr *nest_secctx; - int len, ret; - char *secctx; + int ret; struct lsmblob blob; struct lsmcontext context; @@ -345,7 +344,7 @@ static int ctnetlink_dump_secctx(struct sk_buff *skb, const struct nf_conn *ct) * security_secid_to_secctx() will know which security module * to use to create the secctx. */ lsmblob_init(&blob, ct->secmark); - ret = security_secid_to_secctx(&blob, &secctx, &len); + ret = security_secid_to_secctx(&blob, &context); if (ret) return 0; @@ -354,13 +353,12 @@ static int ctnetlink_dump_secctx(struct sk_buff *skb, const struct nf_conn *ct) if (!nest_secctx) goto nla_put_failure; - if (nla_put_string(skb, CTA_SECCTX_NAME, secctx)) + if (nla_put_string(skb, CTA_SECCTX_NAME, context.context)) goto nla_put_failure; nla_nest_end(skb, nest_secctx); ret = 0; nla_put_failure: - lsmcontext_init(&context, secctx, len, 0); /* scaffolding */ security_release_secctx(&context); return ret; } @@ -655,15 +653,15 @@ static inline int ctnetlink_secctx_size(const struct nf_conn *ct) #ifdef CONFIG_NF_CONNTRACK_SECMARK int len, ret; struct lsmblob blob; + struct lsmcontext context; - /* lsmblob_init() puts ct->secmark into all of the secids in blob. - * security_secid_to_secctx() will know which security module - * to use to create the secctx. */ - lsmblob_init(&blob, ct->secmark); - ret = security_secid_to_secctx(&blob, NULL, &len); + ret = security_secid_to_secctx(&blob, &context); if (ret) return 0; + len = context.len; + security_release_secctx(&context); + return nla_total_size(0) /* CTA_SECCTX */ + nla_total_size(sizeof(char) * len); /* CTA_SECCTX_NAME */ #else diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index b039445f3efc..df6043d1bc22 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c @@ -173,19 +173,16 @@ static void ct_seq_stop(struct seq_file *s, void *v) static void ct_show_secctx(struct seq_file *s, const struct nf_conn *ct) { int ret; - u32 len; - char *secctx; struct lsmblob blob; struct lsmcontext context; lsmblob_init(&blob, ct->secmark); - ret = security_secid_to_secctx(&blob, &secctx, &len); + ret = security_secid_to_secctx(&blob, &context); if (ret) return; - seq_printf(s, "secctx=%s ", secctx); + seq_printf(s, "secctx=%s ", context.context); - lsmcontext_init(&context, secctx, len, 0); /* scaffolding */ security_release_secctx(&context); } #else diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c index 06b7751c7668..719ec0f0f2ab 100644 --- a/net/netfilter/nfnetlink_queue.c +++ b/net/netfilter/nfnetlink_queue.c @@ -306,6 +306,7 @@ static u32 nfqnl_get_sk_secctx(struct sk_buff *skb, char **secdata) u32 seclen = 0; #if IS_ENABLED(CONFIG_NETWORK_SECMARK) struct lsmblob blob; + struct lsmcontext context = { }; if (!skb || !sk_fullsock(skb->sk)) return 0; @@ -317,10 +318,12 @@ static u32 nfqnl_get_sk_secctx(struct sk_buff *skb, char **secdata) * blob. security_secid_to_secctx() will know which security * module to use to create the secctx. */ lsmblob_init(&blob, skb->secmark); - security_secid_to_secctx(&blob, secdata, &seclen); + security_secid_to_secctx(&blob, &context); + *secdata = context.context; } read_unlock_bh(&skb->sk->sk_callback_lock); + seclen = context.len; #endif return seclen; } diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index 8ca1e2b33dcf..3daa99396335 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c @@ -375,8 +375,6 @@ int netlbl_unlhsh_add(struct net *net, struct netlbl_unlhsh_iface *iface; struct audit_buffer *audit_buf = NULL; struct lsmcontext context; - char *secctx = NULL; - u32 secctx_len; struct lsmblob blob; if (addr_len != sizeof(struct in_addr) && @@ -444,12 +442,9 @@ int netlbl_unlhsh_add(struct net *net, * security_secid_to_secctx() will know which security module * to use to create the secctx. */ lsmblob_init(&blob, secid); - if (security_secid_to_secctx(&blob, - &secctx, - &secctx_len) == 0) { - audit_log_format(audit_buf, " sec_obj=%s", secctx); - /* scaffolding */ - lsmcontext_init(&context, secctx, secctx_len, 0); + if (security_secid_to_secctx(&blob, &context) == 0) { + audit_log_format(audit_buf, " sec_obj=%s", + context.context); security_release_secctx(&context); } audit_log_format(audit_buf, " res=%u", ret_val == 0 ? 1 : 0); @@ -482,8 +477,6 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, struct audit_buffer *audit_buf; struct net_device *dev; struct lsmcontext context; - char *secctx; - u32 secctx_len; struct lsmblob blob; spin_lock(&netlbl_unlhsh_lock); @@ -510,11 +503,9 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, if (entry != NULL) lsmblob_init(&blob, entry->secid); if (entry != NULL && - security_secid_to_secctx(&blob, - &secctx, &secctx_len) == 0) { - audit_log_format(audit_buf, " sec_obj=%s", secctx); - /* scaffolding */ - lsmcontext_init(&context, secctx, secctx_len, 0); + security_secid_to_secctx(&blob, &context) == 0) { + audit_log_format(audit_buf, " sec_obj=%s", + context.context); security_release_secctx(&context); } audit_log_format(audit_buf, " res=%u", entry != NULL ? 1 : 0); @@ -553,8 +544,6 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, struct audit_buffer *audit_buf; struct net_device *dev; struct lsmcontext context; - char *secctx; - u32 secctx_len; struct lsmblob blob; spin_lock(&netlbl_unlhsh_lock); @@ -580,10 +569,9 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, if (entry != NULL) lsmblob_init(&blob, entry->secid); if (entry != NULL && - security_secid_to_secctx(&blob, - &secctx, &secctx_len) == 0) { - audit_log_format(audit_buf, " sec_obj=%s", secctx); - lsmcontext_init(&context, secctx, secctx_len, 0); + security_secid_to_secctx(&blob, &context) == 0) { + audit_log_format(audit_buf, " sec_obj=%s", + context.context); security_release_secctx(&context); } audit_log_format(audit_buf, " res=%u", entry != NULL ? 1 : 0); @@ -1106,8 +1094,6 @@ static int netlbl_unlabel_staticlist_gen(u32 cmd, struct lsmcontext context; void *data; u32 secid; - char *secctx; - u32 secctx_len; struct lsmblob blob; data = genlmsg_put(cb_arg->skb, NETLINK_CB(cb_arg->nl_cb->skb).portid, @@ -1167,15 +1153,13 @@ static int netlbl_unlabel_staticlist_gen(u32 cmd, * security_secid_to_secctx() will know which security module * to use to create the secctx. */ lsmblob_init(&blob, secid); - ret_val = security_secid_to_secctx(&blob, &secctx, &secctx_len); + ret_val = security_secid_to_secctx(&blob, &context); if (ret_val != 0) goto list_cb_failure; ret_val = nla_put(cb_arg->skb, NLBL_UNLABEL_A_SECCTX, - secctx_len, - secctx); - /* scaffolding */ - lsmcontext_init(&context, secctx, secctx_len, 0); + context.len, + context.context); security_release_secctx(&context); if (ret_val != 0) goto list_cb_failure; diff --git a/net/netlabel/netlabel_user.c b/net/netlabel/netlabel_user.c index ef139d8ae7cd..951ba0639d20 100644 --- a/net/netlabel/netlabel_user.c +++ b/net/netlabel/netlabel_user.c @@ -85,8 +85,6 @@ struct audit_buffer *netlbl_audit_start_common(int type, { struct audit_buffer *audit_buf; struct lsmcontext context; - char *secctx; - u32 secctx_len; struct lsmblob blob; if (audit_enabled == AUDIT_OFF) @@ -102,9 +100,8 @@ struct audit_buffer *netlbl_audit_start_common(int type, lsmblob_init(&blob, audit_info->secid); if (audit_info->secid != 0 && - security_secid_to_secctx(&blob, &secctx, &secctx_len) == 0) { - audit_log_format(audit_buf, " subj=%s", secctx); - lsmcontext_init(&context, secctx, secctx_len, 0);/*scaffolding*/ + security_secid_to_secctx(&blob, &context) == 0) { + audit_log_format(audit_buf, " subj=%s", context.context); security_release_secctx(&context); } diff --git a/security/security.c b/security/security.c index f6a33bf2a7fc..5bb41ca1fa9f 100644 --- a/security/security.c +++ b/security/security.c @@ -2323,18 +2323,22 @@ int security_ismaclabel(const char *name) } EXPORT_SYMBOL(security_ismaclabel); -int security_secid_to_secctx(struct lsmblob *blob, char **secdata, u32 *seclen) +int security_secid_to_secctx(struct lsmblob *blob, struct lsmcontext *cp) { struct security_hook_list *hp; int ilsm = lsm_task_ilsm(current); + memset(cp, 0, sizeof(*cp)); + hlist_for_each_entry(hp, &security_hook_heads.secid_to_secctx, list) { if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) continue; - if (ilsm == LSMBLOB_INVALID || ilsm == hp->lsmid->slot) + if (ilsm == LSMBLOB_INVALID || ilsm == hp->lsmid->slot) { + cp->slot = hp->lsmid->slot; return hp->hook.secid_to_secctx( blob->secid[hp->lsmid->slot], - secdata, seclen); + &cp->context, &cp->len); + } } return LSM_RET_DEFAULT(secid_to_secctx); From patchwork Thu May 13 20:07:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256521 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 66579C433ED for ; Thu, 13 May 2021 20:27:07 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 32A16613DE for ; Thu, 13 May 2021 20:27:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232881AbhEMU2Q (ORCPT ); Thu, 13 May 2021 16:28:16 -0400 Received: from sonic309-27.consmr.mail.ne1.yahoo.com ([66.163.184.153]:38438 "EHLO sonic309-27.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231140AbhEMU2P (ORCPT ); Thu, 13 May 2021 16:28:15 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937625; bh=P5D/d4FetoqKR1xuxXxJ25hFtYH2q58sA8g/exgkI64=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=skXm1oQPxqXWMJuBDhgdYetwG4MgRjSio+5dRZfR/ka60gsHD6kW2menC+avuK8Vg3ypqKp1S6eLrxdKy8pXcuVNDMiTCB7KrjtgksOo+EyW49GOvbnIS0AF/2B3xs2wTyEmVrUmRki5iSTucqgk2fKDbT7gbvk2ieUywsTpm3h0YDBa1MGVD8BMsdArpAQg/A9QD37UpTyiqxcC9FWxmcai8utoVu83MR3y3MlyZEVDtKTVxAHxhX41Wywp11sDsus+PiZ5I1umV5GsgGOdRQ7szZJox9IrMPtwNRGq2nol6uSWgp9B2kGKL2msD5Wi/WPMuH2bT+t/YX41AhIlZg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937625; bh=BF9UVptCLTtpmgP5gOCk+ZnUu5+80Eb40IYFD0kXakl=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=KMtbYLPeLCtm8ed/LKSgcPAux1KtiuldsLBuOwHbFUJRweI6vkHwsNsNARohzc/bMgbwJmrUJgtsi6xehWFdKKpd24vXsWiamTgO6NCXNufET31Q8sahn2+vG/QvkyIx3W8o2w+FSW1tWIZTAW+iM9GMc+EeunSV5dUcGYl/goFDPGPXnWNQxCQ7dIpo2nh4VtVcCoS5YS9Rw0ZLV9soggQ5u3szncXTxGIwd1h/uIIOC4wgq5srBn71Q+VIy3nU6tP8rVE1B1Xt9BROF2MGE4rdeQ3A2e41Ju2Rriu57faWaMju8yynNt0H8oXp5xCWhQINFxpVGC0HWMlJJKrvSg== X-YMail-OSG: 1BRcKAMVM1krIsa2VjLgorlbIlR_VPRlwZdRtU4kF6oH.jPDxrtiIhY_a.yX510 tF7bcq27llOv8ZnvVsahedVMka6D6m5vfTHlTS48UCsG8MqMs6wYCJx5ABLRGuYA06sgZvd32f37 UOTw36J_8XljOYrgE89mbzG9cOj9PkERlZHe_F4fjIRK3Zz1qGkwWKJcVMqYLHz7rqDRJ9UUuD34 En.HxSEcizdV29vcV1GTsUJYjSGG_ITcudcVLSBTEOKFFd9cJYweJwNoNgoX8_TWktNkCSjMuY7o O2zCCssqo5Hg4bKN5gHAolYJlxu7wNjhJc3hfdJqpPfOMPSFrytmM4LjkhToJm1d6RlsaQOicmOI IXaIjJQzwImcVQoeULtviP1.PRNxBHWLHUuNCscDJD0xVcm._ZwpmS9g8iUiU8jzzqI8XJuMhYph dItu7xg.j9oludbPsLb6GlWaKjjpbqH2Y8S4_dh4N.jZeZuflvdS657G6Za_3gCjNzAMxbYfl1lC Lcg_xlJlysUEorlBVfGOnrLzMu_ZDA799q_Wv4SL2mXayk73YlWZiRcuHsJu6rF0i313u7uQMZP2 b30_LbCfoCdfuTLwUfSv5Dmzz_FtBPwKn0_Tw98Uis87MbjF48YkzmA5S06uYQRzcqi1B.zct8oM rOsW1vBP2XmQPdCAQZJ5D.rppYQnst2pBIaiYBdPXcILFy01aldHh7sHY_GwXU55DxphFiXctG3w qBocOwuzl4UFfxXIVGvD3UNmkBRDXc2Q3gn.AjUR.bwBBi765Vkr4wBITWcJiykLE4xhYGkZ03lK J2chiajwbHTm_OsNbUFAWLKYqhPoNUDEWaIFjIPgjsOdpS4zmIGspXh4ewYdyfeg.2gGr4jQmxuX cgtJ04C7VyG.V9557u.WSwRgbbynRyto6.5gwLj1PIX_zb0011MTSaUq2UuoPbH.YAzEizauOAi3 U9od_yk2PKslQ1E8FeRfoguervztaLuMOTHwGDugj3nXAv2adPeiduwX0u7E9OV8xhWVx0znROsn sBuEQH99ZJott32_kezDeY5jvArYvI.JYvUC.LBXMrZ26UAqDmLbyEsWKBeg9RGI26GTeAWGAGD5 edSH0E0Hbbve7dcjrxgABHhwY69tBvvLs8fVwBKQi5O7Xkof2ZlAJD45Xh4rDBvZK0zs4kHhhAi6 hB6xvvJs3PU.SWwyyz44GPUaCD0ox35ydRlRI6A7QPAJqGpiXqmFOtTtEKS7OCwwU97fwf99LiyV kbK.w7DVvF6z3HHJB68aFYs4ZqHOsMqiIoa_pyx3H.AFKKlDY64gR5GGQED8pqJW8ViNN1rzg1wF 0w9qBPs4qV_lta0xavEmUaXVxujxWrzJltRhJP5Refu0q0xXudsXRJ9akEE7seWhyCL20jlaTWu4 N2glHLD3okod_6HeTOLe0A6xAAwy4RRjOlgzFoM80ThHNC4dT2GbKeVxM4V8ud9bgC1JfdsBUCJe H0HRY71gbJqbfCPgozkJ_bFEmXUQglpdCapFiaXZc8eHS4BZDlHdpgxX03btqI_.LGDsKV6axWx5 v9TgGN_gnDtRvudfeAnskPANiLhnBa7GybyFSYUnC3stOB9vnZkwJwPU9fyIk1TItLKVfHvtTYaf 5KALc82VYp1R8CNShTbh2Ty4sPdgPNeBNxZuayOWgAZp5uAFGpFGUh4vv8lDhCLFZBd5C4HtXkY8 _GE1chCNsPIfDe36H1DDnJjhtyJ9WIG7KTntIJYvU.LJoi5m7ub1PuAlj1yaJ04WFB3ZY8Ytf7DQ f.Pc.qjng5HElKvSPsKR8WQrcShlnyG3tDBTCdKw4AIIJbUt8iAhR4Hq0XaSCN5713GQvzpYHHs6 lIB4W33NLCUIDs6QhEfKMw8GH3cQodWcLTSPZ2B_diZXkWxHW09MhBIl7K1D8PsNb0EM9qnrA0V7 RG_npy4tGUhIbEh7kI19r9LB15ZSTxRe777x8q8Aher2Jh9nGvqpSpLCE72TxyeVlR5zFBU07bRl xrKFE1KYQedpb_Y3j9kfYQ2YKCiP00vBxz5jnurvd7pDC5xsjdXOINWsXEx6lZY5T85CcDSTJSZL XmRM5dxbYZMxHRmE8350rVKnsUAzPj1FvKQQShC.sEw9VO809yBPcaIdWjC9nbSFpWs8x4W3xG2S JLghPtJLDQbARz1ByMmeLVZQk80..0JQatacAqi4TRKZrqA_AEo9l2BUHtZS8CieWD3df8Z2YlR5 VEWZYGdkAnc2cF2BaRi.hbwUQkjYwEGPdKZ88RScpxR2mBw2UYQotFu7.le7OzIpCI3AW8CVFO39 hA50P7BaqXAaKNK0Zu9J747UMBiJCcopnX__b8eJy3ABzfyxEYK_xx_QdHCyUaKu4SDegJM31dZT 8vMTac9InuFdsKXBCVFwIhGCFLUbC.tgexGXGuUR5xAa4ns5H8j6vyO2BmtXggGiNQYB6zrtntOD IqQ70sl2CaCJgCU.K1g6kciGDe7E5JdFt49Qf0phQO8xwCPbcCjt9E.f6jSxLua6c6DbC.qdfseE MSnchXLn_xKsQWRszAHTnQLGsv3BQP9wz8gimdWmJvC4fymVi1_MjxNP_uJBXmHd810pPQcC1qd9 7x7xWUCw5BeeCcOtyn0j80k0Aton.iFJdAOvgHjxIte7m0ou6DEj0PHKB9Zlw45UWs7IZjsqMuq. g8BLAucNzu_dDLqFZzgWIFIc39oQgHIOqYsGIZqA8tUWtVkSueNcue_BWNeCj0V2CyREg5uYTcDW TAaEh.SHZC7Ah8hUvCQUhiKjUIUxGvNu7no9UEMReTifbNLjUcadvjVKxQkZgUAHELe92Kmmmg0I 29wYMLn.Kc3VjLQ1urLMfPq7DPkLD7_ew9duSTYOJwI2b.RGwZKI52r970VqtyaR4CFcgO2.HY90 n6HEZEUoLqOwK7i3RfuB1cEDxc8w1FOMx5JNZWBzyEznxXbvZIuCBe.Hv6Z8hTOdIHADXQamfWPP nTbcjPUJCyHi1xBd8hRCtXKkHtfcbHpMzOab4wBkgHAm4OQEbw.fo3HYBh8fs6qln_E_uEH1bxXB ZHoM16zH5H_vB4zbUv1uNmDMGajcfKLAdSrBw0S8ggOs349zqNF4.YfgiT91wNE6u8p0.xlvc9I. 1CEK.kS0smhn4kv6BMT_4Wb5N4xm9rNZyXr9_VqD6URZzLT7kq1A4BXSJEPoTlGzlEz2xDMKYzT1 lLdzWETCf1Nz_pJJv5tiTfr9GGUuAOrVCdYR8XlrIitbd8_JbQauCj7BBnWtzaeA- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic309.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:27:05 +0000 Received: by kubenode543.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 2c0666088a933fc7b7e1010f34978f24; Thu, 13 May 2021 20:27:04 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, Chuck Lever , linux-nfs@vger.kernel.org Subject: [PATCH v26 17/25] LSM: Use lsmcontext in security_inode_getsecctx Date: Thu, 13 May 2021 13:07:59 -0700 Message-Id: <20210513200807.15910-18-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Change the security_inode_getsecctx() interface to fill a lsmcontext structure instead of data and length pointers. This provides the information about which LSM created the context so that security_release_secctx() can use the correct hook. Acked-by: Stephen Smalley Acked-by: Paul Moore Acked-by: Chuck Lever Reviewed-by: John Johansen Signed-off-by: Casey Schaufler Cc: linux-nfs@vger.kernel.org Reviewed-by: Kees Cook --- fs/nfsd/nfs4xdr.c | 23 +++++++++-------------- include/linux/security.h | 5 +++-- security/security.c | 13 +++++++++++-- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 089ec4b61ef1..fc7ba114c298 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -2727,11 +2727,11 @@ nfsd4_encode_layout_types(struct xdr_stream *xdr, u32 layout_types) #ifdef CONFIG_NFSD_V4_SECURITY_LABEL static inline __be32 nfsd4_encode_security_label(struct xdr_stream *xdr, struct svc_rqst *rqstp, - void *context, int len) + struct lsmcontext *context) { __be32 *p; - p = xdr_reserve_space(xdr, len + 4 + 4 + 4); + p = xdr_reserve_space(xdr, context->len + 4 + 4 + 4); if (!p) return nfserr_resource; @@ -2741,13 +2741,13 @@ nfsd4_encode_security_label(struct xdr_stream *xdr, struct svc_rqst *rqstp, */ *p++ = cpu_to_be32(0); /* lfs */ *p++ = cpu_to_be32(0); /* pi */ - p = xdr_encode_opaque(p, context, len); + p = xdr_encode_opaque(p, context->context, context->len); return 0; } #else static inline __be32 nfsd4_encode_security_label(struct xdr_stream *xdr, struct svc_rqst *rqstp, - void *context, int len) + struct lsmcontext *context) { return 0; } #endif @@ -2844,9 +2844,7 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp, int err; struct nfs4_acl *acl = NULL; #ifdef CONFIG_NFSD_V4_SECURITY_LABEL - struct lsmcontext scaff; /* scaffolding */ - void *context = NULL; - int contextlen; + struct lsmcontext context = { }; #endif bool contextsupport = false; struct nfsd4_compoundres *resp = rqstp->rq_resp; @@ -2904,7 +2902,7 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp, bmval0 & FATTR4_WORD0_SUPPORTED_ATTRS) { if (exp->ex_flags & NFSEXP_SECURITY_LABEL) err = security_inode_getsecctx(d_inode(dentry), - &context, &contextlen); + &context); else err = -EOPNOTSUPP; contextsupport = (err == 0); @@ -3324,8 +3322,7 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp, #ifdef CONFIG_NFSD_V4_SECURITY_LABEL if (bmval2 & FATTR4_WORD2_SECURITY_LABEL) { - status = nfsd4_encode_security_label(xdr, rqstp, context, - contextlen); + status = nfsd4_encode_security_label(xdr, rqstp, &context); if (status) goto out; } @@ -3346,10 +3343,8 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp, out: #ifdef CONFIG_NFSD_V4_SECURITY_LABEL - if (context) { - lsmcontext_init(&scaff, context, contextlen, 0); /*scaffolding*/ - security_release_secctx(&scaff); - } + if (context.context) + security_release_secctx(&context); #endif /* CONFIG_NFSD_V4_SECURITY_LABEL */ kfree(acl); if (tempfh) { diff --git a/include/linux/security.h b/include/linux/security.h index 666bd85e142b..0129400ff6e9 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -585,7 +585,7 @@ void security_release_secctx(struct lsmcontext *cp); void security_inode_invalidate_secctx(struct inode *inode); int security_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen); int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen); -int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen); +int security_inode_getsecctx(struct inode *inode, struct lsmcontext *cp); int security_locked_down(enum lockdown_reason what); #else /* CONFIG_SECURITY */ @@ -1461,7 +1461,8 @@ static inline int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 { return -EOPNOTSUPP; } -static inline int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen) +static inline int security_inode_getsecctx(struct inode *inode, + struct lsmcontext *cp) { return -EOPNOTSUPP; } diff --git a/security/security.c b/security/security.c index 5bb41ca1fa9f..1e441c3491b5 100644 --- a/security/security.c +++ b/security/security.c @@ -2395,9 +2395,18 @@ int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen) } EXPORT_SYMBOL(security_inode_setsecctx); -int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen) +int security_inode_getsecctx(struct inode *inode, struct lsmcontext *cp) { - return call_int_hook(inode_getsecctx, -EOPNOTSUPP, inode, ctx, ctxlen); + struct security_hook_list *hp; + + memset(cp, 0, sizeof(*cp)); + + hlist_for_each_entry(hp, &security_hook_heads.inode_getsecctx, list) { + cp->slot = hp->lsmid->slot; + return hp->hook.inode_getsecctx(inode, (void **)&cp->context, + &cp->len); + } + return -EOPNOTSUPP; } EXPORT_SYMBOL(security_inode_getsecctx); From patchwork Thu May 13 20:08:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256547 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY, URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B719EC433ED for ; Thu, 13 May 2021 20:28:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7728A613DE for ; Thu, 13 May 2021 20:28:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232845AbhEMU3V (ORCPT ); Thu, 13 May 2021 16:29:21 -0400 Received: from sonic309-27.consmr.mail.ne1.yahoo.com ([66.163.184.153]:40174 "EHLO sonic309-27.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231682AbhEMU3V (ORCPT ); Thu, 13 May 2021 16:29:21 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937690; bh=KfyRLiXkN7GzdhRBaMWAjvKTGVbL2Tujl8ObV20Uuzk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=WNZXM8Q2CiDQ6B8YDf75bZhLP2Il24zLLO+EfN8SxBKdyPcZwS5wCGdOSI16od+4fcdhCUvO38BaGQLvqq062bO8bYBMFTcjatAyeGlMvxPGjO1oe/na5lw9P2EJVntMPHoqt4IAd4V/LfnNyBl72YwyY53XL6mzQpbXKd8YQCYcnj9bKkwcxUO+nJ4DsR/RE+yH3XVfuUaSBcWMSD6oWHxV576Z+UoyLmuy8nHWAa6HkcwAel7UYjoxT2Em6GrwPuhaiLRWqCJNWjxJ7ZdYyUgYtN+cAtpB+SZvSw6G5y1TgCfmshjgjn9Gg523N87TDwr4HXicKLlLvlT7t/XQXw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937690; bh=AFG07ztm7H//CNQNPdbBKGSh8Pj3cSvWwCBlx4qakhj=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=qWoiw38bJRMeHH8IgEWnwUwVxu3gUtHh2gG/L112o0XdGstStErXcA2Vj3yXtiiKKB/pCgSyGxnn5AxijV0wCQZu70uS+PKJONjtrAMpoHwNFNPCuabtABgGa2Lrbezd9kyoNd8bOHr36+Dcc5WK1l3ckDurDImFjjx6lOyuW1+mtx0L4PZKNx0+Gm0eHP/oxvPNAhel5AP5g/xWBZsYY+k0zJ2qBKYCQaoD+scW2lXB7HFI02ulpO/P4DnrXb+iIZtEdzvLaVGpEUCLGDbH3KdHmkLxq3nQoA4VRfS8i6KcQtWD2iN2TJnzftyT3+hHyDro0QnJu58VWfBdIuAn5Q== X-YMail-OSG: IXfK2b4VM1mB7g_Rz9YS8HJ2BslidVrIJl0SWj3yp3HeY5LYDwvnRi1c7bJ8lbD rIh4y8omufct6U0xEB7VomjZDRH0md9ESU9oECKZA7MNXj5zZP2kzQGkgzRqJvyk_PAoC7EAWSkX MGHjnXUWst3avA0SdaVRrS3PINCFc7evaGlsUAXh7v5ItqE22sjKPjO8kjZVK8UM7m1nT4N4rrw7 0ogL2rAcarxE54LQw8WmfceuYIZfB2XzABcYFHiILNLiZLffhszATR18Y1jWz82FAk2VNdsUB6OR axr4dBfAXlLSWyJ7iK3SyzV3KLBFpWsC52dOq9cL3vALczcWnbmpoWpxR9U2vMM76at5fJ5nmNUM .8TzaOFuaypJ_43i61v_I8sWVEwCKXeMYgOUu4GgSoSj3RqIK14C5_WrmhvQCe2U03U6rSa9sFER 8IdeYrh_JGWto8na44lP4ZMoa2NWIWGeW3ujpFKSQagrEGyAdlQmeGsc148Jyu208ARjsbYXMgBM saQSMdJzkFxMvw46hs9UARuZ6921eAWS1qJ.M_qVh2phFgRWBD9tEsC1kEa0SCOaAD7a.8Wp5I2M oxe9J7HT2LvHfSXLAPuYH6zi4ma6tWy3cCnp0L4FlcYdsOUXSgjDUrn3.owgXLNSIizyWUPXdPbh _fGS.Uw59oRj7EAbVDVVeD021Q8SzHcY19e7XvbYNjbYiiLhVmQY7ik1ZoXu4U0q1RBxZ6OJFRz9 A3evX2NyZs15ARaiQ43LeZ7T1lotglFXWFyyapyna9chytRsu3VHww5WS8_RSfIzYeqsEVOkfqG5 8pfX4dE8Sn8jiHQWlp6WhnVC1LRNmj7dR30QTe1AqfvFUa6xLyeTRUemu5W_HnXxuEs0WmuWbWMP 57jbjF4Bs6PRslzF0UxiBtuuAuq89dQ51E3UVK.pK0L.DIT281WBgVnGOTajjH9LXdJAYMHDDlCT DDYrRPl.un1tWBlzcZKOoIuKmuz2S8MOYgZRGM1X3PB.daRC969Or0i44pchsit1l.gfCYn4zwgw .lYpleb4.7oHbq8m7D6Divdg52CXt48ubrCzgIWop_TqKQWwCtcrJHDn62HcxG_ACDFnd7Icsvp2 h_Q4Ai7LY_219G0QbknKB8kDWJeD2jhKDxrlkC15F8Twpgq.aE5gXyuX.lVuIf5U.jrnRTLNMCGS oAkJUeGdhVq4gTNxVDDwo_8j87J.U2TEWx209kjvmX3tneYeCEe1K_.tNoGMl1LjqlwV9FLggWL6 qFCFhDWwyoje9wjehh0F_6J1siL2sx1UvWYrP9Kqefq..SNKxZsZe6UHsEv5TQFSk3ukNWd4q07G FlhpjgPAYJ1PLbkV7we1aC1ymscpP8C1nBzKopfSb1tdRSTwpSKTtItmsYxk0tb0VJ0y9ZesvFSv jYnfuSYDPYCGpWUnXltA07a5B.7lr4HBVBkrTuphKvjxL7qP9vixbsCwN7lRlIT7xZCDfiJyRRKk 9K8P6i7vYW63G1KNswvjsp.aiUiq5bwU3ZEeJg6GlyeiKhPvILJRshhECmvRHZNcb84UfvrJ9H6f j44Gvt_NHhNvqEShzLhSD3TA1ZaJhWgEKZNTO3AcSFh978QxKbvPlTCz4hv4bOATo_rbQBSIX1a9 2O0efmNxVy..M_7Vx91WHli1f_WgQaEy_9ewYTtA1Tr8V1BYolA7nq5uKXRPXiDquUeEUu_C_qzO 75nav3racAQmwo2WNtXIWhaE.pu8EVM5vUuJMI7PzwWiRxoiNZI_gvrUnPaXys_mDDwk3E8gQV6p bV2Peo7IVymZLrJJ45s_jluYX4cwJ.52xQlzsRnvQc6rtAi8zCNzfgFixskQDYe7NEZ31B0SoxbW Mpxd3XmqoN3CygocvNAr42QidyHqAzupHi9pxN66wOLDgZIyufULM2FBgKtJnqHdjI6kGXCHPK7F kxhwY0bAd60GJz.vaFw93G5jYMsOPtObJfluCPGiMuWIST8j0vbBKAg_dRo3B1VxrcwG7ErSeV0Q EoHEzLXcLCspfy26soVmFpboEJ6H300iwwpcgs8zMXnj2wswASOKDWnWqaETQYqosxdZvvMza9HR D7nb2WYUHKTfW0nhL.lfkg8Bl2HsWqyWuWZ3l66jzHSz.MLcgyuyfOhfatNt7k8lgjKvBLURM0uQ aWpo72FdtyH7gxP0CubCBhzB7J_0THAY9g8SIGmGjXqqoEp5UR.0vPrMvnWiJSKqUuBMjyR3zIip RFHqiEoTgDah0DmaMzVbpYpgfKy3Dh.pJBHW3PDdtKN_SbWMJRJkVDQKzT2Xi76umvR0oqANjYRR kEX3Oo2hTXSKNgN8R5B6Y2ms3WMrkDHYI_OxteRHxumukOPHYM0mMqLFkcSexFyxWo8acX1j_BxD 7zwRrgGyVAYz0vvobEWA1GZjzsEeJUpJiR6Km7sxu81rWXeKv2QpLgrQUFm7fQ57qDKy45wQ5L9R yvsB8EEvAlEqXMjuhp7HUpYo8jhQ9Qq28po8DDN7XWNYuV_EvtWRPe5p1eMIlMwGOjCKE53Finp1 Ug5lyfCVVfOp.ZvkI4FPTIeoPuuxTBlB.eJCIe_l07lInkT1heGsZMHyAn9z2gBUG6PKtvH9HwNt 4yYsY0FAl.PV7MG8r8LprnZHLkxE3vYEPfQVE9jeg6g.AS7SE5YiRtGz8KgQjs7tzKoiEoIScFgA V5OHf_Vd5U6A3J11YilVIKw4SdFOYo7QXiop3lwqWM6mXeLbHMdtdcOKo6T8C5hlOHyX4exDXL58 mY5nUcxNw7ccNFtE0JZFtx4h9Pwt1V0LrGXNfk2m5Cr794m8dwx3Sbj2Cg9jHoIndo7OHd.UKSHM 3aD5wzklA_gtVF8m3Y3_.GVAPnp_hq8N0dKVT1FwhUvbxQYciiSP61xL4JdwEk149U2Y5bYi.F4O gsyanQmAikdxO.ZpVkt5OuKrskXUnBU8mRFMXxDe6le85MZkt2rns2a9YrDqPpKJlPpik_e2nyC0 fY_I9b9y5MaMZhuryAsPBspskfzgTRnc5XwjLoqN6LEJOvsyihdKjMzIYI4y2huGOUQbILmjpYke 3zMS9UcoVDYre9ekn.jE1PMM_WTGMYOpwn2z2nbNZKcak6PZqDmMCxiBM7Vk2QSwHxcbKCR7NrBc 3LUhfIpG0CZh5KO4FcSl53h4idIJFPJavWnh9Kk8kwLqAMaB9vr1hNv3nSTqERME1n2QuroUxHdj KaWrTJcIxWe_eW6a3htM99oWEdTygqCvTqBHCxDbc.wguVd3TZ6_kjFHZNjys9fM8dWeZbNMJcyW 75fD0ZLCfJqpM1kaP4KOPtJmaCKR0fxRes0o_qQnF2LVy9B3GQPf24geywP3wRlHHFyvDYwIw99w 3wEloZHhifo0YX5X..kI45QsgO03cgQe.jAXG3zM15RAarpgMBVL_HqFkx4M0_yviHtUc X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic309.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:28:10 +0000 Received: by kubenode562.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 6937fff4db5c11c6fac9189ee4f4cbb7; Thu, 13 May 2021 20:28:09 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, Pablo Neira Ayuso , netdev@vger.kernel.org, netfilter-devel@vger.kernel.org Subject: [PATCH v26 18/25] LSM: security_secid_to_secctx in netlink netfilter Date: Thu, 13 May 2021 13:08:00 -0700 Message-Id: <20210513200807.15910-19-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Change netlink netfilter interfaces to use lsmcontext pointers, and remove scaffolding. Reviewed-by: Kees Cook Reviewed-by: John Johansen Acked-by: Stephen Smalley Acked-by: Pablo Neira Ayuso Signed-off-by: Casey Schaufler Cc: netdev@vger.kernel.org Cc: netfilter-devel@vger.kernel.org Acked-by: Paul Moore --- net/netfilter/nfnetlink_queue.c | 37 +++++++++++++-------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c index 719ec0f0f2ab..bf8db099090b 100644 --- a/net/netfilter/nfnetlink_queue.c +++ b/net/netfilter/nfnetlink_queue.c @@ -301,15 +301,13 @@ static int nfqnl_put_sk_uidgid(struct sk_buff *skb, struct sock *sk) return -1; } -static u32 nfqnl_get_sk_secctx(struct sk_buff *skb, char **secdata) +static void nfqnl_get_sk_secctx(struct sk_buff *skb, struct lsmcontext *context) { - u32 seclen = 0; #if IS_ENABLED(CONFIG_NETWORK_SECMARK) struct lsmblob blob; - struct lsmcontext context = { }; if (!skb || !sk_fullsock(skb->sk)) - return 0; + return; read_lock_bh(&skb->sk->sk_callback_lock); @@ -318,14 +316,12 @@ static u32 nfqnl_get_sk_secctx(struct sk_buff *skb, char **secdata) * blob. security_secid_to_secctx() will know which security * module to use to create the secctx. */ lsmblob_init(&blob, skb->secmark); - security_secid_to_secctx(&blob, &context); - *secdata = context.context; + security_secid_to_secctx(&blob, context); } read_unlock_bh(&skb->sk->sk_callback_lock); - seclen = context.len; #endif - return seclen; + return; } static u32 nfqnl_get_bridge_size(struct nf_queue_entry *entry) @@ -397,12 +393,10 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue, struct net_device *indev; struct net_device *outdev; struct nf_conn *ct = NULL; + struct lsmcontext context = { }; enum ip_conntrack_info ctinfo; struct nfnl_ct_hook *nfnl_ct; bool csum_verify; - struct lsmcontext scaff; /* scaffolding */ - char *secdata = NULL; - u32 seclen = 0; size = nlmsg_total_size(sizeof(struct nfgenmsg)) + nla_total_size(sizeof(struct nfqnl_msg_packet_hdr)) @@ -470,9 +464,9 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue, } if ((queue->flags & NFQA_CFG_F_SECCTX) && entskb->sk) { - seclen = nfqnl_get_sk_secctx(entskb, &secdata); - if (seclen) - size += nla_total_size(seclen); + nfqnl_get_sk_secctx(entskb, &context); + if (context.len) + size += nla_total_size(context.len); } skb = alloc_skb(size, GFP_ATOMIC); @@ -602,7 +596,8 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue, nfqnl_put_sk_uidgid(skb, entskb->sk) < 0) goto nla_put_failure; - if (seclen && nla_put(skb, NFQA_SECCTX, seclen, secdata)) + if (context.len && + nla_put(skb, NFQA_SECCTX, context.len, context.context)) goto nla_put_failure; if (ct && nfnl_ct->build(skb, ct, ctinfo, NFQA_CT, NFQA_CT_INFO) < 0) @@ -630,10 +625,8 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue, } nlh->nlmsg_len = skb->len; - if (seclen) { - lsmcontext_init(&scaff, secdata, seclen, 0); - security_release_secctx(&scaff); - } + if (context.len) + security_release_secctx(&context); return skb; nla_put_failure: @@ -641,10 +634,8 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue, kfree_skb(skb); net_err_ratelimited("nf_queue: error creating packet message\n"); nlmsg_failure: - if (seclen) { - lsmcontext_init(&scaff, secdata, seclen, 0); - security_release_secctx(&scaff); - } + if (context.len) + security_release_secctx(&context); return NULL; } From patchwork Thu May 13 20:08:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256549 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 361E8C43460 for ; Thu, 13 May 2021 20:29:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 04B2361421 for ; Thu, 13 May 2021 20:29:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232900AbhEMUaa (ORCPT ); Thu, 13 May 2021 16:30:30 -0400 Received: from sonic317-38.consmr.mail.ne1.yahoo.com ([66.163.184.49]:42144 "EHLO sonic317-38.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232802AbhEMUa0 (ORCPT ); Thu, 13 May 2021 16:30:26 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937756; bh=B6/eTJ18z4eQ+mOCYA8J02+OIxRGwvinHOaRQJDorLg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=d0ShEwHa37GKEmFAHXwRkeXPXedQQAIDTbpyL9TT/zENmYkA48MjTljeymGY7qw6v4CJDH7uW0AA7YmD0BbMVPRM8Zd5+FqrghU5ZzBkNpPongkqCbsR16H0TBSpS8cvZCrFaiNPiEV2D4/YXqaD1RBm71V+eN/tpAj/0DDRgHbng/n1e2mLuj7dFxsAjDuB94x6Dc0js0G/961k4a/QOF8aYGMF2T6OWJ+wp+E/57MKcgLUuPCvn0HLNkextFoRlEERWQm84WJQuCWWc/o1ZErfJ/+QsiTcVQD8FFh+ioLrcTaLSuJavAixSlDSPlS05ksQ0TPccd1McYZhRY63Pw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937756; bh=cB+q4HJtWvPDRHd3q/Nkw/CgggArKTvReHOzgcVGCE+=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=t7A5WZVdrQ6XmtJ469jnc7Lec82h4aL7aiNoiMkvSOf4GOtAbCzePA5/FQDTp2xiTHHiqQkdcgYHb6Z8K2J/WEgQPBXS7JeFW1x+Iq81O49HCZf2QZPCfB40Q1RVW0RbWpEAZCJ+/wBxa+xLGNe8Yu3/YyBGNsRHmBUnBOnE4UYcZiEYZxt9wFJteOr8wZOPxtoK3/oI9VbVhTbmGaAyyCddCQyulWj8pFkqG7NomOdX4CzRRUqFhQiWCkdTOPzi7wjsTpkWmXHljjpnFvms3DITKWjTkaTxLgGFhQIY+8azP5C+QcVZMC0URuVDJYx6Yz0+eDNqwE5eBlU/CP10/A== X-YMail-OSG: oKBeU6kVM1mMc_cEu8U53A.NaN0abWzx8OkwuMzUmKYqAxGOjVM5U_pKnXskIu6 dEJwaFVRQQIeGLxaOrYvw_0jru8aaSfB9Fv_XjcyBDvlPt9dkCuWjq733GKmj4mR3SZyiAgEaDcp iXk3_a0eaVzfhpLb1ZzYmSOSumEWYwmX6odtlVTJPi1dCd0nAVPWdDYiUqhF37av6YcXvZNi_Sa9 9GfmM4lsbedS44OfFf.x2Sute5mGtOdt2MSbFAcuf81wYdrXmRqX2hs9v5gGXuoCkwLZJgOqNvpx EmvL1kihP.o7bAO9rXKFJhgA8kmVRQfI9ZSN40RSOzaRJc8qOdUmznW5qz7OwsgWKY.vlYHMb.Zb 1H.ywf1W3NMEFi17NP6q3rx5bYrTNpsz9FEXBATE7Jy_5.O0EV_Zx0Z0DtGSzZkSsV4zBmiJL6dX 3seq290zCbIUkJWd6X_hqf96c7Vq7KE84SxyeGJv3FknuMQ6wiccAaF.JbGUX34NW18OxY2yrDSm 070VUEGvyhbVb45iGNEvyJ8N.NVMRHNRQ7vVxiJgvzCQIXaBvGQ4oGXR6YL1vHc7jNBAiOJhOTNX _XECiOWOTd8RDebCU5jCeBLYm6tSQya7yQwEaoHAxJkfiwLmQgvgbgyo0DUuAFpufp69ghrfnwSV xAznDif2lWIEo1CIbEmVZNcvt5O4Aj.SmobgmZlGTCXRDjyVe9zePa1rNNKwhQDlijKYCPyjoekJ gWSXxQ5kVIHuJVVyzUzuC7TbNs5jAg.yRy.CWGBOYTgP7BFKH6KKtaRG5l2SUHE1qZraNHBVLp.E LgSBB6dBswsh6YbnLUxryNG1jdi89mIKZ4hQuooC7htiWma6BqHuAGmsNdkGl6a.QMoL6Wfo5VfI yzW.BAPP0iFm_77dPwIbfawzm_TjYnt_tZYuy8XP55Kq3VUUz3UCpGHRoKTnMHq39.w3P_ChL.ty MVAtsjiJjeM72u4pM0gBrSbro5hUM9TRR69LWcDg4Ed69t_y5DRStDo094GrSeD0y58QY7gv2pDJ YGfYn1Ec.v.nNGwf1fr7FR58_mjs3mcbVxmS8fZ2Fu_MAuJ_xSG_T0Jv2lEpG8kLUjckd2xi2hlj Ro47vGBezdFAqf32wvcRfkk2qwAtEJTVwBccEXf8NK5Dh6Oxg5IvFxyIuw4_nI_p_BnmntrJgyUr HyF86wXkljZ6oYcS.inggSZkVUIW83N7XbUmpj7S2gE1oNRaX9OEeQT_HP..G7.7ShVDxNDt2grN s0XqGNreZLnGM8CwGDQiUzQRqX70K94Rrx1Ix0oYvQqyGRwHYTTS5lznespj1_kOxpAs0TyvrXpq fJgDUHZhvQuRmyJvxlWUJ4bNaXCtZW_F7zONsyxc1VUV3Q.hpKg9CRWzgqUEgpNzbHtNUeMK5Ik5 FHqhCXJX1pz0zn7zvhVt6efuyjXvGjP7ihlg.QM8ApJF7jOTPH6XC0LvqovAY0HVryWwfY06cg9D miO2dVm89rpqQEcgmPKKnl1MC0GyPwSatuVEFn006JqXQ99ms2hsdMyW7JdL4F3rMxxw8zPwWJXu 36SUSrOI.ytxnFustvcBb1YHuhIKQHgi6fn1WYY2CFso8JMxuG8l6s_eZ8moOp692VPKlitDaOZw rNmLhlwxo1YzVNHi9imzNAgzMk8AwNdAXF5XE_.3eQ.h50Q.FcEUxGII68CeQaG0QWYUKZdP02G4 5RXepD1jVtTlj7spNo3czH9R6eQ4jCbJvGi5low6wnzXq7TRcLF9ox9im2PWaJKvX4qcJXQwtMkr hvaVaLz2uStOl6IoZhDTSGw7Uo.Xf.cWQ2kqHtk5h_i3cRCA_eSM8B3h11a1C15IFqOz6cVBxPEu PxABcKbqnf1U0HbAMLt_tX8DVRpYy6t6uoeTVJJQpie4FCmWEaif4q_TK4Q9AepPjfyt_.1gq8Rt PUFtWSUsHgHIXnRBHSPeTIhSUmN03QMYwWFbl8iasvb9YjV_MF7bcZCg5T5GjIMKxsyqwQyAUSI5 y5CCNPyJcEEKUTqfftIzEzrcUP3m46CXXGU2376J_DJaWtVigrunpVKnDeM52Ef7eDbLRwDTCPDC j46Zw2AHSgr2uMtJnYMlqEmR8tOUcM_BP5XRxCWymXDzIEMmDE1YEo6ZhjM_n4.mSWrEFif_OkhV 2dMnk5UXxn8iICQithmHPZJEw6QnNJB6MP9Q5onXJ70kxHuDPspL_4aU8wj4ZdZHMeW040VLDrkK ASwa67_Ad0EVkZEwJtXcIIxCY30x65LwCTo1byCbmAyQfB899CXDEJ9jpynpzQFvqPjBzwMMoyOz bkdwfvcud_NeWq2Sc0dG5sQgbSzTLySsbIoO4DdH9M4s2TAkkq1z0BtwP2as5sqIILW5_DmS3wUG SWpf7n2otUgFALAVD6zK6PWgPzb.1VRtneB5WAJw5wtEfb8GrkId7ojwTt4ARUTbTV29rJPU2zAO bwH2nj0OWv2Qo6AjyGR6SVeKGf6swBTtIEYxjSE7s0tavYcnlJfC3.71lx6QXC2rGRZWLduk5ZFo IgFz3DfS2zrvRz7HJC_qBjLMKVgeTf.8ku.xlJtg0Ut1upc16yfnrmByY_fYBHZHdsYM8i6Ge1VQ vSPFVTKomwb6Mjc.ltWPHAMTrem6G5Rht1mRuKxqT3S.h.t1KTzWs9ZxjolfoGf.hbu2OxhvCe2R cDCJqrPk0Lyn5coXr7tJYm87Nhc83zbs2EbiWIpIRv.QkFJZDcojt1DlZv93_d0ERaRtJvFXdbXl wu_.jJ_ZT3Bra8MWAe63l4EI1kmg7Wsa7LotJa53JtjoAmwNNUZiOAEaKzrErxO3dC8NvFW69Mzy 5X0Hzx_Xz2FlrMyUCt6DlFw4YwjaDpq0Qdq4CQ0ToJI25se5fTNxTCEn3ZegUFJgH.FrcfiT1It2 urGNmvuced5bVNTf1Ca_w9uqW8Hb4JObHG6wZBfznOhaO1mLjQAMRmu88uqYQsSehRzC8SVrRSWv J0dOPDKGzwiextyj4pmPHwVmvrkEIQQy1XYcr3tVT374fc8mx5iCeHxAI87jgqIBUbq8RV_4wK7x 6h6yVdwt5oOdEVq_6qbNYJiojskyx.VsLg43fVRsCtrYYyRONmOOMXu3JJOc9CVtxrT_cy3QEkP8 k_MywknMESl9ojrX4Em3x.D7ZG8KaBtswUJspsPuGyMaxZeEpFE79Q5TmhFWZPEmcxtTrlHTPAJ4 onhZPQVW1CFXZprrvwAey2Ft0 X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic317.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:29:16 +0000 Received: by kubenode524.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 46f72a20891a8e88b1a5185d10a2c10d; Thu, 13 May 2021 20:29:15 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v26 19/25] NET: Store LSM netlabel data in a lsmblob Date: Thu, 13 May 2021 13:08:01 -0700 Message-Id: <20210513200807.15910-20-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Netlabel uses LSM interfaces requiring an lsmblob and the internal storage is used to pass information between these interfaces, so change the internal data from a secid to a lsmblob. Update the netlabel interfaces and their callers to accommodate the change. This requires that the modules using netlabel use the lsm_id.slot to access the correct secid when using netlabel. Reviewed-by: Kees Cook Reviewed-by: John Johansen Acked-by: Stephen Smalley Acked-by: Paul Moore Signed-off-by: Casey Schaufler Cc: netdev@vger.kernel.org --- include/net/netlabel.h | 8 +-- net/ipv4/cipso_ipv4.c | 26 ++++++---- net/netlabel/netlabel_kapi.c | 6 +-- net/netlabel/netlabel_unlabeled.c | 79 +++++++++-------------------- net/netlabel/netlabel_unlabeled.h | 2 +- security/selinux/hooks.c | 2 +- security/selinux/include/security.h | 1 + security/selinux/netlabel.c | 2 +- security/selinux/ss/services.c | 4 +- security/smack/smack.h | 1 + security/smack/smack_access.c | 2 +- security/smack/smack_lsm.c | 11 ++-- security/smack/smackfs.c | 10 ++-- 13 files changed, 68 insertions(+), 86 deletions(-) diff --git a/include/net/netlabel.h b/include/net/netlabel.h index 43ae50337685..73fc25b4042b 100644 --- a/include/net/netlabel.h +++ b/include/net/netlabel.h @@ -166,7 +166,7 @@ struct netlbl_lsm_catmap { * @attr.mls: MLS sensitivity label * @attr.mls.cat: MLS category bitmap * @attr.mls.lvl: MLS sensitivity level - * @attr.secid: LSM specific secid token + * @attr.lsmblob: LSM specific data * * Description: * This structure is used to pass security attributes between NetLabel and the @@ -201,7 +201,7 @@ struct netlbl_lsm_secattr { struct netlbl_lsm_catmap *cat; u32 lvl; } mls; - u32 secid; + struct lsmblob lsmblob; } attr; }; @@ -415,7 +415,7 @@ int netlbl_cfg_unlbl_static_add(struct net *net, const void *addr, const void *mask, u16 family, - u32 secid, + struct lsmblob *lsmblob, struct netlbl_audit *audit_info); int netlbl_cfg_unlbl_static_del(struct net *net, const char *dev_name, @@ -523,7 +523,7 @@ static inline int netlbl_cfg_unlbl_static_add(struct net *net, const void *addr, const void *mask, u16 family, - u32 secid, + struct lsmblob *lsmblob, struct netlbl_audit *audit_info) { return -ENOSYS; diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c index bfaf327e9d12..6f289821edb7 100644 --- a/net/ipv4/cipso_ipv4.c +++ b/net/ipv4/cipso_ipv4.c @@ -106,15 +106,17 @@ int cipso_v4_rbm_strictvalid = 1; /* Base length of the local tag (non-standard tag). * Tag definition (may change between kernel versions) * - * 0 8 16 24 32 - * +----------+----------+----------+----------+ - * | 10000000 | 00000110 | 32-bit secid value | - * +----------+----------+----------+----------+ - * | in (host byte order)| - * +----------+----------+ - * + * 0 8 16 16 + sizeof(struct lsmblob) + * +----------+----------+---------------------+ + * | 10000000 | 00000110 | LSM blob data | + * +----------+----------+---------------------+ + * + * All secid and flag fields are in host byte order. + * The lsmblob structure size varies depending on which + * Linux security modules are built in the kernel. + * The data is opaque. */ -#define CIPSO_V4_TAG_LOC_BLEN 6 +#define CIPSO_V4_TAG_LOC_BLEN (2 + sizeof(struct lsmblob)) /* * Helper Functions @@ -1460,7 +1462,11 @@ static int cipso_v4_gentag_loc(const struct cipso_v4_doi *doi_def, buffer[0] = CIPSO_V4_TAG_LOCAL; buffer[1] = CIPSO_V4_TAG_LOC_BLEN; - *(u32 *)&buffer[2] = secattr->attr.secid; + /* Ensure that there is sufficient space in the CIPSO header + * for the LSM data. */ + BUILD_BUG_ON(CIPSO_V4_TAG_LOC_BLEN > CIPSO_V4_OPT_LEN_MAX); + memcpy(&buffer[2], &secattr->attr.lsmblob, + sizeof(secattr->attr.lsmblob)); return CIPSO_V4_TAG_LOC_BLEN; } @@ -1480,7 +1486,7 @@ static int cipso_v4_parsetag_loc(const struct cipso_v4_doi *doi_def, const unsigned char *tag, struct netlbl_lsm_secattr *secattr) { - secattr->attr.secid = *(u32 *)&tag[2]; + memcpy(&secattr->attr.lsmblob, &tag[2], sizeof(secattr->attr.lsmblob)); secattr->flags |= NETLBL_SECATTR_SECID; return 0; diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c index 5e1239cef000..bbfaff539416 100644 --- a/net/netlabel/netlabel_kapi.c +++ b/net/netlabel/netlabel_kapi.c @@ -196,7 +196,7 @@ int netlbl_cfg_unlbl_map_add(const char *domain, * @addr: IP address in network byte order (struct in[6]_addr) * @mask: address mask in network byte order (struct in[6]_addr) * @family: address family - * @secid: LSM secid value for the entry + * @lsmblob: LSM data value for the entry * @audit_info: NetLabel audit information * * Description: @@ -210,7 +210,7 @@ int netlbl_cfg_unlbl_static_add(struct net *net, const void *addr, const void *mask, u16 family, - u32 secid, + struct lsmblob *lsmblob, struct netlbl_audit *audit_info) { u32 addr_len; @@ -230,7 +230,7 @@ int netlbl_cfg_unlbl_static_add(struct net *net, return netlbl_unlhsh_add(net, dev_name, addr, mask, addr_len, - secid, audit_info); + lsmblob, audit_info); } /** diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index 3daa99396335..0ce9bee43dd3 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c @@ -66,7 +66,7 @@ struct netlbl_unlhsh_tbl { #define netlbl_unlhsh_addr4_entry(iter) \ container_of(iter, struct netlbl_unlhsh_addr4, list) struct netlbl_unlhsh_addr4 { - u32 secid; + struct lsmblob lsmblob; struct netlbl_af4list list; struct rcu_head rcu; @@ -74,7 +74,7 @@ struct netlbl_unlhsh_addr4 { #define netlbl_unlhsh_addr6_entry(iter) \ container_of(iter, struct netlbl_unlhsh_addr6, list) struct netlbl_unlhsh_addr6 { - u32 secid; + struct lsmblob lsmblob; struct netlbl_af6list list; struct rcu_head rcu; @@ -220,7 +220,7 @@ static struct netlbl_unlhsh_iface *netlbl_unlhsh_search_iface(int ifindex) * @iface: the associated interface entry * @addr: IPv4 address in network byte order * @mask: IPv4 address mask in network byte order - * @secid: LSM secid value for entry + * @lsmblob: LSM data value for entry * * Description: * Add a new address entry into the unlabeled connection hash table using the @@ -231,7 +231,7 @@ static struct netlbl_unlhsh_iface *netlbl_unlhsh_search_iface(int ifindex) static int netlbl_unlhsh_add_addr4(struct netlbl_unlhsh_iface *iface, const struct in_addr *addr, const struct in_addr *mask, - u32 secid) + struct lsmblob *lsmblob) { int ret_val; struct netlbl_unlhsh_addr4 *entry; @@ -243,7 +243,7 @@ static int netlbl_unlhsh_add_addr4(struct netlbl_unlhsh_iface *iface, entry->list.addr = addr->s_addr & mask->s_addr; entry->list.mask = mask->s_addr; entry->list.valid = 1; - entry->secid = secid; + entry->lsmblob = *lsmblob; spin_lock(&netlbl_unlhsh_lock); ret_val = netlbl_af4list_add(&entry->list, &iface->addr4_list); @@ -260,7 +260,7 @@ static int netlbl_unlhsh_add_addr4(struct netlbl_unlhsh_iface *iface, * @iface: the associated interface entry * @addr: IPv6 address in network byte order * @mask: IPv6 address mask in network byte order - * @secid: LSM secid value for entry + * @lsmblob: LSM data value for entry * * Description: * Add a new address entry into the unlabeled connection hash table using the @@ -271,7 +271,7 @@ static int netlbl_unlhsh_add_addr4(struct netlbl_unlhsh_iface *iface, static int netlbl_unlhsh_add_addr6(struct netlbl_unlhsh_iface *iface, const struct in6_addr *addr, const struct in6_addr *mask, - u32 secid) + struct lsmblob *lsmblob) { int ret_val; struct netlbl_unlhsh_addr6 *entry; @@ -287,7 +287,7 @@ static int netlbl_unlhsh_add_addr6(struct netlbl_unlhsh_iface *iface, entry->list.addr.s6_addr32[3] &= mask->s6_addr32[3]; entry->list.mask = *mask; entry->list.valid = 1; - entry->secid = secid; + entry->lsmblob = *lsmblob; spin_lock(&netlbl_unlhsh_lock); ret_val = netlbl_af6list_add(&entry->list, &iface->addr6_list); @@ -366,7 +366,7 @@ int netlbl_unlhsh_add(struct net *net, const void *addr, const void *mask, u32 addr_len, - u32 secid, + struct lsmblob *lsmblob, struct netlbl_audit *audit_info) { int ret_val; @@ -375,7 +375,6 @@ int netlbl_unlhsh_add(struct net *net, struct netlbl_unlhsh_iface *iface; struct audit_buffer *audit_buf = NULL; struct lsmcontext context; - struct lsmblob blob; if (addr_len != sizeof(struct in_addr) && addr_len != sizeof(struct in6_addr)) @@ -408,7 +407,7 @@ int netlbl_unlhsh_add(struct net *net, const struct in_addr *addr4 = addr; const struct in_addr *mask4 = mask; - ret_val = netlbl_unlhsh_add_addr4(iface, addr4, mask4, secid); + ret_val = netlbl_unlhsh_add_addr4(iface, addr4, mask4, lsmblob); if (audit_buf != NULL) netlbl_af4list_audit_addr(audit_buf, 1, dev_name, @@ -421,7 +420,7 @@ int netlbl_unlhsh_add(struct net *net, const struct in6_addr *addr6 = addr; const struct in6_addr *mask6 = mask; - ret_val = netlbl_unlhsh_add_addr6(iface, addr6, mask6, secid); + ret_val = netlbl_unlhsh_add_addr6(iface, addr6, mask6, lsmblob); if (audit_buf != NULL) netlbl_af6list_audit_addr(audit_buf, 1, dev_name, @@ -438,11 +437,7 @@ int netlbl_unlhsh_add(struct net *net, unlhsh_add_return: rcu_read_unlock(); if (audit_buf != NULL) { - /* lsmblob_init() puts secid into all of the secids in blob. - * security_secid_to_secctx() will know which security module - * to use to create the secctx. */ - lsmblob_init(&blob, secid); - if (security_secid_to_secctx(&blob, &context) == 0) { + if (security_secid_to_secctx(lsmblob, &context) == 0) { audit_log_format(audit_buf, " sec_obj=%s", context.context); security_release_secctx(&context); @@ -477,7 +472,6 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, struct audit_buffer *audit_buf; struct net_device *dev; struct lsmcontext context; - struct lsmblob blob; spin_lock(&netlbl_unlhsh_lock); list_entry = netlbl_af4list_remove(addr->s_addr, mask->s_addr, @@ -497,13 +491,8 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, addr->s_addr, mask->s_addr); if (dev != NULL) dev_put(dev); - /* lsmblob_init() puts entry->secid into all of the secids - * in blob. security_secid_to_secctx() will know which - * security module to use to create the secctx. */ - if (entry != NULL) - lsmblob_init(&blob, entry->secid); if (entry != NULL && - security_secid_to_secctx(&blob, &context) == 0) { + security_secid_to_secctx(&entry->lsmblob, &context) == 0) { audit_log_format(audit_buf, " sec_obj=%s", context.context); security_release_secctx(&context); @@ -544,7 +533,6 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, struct audit_buffer *audit_buf; struct net_device *dev; struct lsmcontext context; - struct lsmblob blob; spin_lock(&netlbl_unlhsh_lock); list_entry = netlbl_af6list_remove(addr, mask, &iface->addr6_list); @@ -563,13 +551,8 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, addr, mask); if (dev != NULL) dev_put(dev); - /* lsmblob_init() puts entry->secid into all of the secids - * in blob. security_secid_to_secctx() will know which - * security module to use to create the secctx. */ - if (entry != NULL) - lsmblob_init(&blob, entry->secid); if (entry != NULL && - security_secid_to_secctx(&blob, &context) == 0) { + security_secid_to_secctx(&entry->lsmblob, &context) == 0) { audit_log_format(audit_buf, " sec_obj=%s", context.context); security_release_secctx(&context); @@ -923,14 +906,8 @@ static int netlbl_unlabel_staticadd(struct sk_buff *skb, if (ret_val != 0) return ret_val; - /* netlbl_unlhsh_add will be changed to pass a struct lsmblob * - * instead of a u32 later in this patch set. security_secctx_to_secid() - * will only be setting one entry in the lsmblob struct, so it is - * safe to use lsmblob_value() to get that one value. */ - - return netlbl_unlhsh_add(&init_net, - dev_name, addr, mask, addr_len, - lsmblob_value(&blob), &audit_info); + return netlbl_unlhsh_add(&init_net, dev_name, addr, mask, addr_len, + &blob, &audit_info); } /** @@ -977,11 +954,8 @@ static int netlbl_unlabel_staticadddef(struct sk_buff *skb, if (ret_val != 0) return ret_val; - /* security_secctx_to_secid() will only put one secid into the lsmblob - * so it's safe to use lsmblob_value() to get the secid. */ - return netlbl_unlhsh_add(&init_net, - NULL, addr, mask, addr_len, - lsmblob_value(&blob), &audit_info); + return netlbl_unlhsh_add(&init_net, NULL, addr, mask, addr_len, &blob, + &audit_info); } /** @@ -1093,8 +1067,7 @@ static int netlbl_unlabel_staticlist_gen(u32 cmd, struct net_device *dev; struct lsmcontext context; void *data; - u32 secid; - struct lsmblob blob; + struct lsmblob *lsmb; data = genlmsg_put(cb_arg->skb, NETLINK_CB(cb_arg->nl_cb->skb).portid, cb_arg->seq, &netlbl_unlabel_gnl_family, @@ -1132,7 +1105,7 @@ static int netlbl_unlabel_staticlist_gen(u32 cmd, if (ret_val != 0) goto list_cb_failure; - secid = addr4->secid; + lsmb = (struct lsmblob *)&addr4->lsmblob; } else { ret_val = nla_put_in6_addr(cb_arg->skb, NLBL_UNLABEL_A_IPV6ADDR, @@ -1146,14 +1119,10 @@ static int netlbl_unlabel_staticlist_gen(u32 cmd, if (ret_val != 0) goto list_cb_failure; - secid = addr6->secid; + lsmb = (struct lsmblob *)&addr6->lsmblob; } - /* lsmblob_init() secid into all of the secids in blob. - * security_secid_to_secctx() will know which security module - * to use to create the secctx. */ - lsmblob_init(&blob, secid); - ret_val = security_secid_to_secctx(&blob, &context); + ret_val = security_secid_to_secctx(lsmb, &context); if (ret_val != 0) goto list_cb_failure; ret_val = nla_put(cb_arg->skb, @@ -1512,7 +1481,7 @@ int netlbl_unlabel_getattr(const struct sk_buff *skb, &iface->addr4_list); if (addr4 == NULL) goto unlabel_getattr_nolabel; - secattr->attr.secid = netlbl_unlhsh_addr4_entry(addr4)->secid; + secattr->attr.lsmblob = netlbl_unlhsh_addr4_entry(addr4)->lsmblob; break; } #if IS_ENABLED(CONFIG_IPV6) @@ -1525,7 +1494,7 @@ int netlbl_unlabel_getattr(const struct sk_buff *skb, &iface->addr6_list); if (addr6 == NULL) goto unlabel_getattr_nolabel; - secattr->attr.secid = netlbl_unlhsh_addr6_entry(addr6)->secid; + secattr->attr.lsmblob = netlbl_unlhsh_addr6_entry(addr6)->lsmblob; break; } #endif /* IPv6 */ diff --git a/net/netlabel/netlabel_unlabeled.h b/net/netlabel/netlabel_unlabeled.h index 058e3a285d56..168920780994 100644 --- a/net/netlabel/netlabel_unlabeled.h +++ b/net/netlabel/netlabel_unlabeled.h @@ -211,7 +211,7 @@ int netlbl_unlhsh_add(struct net *net, const void *addr, const void *mask, u32 addr_len, - u32 secid, + struct lsmblob *lsmblob, struct netlbl_audit *audit_info); int netlbl_unlhsh_remove(struct net *net, const char *dev_name, diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index dba867721336..b7800fa55a34 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -7122,7 +7122,7 @@ static int selinux_perf_event_write(struct perf_event *event) } #endif -static struct lsm_id selinux_lsmid __lsm_ro_after_init = { +struct lsm_id selinux_lsmid __lsm_ro_after_init = { .lsm = "selinux", .slot = LSMBLOB_NEEDED }; diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h index ac0ece01305a..9f856f2cd277 100644 --- a/security/selinux/include/security.h +++ b/security/selinux/include/security.h @@ -73,6 +73,7 @@ struct netlbl_lsm_secattr; extern int selinux_enabled_boot; +extern struct lsm_id selinux_lsmid; /* * type_datum properties diff --git a/security/selinux/netlabel.c b/security/selinux/netlabel.c index 6a94b31b5472..d8d7603ab14e 100644 --- a/security/selinux/netlabel.c +++ b/security/selinux/netlabel.c @@ -108,7 +108,7 @@ static struct netlbl_lsm_secattr *selinux_netlbl_sock_getattr( return NULL; if ((secattr->flags & NETLBL_SECATTR_SECID) && - (secattr->attr.secid == sid)) + (secattr->attr.lsmblob.secid[selinux_lsmid.slot] == sid)) return secattr; return NULL; diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index 0a5ce001609b..b6071e977cdf 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c @@ -3883,7 +3883,7 @@ int security_netlbl_secattr_to_sid(struct selinux_state *state, if (secattr->flags & NETLBL_SECATTR_CACHE) *sid = *(u32 *)secattr->cache->data; else if (secattr->flags & NETLBL_SECATTR_SECID) - *sid = secattr->attr.secid; + *sid = secattr->attr.lsmblob.secid[selinux_lsmid.slot]; else if (secattr->flags & NETLBL_SECATTR_MLS_LVL) { rc = -EIDRM; ctx = sidtab_search(sidtab, SECINITSID_NETMSG); @@ -3960,7 +3960,7 @@ int security_netlbl_sid_to_secattr(struct selinux_state *state, if (secattr->domain == NULL) goto out; - secattr->attr.secid = sid; + secattr->attr.lsmblob.secid[selinux_lsmid.slot] = sid; secattr->flags |= NETLBL_SECATTR_DOMAIN_CPY | NETLBL_SECATTR_SECID; mls_export_netlbl_lvl(policydb, ctx, secattr); rc = mls_export_netlbl_cat(policydb, ctx, secattr); diff --git a/security/smack/smack.h b/security/smack/smack.h index b5bdf947792f..0eaae6b3f935 100644 --- a/security/smack/smack.h +++ b/security/smack/smack.h @@ -303,6 +303,7 @@ int smack_populate_secattr(struct smack_known *skp); * Shared data. */ extern int smack_enabled; +extern struct lsm_id smack_lsmid; extern int smack_cipso_direct; extern int smack_cipso_mapped; extern struct smack_known *smack_net_ambient; diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c index 7eabb448acab..fccd5da3014e 100644 --- a/security/smack/smack_access.c +++ b/security/smack/smack_access.c @@ -522,7 +522,7 @@ int smack_populate_secattr(struct smack_known *skp) { int slen; - skp->smk_netlabel.attr.secid = skp->smk_secid; + skp->smk_netlabel.attr.lsmblob.secid[smack_lsmid.slot] = skp->smk_secid; skp->smk_netlabel.domain = skp->smk_known; skp->smk_netlabel.cache = netlbl_secattr_cache_alloc(GFP_ATOMIC); if (skp->smk_netlabel.cache != NULL) { diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 7aa7ea38f627..e65497a5c095 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -3720,11 +3720,12 @@ static struct smack_known *smack_from_secattr(struct netlbl_lsm_secattr *sap, if ((sap->flags & NETLBL_SECATTR_CACHE) != 0) return (struct smack_known *)sap->cache->data; + /* + * Looks like a fallback, which gives us a secid. + */ if ((sap->flags & NETLBL_SECATTR_SECID) != 0) - /* - * Looks like a fallback, which gives us a secid. - */ - return smack_from_secid(sap->attr.secid); + return smack_from_secid( + sap->attr.lsmblob.secid[smack_lsmid.slot]); if ((sap->flags & NETLBL_SECATTR_MLS_LVL) != 0) { /* @@ -4701,7 +4702,7 @@ struct lsm_blob_sizes smack_blob_sizes __lsm_ro_after_init = { .lbs_superblock = sizeof(struct superblock_smack), }; -static struct lsm_id smack_lsmid __lsm_ro_after_init = { +struct lsm_id smack_lsmid __lsm_ro_after_init = { .lsm = "smack", .slot = LSMBLOB_NEEDED }; diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c index 22ded2c26089..e592e10397af 100644 --- a/security/smack/smackfs.c +++ b/security/smack/smackfs.c @@ -1140,6 +1140,7 @@ static void smk_net4addr_insert(struct smk_net4addr *new) static ssize_t smk_write_net4addr(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { + struct lsmblob lsmblob; struct smk_net4addr *snp; struct sockaddr_in newname; char *smack; @@ -1271,10 +1272,13 @@ static ssize_t smk_write_net4addr(struct file *file, const char __user *buf, * this host so that incoming packets get labeled. * but only if we didn't get the special CIPSO option */ - if (rc == 0 && skp != NULL) + if (rc == 0 && skp != NULL) { + lsmblob_init(&lsmblob, 0); + lsmblob.secid[smack_lsmid.slot] = snp->smk_label->smk_secid; rc = netlbl_cfg_unlbl_static_add(&init_net, NULL, - &snp->smk_host, &snp->smk_mask, PF_INET, - snp->smk_label->smk_secid, &audit_info); + &snp->smk_host, &snp->smk_mask, PF_INET, &lsmblob, + &audit_info); + } if (rc == 0) rc = count; From patchwork Thu May 13 20:08:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256551 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 10BEEC433B4 for ; Thu, 13 May 2021 20:30:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E497D613DE for ; Thu, 13 May 2021 20:30:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232874AbhEMUbe (ORCPT ); Thu, 13 May 2021 16:31:34 -0400 Received: from sonic317-38.consmr.mail.ne1.yahoo.com ([66.163.184.49]:44909 "EHLO sonic317-38.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232818AbhEMUbb (ORCPT ); Thu, 13 May 2021 16:31:31 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937821; bh=orfoMgYFn03ogh8eLHzt9UObSJhiXDRYegGSymMkcVU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=qy7Y8ui1KlCc2KmV5xG6B2RmnANpO782BWBYnZ5kbx1DBSeKY0OQHyfAzIXhXUchTuRJmDy6vu60eQ4gW4yXjFHQu2z69zBNoGNqx7+Ap7iZ+jfNfWF0xnc0JOGtwWjWAnkemQXYexYbS066xRxPSPm4vLE/29WhFZ5Yc3kn5Oi60rmV2oVYTkQ89kl416/tvxg5TuDZUjGXeoB7tduEFq2iOoJj/b7+1nUOS7BlRaBx0lW7P9fd8KoQ6mniw6kTV8RgXkmvEBkvIDlxS6d0hvbTtOiS1+2Ta9DgsZF8gx1EUOY01R2SkxZaWvZvPr80Ez/5QnUgtj6JRSaU6THfqA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937821; bh=q8opedQtQtFp0+Nb2+M3pJvNaS+IGkA2SOcYzdX16hZ=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=mBryKm2/NvINAj40VVK37ii2mqLnWNDRbEO/SM9DapFoEQFAkcaWabbx9crVkpIg/I2qRqsf3uilc0hKo6lFo2XYxXw3UU6tMAlx+N0LTY59daehW3677L9BoVIw1xuqG+wob3vtGgcUwrZvGFWkrGV757XRrNtlRz9kz1Niu5hfP/YfwpNpteUfAijkOA2OEXIdtsW+5Kn5ibTRH5iK4nAecm4sBPshpNu6E1ajn3+1M69V4+uGMN+81Fs+z1CmChl+1Z0ltx+EntbJbA2dxZsiHApG9XGMKgPVJTglSYiKGSzOHReCgREbHDK53E7asq/8G2Dj0cHXfdemM/e2zg== X-YMail-OSG: dsbIvbwVM1nfj78dPnEu1.RyyhY7xJWASJ1au56bVLfKNhAVJuLlZVJNLmeVsFp 1DSScpnyw1Rjr8vnC9Mj6Gtq8fvb6xNZV1.o6b6lmQYLGjn0FpZonESdNK2qlCpP0Bf9qBSF94JB nMSTON3wWBXfcZsplR9fbz1ZL1oBdTYywX8RfRsXwfC90PSWJ0gv.1TKW4kEMvckjl2b4qcew0GZ Tg3z1ejoH4f8q2pjhB1b3GoEuWuVmbs2SgGgWSASDw37.pPg6a3cTkvVEIii5Ob5iPvIjW8F3iWM qmer6o7CxlTE1AdVKriIfbDrIVE7NXSe_rPLmpZ_NC0JhTPWAaEgRQjqodv21m42RBnMT4YijhMp TxvJx_DL9kzLW9SNPlZnUecw9cwQvGLj4b8tAWkaBOfblm_ttighg_I7i3XKGUiAuvhcLkUqg4.N Ec3_PY2lMSl_8tRzasSGjC7EfkX2EYDmhBIZbK3Ta0f8dYxpjGUO_nNjv7JLXoFc9dP9IDSoM_Vh HWT8ml3I6nz18kloL8TJJZlTUWRRrMyAWYDdX74UQ7_cJame4ZKhMGR9aywp000Ym6PtuzX4jtuT 4wMo8hfFB5ef_1ni6I3j7ezJqaHqL2nXGQzdflA6ej.nbjkwynDtzybGConxFF7ISbYwrXf1FCeG mMm7Fh0VSXJlLk41uiUXfhaptV322bUfi9oYu.T6xK25Y0XCrWjKypjZBpz88Icj6EQMaGZdesC. HSnLmkP4sMqH5AjbWclqxxieEUvMdnyCwpLKf_OCxg5DWdIkmLbO9sWspxsPrK4DLsYfPJ3yzau9 6nj2GIFduO0RXM6dFVktjGNVWF.VkPugHVzLVhIt8C0sqvQtEy6vnhdjOc0VTyuoWszLijwxRvAP L.CkxvbKREyBqOZMOBhd4IbndNUvx8RU9xnDntvjMQEpBNbIVEJieWSeOJvwK8aOUsuXkpHyV6N_ SPitAIeUY1_9uV90gAWLlbZH70mkIDEq2ETHslQrzWzTLCU6P7384WhaH8lGMLOdXtdLbQQoUj5V fGN7SO6gNy4HKWtC2plWWk904LBEzcK1DsjwqLhdkUfIT0rlLtX.A2iN7drX4VuAt2mPgpnyz_Tf 94fQXykDA3CkYf41Iat1fH35kb112RU0I52wg0sF6HEX6yp26Nhdztop2aMNJjom9PdpOrHWtlwb o.kus1WWwpmbdIB_FxqyXqWSHRsyp8r63obxChomc7VH4y4tbZ118v2sw9GHI_PgY9mCVWjPR5qU y9IvqtmIP3uNnsssXmPhX2L4AcOXRDPYZOfzYf_v9PigMwvh7.yCrDpbAkwwD30T7BDgCfDceeFn nJSd6Pz5CBSIbkbF0NppDmDb_CFqOwN6i5Js8txBa..BkFOy2vwspa0C9rR0A_w6u1.NtO4s7Zsc _TMdOLEx9_LVfB4_KfqIBeCF3YHRGxfAKn9C8nSHCG4VbRJTsHNub7hz_.vqnAU6D62XCYE9nyuo _FymeA_85mq28WFdCtUVafxIOkcofgeLpNaEpUG.nLBvO0Q05o6U.ftReRUDwtCyM6Kv6a1Z51On RLwiRhicTdwmZuNIkJrYLxi__1xdoaarh1kAJ9g5ewJx9waCBhDvdoszbJlctLN5eu4HP.yTGnJL ICD1o1iQAHnYuNOeL5.mFVMmk9IliqY7Vxtr9lC178bmizR1DR7WA8ii0.r3lFKDo3ETHvfmtJ0z mx7wHT_RFNcDzLhbtI0Rh1PUktmmmHvbxfx4pHqS4We1nDeI1jaIbWUSkE1y3ErZ56pObNoas2kC naoEcT0OWy1j90_eOKCsC63ebz5QC9MJhx.Pf.cJlBsJP6msmhf4V4F9DSRRmkDsCbsxMIJcWZP3 1gTLV47VwZxE186aW9x6M6yBwq151L0frxOzKFE3YEfbya6RonYODpN64gpGhSFuhxe8fJiCCbdq 8aDFtHm8KPwtYFxvPgjZeAdMVQx7AeTwEuKC0P9mRROyBeO.X7AfKeBhDxePgUDBxkahlJ9DdyJQ 6Ebfp4BwKsS1nWliGXtn1ymv17YYnc24TRAkFZZp5r6wt8aNnXWEozAjF3gn.p8lxf5.uRjUEWqp _n_JTq5U03dFSrIrnBdb4IRUfSY2CLtvNpfg0BNCyg1NPv.juyxKibD5u8ChIp91iYVZZ2FVNaR1 MvVbPg45Or6pOhv9BVRkZhCdXxF6rc8UD2Hy48JdGSXkCOQKzLJms4p0td8sFtJ.gTzHQKhoRns9 8lTsJs3su7nwQK_HN71_zzToZU7r80coW3LmwlUKgMrCLEy4Hxr4x_cZx2YLQgJ8l_jjVL1oFRg8 Keifq9r7njrTTRBK9iQEjlb9MYJuDw_Mt7Oj6IT6TCwjH1_j5AJoKromSbu_JoEqpDBIhLwF6._j rw0yZW3wGVcRgPYwzNa5mgF5.uyz.mmKtjXCSyHRXrEEmsHtnnkcmTtK3SyGw_WC5fOK3fv6.la5 c9rUwOqZ8.7NpcjiluFUciWx78GvP8LDgAaeweVfBPCYjoex.hV8_T8RWYy6a02w_g8gTLWS.gtN b1eBGmih74dQ6Zi2M3MSB2rzwN9Ak5r1Q5b1T9nzMgI1zccLRf4ADoM0XQg3YoI33oZPf4D47miZ gz1yoiMDfDU.a0.YoBduOoIUVadvhmaVVQ.QtHVqpAkB4Levvso4D4DVS7VT8jbizGveNKl1tWum WT.BsvRSw_6n5xJUjcCE_x9hmsBL.YwulSPLZ_oPg6UTn0HOvUiafUWMUn3ZWhvpUoTgLpdUyqcO OA_OsSRjrl4G4HvHp_bdEuI7HN_54UTEqXNZJCu3YgeoFEoWlfLvUeTiJpYC3OXPvc.I2LGdN98Z XK0VbAod1IwETz_4jzR5tEpJpeyxYonEzZRPxV6TOp_ZGQd7GgVcjM6znpLoGH9n1T.A6tbFlsnh 4Hpg970SKmvTqswP6_hkGR2KTU101WQeKF609NHrvwdunX9jojkJ_UvsNaUMcBR2ekyMGAVGuCjd 3Tv3I5uJP1JB4Q9XsZJt3RTYd1cqggfaG7FUmyappkA0z7DF4MTB0zts6OdZeTWC9YHTWKipYhY4 BDTaLqZt5k1xmR3CXKrPoQoJeenAyQzQmYtxtY1nkMxM65qHIdB_NKB42BdGh3GdmgoNz0aXOa_3 NCWYBjHgoNls59ykhLQTxkOG_7UU5a._uYv.h X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic317.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:30:21 +0000 Received: by kubenode581.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 27a9153262f58f2e7e1ce912bb0ce8b7; Thu, 13 May 2021 20:30:20 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org Subject: [PATCH v26 20/25] LSM: Verify LSM display sanity in binder Date: Thu, 13 May 2021 13:08:02 -0700 Message-Id: <20210513200807.15910-21-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Verify that the tasks on the ends of a binder transaction use the same "interface_lsm" security module. This prevents confusion of security "contexts". Reviewed-by: Kees Cook Reviewed-by: John Johansen Acked-by: Stephen Smalley Acked-by: Paul Moore Signed-off-by: Casey Schaufler --- security/security.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/security/security.c b/security/security.c index 1e441c3491b5..d1e9a54e22b4 100644 --- a/security/security.c +++ b/security/security.c @@ -857,9 +857,38 @@ int security_binder_set_context_mgr(struct task_struct *mgr) return call_int_hook(binder_set_context_mgr, 0, mgr); } +/** + * security_binder_transaction - Binder driver transaction check + * @from: source of the transaction + * @to: destination of the transaction + * + * Verify that the tasks have the same LSM "display", then + * call the security module hooks. + * + * Returns -EINVAL if the displays don't match, or the + * result of the security module checks. + */ int security_binder_transaction(struct task_struct *from, struct task_struct *to) { + int from_ilsm = lsm_task_ilsm(from); + int to_ilsm = lsm_task_ilsm(to); + + /* + * If the ilsm is LSMBLOB_INVALID the first module that has + * an entry is used. This will be in the 0 slot. + * + * This is currently only required if the server has requested + * peer contexts, but it would be unwieldly to have too much of + * the binder driver detail here. + */ + if (from_ilsm == LSMBLOB_INVALID) + from_ilsm = 0; + if (to_ilsm == LSMBLOB_INVALID) + to_ilsm = 0; + if (from_ilsm != to_ilsm) + return -EINVAL; + return call_int_hook(binder_transaction, 0, from, to); } From patchwork Thu May 13 20:08:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256553 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E1AE3C433ED for ; Thu, 13 May 2021 20:31:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B137661287 for ; Thu, 13 May 2021 20:31:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232832AbhEMUcm (ORCPT ); Thu, 13 May 2021 16:32:42 -0400 Received: from sonic309-27.consmr.mail.ne1.yahoo.com ([66.163.184.153]:45407 "EHLO sonic309-27.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232331AbhEMUcl (ORCPT ); Thu, 13 May 2021 16:32:41 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937891; bh=7V2RZ/HRpW1AoAp/Iq1XcaU0GNuu+Wd9ZV/RFltAMkg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=kvydQvuLMkFVVs2B1sZrl6vJ0pa3oWS90EWe1BYnTxNjaKgNGqcrsfEXzzNiyaWKhiAmHD5RobjW3dMPm8rTV5wFS9bC42CRx4h1zxuVJjk/dvVmNYHrpjVkvxXXgFn4nGvwELlF68Fkp/T4D9KcG3Qzal2rHIOsoCDLD2t3CzOMxldUeALF1G7q5jB6UHKIHQr1tZVUAovuLNw9fqjthsfekBCHwa3nVWx5X2AyA5O3viU5lwPFdfHx6IJCRVNmp84jLYegnPsfAQ+8t3y8WCVIfSRl044ibggKQgYgBZVtlgWMpJOuyDMaAEz9e+N1j7m4zqTI242wc4Loc/BgIg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937891; bh=4N2u0Sp150XJ2GywJA+V6LxsXUu6t6ripev9snnstJ9=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=NRmIHenQe3wrWD1G6/boUMmSnRc6dvoAKZHsYIlMiRFGQKDDGDVvHGLLw0MsXKxnrqz3TxdTXyjIjc11iB8svCuRbTaxiXsJDE4xhWQUjwyAEsu075NsV+kMzJEbv9Kpvy6FjvoeVHDdVTgNsVrDf1xlpEIZxss10J6GRaMU/6+nxAtsudrece/jcDMkThp7WXtja9+BMWCa+fBCN+d57Z3bmorU7to5+2livS/eGyEjlKpH4O+K4jeH4jIHod2HIiVhFaSX2Cz1UUU7GmfX20Xxtcr/n8qo/CB3zmz7B8ZfPcDNRA7fY9Hsvy9BJufYrnjAn1jh/o/H7u0BKjSs2w== X-YMail-OSG: kPJePJ0VM1mUFHUKIuV2NqtLmCMe99NBEJarxZ4Ex2o4LG9ojKrGw7egXG102wK 48X6xkSg6GHM2RSIEy6B83jWWeUZ3mEMgaogBQuk9tw89WnCt4wyXpinoLlh4cVE4iePYp.exgbc CsXTV9zl87CAMVxQ645lkdnP1zW7tiqDiHIiQYa2fkh0oinq1lQygL5H5DNmXYPMsvWh15qfSL8h V9u_S1SrdsTjFK2P98VmJ8NVYFUwR_yNAqsibgw8qXStFuqmptvxABU3frvhCEBf_9jSnbq6QxwR EknFh123IUAZK0iHWQL.bh7v5FDJqSwxwn2idP45W._w7xuBqFRze9G3A9AH9mZXDCid.4BuFEcf HkXIb1TZJI8IKd2KGsfiXsaWLxkCxtrm2kNgN7Y_moBl2PLT9B3wZ68l7vv1nrihKVL9Q8vT_mRl RhMv1wBiF6D8hhgKED9msXWr2X7wutTxs5AVzoRyLwhPFNPD1H7Cm33sPwcr6iKuUQerH9uj0ww1 vND8cvODQjm4glQCzczzOLqP7EB80Q4Knk4RXH6XG6huQXUc_xgsmoV7K39ubY_29.9u3D1ckHjH bVrmo.2rRVyRD0OhdTzAbU1PgwoQMXJC.lOZc8VMrNO31FN8KqnrD5MgcX8Hi9UUNJHxehk5yulH SgS0Gt4zQ4A5DbNlkNUr4JGGY2S2y9LdEnr2i1fbzSBP6QQArUHBZ2.PF.4kOVmyOX8zEA8ha8lZ lQQARlPrUKYU4wkaP6MiIEQx2ncXCiB6q__.Jsrj40hlmGyQ0swXv7PzOfMssiJWFiTLDa.Dqv.W vgV9xHOTN7dZLvuBABL_CO1HOEE9M44xPS3NDhFofrFQE7ChzDFP0Hz3b8QXczyV5mBnIEQj.M3I Wy6moQedJOgypeIE.DdiqpFaPCUwETVDFdf8ZS5RgiJ_9R9YriDzlTIXPMy7KFn2LhFr1v2f992f S6f6Une2r4o6W0mDbYFc.t3eOAUvlIUmnE7SAq55W2hGGaDFcnCP8otCq.gLD_b6m.eHgZ_RVcxX qWscaHyJyK2V7epy2gHJJdrtw9aVctoUMLHaZya5Sf3pWguZ6eCVEFyldq7w8chaf3mGCy_J0tno ycGl8jA4SuQZ2VQ.5YqnRi0oJjhnxAyUvDK7R.fXjJorlWXj6izl8kkUQi9nTTqdxtoV3MxYSX3Z hP9LXBwiao996LoB._fqU0Z0N8mDv0j.zToa5kfK_t.wHI4MMM_OmA07Jd5wMBHwi6_CLCAWExIH 1ECKCs.R7hF5lDBWq6uvBWewemoTUo.LV2U_90rgTL8b64D6oQCirEdUTiXzNY5t7PNJTmPmOHdr eMVQdywBDRDg0ZmGcNxpZggKfqakR1627feCatiHpcV8XtMHEBx3EOIYT6QYmNhO6I1TgRuT5X2G Pg6dQQm5tIz1B01GbwYhAw5lIOrVAu_wTIsKj0KBwbBjrBCUdol2Eb.c7vdrskRBaRepLiZa7nAb ezE6Adt_OXe3g8vRIx0RNkD3ncSgDiBg.xOuT7sRJuGVI78UUxVqjfpPxU5tgAGL_6DNBMnSNmHo TVXBEeKBqqbK3Ko8mvhjLdon8KvVDwrhfk1DwgpOifckDU2BlM_1mwswaFt87aeFsPJ61oDWLOSA pY4ZxOwHzRZ7JSCtB3PV6TAAnmZ1tbZL0udh39JfUW1R.JHfcWuczgrzqbcOnnbKSzUTJx_akr3G xRapH6VVAht_zIdQqqLBUGVAuG5_mm4wtz_aWw99pclvP1ecvh5qT7QqaYxh.qlQAstXJwDY27Gd KEHx0poAC6vuqYzvnV43r2WXANJpIBbfJLLg7JJwAEv512JvmLxwJrUR8rM_pRxG0YCEcH3PWBHM JF1f7PflLptSbHN9vXSt7GMjOKvCCv8rqwUhzmNpPA_rCviffQ9a_4M7T0rpSfqqTnLFz48wgaFu y8mPhRFQ3M.tPG4jYZqWZdmDU5wE7tiW1Zje.9caVF18knodviuAyOusDuhvP7GZxkHK3_Vg6bIo vF0je1mHBw4FYispQHaO0V6Fzsi8wQ7jVncZ6AwMcblyaMtx69jFUL0J.KemRmQ4TtDTaMIKic3n TGVywiRje8xXf1mFl9Om4O.nODlnOyVtme92tsHnnofGU8d5dyon5UuNMX3jhVduyxJdLnDQdB8_ vMMv7e5G19QM7ewwkRgJdOaf6Svd3yHjFkLSluhlPk9deXrZlqnlaW2JUWxLRI0Tc6WQvpIa0oI4 hpttd2xVN4593NKvBvg2k2tvAnf9mAPphDpM2Nm_tzEcnHo_49yKeJTQ.ZV9trhDWJ604XEh9PFa .aiWIWwd.5VXxQr5ohc1cw8ufxJneJUIVmsm4.uh.sN7ZQXaRPTP3hN0E1jIpXDVZMA2sHKrpznT A5Utr9D4PZSXVHO1CSHIg8RbYSFPnRa.rTUt08rluZdcLvIIYW8Msfq1nJK26Pl0DccPc5puE.NP UZ4f7mYYxRlQ8gQgzQfEuQGSPPOQUa_jngjBr040CJ6guzlM6fu7.pN7cM20PKskiBg1zScXV.Vr XoIhGaG.T1gzNLVpjon6b0B08zGH8fDWSX4EWiNbdvZobxT6gjQtTIjbGYw3XRfvMEW3C2xMyMDv 95sYtGK36XE39qhP6yAp8dtp68jWoThrUcLP_joFV6tcI.YwWDVIOtqNHFYS9j3AY.7CX0KpQfFC HefRT0C2j6m3g3otxXybGr99MH0IBYacuUBh1FoMZolwiDAK4_tXaQMyc754QhaHJ7mzzK3RftKr UsGV4OdGSIllU3sJ37nPmWZbCnTOQPUu1Cws.us5mYzXcoTA1xHL_KG8_ozuVi7gZmx03T2RxeNI fjcmJzj9RqPDBL8CSGdOa0rBPgHmdvQx1n4Lbox1TPd_3Itadj2hElXQcXlwlaY4D75NRB.85LwX pnD8xgSxNa5RJv89Y0CIdNvpvjcCUcI8OQoDG6s84S4pQIKJ6p3bFZmnFuKXAFgBobaaVzHC8Ayx g4hXWx_BRRZKF9VbHVx.uZZ2NgzEhgYkQYonlobuG8EoVpnNR_U_iWZtOFP6WmYFIle.0cRROFb4 3Lv6Z9QPYtYz1vSz4hnmaxBMu0FO6oF3QTUHRpcZrd2r1aPvGMZQj181BB5bBjlR80WXybd8oBai MnckoBtVjTQXPYWubpFlBv4CGaD8WsivYA34zSU1SoRFUG9VpGVMQqayy_o4- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic309.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:31:31 +0000 Received: by kubenode547.mail-prod1.omega.bf1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID d32d99f643fa23047b61ede1e4e08778; Thu, 13 May 2021 20:31:27 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, Richard Guy Briggs Subject: [PATCH v26 21/25] audit: add support for non-syscall auxiliary records Date: Thu, 13 May 2021 13:08:03 -0700 Message-Id: <20210513200807.15910-22-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Standalone audit records have the timestamp and serial number generated on the fly and as such are unique, making them standalone. This new function audit_alloc_local() generates a local audit context that will be used only for a standalone record and its auxiliary record(s). The context is discarded immediately after the local associated records are produced. Signed-off-by: Richard Guy Briggs Signed-off-by: Casey Schaufler Cc: linux-audit@redhat.com To: Richard Guy Briggs Acked-by: Paul Moore --- include/linux/audit.h | 8 ++++++++ kernel/audit.h | 1 + kernel/auditsc.c | 33 ++++++++++++++++++++++++++++----- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/include/linux/audit.h b/include/linux/audit.h index 418a485af114..97cd7471e572 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h @@ -289,6 +289,8 @@ static inline int audit_signal_info(int sig, struct task_struct *t) /* Public API */ extern int audit_alloc(struct task_struct *task); extern void __audit_free(struct task_struct *task); +extern struct audit_context *audit_alloc_local(gfp_t gfpflags); +extern void audit_free_context(struct audit_context *context); extern void __audit_syscall_entry(int major, unsigned long a0, unsigned long a1, unsigned long a2, unsigned long a3); extern void __audit_syscall_exit(int ret_success, long ret_value); @@ -552,6 +554,12 @@ static inline void audit_log_nfcfg(const char *name, u8 af, extern int audit_n_rules; extern int audit_signals; #else /* CONFIG_AUDITSYSCALL */ ++static inline struct audit_context *audit_alloc_local(gfp_t gfpflags) +{ + return NULL; +} +static inline void audit_free_context(struct audit_context *context) +{ } static inline int audit_alloc(struct task_struct *task) { return 0; diff --git a/kernel/audit.h b/kernel/audit.h index 23a85a470121..27ef690afd30 100644 --- a/kernel/audit.h +++ b/kernel/audit.h @@ -99,6 +99,7 @@ struct audit_proctitle { struct audit_context { int dummy; /* must be the first element */ int in_syscall; /* 1 if task is in a syscall */ + bool local; /* local context needed */ enum audit_state state, current_state; unsigned int serial; /* serial number for record */ int major; /* syscall number */ diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 67da23f6bebd..d4e061f95da8 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -925,11 +925,13 @@ static inline void audit_free_aux(struct audit_context *context) } } -static inline struct audit_context *audit_alloc_context(enum audit_state state) +static inline struct audit_context *audit_alloc_context(enum audit_state state, + gfp_t gfpflags) { struct audit_context *context; - context = kzalloc(sizeof(*context), GFP_KERNEL); + /* We can be called in atomic context via audit_tg() */ + context = kzalloc(sizeof(*context), gfpflags); if (!context) return NULL; context->state = state; @@ -965,7 +967,8 @@ int audit_alloc(struct task_struct *tsk) return 0; } - if (!(context = audit_alloc_context(state))) { + context = audit_alloc_context(state, GFP_KERNEL); + if (!context) { kfree(key); audit_log_lost("out of memory in audit_alloc"); return -ENOMEM; @@ -977,8 +980,27 @@ int audit_alloc(struct task_struct *tsk) return 0; } -static inline void audit_free_context(struct audit_context *context) +struct audit_context *audit_alloc_local(gfp_t gfpflags) { + struct audit_context *context = NULL; + + context = audit_alloc_context(AUDIT_RECORD_CONTEXT, gfpflags); + if (!context) { + audit_log_lost("out of memory in audit_alloc_local"); + goto out; + } + context->serial = audit_serial(); + ktime_get_coarse_real_ts64(&context->ctime); + context->local = true; +out: + return context; +} +EXPORT_SYMBOL(audit_alloc_local); + +void audit_free_context(struct audit_context *context) +{ + if (!context) + return; audit_free_module(context); audit_free_names(context); unroll_tree_refs(context, NULL, 0); @@ -989,6 +1011,7 @@ static inline void audit_free_context(struct audit_context *context) audit_proctitle_free(context); kfree(context); } +EXPORT_SYMBOL(audit_free_context); static int audit_log_pid_context(struct audit_context *context, pid_t pid, kuid_t auid, kuid_t uid, @@ -2210,7 +2233,7 @@ EXPORT_SYMBOL_GPL(__audit_inode_child); int auditsc_get_stamp(struct audit_context *ctx, struct timespec64 *t, unsigned int *serial) { - if (!ctx->in_syscall) + if (!ctx->in_syscall && !ctx->local) return 0; if (!ctx->serial) ctx->serial = audit_serial(); From patchwork Thu May 13 20:08:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256555 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 44DB4C433B4 for ; Thu, 13 May 2021 20:32:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 09F07611BF for ; Thu, 13 May 2021 20:32:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232947AbhEMUdr (ORCPT ); Thu, 13 May 2021 16:33:47 -0400 Received: from sonic317-38.consmr.mail.ne1.yahoo.com ([66.163.184.49]:33379 "EHLO sonic317-38.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232948AbhEMUdq (ORCPT ); Thu, 13 May 2021 16:33:46 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937956; bh=sJ9e8qsmpa5HneGdK4dPH8thQK5rJ0jRuPc0AgwVcI4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=EauFfg6M5Q0w4DZRikeATnp8ogwCw1+9K/KbDWfxFNDVYjZruRXPas/0uiSnaCZKxoeO2bZBUvumpb51vEwftTG1ndEoIRRARFN58T6BaRad835JUrZsjFhvLw3hVmS/lnNGZRepu1M0bvpzciYrgiZ7/+/8t9biKZPt4SPU4mhGJlu0nvUrXWHoeaFKhu4Vl6+CttsoGM+/pVFlef8v/oRfRRfaFXkfD2lplV0yC5iWF291cxdteJT0UD1at3WHHCTxF1VNm1dHSKSGnJbiKtsC22e98ahXVTWOaeNUp3RBl0XROyEqoKVM85ZKUxUltw59TmN4ViAu1zuNSRiV/g== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620937956; bh=z+Uplu/4K2KS5E/XqCMsbkvJFCRZ7CaF4qefZ6D/R6M=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=nxzTwifUUhcccIVnkLXe1YdfLAXQcyG0r/a48vT30S6g93slBZlajfo/4JXCIJ+7N4UreoXcpf6NJZJ7JiI08Sv4IPiwNFlAu88qMvugc/eTxb9kQIXB8vUUTDJ2VWE17AA/mIN4G+8YwghcqUm/a9iM5PNXNFuG1u3W5dKdO64TgZjc6//wO/YmGpkPP3tv0CGXslytwSNSSVl2x1skrqTTP21GBfPYnqZZ28VON8V4ljxvlgTn6IL6JENGr6VoNtdzYoiM6IbwzMjM/8q5aIbOJ3OnJRxSruHwz3deiXtF3zLmFnQ8IPJ4YOmO2ypdYW41WAZgvrDGSDewiBppHw== X-YMail-OSG: vHYBfcgVM1mNMqnZFBL7UTydBQQ92gKWNn.QM9AqkUT7HdDYqKPza9ZEGL60cO6 zDS1n5IfdF2taKkV2dUTaVKgp_NtN4jcdWr7m2w2ajAlVDJZn8WVDd_h87b1CxEaEDNMgotEA829 PAA6PnaBOpBEM59P6DuJ5swfj2qgj_4iT2tYNL5sy6eaeXtyGTkQBS9E9B5x9SBlL4htkZ4q6QPg 9VgCqzIwIh4pvTTk5EmFlsXf28kcPp9uqSOYjOw0ndtPwd3OSs5_fc9RFeO6DyeP3Xz7Ofblx.NX lp14.n4k5ZPInaOLHF.RQ3VC1Vjo_0KC4BxmKNuHIykRaP4puKfyaMbAM52OW0BkgK4Z8fYivKgb QfPESv0S1g4lIufT4WjyhewPiBeLsejGDeQsLZJt5JYpV7S1Irhccpu1jfQ.sbA2.uHqRAhimguq yXgIoBPdQfEuHV3kD3VrFXOQA4pM6uHo3JqFaZsoXMUTYdFRU1NOHrKkBiD7EXUbg4SfOfTdmKP8 EzRTVZXMCFSP9eOpZAYUkcbt793ahVkCoHB_1X3JYUGeUPhzXFpEgXMPt_DSOOdDIQC.adjbSIvu srvsQ7YmJjYJuV8VGFkk7K4ibFvisywytAOySBSk3HfhcukXUQpjDgxKCWcPWgIBkLCowEABK7eO u5Zi9TtkvItOeDYMhKNLSE1P9Iq8ZGggtSPtgWfiS.9t2nB2tNvIEWfoUZXiiqIN9buqhXhI5qGn O1lxzU9BhhYC_Iaa6Ow0zz9ZccpKHFnJ69XPxBpP7eXnRI5SO6GrJ2xqsIqOe3gJf6P2R.X.UWk5 8gPIfIPABul3Wt8lKQgknDO9MCJWQVESw4GRDQmy5nb29MjoY6gdj8EFshAA1okRa6zXDonSr3Sv UAAzxRDXxjTUZYBwSSYj09h_3cu9zDVDzq7ImHeHWIAfz2iQhMJsfC5a_FgRDh3_iHmDkTyv9A4M UfSpYcFdlImiVBK0AC_LKdYEFRGALz.ipveDbQHq5FFowZo_GmDidFTRwDyAWoLHAEkU9HFa_WLH 1tUT5.FsnAzU40y9KpsVPZMb4FFDrquGdHnqFSIfTgjVuxxQFEgt34i0AIbHz7HlH1DYYiBLvPEQ tszMxoeAYqDiofrFXp7xqmr.k8DvxadlGq9uuUskX.3OEKRabL.RGezxrsU6_1OSZ3KzjjdH1Ehk BKIhLZaXz2aA0C4InPW4_vc1mJxaiuzVN8guNR5SE4BhEf.s6zf4qWKJ.ojXZB.npcRTqodI9hjk AG94OS0CYzPbkLL9I9L8HFalreuEIzVh1PZAg.20Yc8V1b9NNvP18qXGh5npYxGIKy6L6lQ4H7Ck DFvBmY5tSEZVV64NwgqzdIQuETfpiztAdEqOcYpfQxRvHEI.LPX9eUpLLEvLVVY4nEPnmt3Q3Yvl KcGgjJtSo7XqIVnsi8XNHxnQyriu0f0QjFIiiTefUu99kggXh0TbWU.UWW4UW0iXNMSdTn23irWu XHd.4wmk4Juj7ZxnlRsle0WIXTxod5gJRn66sllYTzPbPxtFHyZ_hbNqdArGCzc6T0qfxh6kd7RH 3ch9ouO8eMDlN5gFtOV2rMNiTi78YeusigV0GHgPrD5lRwQgJqmGgho6ZCYn2of3gbviP7VsWIBm MjhKr0havbayQqse5EL.5FaykCu3aklo9.Nn52AMIFm9QbulBsIxGS00rh_NbFko7AUQSXSxNztS _UUUlcIC31eS6q1ev8xtOfHTjcHL7j_tt24UczrE.v4P6I8E._dN.WUMB9bUtCUWswHLAIsYtO38 z.ou_LEHDmHE3tHciiHrollapmlUV3hnMyhric5hLydzA8hG0DAEfPiIEXtzhx1vqLawQ5BBau.Q IDhh9TDX7ySs_W9hMF36QHMe544IkUMEyqoUUBP8l54n_nVTjc8WxnII1T5lC2eSqrsN_idmldq2 NvRLzvAweGU_sEI8f38KeUueoLs3aOnmRjpCJBBCGQKLNkKODk.Bcfcka6uSKx29AGzcrhapPtv. nBIyT.1YsefBM15JgjISFVNCfR4BYyJ.ghC_9JR3sdTqrcRo9svdqOrFopxn5zwQ0xUnDkFlwFPQ 1faFBLPr1ihgSjN4C4wgKMQKHynl7I2fKlTDpQqLi.b1qScYU.J7tDKY3P10PnocUTDUGEbKXp96 mYYkOQx7vh9DoI6UKcXa3A96iZ83VVojy6oQ2HAbM41C2jHy5vCHTRzOFAXP15X30nfnk2uSq.wU Vf.B7H3J3n2wRHnQIsTAdYCn0Shho.u0JEfM6GIK4QOtkxEMruOvtCrpajMUlr4y7ABUo6AZqbdA MFs6Vk1Gnd3RaKZ0mtX9yUyoV8pn5I9IkeNTj87ja9CM1K6U5VUy7EdtzfMeiWxcmEOS_yVOfc18 bRJgrJyD8X4y64s2TaepTN_0u6G5RIX3C1Q3DMgo82QfWzNwuHJ78oGOAz0udsrJVcH1_AhuC.3a _QydsFmSWuEiG2is8SPQZHPPW0T3Eea8M3y6vByzpFXQs7KbBd3FO5WhstRIu5rdpqxmT8BhtC.C qYgWShZjHbPjYg7RYOn6OQOzfdjuTchNvsEHlC_Qyw7BZa6nq602zRyr480ZueNop9V5yrS9QH2o xIFnvcIils.OlVr0fTPM9KfBfCKSUz0l0800HEuhIC7.0ZqEY6syav6Id2_Y5zxz7008zYMq3O3v TtT5VsjTKP3SqyDrd.4jGIEmFPgUOofdJsmFw_xg_YtWF36Swi2RnLDYDdciqvC2PpHRqS7wCbgN L6qIWL2JoEf5ZLo1RJmsqNpGfWhhZ9Nur8iE6V93fdFcAb84g56Cdd2Qy6k6.EsIP7Lx4sPKPlI1 baLc5p64UgnD62YoqNqeScyLxfevWWIXgGrtQfqtXGa2ABd2UXso0Q4Yrq4rYPYuVlKM8DqPK4jx DQfLHTcTwPcZVSf_hJmcM.MvYpUih35Z8LsD1xKdzYteRUb5qotvcDy8St0ihGvxDBGqZe81aAWj cIpsdCd0fUDcNesL0qkOcafWnLinhdpD6sCTrcJ_gyWrQO5cGMpI1krneAPIOHqqRz69MsltkJgf rjuNN2FcwQ42uBa67Lm.8m.TTL.xDH32Au6q5U9FsYntiQxY3hiiPcXAIHNmjdDeb.PrSRYkBkRE LdgL8IsWm2Xhm9I.bTSuXjeXYJkx4z7p72LxU0u_8PL2Pkq7nBBOr0DKd_ljo4UzR8ZMNqQzfHo8 AIrHw9iyveaZ8F6NXbEzb.F6uIPt7a1mzVKXd7kJSxw-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic317.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:32:36 +0000 Received: by kubenode518.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 30b071452c09b5da941082a96c8657ff; Thu, 13 May 2021 20:32:33 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v26 22/25] Audit: Add new record for multiple process LSM attributes Date: Thu, 13 May 2021 13:08:04 -0700 Message-Id: <20210513200807.15910-23-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Create a new audit record type to contain the subject information when there are multiple security modules that require such data. This record is linked with the same timestamp and serial number using the audit_alloc_local() mechanism. The record is produced only in cases where there is more than one security module with a process "context". In cases where this record is produced the subj= fields of other records in the audit event will be set to "subj=?". An example of the MAC_TASK_CONTEXTS (1420) record is: type=UNKNOWN[1420] msg=audit(1600880931.832:113) subj_apparmor==unconfined subj_smack=_ There will be a subj_$LSM= entry for each security module LSM that supports the secid_to_secctx and secctx_to_secid hooks. The BPF security module implements secid/secctx translation hooks, so it has to be considered to provide a secctx even though it may not actually do so. Signed-off-by: Casey Schaufler To: paul@paul-moore.com To: linux-audit@redhat.com To: rgb@redhat.com Cc: netdev@vger.kernel.org --- drivers/android/binder.c | 2 +- include/linux/audit.h | 24 ++++++++ include/linux/security.h | 16 ++++- include/net/netlabel.h | 3 +- include/net/scm.h | 2 +- include/net/xfrm.h | 13 +++- include/uapi/linux/audit.h | 1 + kernel/audit.c | 80 ++++++++++++++++++------- kernel/audit.h | 3 + kernel/auditfilter.c | 6 +- kernel/auditsc.c | 75 ++++++++++++++++++++--- net/ipv4/ip_sockglue.c | 2 +- net/netfilter/nf_conntrack_netlink.c | 4 +- net/netfilter/nf_conntrack_standalone.c | 2 +- net/netfilter/nfnetlink_queue.c | 2 +- net/netlabel/netlabel_domainhash.c | 4 +- net/netlabel/netlabel_unlabeled.c | 24 ++++---- net/netlabel/netlabel_user.c | 20 ++++--- net/netlabel/netlabel_user.h | 6 +- net/xfrm/xfrm_policy.c | 10 ++-- net/xfrm/xfrm_state.c | 20 ++++--- security/integrity/ima/ima_api.c | 7 ++- security/integrity/integrity_audit.c | 6 +- security/security.c | 46 +++++++++----- security/smack/smackfs.c | 3 +- 25 files changed, 274 insertions(+), 107 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index f2a27bbbbe4d..7818c0fe0f38 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -2722,7 +2722,7 @@ static void binder_transaction(struct binder_proc *proc, * case well anyway. */ security_task_getsecid_obj(proc->tsk, &blob); - ret = security_secid_to_secctx(&blob, &lsmctx); + ret = security_secid_to_secctx(&blob, &lsmctx, LSMBLOB_DISPLAY); if (ret) { return_error = BR_FAILED_REPLY; return_error_param = ret; diff --git a/include/linux/audit.h b/include/linux/audit.h index 97cd7471e572..229cd71fbf09 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h @@ -164,6 +164,8 @@ extern struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp extern __printf(2, 3) void audit_log_format(struct audit_buffer *ab, const char *fmt, ...); extern void audit_log_end(struct audit_buffer *ab); +extern void audit_log_end_local(struct audit_buffer *ab, + struct audit_context *context); extern bool audit_string_contains_control(const char *string, size_t len); extern void audit_log_n_hex(struct audit_buffer *ab, @@ -188,6 +190,7 @@ extern void audit_log_lost(const char *message); extern int audit_log_task_context(struct audit_buffer *ab); extern void audit_log_task_info(struct audit_buffer *ab); +extern void audit_log_lsm(struct audit_context *context); extern int audit_update_lsm_rules(void); @@ -226,6 +229,9 @@ void audit_log_format(struct audit_buffer *ab, const char *fmt, ...) { } static inline void audit_log_end(struct audit_buffer *ab) { } +static inline void audit_log_end_local(struct audit_buffer *ab, + struct audit_context *context) +{ } static inline void audit_log_n_hex(struct audit_buffer *ab, const unsigned char *buf, size_t len) { } @@ -252,6 +258,8 @@ static inline int audit_log_task_context(struct audit_buffer *ab) } static inline void audit_log_task_info(struct audit_buffer *ab) { } +static void audit_log_lsm(struct audit_context *context) +{ } static inline kuid_t audit_get_loginuid(struct task_struct *tsk) { @@ -291,6 +299,7 @@ extern int audit_alloc(struct task_struct *task); extern void __audit_free(struct task_struct *task); extern struct audit_context *audit_alloc_local(gfp_t gfpflags); extern void audit_free_context(struct audit_context *context); +extern void audit_free_local(struct audit_context *context); extern void __audit_syscall_entry(int major, unsigned long a0, unsigned long a1, unsigned long a2, unsigned long a3); extern void __audit_syscall_exit(int ret_success, long ret_value); @@ -386,6 +395,19 @@ static inline void audit_ptrace(struct task_struct *t) __audit_ptrace(t); } +static inline struct audit_context *audit_alloc_for_lsm(gfp_t gfp) +{ + struct audit_context *context = audit_context(); + + if (context) + return context; + + if (lsm_multiple_contexts()) + return audit_alloc_local(gfp); + + return NULL; +} + /* Private API (for audit.c only) */ extern void __audit_ipc_obj(struct kern_ipc_perm *ipcp); extern void __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode); @@ -560,6 +582,8 @@ extern int audit_signals; } static inline void audit_free_context(struct audit_context *context) { } +static inline void audit_free_local(struct audit_context *context) +{ } static inline int audit_alloc(struct task_struct *task) { return 0; diff --git a/include/linux/security.h b/include/linux/security.h index 0129400ff6e9..ddab456e93d3 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -182,6 +182,8 @@ struct lsmblob { #define LSMBLOB_INVALID -1 /* Not a valid LSM slot number */ #define LSMBLOB_NEEDED -2 /* Slot requested on initialization */ #define LSMBLOB_NOT_NEEDED -3 /* Slot not requested */ +#define LSMBLOB_DISPLAY -4 /* Use the "display" slot */ +#define LSMBLOB_FIRST -5 /* Use the default "display" slot */ /** * lsmblob_init - initialize an lsmblob structure @@ -248,6 +250,15 @@ static inline u32 lsmblob_value(const struct lsmblob *blob) return 0; } +static inline bool lsm_multiple_contexts(void) +{ +#ifdef CONFIG_SECURITY + return lsm_slot_to_name(1) != NULL; +#else + return false; +#endif +} + /* These functions are in security/commoncap.c */ extern int cap_capable(const struct cred *cred, struct user_namespace *ns, int cap, unsigned int opts); @@ -578,7 +589,8 @@ int security_setprocattr(const char *lsm, const 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(struct lsmblob *blob, struct lsmcontext *cp); +int security_secid_to_secctx(struct lsmblob *blob, struct lsmcontext *cp, + int display); int security_secctx_to_secid(const char *secdata, u32 seclen, struct lsmblob *blob); void security_release_secctx(struct lsmcontext *cp); @@ -1433,7 +1445,7 @@ static inline int security_ismaclabel(const char *name) } static inline int security_secid_to_secctx(struct lsmblob *blob, - struct lsmcontext *cp) + struct lsmcontext *cp, int display) { return -EOPNOTSUPP; } diff --git a/include/net/netlabel.h b/include/net/netlabel.h index 73fc25b4042b..9bc1f969a25d 100644 --- a/include/net/netlabel.h +++ b/include/net/netlabel.h @@ -97,7 +97,8 @@ struct calipso_doi; /* NetLabel audit information */ struct netlbl_audit { - u32 secid; + struct audit_context *localcontext; + struct lsmblob lsmdata; kuid_t loginuid; unsigned int sessionid; }; diff --git a/include/net/scm.h b/include/net/scm.h index b77a52f93389..f4d567d4885e 100644 --- a/include/net/scm.h +++ b/include/net/scm.h @@ -101,7 +101,7 @@ static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct sc * and the infrastructure will know which it is. */ lsmblob_init(&lb, scm->secid); - err = security_secid_to_secctx(&lb, &context); + err = security_secid_to_secctx(&lb, &context, LSMBLOB_DISPLAY); if (!err) { put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, context.len, diff --git a/include/net/xfrm.h b/include/net/xfrm.h index c58a6d4eb610..f8ad20d34498 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -669,13 +669,22 @@ struct xfrm_spi_skb_cb { #define XFRM_SPI_SKB_CB(__skb) ((struct xfrm_spi_skb_cb *)&((__skb)->cb[0])) #ifdef CONFIG_AUDITSYSCALL -static inline struct audit_buffer *xfrm_audit_start(const char *op) +static inline struct audit_buffer *xfrm_audit_start(const char *op, + struct audit_context **lac) { + struct audit_context *context; struct audit_buffer *audit_buf = NULL; if (audit_enabled == AUDIT_OFF) return NULL; - audit_buf = audit_log_start(audit_context(), GFP_ATOMIC, + context = audit_context(); + if (lac != NULL) { + if (lsm_multiple_contexts() && context == NULL) + context = audit_alloc_local(GFP_ATOMIC); + *lac = context; + } + + audit_buf = audit_log_start(context, GFP_ATOMIC, AUDIT_MAC_IPSEC_EVENT); if (audit_buf == NULL) return NULL; diff --git a/include/uapi/linux/audit.h b/include/uapi/linux/audit.h index cd2d8279a5e4..2a63720e56f6 100644 --- a/include/uapi/linux/audit.h +++ b/include/uapi/linux/audit.h @@ -139,6 +139,7 @@ #define AUDIT_MAC_UNLBL_STCDEL 1417 /* NetLabel: del a static label */ #define AUDIT_MAC_CALIPSO_ADD 1418 /* NetLabel: add CALIPSO DOI entry */ #define AUDIT_MAC_CALIPSO_DEL 1419 /* NetLabel: del CALIPSO DOI entry */ +#define AUDIT_MAC_TASK_CONTEXTS 1420 /* Multiple LSM contexts */ #define AUDIT_FIRST_KERN_ANOM_MSG 1700 #define AUDIT_LAST_KERN_ANOM_MSG 1799 diff --git a/kernel/audit.c b/kernel/audit.c index 841123390d41..60c027d7759c 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -386,10 +386,12 @@ void audit_log_lost(const char *message) static int audit_log_config_change(char *function_name, u32 new, u32 old, int allow_changes) { + struct audit_context *context; struct audit_buffer *ab; int rc = 0; - ab = audit_log_start(audit_context(), GFP_KERNEL, AUDIT_CONFIG_CHANGE); + context = audit_alloc_for_lsm(GFP_KERNEL); + ab = audit_log_start(context, GFP_KERNEL, AUDIT_CONFIG_CHANGE); if (unlikely(!ab)) return rc; audit_log_format(ab, "op=set %s=%u old=%u ", function_name, new, old); @@ -398,7 +400,7 @@ static int audit_log_config_change(char *function_name, u32 new, u32 old, if (rc) allow_changes = 0; /* Something weird, deny request */ audit_log_format(ab, " res=%d", allow_changes); - audit_log_end(ab); + audit_log_end_local(ab, context); return rc; } @@ -1072,12 +1074,6 @@ static void audit_log_common_recv_msg(struct audit_context *context, audit_log_task_context(*ab); } -static inline void audit_log_user_recv_msg(struct audit_buffer **ab, - u16 msg_type) -{ - audit_log_common_recv_msg(NULL, ab, msg_type); -} - int is_audit_feature_set(int i) { return af.features & AUDIT_FEATURE_TO_MASK(i); @@ -1110,6 +1106,7 @@ static void audit_log_feature_change(int which, u32 old_feature, u32 new_feature audit_log_format(ab, " feature=%s old=%u new=%u old_lock=%u new_lock=%u res=%d", audit_feature_names[which], !!old_feature, !!new_feature, !!old_lock, !!new_lock, res); + audit_log_lsm(ab->ctx); audit_log_end(ab); } @@ -1190,6 +1187,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) struct audit_buffer *ab; u16 msg_type = nlh->nlmsg_type; struct audit_sig_info *sig_data; + struct audit_context *lcontext; err = audit_netlink_ok(skb, msg_type); if (err) @@ -1357,7 +1355,8 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) if (err) break; } - audit_log_user_recv_msg(&ab, msg_type); + lcontext = audit_alloc_for_lsm(GFP_KERNEL); + audit_log_common_recv_msg(lcontext, &ab, msg_type); if (msg_type != AUDIT_USER_TTY) { /* ensure NULL termination */ str[data_len - 1] = '\0'; @@ -1370,7 +1369,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) data_len--; audit_log_n_untrustedstring(ab, str, data_len); } - audit_log_end(ab); + audit_log_end_local(ab, lcontext); } break; case AUDIT_ADD_RULE: @@ -1378,13 +1377,14 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) if (data_len < sizeof(struct audit_rule_data)) return -EINVAL; if (audit_enabled == AUDIT_LOCKED) { - audit_log_common_recv_msg(audit_context(), &ab, + lcontext = audit_alloc_for_lsm(GFP_KERNEL); + audit_log_common_recv_msg(lcontext, &ab, AUDIT_CONFIG_CHANGE); audit_log_format(ab, " op=%s audit_enabled=%d res=0", msg_type == AUDIT_ADD_RULE ? "add_rule" : "remove_rule", audit_enabled); - audit_log_end(ab); + audit_log_end_local(ab, lcontext); return -EPERM; } err = audit_rule_change(msg_type, seq, data, data_len); @@ -1394,10 +1394,10 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) break; case AUDIT_TRIM: audit_trim_trees(); - audit_log_common_recv_msg(audit_context(), &ab, - AUDIT_CONFIG_CHANGE); + lcontext = audit_alloc_for_lsm(GFP_KERNEL); + audit_log_common_recv_msg(lcontext, &ab, AUDIT_CONFIG_CHANGE); audit_log_format(ab, " op=trim res=1"); - audit_log_end(ab); + audit_log_end_local(ab, lcontext); break; case AUDIT_MAKE_EQUIV: { void *bufp = data; @@ -1425,6 +1425,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) /* OK, here comes... */ err = audit_tag_tree(old, new); + lcontext = audit_alloc_for_lsm(GFP_KERNEL); audit_log_common_recv_msg(audit_context(), &ab, AUDIT_CONFIG_CHANGE); audit_log_format(ab, " op=make_equiv old="); @@ -1432,7 +1433,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) audit_log_format(ab, " new="); audit_log_untrustedstring(ab, new); audit_log_format(ab, " res=%d", !err); - audit_log_end(ab); + audit_log_end_local(ab, lcontext); kfree(old); kfree(new); break; @@ -1443,7 +1444,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) if (lsmblob_is_set(&audit_sig_lsm)) { err = security_secid_to_secctx(&audit_sig_lsm, - &context); + &context, LSMBLOB_FIRST); if (err) return err; } @@ -1498,13 +1499,14 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) old.enabled = t & AUDIT_TTY_ENABLE; old.log_passwd = !!(t & AUDIT_TTY_LOG_PASSWD); + lcontext = audit_alloc_for_lsm(GFP_KERNEL); audit_log_common_recv_msg(audit_context(), &ab, AUDIT_CONFIG_CHANGE); audit_log_format(ab, " op=tty_set old-enabled=%d new-enabled=%d" " old-log_passwd=%d new-log_passwd=%d res=%d", old.enabled, s.enabled, old.log_passwd, s.log_passwd, !err); - audit_log_end(ab); + audit_log_end_local(ab, lcontext); break; } default: @@ -1550,6 +1552,7 @@ static void audit_receive(struct sk_buff *skb) /* Log information about who is connecting to the audit multicast socket */ static void audit_log_multicast(int group, const char *op, int err) { + struct audit_context *context; const struct cred *cred; struct tty_struct *tty; char comm[sizeof(current->comm)]; @@ -1558,7 +1561,8 @@ static void audit_log_multicast(int group, const char *op, int err) if (!audit_enabled) return; - ab = audit_log_start(audit_context(), GFP_KERNEL, AUDIT_EVENT_LISTENER); + context = audit_alloc_for_lsm(GFP_KERNEL); + ab = audit_log_start(context, GFP_KERNEL, AUDIT_EVENT_LISTENER); if (!ab) return; @@ -1576,7 +1580,7 @@ static void audit_log_multicast(int group, const char *op, int err) audit_log_untrustedstring(ab, get_task_comm(comm, current)); audit_log_d_path_exe(ab, current->mm); /* exe= */ audit_log_format(ab, " nl-mcgrp=%d op=%s res=%d", group, op, !err); - audit_log_end(ab); + audit_log_end_local(ab, context); } /* Run custom bind function on netlink socket group connect or bind requests. */ @@ -2138,7 +2142,19 @@ int audit_log_task_context(struct audit_buffer *ab) if (!lsmblob_is_set(&blob)) return 0; - error = security_secid_to_secctx(&blob, &context); + /* + * If there is more than one security module that has a + * subject "context" it's necessary to put the subject data + * into a separate record to maintain compatibility. + */ + if (lsm_multiple_contexts()) { + if (ab->ctx) + ab->ctx->lsm = blob; + audit_log_format(ab, " subj=?"); + return 0; + } + + error = security_secid_to_secctx(&blob, &context, LSMBLOB_FIRST); if (error) { if (error != -EINVAL) goto error_path; @@ -2224,6 +2240,7 @@ void audit_log_task_info(struct audit_buffer *ab) audit_log_untrustedstring(ab, get_task_comm(comm, current)); audit_log_d_path_exe(ab, current->mm); audit_log_task_context(ab); + audit_log_lsm(ab->ctx); } EXPORT_SYMBOL(audit_log_task_info); @@ -2274,6 +2291,7 @@ static void audit_log_set_loginuid(kuid_t koldloginuid, kuid_t kloginuid, unsigned int oldsessionid, unsigned int sessionid, int rc) { + struct audit_context *context; struct audit_buffer *ab; uid_t uid, oldloginuid, loginuid; struct tty_struct *tty; @@ -2281,7 +2299,8 @@ static void audit_log_set_loginuid(kuid_t koldloginuid, kuid_t kloginuid, if (!audit_enabled) return; - ab = audit_log_start(audit_context(), GFP_KERNEL, AUDIT_LOGIN); + context = audit_alloc_for_lsm(GFP_KERNEL); + ab = audit_log_start(context, GFP_KERNEL, AUDIT_LOGIN); if (!ab) return; @@ -2296,7 +2315,7 @@ static void audit_log_set_loginuid(kuid_t koldloginuid, kuid_t kloginuid, oldloginuid, loginuid, tty ? tty_name(tty) : "(none)", oldsessionid, sessionid, !rc); audit_put_tty(tty); - audit_log_end(ab); + audit_log_end_local(ab, context); } /** @@ -2396,6 +2415,21 @@ void audit_log_end(struct audit_buffer *ab) audit_buffer_free(ab); } +/** + * audit_log_end_local - end one audit record with local context + * @ab: the audit_buffer + * @context: the local context + * + * Emit an LSM context record if appropriate, then end the audit event + * in the usual way. + */ +void audit_log_end_local(struct audit_buffer *ab, struct audit_context *context) +{ + audit_log_end(ab); + audit_log_lsm_common(context); + audit_free_local(context); +} + /** * audit_log - Log an audit record * @ctx: audit context diff --git a/kernel/audit.h b/kernel/audit.h index 27ef690afd30..5ad0c6819aa8 100644 --- a/kernel/audit.h +++ b/kernel/audit.h @@ -100,6 +100,7 @@ struct audit_context { int dummy; /* must be the first element */ int in_syscall; /* 1 if task is in a syscall */ bool local; /* local context needed */ + bool lsmdone; /* multiple security reported */ enum audit_state state, current_state; unsigned int serial; /* serial number for record */ int major; /* syscall number */ @@ -131,6 +132,7 @@ struct audit_context { kgid_t gid, egid, sgid, fsgid; unsigned long personality; int arch; + struct lsmblob lsm; pid_t target_pid; kuid_t target_auid; @@ -201,6 +203,7 @@ struct audit_context { extern bool audit_ever_enabled; extern void audit_log_session_info(struct audit_buffer *ab); +extern void audit_log_lsm_common(struct audit_context *context); extern int auditd_test_task(struct task_struct *task); diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index 1ba14a7a38f7..be59ca46b0a2 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c @@ -1098,12 +1098,14 @@ static void audit_list_rules(int seq, struct sk_buff_head *q) /* Log rule additions and removals */ static void audit_log_rule_change(char *action, struct audit_krule *rule, int res) { + struct audit_context *context; struct audit_buffer *ab; if (!audit_enabled) return; - ab = audit_log_start(audit_context(), GFP_KERNEL, AUDIT_CONFIG_CHANGE); + context = audit_alloc_for_lsm(GFP_KERNEL); + ab = audit_log_start(context, GFP_KERNEL, AUDIT_CONFIG_CHANGE); if (!ab) return; audit_log_session_info(ab); @@ -1111,7 +1113,7 @@ static void audit_log_rule_change(char *action, struct audit_krule *rule, int re audit_log_format(ab, " op=%s", action); audit_log_key(ab, rule->filterkey); audit_log_format(ab, " list=%d res=%d", rule->listnr, res); - audit_log_end(ab); + audit_log_end_local(ab, context); } /** diff --git a/kernel/auditsc.c b/kernel/auditsc.c index d4e061f95da8..55509faf5341 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -940,6 +940,7 @@ static inline struct audit_context *audit_alloc_context(enum audit_state state, INIT_LIST_HEAD(&context->names_list); context->fds[0] = -1; context->return_valid = AUDITSC_INVALID; + context->lsmdone = false; return context; } @@ -987,12 +988,11 @@ struct audit_context *audit_alloc_local(gfp_t gfpflags) context = audit_alloc_context(AUDIT_RECORD_CONTEXT, gfpflags); if (!context) { audit_log_lost("out of memory in audit_alloc_local"); - goto out; + return NULL; } context->serial = audit_serial(); ktime_get_coarse_real_ts64(&context->ctime); context->local = true; -out: return context; } EXPORT_SYMBOL(audit_alloc_local); @@ -1013,6 +1013,13 @@ void audit_free_context(struct audit_context *context) } EXPORT_SYMBOL(audit_free_context); +void audit_free_local(struct audit_context *context) +{ + if (context && context->local) + audit_free_context(context); +} +EXPORT_SYMBOL(audit_free_local); + static int audit_log_pid_context(struct audit_context *context, pid_t pid, kuid_t auid, kuid_t uid, unsigned int sessionid, @@ -1030,7 +1037,7 @@ static int audit_log_pid_context(struct audit_context *context, pid_t pid, from_kuid(&init_user_ns, auid), from_kuid(&init_user_ns, uid), sessionid); if (lsmblob_is_set(blob)) { - if (security_secid_to_secctx(blob, &lsmctx)) { + if (security_secid_to_secctx(blob, &lsmctx, LSMBLOB_FIRST)) { audit_log_format(ab, " obj=(none)"); rc = 1; } else { @@ -1275,7 +1282,8 @@ static void show_special(struct audit_context *context, int *call_panic) struct lsmblob blob; lsmblob_init(&blob, osid); - if (security_secid_to_secctx(&blob, &lsmcxt)) { + if (security_secid_to_secctx(&blob, &lsmcxt, + LSMBLOB_FIRST)) { audit_log_format(ab, " osid=%u", osid); *call_panic = 1; } else { @@ -1430,7 +1438,7 @@ static void audit_log_name(struct audit_context *context, struct audit_names *n, struct lsmcontext lsmctx; lsmblob_init(&blob, n->osid); - if (security_secid_to_secctx(&blob, &lsmctx)) { + if (security_secid_to_secctx(&blob, &lsmctx, LSMBLOB_FIRST)) { audit_log_format(ab, " osid=%u", n->osid); if (call_panic) *call_panic = 2; @@ -1504,6 +1512,47 @@ static void audit_log_proctitle(void) audit_log_end(ab); } +void audit_log_lsm_common(struct audit_context *context) +{ + struct audit_buffer *ab; + struct lsmcontext lsmdata; + bool sep = false; + int error; + int i; + + if (!lsm_multiple_contexts() || context == NULL || + !lsmblob_is_set(&context->lsm)) + return; + + ab = audit_log_start(context, GFP_ATOMIC, AUDIT_MAC_TASK_CONTEXTS); + if (!ab) + return; /* audit_panic or being filtered */ + + for (i = 0; i < LSMBLOB_ENTRIES; i++) { + if (context->lsm.secid[i] == 0) + continue; + error = security_secid_to_secctx(&context->lsm, &lsmdata, i); + if (error && error != -EINVAL) { + audit_panic("error in audit_log_lsm"); + return; + } + + audit_log_format(ab, "%ssubj_%s=%s", sep ? " " : "", + lsm_slot_to_name(i), lsmdata.context); + sep = true; + + security_release_secctx(&lsmdata); + } + audit_log_end(ab); + context->lsmdone = true; +} + +void audit_log_lsm(struct audit_context *context) +{ + if (!context->lsmdone) + audit_log_lsm_common(context); +} + static void audit_log_exit(void) { int i, call_panic = 0; @@ -1538,6 +1587,8 @@ static void audit_log_exit(void) audit_log_key(ab, context->filterkey); audit_log_end(ab); + audit_log_lsm(context); + for (aux = context->aux; aux; aux = aux->next) { ab = audit_log_start(context, GFP_KERNEL, aux->type); @@ -1628,6 +1679,8 @@ static void audit_log_exit(void) audit_log_proctitle(); + audit_log_lsm(context); + /* Send end of event record to help user space know we are finished */ ab = audit_log_start(context, GFP_KERNEL, AUDIT_EOE); if (ab) @@ -2619,10 +2672,12 @@ void __audit_ntp_log(const struct audit_ntp_data *ad) void __audit_log_nfcfg(const char *name, u8 af, unsigned int nentries, enum audit_nfcfgop op, gfp_t gfp) { + struct audit_context *context; struct audit_buffer *ab; char comm[sizeof(current->comm)]; - ab = audit_log_start(audit_context(), gfp, AUDIT_NETFILTER_CFG); + context = audit_alloc_for_lsm(GFP_KERNEL); + ab = audit_log_start(context, gfp, AUDIT_NETFILTER_CFG); if (!ab) return; audit_log_format(ab, "table=%s family=%u entries=%u op=%s", @@ -2632,7 +2687,7 @@ void __audit_log_nfcfg(const char *name, u8 af, unsigned int nentries, audit_log_task_context(ab); /* subj= */ audit_log_format(ab, " comm="); audit_log_untrustedstring(ab, get_task_comm(comm, current)); - audit_log_end(ab); + audit_log_end_local(ab, context); } EXPORT_SYMBOL_GPL(__audit_log_nfcfg); @@ -2667,6 +2722,7 @@ static void audit_log_task(struct audit_buffer *ab) */ void audit_core_dumps(long signr) { + struct audit_context *context; struct audit_buffer *ab; if (!audit_enabled) @@ -2675,12 +2731,13 @@ void audit_core_dumps(long signr) if (signr == SIGQUIT) /* don't care for those */ return; - ab = audit_log_start(audit_context(), GFP_KERNEL, AUDIT_ANOM_ABEND); + context = audit_alloc_for_lsm(GFP_KERNEL); + ab = audit_log_start(context, GFP_KERNEL, AUDIT_ANOM_ABEND); if (unlikely(!ab)) return; audit_log_task(ab); audit_log_format(ab, " sig=%ld res=1", signr); - audit_log_end(ab); + audit_log_end_local(ab, context); } /** diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index ae073b642fa7..5c0029a3a595 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c @@ -140,7 +140,7 @@ static void ip_cmsg_recv_security(struct msghdr *msg, struct sk_buff *skb) return; lsmblob_init(&lb, secid); - err = security_secid_to_secctx(&lb, &context); + err = security_secid_to_secctx(&lb, &context, LSMBLOB_DISPLAY); if (err) return; diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 215d3f9e9715..60539221e023 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -344,7 +344,7 @@ static int ctnetlink_dump_secctx(struct sk_buff *skb, const struct nf_conn *ct) * security_secid_to_secctx() will know which security module * to use to create the secctx. */ lsmblob_init(&blob, ct->secmark); - ret = security_secid_to_secctx(&blob, &context); + ret = security_secid_to_secctx(&blob, &context, LSMBLOB_DISPLAY); if (ret) return 0; @@ -655,7 +655,7 @@ static inline int ctnetlink_secctx_size(const struct nf_conn *ct) struct lsmblob blob; struct lsmcontext context; - ret = security_secid_to_secctx(&blob, &context); + ret = security_secid_to_secctx(&blob, &context, LSMBLOB_DISPLAY); if (ret) return 0; diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index df6043d1bc22..861106a5f605 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c @@ -177,7 +177,7 @@ static void ct_show_secctx(struct seq_file *s, const struct nf_conn *ct) struct lsmcontext context; lsmblob_init(&blob, ct->secmark); - ret = security_secid_to_secctx(&blob, &context); + ret = security_secid_to_secctx(&blob, &context, LSMBLOB_DISPLAY); if (ret) return; diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c index bf8db099090b..90ecf03b35ba 100644 --- a/net/netfilter/nfnetlink_queue.c +++ b/net/netfilter/nfnetlink_queue.c @@ -316,7 +316,7 @@ static void nfqnl_get_sk_secctx(struct sk_buff *skb, struct lsmcontext *context) * blob. security_secid_to_secctx() will know which security * module to use to create the secctx. */ lsmblob_init(&blob, skb->secmark); - security_secid_to_secctx(&blob, context); + security_secid_to_secctx(&blob, context, LSMBLOB_DISPLAY); } read_unlock_bh(&skb->sk->sk_callback_lock); diff --git a/net/netlabel/netlabel_domainhash.c b/net/netlabel/netlabel_domainhash.c index dc8c39f51f7d..2690a528d262 100644 --- a/net/netlabel/netlabel_domainhash.c +++ b/net/netlabel/netlabel_domainhash.c @@ -259,7 +259,7 @@ static void netlbl_domhsh_audit_add(struct netlbl_dom_map *entry, break; } audit_log_format(audit_buf, " res=%u", result == 0 ? 1 : 0); - audit_log_end(audit_buf); + audit_log_end_local(audit_buf, audit_info->localcontext); } } @@ -614,7 +614,7 @@ int netlbl_domhsh_remove_entry(struct netlbl_dom_map *entry, audit_log_format(audit_buf, " nlbl_domain=%s res=1", entry->domain ? entry->domain : "(default)"); - audit_log_end(audit_buf); + audit_log_end_local(audit_buf, audit_info->localcontext); } switch (entry->def.type) { diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index 0ce9bee43dd3..380eeffd8e00 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c @@ -437,13 +437,14 @@ int netlbl_unlhsh_add(struct net *net, unlhsh_add_return: rcu_read_unlock(); if (audit_buf != NULL) { - if (security_secid_to_secctx(lsmblob, &context) == 0) { + if (security_secid_to_secctx(lsmblob, &context, + LSMBLOB_FIRST) == 0) { audit_log_format(audit_buf, " sec_obj=%s", context.context); security_release_secctx(&context); } audit_log_format(audit_buf, " res=%u", ret_val == 0 ? 1 : 0); - audit_log_end(audit_buf); + audit_log_end_local(audit_buf, audit_info->localcontext); } return ret_val; } @@ -492,13 +493,14 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, if (dev != NULL) dev_put(dev); if (entry != NULL && - security_secid_to_secctx(&entry->lsmblob, &context) == 0) { + security_secid_to_secctx(&entry->lsmblob, &context, + LSMBLOB_FIRST) == 0) { audit_log_format(audit_buf, " sec_obj=%s", context.context); security_release_secctx(&context); } audit_log_format(audit_buf, " res=%u", entry != NULL ? 1 : 0); - audit_log_end(audit_buf); + audit_log_end_local(audit_buf, audit_info->localcontext); } if (entry == NULL) @@ -552,13 +554,14 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, if (dev != NULL) dev_put(dev); if (entry != NULL && - security_secid_to_secctx(&entry->lsmblob, &context) == 0) { + security_secid_to_secctx(&entry->lsmblob, &context, + LSMBLOB_FIRST) == 0) { audit_log_format(audit_buf, " sec_obj=%s", context.context); security_release_secctx(&context); } audit_log_format(audit_buf, " res=%u", entry != NULL ? 1 : 0); - audit_log_end(audit_buf); + audit_log_end_local(audit_buf, audit_info->localcontext); } if (entry == NULL) @@ -741,7 +744,7 @@ static void netlbl_unlabel_acceptflg_set(u8 value, if (audit_buf != NULL) { audit_log_format(audit_buf, " unlbl_accept=%u old=%u", value, old_val); - audit_log_end(audit_buf); + audit_log_end_local(audit_buf, audit_info->localcontext); } } @@ -1122,7 +1125,7 @@ static int netlbl_unlabel_staticlist_gen(u32 cmd, lsmb = (struct lsmblob *)&addr6->lsmblob; } - ret_val = security_secid_to_secctx(lsmb, &context); + ret_val = security_secid_to_secctx(lsmb, &context, LSMBLOB_FIRST); if (ret_val != 0) goto list_cb_failure; ret_val = nla_put(cb_arg->skb, @@ -1528,14 +1531,11 @@ int __init netlbl_unlabel_defconf(void) int ret_val; struct netlbl_dom_map *entry; struct netlbl_audit audit_info; - struct lsmblob blob; /* Only the kernel is allowed to call this function and the only time * it is called is at bootup before the audit subsystem is reporting * messages so don't worry to much about these values. */ - security_task_getsecid_subj(current, &blob); - /* scaffolding until audit_info.secid is converted */ - audit_info.secid = blob.secid[0]; + security_task_getsecid_subj(current, &audit_info.lsmdata); audit_info.loginuid = GLOBAL_ROOT_UID; audit_info.sessionid = 0; diff --git a/net/netlabel/netlabel_user.c b/net/netlabel/netlabel_user.c index 951ba0639d20..90a18b245380 100644 --- a/net/netlabel/netlabel_user.c +++ b/net/netlabel/netlabel_user.c @@ -83,14 +83,17 @@ int __init netlbl_netlink_init(void) struct audit_buffer *netlbl_audit_start_common(int type, struct netlbl_audit *audit_info) { + struct audit_context *audit_ctx; struct audit_buffer *audit_buf; struct lsmcontext context; - struct lsmblob blob; if (audit_enabled == AUDIT_OFF) return NULL; - audit_buf = audit_log_start(audit_context(), GFP_ATOMIC, type); + audit_ctx = audit_alloc_for_lsm(GFP_ATOMIC); + audit_info->localcontext = audit_ctx; + + audit_buf = audit_log_start(audit_ctx, GFP_ATOMIC, type); if (audit_buf == NULL) return NULL; @@ -98,11 +101,14 @@ struct audit_buffer *netlbl_audit_start_common(int type, from_kuid(&init_user_ns, audit_info->loginuid), audit_info->sessionid); - lsmblob_init(&blob, audit_info->secid); - if (audit_info->secid != 0 && - security_secid_to_secctx(&blob, &context) == 0) { - audit_log_format(audit_buf, " subj=%s", context.context); - security_release_secctx(&context); + if (lsmblob_is_set(&audit_info->lsmdata)) { + if (!lsm_multiple_contexts() && + security_secid_to_secctx(&audit_info->lsmdata, &context, + LSMBLOB_FIRST) == 0) { + audit_log_format(audit_buf, " subj=%s", + context.context); + security_release_secctx(&context); + } } return audit_buf; diff --git a/net/netlabel/netlabel_user.h b/net/netlabel/netlabel_user.h index 11f6da93f31b..bc1f0cd824d5 100644 --- a/net/netlabel/netlabel_user.h +++ b/net/netlabel/netlabel_user.h @@ -34,11 +34,7 @@ static inline void netlbl_netlink_auditinfo(struct sk_buff *skb, struct netlbl_audit *audit_info) { - struct lsmblob blob; - - security_task_getsecid_subj(current, &blob); - /* scaffolding until secid is converted */ - audit_info->secid = blob.secid[0]; + security_task_getsecid_subj(current, &audit_info->lsmdata); audit_info->loginuid = audit_get_loginuid(current); audit_info->sessionid = audit_get_sessionid(current); } diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index ce500f847b99..a4d554214d4b 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -4173,30 +4173,32 @@ static void xfrm_audit_common_policyinfo(struct xfrm_policy *xp, void xfrm_audit_policy_add(struct xfrm_policy *xp, int result, bool task_valid) { + struct audit_context *context; struct audit_buffer *audit_buf; - audit_buf = xfrm_audit_start("SPD-add"); + audit_buf = xfrm_audit_start("SPD-add", &context); if (audit_buf == NULL) return; xfrm_audit_helper_usrinfo(task_valid, audit_buf); audit_log_format(audit_buf, " res=%u", result); xfrm_audit_common_policyinfo(xp, audit_buf); - audit_log_end(audit_buf); + audit_log_end_local(audit_buf, context); } EXPORT_SYMBOL_GPL(xfrm_audit_policy_add); void xfrm_audit_policy_delete(struct xfrm_policy *xp, int result, bool task_valid) { + struct audit_context *context; struct audit_buffer *audit_buf; - audit_buf = xfrm_audit_start("SPD-delete"); + audit_buf = xfrm_audit_start("SPD-delete", &context); if (audit_buf == NULL) return; xfrm_audit_helper_usrinfo(task_valid, audit_buf); audit_log_format(audit_buf, " res=%u", result); xfrm_audit_common_policyinfo(xp, audit_buf); - audit_log_end(audit_buf); + audit_log_end_local(audit_buf, context); } EXPORT_SYMBOL_GPL(xfrm_audit_policy_delete); #endif diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 4496f7efa220..a1fd0e122be8 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -2747,29 +2747,31 @@ static void xfrm_audit_helper_pktinfo(struct sk_buff *skb, u16 family, void xfrm_audit_state_add(struct xfrm_state *x, int result, bool task_valid) { + struct audit_context *context; struct audit_buffer *audit_buf; - audit_buf = xfrm_audit_start("SAD-add"); + audit_buf = xfrm_audit_start("SAD-add", &context); if (audit_buf == NULL) return; xfrm_audit_helper_usrinfo(task_valid, audit_buf); xfrm_audit_helper_sainfo(x, audit_buf); audit_log_format(audit_buf, " res=%u", result); - audit_log_end(audit_buf); + audit_log_end_local(audit_buf, context); } EXPORT_SYMBOL_GPL(xfrm_audit_state_add); void xfrm_audit_state_delete(struct xfrm_state *x, int result, bool task_valid) { + struct audit_context *context; struct audit_buffer *audit_buf; - audit_buf = xfrm_audit_start("SAD-delete"); + audit_buf = xfrm_audit_start("SAD-delete", &context); if (audit_buf == NULL) return; xfrm_audit_helper_usrinfo(task_valid, audit_buf); xfrm_audit_helper_sainfo(x, audit_buf); audit_log_format(audit_buf, " res=%u", result); - audit_log_end(audit_buf); + audit_log_end_local(audit_buf, context); } EXPORT_SYMBOL_GPL(xfrm_audit_state_delete); @@ -2779,7 +2781,7 @@ void xfrm_audit_state_replay_overflow(struct xfrm_state *x, struct audit_buffer *audit_buf; u32 spi; - audit_buf = xfrm_audit_start("SA-replay-overflow"); + audit_buf = xfrm_audit_start("SA-replay-overflow", NULL); if (audit_buf == NULL) return; xfrm_audit_helper_pktinfo(skb, x->props.family, audit_buf); @@ -2797,7 +2799,7 @@ void xfrm_audit_state_replay(struct xfrm_state *x, struct audit_buffer *audit_buf; u32 spi; - audit_buf = xfrm_audit_start("SA-replayed-pkt"); + audit_buf = xfrm_audit_start("SA-replayed-pkt", NULL); if (audit_buf == NULL) return; xfrm_audit_helper_pktinfo(skb, x->props.family, audit_buf); @@ -2812,7 +2814,7 @@ void xfrm_audit_state_notfound_simple(struct sk_buff *skb, u16 family) { struct audit_buffer *audit_buf; - audit_buf = xfrm_audit_start("SA-notfound"); + audit_buf = xfrm_audit_start("SA-notfound", NULL); if (audit_buf == NULL) return; xfrm_audit_helper_pktinfo(skb, family, audit_buf); @@ -2826,7 +2828,7 @@ void xfrm_audit_state_notfound(struct sk_buff *skb, u16 family, struct audit_buffer *audit_buf; u32 spi; - audit_buf = xfrm_audit_start("SA-notfound"); + audit_buf = xfrm_audit_start("SA-notfound", NULL); if (audit_buf == NULL) return; xfrm_audit_helper_pktinfo(skb, family, audit_buf); @@ -2844,7 +2846,7 @@ void xfrm_audit_state_icvfail(struct xfrm_state *x, __be32 net_spi; __be32 net_seq; - audit_buf = xfrm_audit_start("SA-icv-failure"); + audit_buf = xfrm_audit_start("SA-icv-failure", NULL); if (audit_buf == NULL) return; xfrm_audit_helper_pktinfo(skb, x->props.family, audit_buf); diff --git a/security/integrity/ima/ima_api.c b/security/integrity/ima/ima_api.c index 691f68d478f1..8e7c660b9b01 100644 --- a/security/integrity/ima/ima_api.c +++ b/security/integrity/ima/ima_api.c @@ -342,6 +342,7 @@ void ima_store_measurement(struct integrity_iint_cache *iint, void ima_audit_measurement(struct integrity_iint_cache *iint, const unsigned char *filename) { + struct audit_context *context; struct audit_buffer *ab; char *hash; const char *algo_name = hash_algo_name[iint->ima_hash->algo]; @@ -358,8 +359,8 @@ void ima_audit_measurement(struct integrity_iint_cache *iint, hex_byte_pack(hash + (i * 2), iint->ima_hash->digest[i]); hash[i * 2] = '\0'; - ab = audit_log_start(audit_context(), GFP_KERNEL, - AUDIT_INTEGRITY_RULE); + context = audit_alloc_for_lsm(GFP_KERNEL); + ab = audit_log_start(context, GFP_KERNEL, AUDIT_INTEGRITY_RULE); if (!ab) goto out; @@ -368,7 +369,7 @@ void ima_audit_measurement(struct integrity_iint_cache *iint, audit_log_format(ab, " hash=\"%s:%s\"", algo_name, hash); audit_log_task_info(ab); - audit_log_end(ab); + audit_log_end_local(ab, context); iint->flags |= IMA_AUDITED; out: diff --git a/security/integrity/integrity_audit.c b/security/integrity/integrity_audit.c index 29220056207f..b38163c43659 100644 --- a/security/integrity/integrity_audit.c +++ b/security/integrity/integrity_audit.c @@ -38,13 +38,15 @@ void integrity_audit_message(int audit_msgno, struct inode *inode, const char *cause, int result, int audit_info, int errno) { + struct audit_context *context; struct audit_buffer *ab; char name[TASK_COMM_LEN]; if (!integrity_audit_info && audit_info == 1) /* Skip info messages */ return; - ab = audit_log_start(audit_context(), GFP_KERNEL, audit_msgno); + context = audit_alloc_for_lsm(GFP_KERNEL); + ab = audit_log_start(context, GFP_KERNEL, audit_msgno); audit_log_format(ab, "pid=%d uid=%u auid=%u ses=%u", task_pid_nr(current), from_kuid(&init_user_ns, current_uid()), @@ -63,5 +65,5 @@ void integrity_audit_message(int audit_msgno, struct inode *inode, audit_log_format(ab, " ino=%lu", inode->i_ino); } audit_log_format(ab, " res=%d errno=%d", !result, errno); - audit_log_end(ab); + audit_log_end_local(ab, context); } diff --git a/security/security.c b/security/security.c index d1e9a54e22b4..bb4c7f6c62ec 100644 --- a/security/security.c +++ b/security/security.c @@ -2307,7 +2307,7 @@ int security_setprocattr(const char *lsm, const char *name, void *value, hlist_for_each_entry(hp, &security_hook_heads.setprocattr, list) { rc = hp->hook.setprocattr(name, value, size); - if (rc < 0) + if (rc < 0 && rc != -EINVAL) return rc; } @@ -2352,13 +2352,31 @@ int security_ismaclabel(const char *name) } EXPORT_SYMBOL(security_ismaclabel); -int security_secid_to_secctx(struct lsmblob *blob, struct lsmcontext *cp) +int security_secid_to_secctx(struct lsmblob *blob, struct lsmcontext *cp, + int ilsm) { struct security_hook_list *hp; - int ilsm = lsm_task_ilsm(current); memset(cp, 0, sizeof(*cp)); + /* + * ilsm either is the slot number use for formatting + * or an instruction on which relative slot to use. + */ + if (ilsm == LSMBLOB_DISPLAY) + ilsm = lsm_task_ilsm(current); + else if (ilsm == LSMBLOB_FIRST) + ilsm = LSMBLOB_INVALID; + else if (ilsm < 0) { + WARN_ONCE(true, + "LSM: %s unknown interface LSM\n", __func__); + ilsm = LSMBLOB_INVALID; + } else if (ilsm >= lsm_slot) { + WARN_ONCE(true, + "LSM: %s invalid interface LSM\n", __func__); + ilsm = LSMBLOB_INVALID; + } + hlist_for_each_entry(hp, &security_hook_heads.secid_to_secctx, list) { if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) continue; @@ -2388,7 +2406,7 @@ int security_secctx_to_secid(const char *secdata, u32 seclen, return hp->hook.secctx_to_secid(secdata, seclen, &blob->secid[hp->lsmid->slot]); } - return 0; + return -EOPNOTSUPP; } EXPORT_SYMBOL(security_secctx_to_secid); @@ -2882,23 +2900,17 @@ int security_key_getsecurity(struct key *key, char **_buffer) int security_audit_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule) { struct security_hook_list *hp; - bool one_is_good = false; - int rc = 0; - int trc; + int ilsm = lsm_task_ilsm(current); hlist_for_each_entry(hp, &security_hook_heads.audit_rule_init, list) { if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) continue; - trc = hp->hook.audit_rule_init(field, op, rulestr, - &lsmrule[hp->lsmid->slot]); - if (trc == 0) - one_is_good = true; - else - rc = trc; + if (ilsm != LSMBLOB_INVALID && ilsm != hp->lsmid->slot) + continue; + return hp->hook.audit_rule_init(field, op, rulestr, + &lsmrule[hp->lsmid->slot]); } - if (one_is_good) - return 0; - return rc; + return 0; } int security_audit_rule_known(struct audit_krule *krule) @@ -2930,6 +2942,8 @@ int security_audit_rule_match(struct lsmblob *blob, u32 field, u32 op, continue; if (lsmrule[hp->lsmid->slot] == NULL) continue; + if (lsmrule[hp->lsmid->slot] == NULL) + continue; rc = hp->hook.audit_rule_match(blob->secid[hp->lsmid->slot], field, op, &lsmrule[hp->lsmid->slot]); diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c index e592e10397af..d56e55c04aa4 100644 --- a/security/smack/smackfs.c +++ b/security/smack/smackfs.c @@ -185,7 +185,8 @@ static void smk_netlabel_audit_set(struct netlbl_audit *nap) nap->loginuid = audit_get_loginuid(current); nap->sessionid = audit_get_sessionid(current); - nap->secid = skp->smk_secid; + lsmblob_init(&nap->lsmdata, 0); + nap->lsmdata.secid[smack_lsmid.slot] = skp->smk_secid; } /* From patchwork Thu May 13 20:08:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256591 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9BF13C433ED for ; Thu, 13 May 2021 20:33:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6C23661287 for ; Thu, 13 May 2021 20:33:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232985AbhEMUew (ORCPT ); Thu, 13 May 2021 16:34:52 -0400 Received: from sonic317-38.consmr.mail.ne1.yahoo.com ([66.163.184.49]:36965 "EHLO sonic317-38.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232975AbhEMUew (ORCPT ); Thu, 13 May 2021 16:34:52 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620938021; bh=7AWaAxB0PKweU7mi6NHi1EuujLQHl/tfii/ELfp3KOg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=PT3CXxrTA2C0RZygmJrktik1Pki5Gbb+ektgKTvZvwv5ISzLnagFT0wuPgtUasvbHY4N8yQyWEo+NWz+l1OVvnmX8iakLoM8Tqeyw/pYHSJq/jZY75I0ai77uDa9budRQtTFhCpvFtgcqHJRFtfdv6poHLgpgEuXsJ62yJvul6WFUuYYHbDKroUA6C4Zozp9ah/suWVlxXGUQ3xd+LEgNP43Wy0SkYGQR8FyrlKtxTMmLoN0eOWu1iX3DjDV/P4yBCp1tSYmZqvV59yiwfbSKMeP91VGJCtYnA4AwoNyKXa0NheqwMkpAbboxpqs10IS+SFc3VjnDSQYWFLX0M2pbw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620938021; bh=fiCQaKYiWZAWC2nUv5KZOn4t/qLgHtEwW0z50qYqFC6=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=HSSPcglWxBQXfBTp8ikmKxKwBALseYEYJb82WgBsfV8j1D/Pl9z54u/2K7GmaBQSPd9oBzeXsscIUtINtqIEFnovf6wUEN2+XW/JWGBQ3Fso7CTWZI3wCV6GK8HIOUm9EhMSQUVEiuWbSeG50VW9xQt4NTaH3gFC0nsbzOoqaX+GZsyYfJ4lUiBzyZ11RHI5/szX6YhKJ6GaP7IE26Zhsz45dcKDOQRoUJtKQN3OMXBlnS6hyPuPFbZQ+3iS9kZN4uk7MxVjnCfJ59bx7IyTzX87vNP81N3da6cIofIIw0hJhNlKWw5yEzXvxHgAMjinTG8HQLw6p4+A/jIa/CALLA== X-YMail-OSG: UAp4DLgVM1lbWvApswB2oghFN6xC4RElwTXWKCnTdHsVwqe38eG9tmeR1DmVR6G wywhnX4FdSZCIuFPhySSk4Q5YDFNgVQuF668BRBHQKxHjyGF.hcyKbxbx4vu2AOStdOAqK5Bcufx Nuwo0HjFIvjlWrPax1O9_7jv.1GfWQa9njingSNCPcUuaZmKsxIb1zG5.k5yWAX0hu4ptx6O8KPR JZyORmqwloThfk3i_h.bvi_QPyxFInr0JDpflrHstoUEGj2_KpRdpiKXO7x1NOeoxiN87usfe_yM ykDjMIXPot3lHvcowUzEA4vV5LJRnbZEs.dXb9Hsm9clYQDBKh_j7vDbf.fzERdZqz59jNgDCq3J wjUllEAw3TZSEk.ItfaXu1jWtAp50vhFBKhktcYjov46cNBS8fYUZ2j3qyS.ktdrfZCATPvS8ooq XVijYBeQtUJHrxhQaN98dgWZXCpYp25jjrhbI30glfRM8Fk5sx3aucZ0ZnjeW2pCmiYHClPL.CY4 kePoztzBbju8Z0IK0YlW0sarMO.IgcuJKNGPkZGdqlLcjUkPHTuQ.2kvMEmhtgR_VCMQ4cJMYTf. SgSX.xY05bxxbUMR0nXIekEhH1rnxCwJOurOK_s_SihWPoiR09syBj0K1BP.w4SB7qQCTwS1QKC7 cDibeUVBgtLjUlYaR9g6Rw_tEWoBRnm6jOGMCFrNfotQ5kuvURKirOffJir4.8gqnS.ByxnGKZCi vxLERufrah6zyGPH8xY4f.UAZ_Mk9fek6837Jr.Hm.gKKTIm8zqZz_7LqlGBZwndy2bla07FQm8b egyKzhU4GWy0ihQcJn8xo7.FiCvxWVLvroaVQ0kiC4WJPVZI.Q2E5iWhCQhfYsWunGMdv1PG3kTP _W9LIbb42u_DbNlD_13zoXR.uRfqyWGha62FnqWenkJhq3ZY89Kdct1H3ir0oXFPycllk3Uh8h.Z gYyy9SZTEkZOLRuFk7AfvM7riuIr1tPQ.AywwwRr1AHUK219Ed9gwQCyLprBUHTwuIt6xBvmpFD0 f9O42M6bP4t7jLypSuZH9dj3GaaOcqwg.c4N0ULnNOGPK0Llzq9IAIpbGFpSUKzAM2xXTO2yWozc BDMDi7X8O5ch2BkbTYDcRvyRKME5Kt_qLlL2uEDaEyGpR7jKD7KYV9Xv_wF5HNkZ0R4OtXgv6YTx DG60g9At27rello0Hkjy2E2qvKfRtZQYpV1jKSz5KvshT3losIgK1ozC.rYq3AH7NJELXh2OiCb8 1itWCShd71oEXvAroiKbCeD1I212ZvMnRCQOC7NjgVTMEk5HSyB.gWnKbcm6hQ8OHuiRv7f5jBwr zT1C3LH4SyF4WJwGlMefufc6XfvYYQ0hjHM9p3A5vrMJmUzQym8f2N7MrW3tE3g.EbenDIPTldEa BoTuqd4ntEup.58yuypnAXMxQEbrBGa0A7JzPRWkCCwJS2zKQzaIfn0fUBtK.CcuOhGSZOIa2luT GkiYakUYLLwPxzSc3dfBw2GESZwC0VIQ8N8fqBDp5lG2tDBhiPyZFBW8qXgJdMPj.C3.oemYiFU1 UdIgIkQVR1XF7iUoJ9bqihfzYFjFpm5PktYHdSLQmsNHUdMDqwRsiwH8S7pQpvElauHC34guU3OL 0T1nG.cyuhPyEZx23M6yp6gByHFM92m2Zeu1iwDAyzGNwPJzVby0v_QVkEQqGXC4x2qw2SO7vXIg D7dgmXQgXqbNy.S3DdaSiU.QQ3Dpi_BG6I7rUvGYn43W9kKKKlKwQT9n7PdH3QiKqLPlKzrzccml YVwaFO.4iIMDWRMMw3JeqdnaOM8w2Ex_GervnHuj22dt7mmfmATkZP4OS_iJRVwGniSqmSwPu7AQ ZceahTGmJukAzkhn9lghQAtM2Aj4MvrDH0tb1fOGkJFPjb6IizmFRGU4o9fTCATBM0nPApg9SnE8 XaPtWqdNI7D90Uhd8ymg4SlQ6W6ZyqFjqPfpJF5Q07Stt8.4sP80_tmSS.Cybk89g.CLgVGKA3TG 60eGjGbAOpQRZI85wyg0PYSZjty0Nwaz8JbOcu9HxKj_0NeuJjKxN9YuxCiMtHAaGgbk6pHnOfWI pF5AdmUlglfl.Tr_ON4rpdCM3RPVR8HZXvU_.s7THTtZdGvRJe2aEAC1b0I5ezOLKmTBdMmG72Ap MoTxu3rsrhw9PmM0A1U0TDds42ZuPoYKZyxt5IZTJqVTO9bWE9OGscUH1BwIk.eYRnEk3XlI96KU PBgOBaOYax92CltW6ufv5Kr1a0wFPoVnDrH0wtgBB5zUqVi1iNoB47MokYfsKIIdJy92xMvJA.dJ slPlLtwZST33TyaGCZ0vI9euowpuut63igKzqla.tMbKBE1k9B61DJaqm81chWhookseSm7orw6L IUIQbFmq10bEeeagElmZX25djp8spEw6BfCdsMYJ3brfqGwaYpyWlrK4_LI8ypEfBb2vXH1J82dG XeLjrb2IJowDQD1YI7lLG2RN4lRWC7YsksRSBzGGkN3nH0nWnvonP58Oyl8Yys5.mxMeRv16zmrI no7EBvW2uCWOMcU3eTEX62T4YHqQtncWUMwHvqP4Qm_USD71iZqWME7Kc_6gFOwbDCmlfRfKPVX0 Pfjl0nBuiUg5n7suubY0CSykOBbWMIwduqNJtZkBBflaEfO.xhB7DOPp2SdeVucbwhUhKGKxaPg_ jB8RTf4SAGjnZKm4YkZCq5un5YQ_w8TtbfnCMMNeGiUpuwJmA7SpNyXloxUJ4Qo07iIm0Qki.nK0 3i0a4WPilpE4p7qBGLEItjIFk3FDZe.5QbG2mxU7Y3gFvRyS9Tc11MRRVncDB57TjLA_8XrHA0fN 2d_DsWVLtNGBhgZxyUZ4gpnJ1dwdfxWgL9wJ5zcn.ZHI2ObUXMMzk8DeHgzAPovxwYetkJNvuj8c 1b8PUGVDbKVnUjMUnKTZ54yTvr0fe4Z8JJwnR6edq1LqaaFrt0Em1vHG2bF5sx6xF1vlVsNUROtl SRt6ZLAClQLxfxx3r1gtwxDIQbWrr9z_Cn2TTolDwruR7sNA1.K0CLHOLlnozDC8UlOvQVdIRIWs 1QTEGC5Qq.bWouRIbKhLwlo334qnflzCRn63LSLUgEy0QqYPuivaOUVUbQG0B3jlrBT8uyJP3sRi R X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic317.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:33:41 +0000 Received: by kubenode570.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 5fc27fed877248912438810f41a118f6; Thu, 13 May 2021 20:33:39 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org Subject: [PATCH v26 23/25] Audit: Add a new record for multiple object LSM attributes Date: Thu, 13 May 2021 13:08:05 -0700 Message-Id: <20210513200807.15910-24-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Create a new audit record type to contain the object information when there are multiple security modules that may require such data. This record is linked with the same timestamp and serial number. An example of the MAC_OBJ_CONTEXTS (1421) record is: type=UNKNOWN[1421] msg=audit(1601152467.009:1050): obj_selinux=unconfined_u:object_r:user_home_t:s0 Not all security modules that can provide object information do so in all cases. It is possible that a security module won't apply an object attribute in all cases. Signed-off-by: Casey Schaufler Cc: linux-audit@redhat.com To: Paul Moore --- include/linux/audit.h | 7 ++++ include/uapi/linux/audit.h | 1 + kernel/audit.c | 53 +++++++++++++++++++++++++++ kernel/audit.h | 4 +-- kernel/auditsc.c | 73 +++++++------------------------------- 5 files changed, 75 insertions(+), 63 deletions(-) diff --git a/include/linux/audit.h b/include/linux/audit.h index 229cd71fbf09..b92ad58bc97d 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h @@ -189,6 +189,8 @@ extern void audit_log_path_denied(int type, extern void audit_log_lost(const char *message); extern int audit_log_task_context(struct audit_buffer *ab); +extern int audit_log_object_context(struct audit_buffer *ab, + struct lsmblob *blob); extern void audit_log_task_info(struct audit_buffer *ab); extern void audit_log_lsm(struct audit_context *context); @@ -256,6 +258,11 @@ static inline int audit_log_task_context(struct audit_buffer *ab) { return 0; } +static inline int audit_log_object_context(struct audit_buffer *ab, + struct lsmblob *blob) +{ + return 0; +} static inline void audit_log_task_info(struct audit_buffer *ab) { } static void audit_log_lsm(struct audit_context *context) diff --git a/include/uapi/linux/audit.h b/include/uapi/linux/audit.h index 2a63720e56f6..dbb1dce16962 100644 --- a/include/uapi/linux/audit.h +++ b/include/uapi/linux/audit.h @@ -140,6 +140,7 @@ #define AUDIT_MAC_CALIPSO_ADD 1418 /* NetLabel: add CALIPSO DOI entry */ #define AUDIT_MAC_CALIPSO_DEL 1419 /* NetLabel: del CALIPSO DOI entry */ #define AUDIT_MAC_TASK_CONTEXTS 1420 /* Multiple LSM contexts */ +#define AUDIT_MAC_OBJ_CONTEXTS 1421 /* Multiple LSM object contexts */ #define AUDIT_FIRST_KERN_ANOM_MSG 1700 #define AUDIT_LAST_KERN_ANOM_MSG 1799 diff --git a/kernel/audit.c b/kernel/audit.c index 60c027d7759c..5bef8227c526 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -2171,6 +2171,59 @@ int audit_log_task_context(struct audit_buffer *ab) } EXPORT_SYMBOL(audit_log_task_context); +int audit_log_object_context(struct audit_buffer *ab, + struct lsmblob *blob) +{ + int i; + int error; + bool sep = false; + struct lsmcontext lsmdata; + struct audit_buffer *lsmab = NULL; + struct audit_context *context = NULL; + + /* + * If there is more than one security module that has a + * object "context" it's necessary to put the object data + * into a separate record to maintain compatibility. + */ + if (lsm_multiple_contexts()) { + audit_log_format(ab, " obj=?"); + context = ab->ctx; + if (context) + lsmab = audit_log_start(context, GFP_KERNEL, + AUDIT_MAC_OBJ_CONTEXTS); + } + + for (i = 0; i < LSMBLOB_ENTRIES; i++) { + if (blob->secid[i] == 0) + continue; + error = security_secid_to_secctx(blob, &lsmdata, i); + if (error && error != -EINVAL) { + audit_panic("error in audit_log_object_context"); + return error; + } + + if (context) { + audit_log_format(lsmab, "%sobj_%s=%s", + sep ? " " : "", + lsm_slot_to_name(i), + lsmdata.context); + sep = true; + } else + audit_log_format(ab, " obj=%s", lsmdata.context); + + security_release_secctx(&lsmdata); + if (!context) + break; + } + + if (context) + audit_log_end(lsmab); + + return 0; +} +EXPORT_SYMBOL(audit_log_object_context); + void audit_log_d_path_exe(struct audit_buffer *ab, struct mm_struct *mm) { diff --git a/kernel/audit.h b/kernel/audit.h index 5ad0c6819aa8..952c7a1f2f3c 100644 --- a/kernel/audit.h +++ b/kernel/audit.h @@ -78,7 +78,7 @@ struct audit_names { kuid_t uid; kgid_t gid; dev_t rdev; - u32 osid; + struct lsmblob oblob; struct audit_cap_data fcap; unsigned int fcap_ver; unsigned char type; /* record type */ @@ -155,7 +155,7 @@ struct audit_context { kuid_t uid; kgid_t gid; umode_t mode; - u32 osid; + struct lsmblob oblob; int has_perm; uid_t perm_uid; gid_t perm_gid; diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 55509faf5341..71d5da2f0ee3 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -685,14 +685,6 @@ static int audit_filter_rules(struct task_struct *tsk, if (f->lsm_isset) { /* Find files that match */ if (name) { - /* - * lsmblob_init sets all values in the - * lsmblob to sid. This is temporary - * until name->osid is converted to a - * lsmblob, which happens later in - * this patch set. - */ - lsmblob_init(&blob, name->osid); result = security_audit_rule_match( &blob, f->type, @@ -700,7 +692,6 @@ static int audit_filter_rules(struct task_struct *tsk, f->lsm_rules); } else if (ctx) { list_for_each_entry(n, &ctx->names_list, list) { - lsmblob_init(&blob, name->osid); if (security_audit_rule_match( &blob, f->type, @@ -714,8 +705,7 @@ static int audit_filter_rules(struct task_struct *tsk, /* Find ipc objects that match */ if (!ctx || ctx->type != AUDIT_IPC) break; - lsmblob_init(&blob, ctx->ipc.osid); - if (security_audit_rule_match(&blob, + if (security_audit_rule_match(&ctx->ipc.oblob, f->type, f->op, f->lsm_rules)) ++result; @@ -1026,7 +1016,6 @@ static int audit_log_pid_context(struct audit_context *context, pid_t pid, struct lsmblob *blob, char *comm) { struct audit_buffer *ab; - struct lsmcontext lsmctx; int rc = 0; ab = audit_log_start(context, GFP_KERNEL, AUDIT_OBJ_PID); @@ -1036,15 +1025,8 @@ static int audit_log_pid_context(struct audit_context *context, pid_t pid, audit_log_format(ab, "opid=%d oauid=%d ouid=%d oses=%d", pid, from_kuid(&init_user_ns, auid), from_kuid(&init_user_ns, uid), sessionid); - if (lsmblob_is_set(blob)) { - if (security_secid_to_secctx(blob, &lsmctx, LSMBLOB_FIRST)) { - audit_log_format(ab, " obj=(none)"); - rc = 1; - } else { - audit_log_format(ab, " obj=%s", lsmctx.context); - security_release_secctx(&lsmctx); - } - } + if (lsmblob_is_set(blob)) + rc = audit_log_object_context(ab, blob); audit_log_format(ab, " ocomm="); audit_log_untrustedstring(ab, comm); audit_log_end(ab); @@ -1271,26 +1253,15 @@ static void show_special(struct audit_context *context, int *call_panic) context->socketcall.args[i]); break; } case AUDIT_IPC: { - u32 osid = context->ipc.osid; + struct lsmblob *oblob = &context->ipc.oblob; audit_log_format(ab, "ouid=%u ogid=%u mode=%#ho", from_kuid(&init_user_ns, context->ipc.uid), from_kgid(&init_user_ns, context->ipc.gid), context->ipc.mode); - if (osid) { - struct lsmcontext lsmcxt; - struct lsmblob blob; - - lsmblob_init(&blob, osid); - if (security_secid_to_secctx(&blob, &lsmcxt, - LSMBLOB_FIRST)) { - audit_log_format(ab, " osid=%u", osid); - *call_panic = 1; - } else { - audit_log_format(ab, " obj=%s", lsmcxt.context); - security_release_secctx(&lsmcxt); - } - } + if (lsmblob_is_set(oblob) && + audit_log_object_context(ab, oblob)) + *call_panic = 1; if (context->ipc.has_perm) { audit_log_end(ab); ab = audit_log_start(context, GFP_KERNEL, @@ -1433,20 +1404,9 @@ static void audit_log_name(struct audit_context *context, struct audit_names *n, from_kgid(&init_user_ns, n->gid), MAJOR(n->rdev), MINOR(n->rdev)); - if (n->osid != 0) { - struct lsmblob blob; - struct lsmcontext lsmctx; - - lsmblob_init(&blob, n->osid); - if (security_secid_to_secctx(&blob, &lsmctx, LSMBLOB_FIRST)) { - audit_log_format(ab, " osid=%u", n->osid); - if (call_panic) - *call_panic = 2; - } else { - audit_log_format(ab, " obj=%s", lsmctx.context); - security_release_secctx(&lsmctx); - } - } + if (lsmblob_is_set(&n->oblob) && + audit_log_object_context(ab, &n->oblob) && call_panic) + *call_panic = 2; /* log the audit_names record type */ switch (n->type) { @@ -2034,17 +1994,13 @@ static void audit_copy_inode(struct audit_names *name, const struct dentry *dentry, struct inode *inode, unsigned int flags) { - struct lsmblob blob; - name->ino = inode->i_ino; name->dev = inode->i_sb->s_dev; name->mode = inode->i_mode; name->uid = inode->i_uid; name->gid = inode->i_gid; name->rdev = inode->i_rdev; - security_inode_getsecid(inode, &blob); - /* scaffolding until osid is updated */ - name->osid = blob.secid[0]; + security_inode_getsecid(inode, &name->oblob); if (flags & AUDIT_INODE_NOEVAL) { name->fcap_ver = -1; return; @@ -2390,17 +2346,12 @@ void __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat) void __audit_ipc_obj(struct kern_ipc_perm *ipcp) { struct audit_context *context = audit_context(); - struct lsmblob blob; context->ipc.uid = ipcp->uid; context->ipc.gid = ipcp->gid; context->ipc.mode = ipcp->mode; context->ipc.has_perm = 0; - security_ipc_getsecid(ipcp, &blob); - /* context->ipc.osid will be changed to a lsmblob later in - * the patch series. This will allow auditing of all the object - * labels associated with the ipc object. */ - context->ipc.osid = lsmblob_value(&blob); + security_ipc_getsecid(ipcp, &context->ipc.oblob); context->type = AUDIT_IPC; } From patchwork Thu May 13 20:08:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256593 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0ACF6C43460 for ; Thu, 13 May 2021 20:34:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id F182E611BF for ; Thu, 13 May 2021 20:34:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233046AbhEMUf5 (ORCPT ); Thu, 13 May 2021 16:35:57 -0400 Received: from sonic317-38.consmr.mail.ne1.yahoo.com ([66.163.184.49]:38564 "EHLO sonic317-38.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233023AbhEMUf5 (ORCPT ); Thu, 13 May 2021 16:35:57 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620938087; bh=9nWli++yPqHl27Goa6bURc9CsVwE8MmqYdqxhZMz39A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=gF4h0U2hoZaxyr/hyVPLzHkgLqnWX3gw7kldVffscVFo22ExlpS3CQikaJXirk2G1dusXaxXcu7DyYxl2bwSk9idInVPZ9vAQjVMzOiW2AmubHskePQ+46F7G8GHd5YTgs/4x/06Kykxf6O7u6di9Hs5RcBKo/n34HZBP8RsB/xaDvMEPVg5u2FVJLUyQQoLnTOwTr4BL77HH7GWj9jMmrYFNR6hf7PXMzp8kP2fufk4mL9T0QgvPjYMrxVRTGnZgkSh7x9zJa0mML0ygmP0ik9g9ENn6mRHnTUDMc6RRX7KsNDvZNSBY/23HrJRI12ogpIoJ3Rw8ROxDh/WvvRiXA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620938087; bh=r7ZBJr3XdtjThE7Wr9BjH32WLz6tafr/HakW6IsEvpX=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=i/XDprN6yQUcSYHohVmag9yXwK5lo1++VdTuY0Zo0jDoH95bT0ur/OLB1xDEx9iRfjPA+cXTrWFkgGZYexc9YLKBSJ5PeCfWgy/+EJTygHjpWFLnZz0VZ99QKh1IBn10nfBhmcJ4ypq6Rgu/w++tVasZRI3DURKTMVwiv0DkBz4vm+40eW9tVb12PzAEdCtNczPVGVHJ5PWw/S6cIsqJ3RxOWehR0jrYDwSx3Uwg5bkC4aIWjd/+zU8WyjOdvXVaGgdAhTfJyPc6AZZGCL68a0aZm4D2LQBzNOh3EoMAAth+fK09aghvvSEOpqGYKMmi8NrNoGYOPdLdqO0Xe+qkiA== X-YMail-OSG: t5xQN4oVM1lT6Dgs0u0LqeqtZZbA60HG2LV0x1NZDsEffWyoS7ip4fi01R_x7Bk lUu1P870ZTUkoLwh8A22c4QkFDwEnfhooYSvBXos2M5GxD9zluzeQhG6AGRGlhqp9w070hHm.Tjt Ri9XiWT4GYmuuXWXkY.ecRelc_6j_fQiXO9VnCvNrBse4iLXraZO0R3HE8SJpr6CASZtio9cPR3n Avg5Ba5upf12j2G9Fgc2rov__hr7AcQkY4fl4jDiN3w4NqPQRmgu9Vd9QrX_H3HInv9.rTWMl8jP 2Tr8PCl4y5PzmfaohWvO_oM3AfcuXzh_KwORQTG18rgX2eBSMj2tDX19ZENQIcRQX9D7lT9m.p67 elopRUjkPq7lDJjCTo2VjzzuR3LlEpulQNDUkTX3PyPF8hWhfRYKWsh4lgwJP1uSzVWjZAebS9eJ 184XG.zkurjsvqpltd6OyVScTBp2WnRpqkAq2afov2IoSgd1gPqer8K6pHRWLjIRkUYwGHd_pi6j ZnJBBJem.In6m8Kgadq5gJW75_HlYUXwJCkwd0mblfR9uSTQHTc.EC20ZHpvxokRYTxuYVsuoZc. OBmZKTczkYhOqzed46Pwgk9r0QYvJAblkNC9feM1GBQL5S.JMz7mUHhMn56geHK6DbtKCQqJ_CYk L51jBTtTo8cyb7iAJEuLQ55.TsGsyvSRo..s8LtFLuDzgsgAu_9VbrGiIVkmGRxyEVSM2kVNZy5L _CUG6GYBnVKRzhkMo0SMyNJx0scoP26ze5WW5NPUeoWRVp3jeMj0rT8tmLXAenMRJXRcpdvquUgU X9GwcPCVJ0BNOpjfbwjkHolhaWkiTAettXyaF5esxxhNP07T_1MlmvSRvgFS58xkmxU3iWZJXH6O xbfPZkTK52vpMH4mJmpH7Ol6WnhmEZxUEhU.engU2EYNDod2yZWudIxneYDfUlXCRoRJmJN2epuu 7tCQZKMDRxgAnKQQIqLwsu.DfmrWakAJ1iQ6pD59yu3U4ADYHNCGal3sSw1YTe3YmILoL59xYDqe K59qvGlCxTUecYwt0Dhif3wdRTAasjAusksDvA1ZlDMCaJNjXGnKh5dQ1X5HEh0z70.N0XYe2v29 IfVDUQtqvt5vIrxwiAgv5_3AAWqrz08HggIkAqj6yQ6BED74zDnyp2R2.t1R2L0C35.Zpmw8qOOf .nm8QKgczS0Mx75Zkcn4S3nnQvLrOGdHaEvUm5P.I1pGRBBvjmEktEPqSW0aOdYq.ZapiRhpIfBt qxUk1fVwFCWWgyi5.lRYAsewC8wfTCzDwM4j3Rh31szjv63egVqJ7aSZy3D7jhSgiEAzaftSd85K ZV1M_yVlGqbuzbnBVREDjT13bpTUg9at0I3vqQIVxKNYiKj5Oxs2H4XBClY3gwz3kLWYRMfLjoLo lt6984_..i8SHVwhhteaDQffkFGP3yRie1yXjQgMmYdkBl0WM9wkbmKTYtjEHcPZR43Ph0La024d ArzR4NElbTpHxoDm_qjrADn.tuRliGJOyOZKxf.jZqFv8r_h435Jnci13JdygBNqzwOhjrn2zxwv JWluXj1LQ6DqSjQJKqq11CE2Luk5wJ5OgTMHAs_OLWqmR_oRjhnZ.LMww.NA5LM8s0LZk5lWNAwS b_i1r.5q3PCKHkycZFrvfrRZi8YKYTTO.J.bgdzknKRPdFOx8LhPOCnAeo2jkbFS8E7Ainaw5fhc Kg_Q91WzHeoDNk3.bgz5FcgK.6dJb0pe9JO1s8kV82xPUOtyiiCdKn5tzxUTpQwGqAssKf8Zydth GZ4aq4AbOqXBSm1Ybjn5J..0fHa7vG0Q9V.Dj0W09aBtnDEleGdzmJucXi2hgt8Ap9yaNX9pjhO1 DIOR3Dv.BsiTV89gts1V6Fbnlpf37aWgzn5anet0Mo.5J171BXbRjiHmPlJzFzfyeklnQAYOxN2x h2PL2HZmKMZfNbPIV1GQcWWGib65VtkD6w.re1XR.44LAQKKTtXoJG.m6HgMX5TkDkRzsT0Le1W0 AewxwBmJv5Fvmgga_E8apOdw6iypcyuIMUTIgEdYabDviucxXbsmW7q8_X7mNQhtoR69_46VSY14 QKcU61KI.hV7RiNDNF8eYvq9fRaAWVGGyssNnlJY6wMHvhVwHYcVTTlf2Aemyy.AQSITbgz4JBdn 1PiVGencE_70ehyUg2y4u5jx3roOhNrNrBH7viY0ZKsjbjVtY5Zs.ilaVUwnPBqbNEWTQPNH08dD lGEm5aDg08y0wUBEurDvHNDfWkDl3YP7G_TjwjpO5rJqDkeNlzJvlQ2xCk5UWuqdXbvGFO7totDt sqoU3wMLb5KKQzqPyrcZ9Wat0PfjmzNZKJgZxfVRB_wcEsPrKTM6oz09bbcOwGVk4tRRJcuOHQSk pYyYgbF6kSKDHQlmbbHqXcxj6sCQPgzpbtbdDLmVdqHBkNKeLqZa1L5rsTSX7zu8ygemvgD5HBNr mTtXj4k2OCxgMa2aUKzTYSRjKbneo57E_.6KBY.NlvwNkKSSWKg.Wb0Wqa_Eb9ac5k8TsFd4RlPp MlA.Lv9ksWDNvtI44Q_gBn4eQoHHVLcKqJkW8SMigoAvQpIW61XAWZsxhrrwsTNnexauCEfJKszL WA7BeasMm_g8yQaKXi4kssWTfBqsdDW9.ovXB0yK.6bz.y1ah3Ygwih.3pZsDCo90LeQ16zr2y97 x4tDVBX8qRaMqZpJBnaB.Dsu3ALpd6xaQ7LQHGj5hrPrVcewj_Ug9rnSp_oiXS_D4UCYI5Kcmdb6 iyH_lUeXTKon.VF7cNwCSt2Xn4PYDHePsTKA0klrRotLWJPnQV2PDhooN8kd.9Vubl5wO1.10ruq gVy6vjX.8J.F3kkIjj1L0UylsEpkspmfALbjZuPQ9tKN1s8p1yBl1vbeBIX8XWFntym_LmV2LgPN fl7h6_ghhfHMmUwFJNkg81J36pZ57YT6ln1X4AjgfFgG3gcgYnu_nP8odk_pec0jjaSSguKGV3DB as5RIquu3MSGzdr6gwB6zprMA5WJE33eo7KHzar9bpT0aGk.qHW3DLNCKiNM86uXu0F2hpwKPD23 IiU8ahrZ6ejPBh9EmDCV44fO.OMuUowq.QMFFzsJFMILdGL1l0ijjBh.Dqd3j_Rqi9G9a2HCcXjL zuSfDwUmOjF8_Uas9gXmJ7DhEl_grK1P6xK7.pkJrkc_s.9_RGEiYz0GtmCcRarNEu83UQA_9s9G gDodeTqdP4Nj7d9atjLhG4Q3MqO0DViqERFSQCOyxMRKHe7U- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic317.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:34:47 +0000 Received: by kubenode575.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 20a8231ad8c3c41f8549f1ba05b8d168; Thu, 13 May 2021 20:34:45 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, linux-doc@vger.kernel.org Subject: [PATCH v26 24/25] LSM: Add /proc attr entry for full LSM context Date: Thu, 13 May 2021 13:08:06 -0700 Message-Id: <20210513200807.15910-25-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Add an entry /proc/.../attr/context which displays the full process security "context" in compound format: lsm1\0value\0lsm2\0value\0... This entry is not writable. A security module may decide that its policy does not allow this information to be displayed. In this case none of the information will be displayed. Reviewed-by: Kees Cook Signed-off-by: Casey Schaufler Cc: linux-api@vger.kernel.org Cc: linux-doc@vger.kernel.org --- Documentation/ABI/testing/procfs-attr-context | 14 ++++ Documentation/security/lsm.rst | 14 ++++ fs/proc/base.c | 1 + include/linux/lsm_hooks.h | 6 ++ security/apparmor/include/procattr.h | 2 +- security/apparmor/lsm.c | 8 +- security/apparmor/procattr.c | 22 +++--- security/security.c | 79 +++++++++++++++++++ security/selinux/hooks.c | 2 +- security/smack/smack_lsm.c | 2 +- 10 files changed, 135 insertions(+), 15 deletions(-) create mode 100644 Documentation/ABI/testing/procfs-attr-context diff --git a/Documentation/ABI/testing/procfs-attr-context b/Documentation/ABI/testing/procfs-attr-context new file mode 100644 index 000000000000..40da1c397c30 --- /dev/null +++ b/Documentation/ABI/testing/procfs-attr-context @@ -0,0 +1,14 @@ +What: /proc/*/attr/context +Contact: linux-security-module@vger.kernel.org, +Description: The current security information used by all Linux + security module (LSMs) that are active on the system. + The details of permissions required to read from + this interface and hence obtain the security state + of the task identified is dependent on the LSMs that + are active on the system. + A process cannot write to this interface. + The data provided by this interface will have the form: + lsm_name\0lsm_data\0[lsm_name\0lsm_data\0]... + where lsm_name is the name of the LSM and the following + lsm_data is the process data for that LSM. +Users: LSM user-space diff --git a/Documentation/security/lsm.rst b/Documentation/security/lsm.rst index b77b4a540391..070225ae6ceb 100644 --- a/Documentation/security/lsm.rst +++ b/Documentation/security/lsm.rst @@ -143,3 +143,17 @@ separated list of the active security modules. The file ``/proc/pid/attr/interface_lsm`` contains the name of the security module for which the ``/proc/pid/attr/current`` interface will apply. This interface can be written to. + +The infrastructure does provide an interface for the special +case where multiple security modules provide a process context. +This is provided in compound context format. + +- `lsm\0value\0lsm\0value\0` + +The `lsm` and `value` fields are NUL-terminated bytestrings. +Each field may contain whitespace or non-printable characters. +The NUL bytes are included in the size of a compound context. +The context ``Bell\0Secret\0Biba\0Loose\0`` has a size of 23. + +The file ``/proc/pid/attr/context`` provides the security +context of the identified process. diff --git a/fs/proc/base.c b/fs/proc/base.c index 10de522f3112..23ebfc35435c 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -2808,6 +2808,7 @@ static const struct pid_entry attr_dir_stuff[] = { ATTR(NULL, "keycreate", 0666), ATTR(NULL, "sockcreate", 0666), ATTR(NULL, "interface_lsm", 0666), + ATTR(NULL, "context", 0444), #ifdef CONFIG_SECURITY_SMACK DIR("smack", 0555, proc_smack_attr_dir_inode_ops, proc_smack_attr_dir_ops), diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index d2c4bc94d47f..f6ffe8b069e2 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -1397,6 +1397,12 @@ * @pages contains the number of pages. * Return 0 if permission is granted. * + * @getprocattr: + * Provide the named process attribute for display in special files in + * the /proc/.../attr directory. Attribute naming and the data displayed + * is at the discretion of the security modules. The exception is the + * "context" attribute, which will contain the security context of the + * task as a nul terminated text string without trailing whitespace. * @ismaclabel: * Check if the extended attribute specified by @name * represents a MAC label. Returns 1 if name is a MAC diff --git a/security/apparmor/include/procattr.h b/security/apparmor/include/procattr.h index 31689437e0e1..03dbfdb2f2c0 100644 --- a/security/apparmor/include/procattr.h +++ b/security/apparmor/include/procattr.h @@ -11,7 +11,7 @@ #ifndef __AA_PROCATTR_H #define __AA_PROCATTR_H -int aa_getprocattr(struct aa_label *label, char **string); +int aa_getprocattr(struct aa_label *label, char **string, bool newline); int aa_setprocattr_changehat(char *args, size_t size, int flags); #endif /* __AA_PROCATTR_H */ diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index 4237536106aa..65a004597e53 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -602,6 +602,7 @@ static int apparmor_getprocattr(struct task_struct *task, char *name, const struct cred *cred = get_task_cred(task); struct aa_task_ctx *ctx = task_ctx(current); struct aa_label *label = NULL; + bool newline = true; if (strcmp(name, "current") == 0) label = aa_get_newest_label(cred_label(cred)); @@ -609,11 +610,14 @@ static int apparmor_getprocattr(struct task_struct *task, char *name, label = aa_get_newest_label(ctx->previous); else if (strcmp(name, "exec") == 0 && ctx->onexec) label = aa_get_newest_label(ctx->onexec); - else + else if (strcmp(name, "context") == 0) { + label = aa_get_newest_label(cred_label(cred)); + newline = false; + } else error = -EINVAL; if (label) - error = aa_getprocattr(label, value); + error = aa_getprocattr(label, value, newline); aa_put_label(label); put_cred(cred); diff --git a/security/apparmor/procattr.c b/security/apparmor/procattr.c index c929bf4a3df1..be3b083d9b74 100644 --- a/security/apparmor/procattr.c +++ b/security/apparmor/procattr.c @@ -20,6 +20,7 @@ * aa_getprocattr - Return the profile information for @profile * @profile: the profile to print profile info about (NOT NULL) * @string: Returns - string containing the profile info (NOT NULL) + * @newline: Should a newline be added to @string. * * Returns: length of @string on success else error on failure * @@ -30,20 +31,21 @@ * * Returns: size of string placed in @string else error code on failure */ -int aa_getprocattr(struct aa_label *label, char **string) +int aa_getprocattr(struct aa_label *label, char **string, bool newline) { struct aa_ns *ns = labels_ns(label); struct aa_ns *current_ns = aa_get_current_ns(); + int flags = FLAG_VIEW_SUBNS | FLAG_HIDDEN_UNCONFINED; int len; if (!aa_ns_visible(current_ns, ns, true)) { aa_put_ns(current_ns); return -EACCES; } + if (newline) + flags |= FLAG_SHOW_MODE; - len = aa_label_snxprint(NULL, 0, current_ns, label, - FLAG_SHOW_MODE | FLAG_VIEW_SUBNS | - FLAG_HIDDEN_UNCONFINED); + len = aa_label_snxprint(NULL, 0, current_ns, label, flags); AA_BUG(len < 0); *string = kmalloc(len + 2, GFP_KERNEL); @@ -52,19 +54,19 @@ int aa_getprocattr(struct aa_label *label, char **string) return -ENOMEM; } - len = aa_label_snxprint(*string, len + 2, current_ns, label, - FLAG_SHOW_MODE | FLAG_VIEW_SUBNS | - FLAG_HIDDEN_UNCONFINED); + len = aa_label_snxprint(*string, len + 2, current_ns, label, flags); if (len < 0) { aa_put_ns(current_ns); return len; } - (*string)[len] = '\n'; - (*string)[len + 1] = 0; + if (newline) { + (*string)[len] = '\n'; + (*string)[++len] = 0; + } aa_put_ns(current_ns); - return len + 1; + return len; } /** diff --git a/security/security.c b/security/security.c index bb4c7f6c62ec..d3ff61442877 100644 --- a/security/security.c +++ b/security/security.c @@ -799,6 +799,57 @@ static int lsm_superblock_alloc(struct super_block *sb) return 0; } +/** + * append_ctx - append a lsm/context pair to a compound context + * @ctx: the existing compound context + * @ctxlen: size of the old context, including terminating nul byte + * @lsm: new lsm name, nul terminated + * @new: new context, possibly nul terminated + * @newlen: maximum size of @new + * + * replace @ctx with a new compound context, appending @newlsm and @new + * to @ctx. On exit the new data replaces the old, which is freed. + * @ctxlen is set to the new size, which includes a trailing nul byte. + * + * Returns 0 on success, -ENOMEM if no memory is available. + */ +static int append_ctx(char **ctx, int *ctxlen, const char *lsm, char *new, + int newlen) +{ + char *final; + size_t llen; + size_t nlen; + size_t flen; + + llen = strlen(lsm) + 1; + /* + * A security module may or may not provide a trailing nul on + * when returning a security context. There is no definition + * of which it should be, and there are modules that do it + * each way. + */ + nlen = strnlen(new, newlen); + + flen = *ctxlen + llen + nlen + 1; + final = kzalloc(flen, GFP_KERNEL); + + if (final == NULL) + return -ENOMEM; + + if (*ctxlen) + memcpy(final, *ctx, *ctxlen); + + memcpy(final + *ctxlen, lsm, llen); + memcpy(final + *ctxlen + llen, new, nlen); + + kfree(*ctx); + + *ctx = final; + *ctxlen = flen; + + return 0; +} + /* * The default value of the LSM hook is defined in linux/lsm_hook_defs.h and * can be accessed with: @@ -2232,6 +2283,10 @@ int security_getprocattr(struct task_struct *p, const char *lsm, char *name, char **value) { struct security_hook_list *hp; + char *final = NULL; + char *cp; + int rc = 0; + int finallen = 0; int ilsm = lsm_task_ilsm(current); int slot = 0; @@ -2259,6 +2314,30 @@ int security_getprocattr(struct task_struct *p, const char *lsm, char *name, return -ENOMEM; } + if (!strcmp(name, "context")) { + hlist_for_each_entry(hp, &security_hook_heads.getprocattr, + list) { + rc = hp->hook.getprocattr(p, "context", &cp); + if (rc == -EINVAL) + continue; + if (rc < 0) { + kfree(final); + return rc; + } + rc = append_ctx(&final, &finallen, hp->lsmid->lsm, + cp, rc); + kfree(cp); + if (rc < 0) { + kfree(final); + return rc; + } + } + if (final == NULL) + return -EINVAL; + *value = final; + return finallen; + } + hlist_for_each_entry(hp, &security_hook_heads.getprocattr, list) { if (lsm != NULL && strcmp(lsm, hp->lsmid->lsm)) continue; diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index b7800fa55a34..0a9af748f77c 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -6468,7 +6468,7 @@ static int selinux_getprocattr(struct task_struct *p, goto bad; } - if (!strcmp(name, "current")) + if (!strcmp(name, "current") || !strcmp(name, "context")) sid = __tsec->sid; else if (!strcmp(name, "prev")) sid = __tsec->osid; diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index e65497a5c095..1618d7d6154b 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -3477,7 +3477,7 @@ static int smack_getprocattr(struct task_struct *p, char *name, char **value) char *cp; int slen; - if (strcmp(name, "current") != 0) + if (strcmp(name, "current") != 0 && strcmp(name, "context") != 0) return -EINVAL; cp = kstrdup(skp->smk_known, GFP_KERNEL); From patchwork Thu May 13 20:08:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12256595 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 18442C433B4 for ; Thu, 13 May 2021 20:35:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D98456121E for ; Thu, 13 May 2021 20:35:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233093AbhEMUhH (ORCPT ); Thu, 13 May 2021 16:37:07 -0400 Received: from sonic317-38.consmr.mail.ne1.yahoo.com ([66.163.184.49]:41879 "EHLO sonic317-38.consmr.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233067AbhEMUhH (ORCPT ); Thu, 13 May 2021 16:37:07 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620938157; bh=r5+vPGElNosZcu2Wj41BSjkDKQjGL3hvS42vlbA9dA4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=WTPkNoqeHGcgn3Brgav/A97e7YWtKoxNJ6tgmLJGGnyLh3KoISd3V4zi/wwcO4Ab6/Hf7oiwK8Kuc+e9Mt+/L63rcKsnObLuLWFpbfIJ0jTC+ZEVqgiWSzYEw0u0XlCsBfUH72SkMgLzk+I0yoZ+L6iXiX6mH65q0F7GOoAhn63LRwXsMGD2OzESoP70mAhPmtzdLEC3JmQsoa+TlztcJ2GOCfIdOqIHxJmm8aIGCp8W3u+xeoz2xh8Bi1mWWoHZ44I/sZUgfn78z+7KvTvd2BaiJXXE32f3HlsmB8zpE44kbsA8ocT8nYZWQIFXqyWcnA+miV3Rkkq/gkyuNqhlVg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1620938157; bh=rmGTEneUopIyDsPIvHKa8z2R2pWr8setArob4+5hoBp=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=eo07+xaO0rExrLLUBdQicVWQEQDdxKuBgJ6Z9pFMtsXISC0glL2pFhs+QSz+AusGsoOFyXiulJywjbY6uPq5/HnG9W32xdO6ZiPvfyIH9GTa2NdQVSVtDlfmbhkZJE9ne57y+8D+xJydR55mJtYrBoBy952z01d8Ipf/YBkZt8TnkSvzcbd6YBgF0SHIpS8OcwcpKok/wF4P4W6A2/47M83ThT8iFIdOsYAPaxrDganY9NK985aQo5S6BValySzHeOcWxmJJ5eTgcQOsacm5nLjAtNfGZsZur0LB6qdVEl5d4FRjdgAcSCNyRI11AdOQbU6xsEW8qVLPNyCDG+T0PQ== X-YMail-OSG: gnJjLPsVM1mzdmNomaw5Hs2mbX96jw3uChFTVZYhVp.QCTOtKK.h_FJlQxBbEIz qlJyZBwN5hp_cImGuHymhf7d8OLa1hqIFBlc8nKX7BVaGIjvNe6P8xJOW4v23QyKdkxEn_fEv8.m YCCWkKjbyAZXaHK3iqshftfzWTY4.vYR0gjK_DTtTgbcnwLsLjKB7xW3Ny7_SKw649Q3rLr9TZyL nhxfEos58V7raWmOF7o0r7dWwaO0mWL55J.bWaVMjK.Viy3PgWR7PnLzLEAwH1fhZ4dAYImrXw04 HQs3r12sn6g1Q4S5J1HhC85JII5c7siqyrEz_AADtPF33Rc5eRkq.Jgpq59VDT3GvaajQ0gaUQW4 8uRjAvy3cNWMVOgYP.n9ptyCazBMR5NdtqVgSfCnoJvyVRBsZMogSSvTE7u4LvHP44uGtjMw4Fm2 6whASp8K3XFmafkHkPFsj7ET.jC_sxXCePoY2pnZQvg4xqPSz2itWYcMtUt77vccFowCpqqxODia 9cf6xEpi8CPOJweuiGJnzUScpxFCdfj0XCiXLuYHbgNjleRr8yuu7SXwyeY0t.VbpCK9JjFKMYKT 4SiwmhKpiIA7P0ohgdAnlZp8Y9K4pUzh90S3ayimdS8xYSsOncyzYpgPX0beFbhovU22DlC4j1MJ JnFP2RusET2MrTPR6kk7kmh2xqBdYnHVSFxTY9M5EBdthuhds0ECKdkJqhKlFK9Zq_xdHRSOQPYL 1SAp5RMs1XE3HIQX3K6A.Jd2eMZwAHu9ccIk3dqB704_U09U7w4lyYjAtwQGTI0WKML7xnh6Yo5Z CDHnAJELcn6bdB.TXkhhKLSSBxLfIl_L484ZN9qEUR1ZJxJWxNMSlut4k3fS2.87DaEmBNzxnxJU 4GsJUgG.cYk1SwyyrBPRGwZZpwFUBc5R1S3s3Gz.RQtY4EgmOH90QR1QrtkCZuGmntYih1_G6nV2 vBLVqmrXw7mn_1nnJOw0erdIM_zO1hMCe8ZbtHErv.6EY2Hd6NQArjzu9enOiOE7dnTUu8R9p0kJ vvn35Fjv9VdFQcpXYFlLBdnnw66kw__t39onX1x9AOT44p_VSkxXtbHH6LKJFhuQ0o.b2VS8EAx7 dl45KK9oM3JjNrvfDsHHhcVfAjXRCAwmJT6zdMrq4URjJXYymSh226LK3rj9P_P37nF0uGerWh5b rohQSAcxg49mA_FxxCjQybziOVqVY2PvgDe_CX0l5j.ff9PSiNV3YtgHb4BsZh_E6xgyuw8mxbME YP2K6QDteP4wDYNx_WJ4pFZJkS_NrHGdhgZsnU7_fAtkZKuYf8hvLQTIMlTULT5O0mh2GEPdbRcN 1vr7YiArP2pA1gg7b_dD6EjKaqj2YS14NqnxyF5N7TvpaAHKiDK7pS0dIZXDtOYoRko1Bi2EigsF nKVEsMBC152E_o4z06h6KgGiIqkGrY_UsXSy0PTrM.ojM5MACMjwFVUiAHiuCSzEGx0..U0cvYwT tNFoZO4FjSG1QszQlauJ53I4d65L_iy2kE7asuxqlH0JfpkxYevE9oGjoPI_IZD2N4AHhwUx9oJu KgZTLz_R9WK4hQ8bhv3WVkjfwKzIbTsfGw3m1H7Mf.HKleMR7j9XxFq5nBMX9h9EjESRPylc68Pt OKeP8b3.uJpKlhnJQeJHxjyZCtXI73WYGRrDEWbjXAdIPrwjwx7Zi1sHUi.P0yYZDb85NXfEpZkI TJsemluvMREqwLh_8q9jHRqMS6a.5LCkQVJlNokyXL9c3V0TXtV1OlB6q6V4we4nDF9AVFyr6iUa 1_gv5aOSCceWqCdrgCdztIkCy71EALuVbVVzIRFR5dFWZ4iQ5N0cBcnG.79v2gn_OPdpb00zFsZj DOrQCnv6plSyzSDFOhIL2zSPRFfxtTVUwWmBovGRN1DoE2VUOpnUdBldNXuTCuj.Em7jR1D2ACZA UjdTGtvhe3PEnvZ6U1sssgguDWM5UMU6N7JbofAxQthU7Cba914yGWwR8sOPCMF.Co5e.31vFUap TJmjhKuus2Y5x2OsIX2wXckGuaf_MLDlXFn7xd2TwGbpl3Tj2N7zMMmxEd5Zx26ZdqPhvUeb6Xqr hiezlD6925pVtKtrqDhv.o7Y.C5kCiSfRi2ISws4kKx9ZJ6G.SU1qx7Htr4SuQt.Ox2hf4r3BgUA i4Zf6NnrK4BNKQYKXtrO6ToZ9itwv4gE0cVgeuHgvjrywofybaphW2BJImnsRN_nYn0HTIVgv_mt owrFmb7cK.pXEL2kayou_QuJ6lHlq_14W3NAVpyfguXZWqxsF4j7EP38CtmHTq2ePt2F4rv5Gs2j 889aNFHjbtQ6CAN5BbyaPmjuQ_q4LWwYgDzFmDitHwzDE_RE5gtNvblI_0AH5vQYUvqclqGFYwC_ _KhIev2tgbsE2n0YFimpb4DE6Q1UZJz7J8b8jEcRWcgD.lv5IqctMOi7BrjbM_._qNOBhDSd4tXg 1IfBZv7QIEdBqbD7IzbveAGV9EixbKJFjMCqAz6udURfqicbhzyMMvWO8b39ZeRSLvtmYDQtiiOh dY6RE4COtR5c7MWgMo2QvM5HbqfhAzzxqGiK5GUJDeNdTM9dFNvuU1qEqMfaXhHbrOkm23AsoXk7 keNasqcqVFRSiy_FjNR9VYGn8eOhBVE4Wgy8BlKBUda_Hz63ZRDAo9K0fUmu89YJGcqhU90Mtvn6 5RrrJHyR1UUKHISYuCzE69x7WNLgVdqepF_SfJ_vcxzwJRQkeUITmSflC.HWGJ7P7PEsW4q2lqKz 7xG5nNobMaCh6IMHLY9bPI3zT.0py3iwBmoR98DcPD5.mDRiyir0NaRdyGsP_h3TUDoZumtJYnN9 WXMZB5XKVDasu3fXH3Gc2Km6mddQiv0_IV4XvMhXydFWJlnkMh4My.5Fb9VB3LOZSV1TsqGgC2Jp AkGi77XxT2JDSLIE9qipSjpNZ9NX0d6AYkfoCt8YR4WiUcuX0W_097Q9jeZR2abaZFS0cuZBLAo6 V4B4qlog0PQGGxnk1Ff_GPR4Z7tirm8GEfEiqaA4QAdO.FexyPIdrgy5TXZeoAqx6z2J9aWaP.fT 2.i_mpSiOaFuGiXgnWEpFIp2z5z1rlCb.2JG_pK1szNliS.Ue9Hl9Eu2ipJChJxFerppbTg3M8lt 5L6LgRmH_WTA0CCwoOLLE.cKgXM1O X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic317.consmr.mail.ne1.yahoo.com with HTTP; Thu, 13 May 2021 20:35:57 +0000 Received: by kubenode502.mail-prod1.omega.bf1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 82ee62b5c0a8268c1df3e319376022b6; Thu, 13 May 2021 20:35:52 +0000 (UTC) From: Casey Schaufler To: casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: casey@schaufler-ca.com, linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org Subject: [PATCH v26 25/25] AppArmor: Remove the exclusive flag Date: Thu, 13 May 2021 13:08:07 -0700 Message-Id: <20210513200807.15910-26-casey@schaufler-ca.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210513200807.15910-1-casey@schaufler-ca.com> References: <20210513200807.15910-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: With the inclusion of the interface LSM process attribute mechanism AppArmor no longer needs to be treated as an "exclusive" security module. Remove the flag that indicates it is exclusive. Remove the stub getpeersec_dgram AppArmor hook as it has no effect in the single LSM case and interferes in the multiple LSM case. Acked-by: Stephen Smalley Acked-by: John Johansen Reviewed-by: Kees Cook Signed-off-by: Casey Schaufler --- security/apparmor/lsm.c | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index 65a004597e53..15af5a5cb0c0 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -1138,22 +1138,6 @@ static int apparmor_socket_getpeersec_stream(struct socket *sock, return error; } -/** - * apparmor_socket_getpeersec_dgram - get security label of packet - * @sock: the peer socket - * @skb: packet data - * @secid: pointer to where to put the secid of the packet - * - * Sets the netlabel socket state on sk from parent - */ -static int apparmor_socket_getpeersec_dgram(struct socket *sock, - struct sk_buff *skb, u32 *secid) - -{ - /* TODO: requires secid support */ - return -ENOPROTOOPT; -} - /** * apparmor_sock_graft - Initialize newly created socket * @sk: child sock @@ -1257,8 +1241,6 @@ static struct security_hook_list apparmor_hooks[] __lsm_ro_after_init = { #endif LSM_HOOK_INIT(socket_getpeersec_stream, apparmor_socket_getpeersec_stream), - LSM_HOOK_INIT(socket_getpeersec_dgram, - apparmor_socket_getpeersec_dgram), LSM_HOOK_INIT(sock_graft, apparmor_sock_graft), #ifdef CONFIG_NETWORK_SECMARK LSM_HOOK_INIT(inet_conn_request, apparmor_inet_conn_request), @@ -1928,7 +1910,7 @@ static int __init apparmor_init(void) DEFINE_LSM(apparmor) = { .name = "apparmor", - .flags = LSM_FLAG_LEGACY_MAJOR | LSM_FLAG_EXCLUSIVE, + .flags = LSM_FLAG_LEGACY_MAJOR, .enabled = &apparmor_enabled, .blobs = &apparmor_blob_sizes, .init = apparmor_init,