From patchwork Thu Mar 10 23:46:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777020 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7185FC433F5 for ; Thu, 10 Mar 2022 23:46:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232892AbiCJXrz (ORCPT ); Thu, 10 Mar 2022 18:47:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45666 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240556AbiCJXro (ORCPT ); Thu, 10 Mar 2022 18:47:44 -0500 Received: from sonic308-16.consmr.mail.ne1.yahoo.com (sonic308-16.consmr.mail.ne1.yahoo.com [66.163.187.39]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9CEC519E028 for ; Thu, 10 Mar 2022 15:46:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956002; bh=7Wdp9EDsxW1Zt6K6PMuw73Hqz2U5QPna7Igwbbb21go=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=n2ocOL7AmTUUGZgCtkNczrrUQ+e9HEkOYU67Je1SZJ2NYTtDNYvYxBSYXkz71zhXFdRmR8/gURabuzM0zGIyGiK1SETth/DTSdrTRi4SVDSm/JxfTYNBXlXnpCeV7pkiT360QKcqimGttF+pU82IBKmopnTqBw34aoxaRJG1l54aGPK6hgtUuJlNnHdJhQG9r5/PwlPimSwcr/gGQpWA6ptNqYLkmTTVmM3ifw7Y9WLQt/pr0r2L6wSwqx7oC496Rg8IaCw3jJRvzQQvTe+MTh+d08UhCSas/34HC+Xg/ZbNS6bLXjhqxbuX2+MP3j3iNC7wyDYcsQUDIA6TSH0SFg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956002; bh=XubnpSa90/KPZ1N+1EmnRUvUa0SWKGK4EaafBlulVCj=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=nP7yxJ1Q/+EMHGCOIWvnqPFHIHfQgsBZYFMc2k+XehTdEXjrI97boutgDW3wq0AWmICvyZZP0p28Agb4a8fvvdJxBwXUm6v9N4l6fIyTBNxUYElssGL2HPAPTfDHRi2LWWZiz4LXLf2b3wFXKprg5f4nBhU8IBDTWpFaXSKxCL/gFqesKB/r/XFKnsgzq8RDkteiFIlRPIxKzIMi3V3h+OoNktWLH3thJi7EjlI0gNtU+xNNPeh2yC7N0RvKO3M667goxvf4qzhB+1aRLMcJK896n+1rRYdHLOEnJzY6H+ryUkAfZ+gtcH0iZEakm0tYuMTAJPydQLPIMULIB9HWAg== X-YMail-OSG: 8c.dQKoVM1nJSqqK3oIO9ofSr0jUAuYF_1l_qeXleIzm5ww3f6WpLJLMSFcrBBt TEWgk4sXDsYcXXkBwU8uXVG4SuMQONApBf2Qsa9x9snEXZSAUhQHz4IIh8Jd9GoFwg_IbCTY0veZ pvaNIAnJuwJaHUAF6n8jyRkfQkVn_q_yQSjS05SQ9R1DmXqN9icTkpJZbOYFkkFNP8VN1Mizv7lh nwE23gFEes4GcxfQ8B9dJ6jrgRTKq8fLKHAWzIUL9MnQv31SX4xhhMelUdN4lxRdaa2oTkR.I4Ea NF9AjisKeSsnn_wUFNWHVACVPdy18ZoZ1S8evm8IO2kTVwwVdjyKBSlTgcAgQDDFxQ3ibA.aZ8Hx 6335T7WrtKzTcmbIOOCGXmDrLNvmiD9hRORTjekKP7WNZH1FT1TzSwA2lQkcch0Difgu0Dq.cm.6 deCsxksGvQ6BlfEj2EvrLbtJWO1cSqtQl.msLrpGIzIJ0TGvBZd1Le9zMcWX1e8vfcjl08yUr93Y WnTKw88UjFSnLFeZVV1vYRSaCAZNx40Ja3n154co17EIEzC_Zeg_It_6D16Kv_TAV7J..o1KYu2L JRUcEePZsPMPkkzOUTuw7ovyGmPevixZ4.vq_CAtAG5bO6Y6bZp6EWojMsw80SqsGC90Oaxil9YL yAZOihe7CLjPS1vP3aicSHvCxjBhqUHFs7lxmQSc0ubUFrr6J_S7ZYY6eNV1IfNUbwB606.VW__L ZdRQlVh9P9Htwf2hQVPiEGKgSj_xx.mTlws.7Tu2YBUrB7vW1NdErl.MCoOGiA5NWDAs4ywAY4oz PTEIBDZruESsjK3Au0ZrLoTZnR_2eTkLgV7Cl_Y_hBV32OtbDwTUm6It1Nqc4if.NuR6zXdP5aoq 96UQPmbSO58syjDcyFOXtQepjcYErr3lmpZuy8jpFXG4zVzc__8_byC.zbSqTCdk.Ijjj4hQICeO r8zzAybIXw0SCBp4kbTixSCNIalT..bO_lKRIObA_DFgm.u8PnRjJxcTWZIiKGyJnMyFAiTQygpI NS_5QmREfm4HOcGW5mGGcztk3Q86n3_.6PxhD7RqUqbThFczuJkCLUh6mjFHHY4.X26ApWgRs.kH .qerBqLFnc5inUeLcIsYUyT9p5xM9HjHgGDatNhFZv3K2X6FJocp1TubVK.2q07w8e9uP.baUBw7 50609tXyIw9zBAragWMrZszah4vR4XeA7SBKNwh_JqSixDjVJ8QmdqX8q6sUAEZCY.d8osX.lXJL kjkrv9BS3XRv9CHPXdXMTltQnm4bdjDuD.fHqarHVuoQ86EelbnWwI3Z1WkTYccgNpwR4LGKgga4 .EMqpaUmzB3hyjrFGlkBcjjRF7u03QF5JRp6_xyxsqdkcsiendD4t_O1pYJVLu5VwiXV.gAAqlKt A57gvzflJVcOagTb99kYpUWFPLremNDGxKwVd9NCLYd6m6lhDT6a14Yuy6UmRF8gRY2_joANxBV8 v3uKXoseZ.U8rhgrnx8_ADhPu5vqQ.iT6GA_s.w4ppMOeMLFqZ2Y38qLahVOqMug1so7pCYEz2ja t3IawDg72tr1OeIuniPxOLYIBKBZaVecA_6pbSSrwTzCWefnQpF_kj7d1PfuCFTv1EnwUczW5JZ_ 5PPfK03HGGv.ZMiTNAt9Ae0uCCZS5A5FSV1HGgOQlSb66eQleRSfBhclP5nbYwMFe5pvOLzEhQ0q eh6HoxzEdmXlNzYDoEEIh5EMHIaXXoi2arrT_MXmnuGrs6Rjw82qSk_u20wWu.NrUFEwiLg_w0fn PJlT.j5mwdyEpOuJTOrVKUh6L0Fb6jel28L97hK3lmmsfgPLzHbh9bMhrFyHFWZIaPx0nsENDyVf 5Ug5c1TeOsyL6kHk9Bt_xFtf3njrZ7HA9RJ50olQ4eVGKzC3P50_jIAJ_zhRxUOKiNEp4E_iPEBx qKMmGedCzbRUsBhRsHWBiO5M928mWm1wSr4XgaeISYQABrzg1r9cjPhVG7pTmy99w6eEpSDYbRiK APg42BHRnEtKQMv2lYuB1_O2E1uEV7gR0BoPiHdvAFfQbf6o_JKmMmEVbmL38UzaWLgYzpMQZ.CO 5BXkEhLlfq.rXXsQFmY.cDBE0SDXkiUNkfX8ASsuVjSo_RIvsdaVSIuFUdMJW1NvXsph1djCnMyc GOU7NBquRl5Jnjifw9ZQANNd5vIKoZ3Bj7sEIJmZbokuy_OD7nhvCxcAEEpAK5jVxcBUV9YRdXlx V89D8spYF5stZq3.LdPEPHxQDAdo9Zkm_WzxKeuuj8ggTZqpLfqL1YiQzNwqdFWyzOdoou22clcJ CYvIt_a2pRYspkbGrzOY_CQ6P X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:46:42 +0000 Received: by kubenode525.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 1bc6570d46c38480d6f664d5c69fa809; Thu, 10 Mar 2022 23:46: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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 01/29] integrity: disassociate ima_filter_rule from security_audit_rule Date: Thu, 10 Mar 2022 15:46:04 -0800 Message-Id: <20220310234632.16194-2-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Create real functions for the ima_filter_rule interfaces. These replace #defines that obscure the reuse of audit interfaces. The new fuctions are put in security.c because they use security module registered hooks that we don't want exported. Signed-off-by: Casey Schaufler Acked-by: Paul Moore Reported-by: kernel test robot --- include/linux/security.h | 26 ++++++++++++++++++++++++++ security/integrity/ima/ima.h | 26 -------------------------- security/security.c | 21 +++++++++++++++++++++ 3 files changed, 47 insertions(+), 26 deletions(-) diff --git a/include/linux/security.h b/include/linux/security.h index 6d72772182c8..33e0f2e659df 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -1909,6 +1909,32 @@ static inline void security_audit_rule_free(void *lsmrule) #endif /* CONFIG_SECURITY */ #endif /* CONFIG_AUDIT */ +#ifdef CONFIG_IMA_LSM_RULES +#ifdef CONFIG_SECURITY +int ima_filter_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule); +int ima_filter_rule_match(u32 secid, u32 field, u32 op, void *lsmrule); +void ima_filter_rule_free(void *lsmrule); + +#else + +static inline int ima_filter_rule_init(u32 field, u32 op, char *rulestr, + void **lsmrule) +{ + return 0; +} + +static inline int ima_filter_rule_match(u32 secid, u32 field, u32 op, + void *lsmrule) +{ + return 0; +} + +static inline void ima_filter_rule_free(void *lsmrule) +{ } + +#endif /* CONFIG_SECURITY */ +#endif /* CONFIG_IMA_LSM_RULES */ + #ifdef CONFIG_SECURITYFS extern struct dentry *securityfs_create_file(const char *name, umode_t mode, diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h index be965a8715e4..1b5d70ac2dc9 100644 --- a/security/integrity/ima/ima.h +++ b/security/integrity/ima/ima.h @@ -418,32 +418,6 @@ static inline void ima_free_modsig(struct modsig *modsig) } #endif /* CONFIG_IMA_APPRAISE_MODSIG */ -/* LSM based policy rules require audit */ -#ifdef CONFIG_IMA_LSM_RULES - -#define ima_filter_rule_init security_audit_rule_init -#define ima_filter_rule_free security_audit_rule_free -#define ima_filter_rule_match security_audit_rule_match - -#else - -static inline int ima_filter_rule_init(u32 field, u32 op, char *rulestr, - void **lsmrule) -{ - return -EINVAL; -} - -static inline void ima_filter_rule_free(void *lsmrule) -{ -} - -static inline int ima_filter_rule_match(u32 secid, u32 field, u32 op, - void *lsmrule) -{ - return -EINVAL; -} -#endif /* CONFIG_IMA_LSM_RULES */ - #ifdef CONFIG_IMA_READ_POLICY #define POLICY_FILE_FLAGS (S_IWUSR | S_IRUSR) #else diff --git a/security/security.c b/security/security.c index 22261d79f333..5208b21c8433 100644 --- a/security/security.c +++ b/security/security.c @@ -2566,6 +2566,27 @@ int security_audit_rule_match(u32 secid, u32 field, u32 op, void *lsmrule) } #endif /* CONFIG_AUDIT */ +#ifdef CONFIG_IMA_LSM_RULES +/* + * The integrity subsystem uses the same hooks as + * the audit subsystem. + */ +int ima_filter_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule) +{ + return call_int_hook(audit_rule_init, 0, field, op, rulestr, lsmrule); +} + +void ima_filter_rule_free(void *lsmrule) +{ + call_void_hook(audit_rule_free, lsmrule); +} + +int ima_filter_rule_match(u32 secid, u32 field, u32 op, void *lsmrule) +{ + return call_int_hook(audit_rule_match, 0, secid, field, op, lsmrule); +} +#endif /* CONFIG_IMA_LSM_RULES */ + #ifdef CONFIG_BPF_SYSCALL int security_bpf(int cmd, union bpf_attr *attr, unsigned int size) { From patchwork Thu Mar 10 23:46:05 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777022 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0E3F4C4167D for ; Thu, 10 Mar 2022 23:46:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344841AbiCJXr4 (ORCPT ); Thu, 10 Mar 2022 18:47:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45722 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344890AbiCJXru (ORCPT ); Thu, 10 Mar 2022 18:47:50 -0500 Received: from sonic315-27.consmr.mail.ne1.yahoo.com (sonic315-27.consmr.mail.ne1.yahoo.com [66.163.190.153]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 152F319E01D for ; Thu, 10 Mar 2022 15:46:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956006; bh=iPJV4z48tVnKJ2CzTi8sCc9D3sS+NSGDRgbtdyfouS8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=e2zG1QdiJd+ar4wO1M1gcl99klEuzISNTA1D/6QaMi9EjT9xsdAd1hc48059a3knih8f/olaIm2lbdxMqNSgtff6JNefs87BUgrtJmpVn++bYqOtF7A6zkm+5jlq5s4FzNrZ7pLBZX84S9HV90BJ/xazUvsuXCZF5sbHp2spOqwaDmuY8/21P9/27EkLr1/l/tjRxmafnvUiIcGs5iMP3RqYPTdAT1H/CuR9eJVjZzRivJ5z1hCaCnc+gtksJuTzZZVxCWdvMBAR1zq0ciYMEXmze2w1nH5iw4rYm6TnXKysmLCXfXxwDFfq8un1jzvsQ9UKmO0ssGWJS3lDV1GTsg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956006; bh=UCb2rtlmgYk0IcW5mEP47yw1q/dwrp0bYuNMpcxpmh9=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=XVW0djyJqA6AEMSMLDzskIgFNxT93UYoQyzKg0lIuh4hpnHq65SKfkrgPkN6+7uCXHqIAX+2mMuXZt3lhTy7dD9ms/PWfd24KLkacudk+ZgdaOpLrH+snXU4SbHQc/21FZcAb1OKnam3ZHb1n0k1ntwroTZLOHOU0WQwjf7D7N3or0zkgJZelr9lRMlLQRqFoFF5E3yhKuNJKNu2DSsC6dSF2/rQXiGorzeKQyDZ3GLdd5R4RkiVNXgDQEI1uHledb3JDuMpk0NDo11zfv21GPz5H3HKICESqDaZKqfnwzZKZbvVRbws3O8MGwg5ClbqpY9y/I5wrdHtDBWdUVmU8w== X-YMail-OSG: RFGiQTkVM1krUam.1psxn64qvGTuxpJ.uimGZEQHBjLsXUcJNl5YkJ9nQAYKpHO wQPxEHnc7VbqYT1F9TzluLVoL2tIQff4WuYfhVKrNsUeytBTM6PJCcNsU_0tGR_WjH30QI3BHuwc COjJncsbaP2920Mj4h0p.LgUm_eHxePoq589hkuo7WrHVhk.paqnW2P6tgL_8Xk0F8rHH3k6K.9m a6Pm0KP2y69nM5ljVCwyF_HX79EGIN4HpmVgj4LUZXQU1SZsIIv_mBJXwuvtrQ6bEagC19frGfmD 6KpLdn11oPiLG5maq789RLbnxcBIQnIp8vquYkIJgw9m2jNjzNn_r3bolAYSq2AXrjPxdKss8JVY l5BdKy89Y.iCgDBI2Wjrv4vQKhzYqHMU9lRNkgezFYH4ACSDceJghBhZ8Tm9rQUe5biYPjepDC63 9AYUHBGmKTU1l7.0SE0mZfFMLFVLOnW2AR1AXjzG1.312rMyXpxpRfZjTU6lEfmm1y3PABlmrH5H HUJwJOdAaBa8VdQzO2DqYjNtB2S5pZK9HISQt83svlQH4vyyNq3XNKShIs5h.KTJgnnfJVI09_.R OHBprm7YEcjTji6vtcdErZzLZXVIlew4ElVTrsxv0uphpUTRAdD2gkAqZVC2QMnuN__AcxCNR4yz TKPKsPtrLf7hw9l1lVO1L4.gJsWYGPK_pGU34QCujUga6ENcVgAE.0EvZE4gkqxSn_e2Ej8.S9vD _oQMjZ9wip2ISpfkTExpbSmYNfB5ZTWmQmCMMO2ynWTXDdZfLgrpuOKq1Ls9n7BWGQhLHKfRitMW tLKiOzD_KCIXbspHmlNYo5T_5OQmrpbuoXJQ9ycv_uOhYIhpaEbAz5qs8pVZ9MU4bV8JENm.vMVI cuF4ARjJ6bki3uzaSlGQYbv.RVYdxzZSnqPg0ZYLHR4cE_pn9h0L0k8juC4etPcaJz1JeiCUxnjw 0QrC1OTicbufKNvVuvmSWDl7JVD8AA6C9FTeKY1XOcxJkoJUDs4ZemScOrKd19OYPrAs75I8Oxa7 7Bfp4IEXLDU9gWuKQpTbj9JJaHNBVVJLDslUWznOgLNllUgrMRQXaA8Q80QwccgLhaAXXNqS2_Tl 3zRNCtzcz9Bgj6jF2lavtDexSjrMzTmeJYRHgHZyJ_7YSgIrkDf1aMCYhTWF0XCfIUqzKSPT9RvU iNRWO4Q1VrgPlwS3FUbpc_4nucAv_wM4_MPyFOCEIrClEOfCtrcHjy_9seaTb5XupOAiDdQInlaa 4MiYrcCyMMsUJkqdyJOhruTDjlPEblDyb2scAAcvVSGfLE.tnH92kJHMyT.t_GeAi9Nc9gY.OMBI gEG_GHLE8O_i15n6YhdhvS87pUN6gMg9cycXKdhpWHPP5mElnakcPI0av91a9r7gZsY.oJ9L.Mgx x.WY_Tvo1rVsMPfkA8DymtEVx8nFHZdcO8GyHQLdznav6jY50IB8L3zeqpz48UzG7563PdK.Bchv hBcuT.OniR6Eds_Vo0tWVpCfabdKPBj9UrdsMKlF88PxBwZkREfWbzPioRuun3MUkhDCcR0Y_YXi Xmwu.I.V2X1a5WuJhsBzLkAJ__cl9.3fSav18RcyjUarV7cF8QglgZ7e4V3CZkIV.hAVZGxmU2Oy gzFytkgM48ppoTRad68R6uGe5p1_9HQQEzFRvqQW.DqS.byx.W52lKtKH9G99zpM_IQ3MBa75oQy L24lSF5x0IhamRCsrW7xCOdxvl2PoBC3.CNOd.gCY0PmWoMNhrYrRJVU97bfVNY6nPli0WX1Nd2f 8Z.0u0zG0zLy4oXzwgEoXZQsEwUydWKtVbWV650cXSgTF8RGv89PLztvr1OMVerZ7F_qdqtAXMXq xaVjdXBw5WW2e.DIUEWX9qd5svZraLSMjBLd9XoEMmsMQiz_TppOh6YFMB3aSIXpoymlENzZVLwr Ku018x1WLRWjb7cfmxRh4B4u8.iTeOa5ptaW6SvACimG5BsamthNik0vyyccCZRdzRFY0TzTujw7 y0C.1nPlBH0gjFo6SppHGdgt4Qg2WsVdCHRaN7oOEeNl8wCKTaAurUWUhEKhACCqGpavR0d9hpL8 uM7JVU.lOXSrNj2oleLfB6S.yYqhcmwSsqw4vwTlJBVgo1j9Yfdj4FySwxC8U3sCbMHhVLwBPlF3 GnQ0NyhN3X5yPOERanXeiemynW6lc90upMrLXPgL9ZwlEEPQrvdiHe2HPHkNduoOw3f4z0uCyPc5 NPQl5VfyAZIQNQEgl4RysFR105gokqmhpow_jiJDuPgL2ew-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic315.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:46:46 +0000 Received: by kubenode525.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 1bc6570d46c38480d6f664d5c69fa809; Thu, 10 Mar 2022 23:46:40 +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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 02/29] LSM: Infrastructure management of the sock security Date: Thu, 10 Mar 2022 15:46:05 -0800 Message-Id: <20220310234632.16194-3-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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 | 4 +- 10 files changed, 143 insertions(+), 119 deletions(-) diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index 3bf5c658bc44..129d99c6f9ed 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -1600,6 +1600,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 4f0eecb67dde..be8976c407f4 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -782,33 +782,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); } /** @@ -817,8 +799,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); @@ -874,7 +856,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); @@ -1059,7 +1041,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; @@ -1072,7 +1054,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; @@ -1156,7 +1138,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(); @@ -1166,7 +1148,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; @@ -1183,6 +1165,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 = { @@ -1219,7 +1202,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), @@ -1771,7 +1753,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 5208b21c8433..f2d4b20613c8 100644 --- a/security/security.c +++ b/security/security.c @@ -29,6 +29,7 @@ #include #include #include +#include #define MAX_LSM_EVM_XATTR 2 @@ -204,6 +205,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); } @@ -340,6 +342,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); @@ -659,6 +662,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 @@ -2263,12 +2288,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 5b6895e4fc29..dffde40d367e 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -4593,7 +4593,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,}; @@ -4650,7 +4650,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 */ @@ -4666,8 +4666,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; @@ -4682,7 +4682,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; @@ -4817,7 +4817,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); @@ -4996,9 +4996,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; @@ -5030,8 +5030,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,}; @@ -5073,7 +5073,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,}; @@ -5106,7 +5106,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; @@ -5174,13 +5174,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 || @@ -5240,34 +5242,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; @@ -5281,7 +5276,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; } @@ -5291,7 +5286,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) @@ -5306,7 +5301,7 @@ static void selinux_sock_graft(struct sock *sk, struct socket *parent) static int selinux_sctp_assoc_request(struct sctp_association *asoc, struct sk_buff *skb) { - struct sk_security_struct *sksec = asoc->base.sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(asoc->base.sk); struct common_audit_data ad; struct lsm_network_audit net = {0,}; u8 peerlbl_active; @@ -5457,8 +5452,8 @@ static int selinux_sctp_bind_connect(struct sock *sk, int optname, static void selinux_sctp_sk_clone(struct sctp_association *asoc, 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. @@ -5475,7 +5470,7 @@ static void selinux_sctp_sk_clone(struct sctp_association *asoc, 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; @@ -5496,7 +5491,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; @@ -5513,7 +5508,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)) @@ -5597,7 +5592,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 @@ -5726,7 +5721,7 @@ static unsigned int selinux_ip_output(void *priv, 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; @@ -5749,7 +5744,7 @@ static unsigned int selinux_ip_postroute_compat(struct sk_buff *skb, sk = skb_to_full_sk(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; @@ -5842,7 +5837,7 @@ static unsigned int selinux_ip_postroute(void *priv, 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 @@ -5871,7 +5866,7 @@ static unsigned int selinux_ip_postroute(void *priv, } 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; } @@ -5920,7 +5915,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; @@ -6920,6 +6915,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 1321f15799e2..800ab4b4239e 100644 --- a/security/selinux/netlabel.c +++ b/security/selinux/netlabel.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -68,7 +69,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) @@ -101,7 +102,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) @@ -236,7 +237,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; @@ -274,7 +275,7 @@ int selinux_netlbl_sctp_assoc_request(struct sctp_association *asoc, { int rc; struct netlbl_lsm_secattr secattr; - struct sk_security_struct *sksec = asoc->base.sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(asoc->base.sk); struct sockaddr_in addr4; struct sockaddr_in6 addr6; @@ -355,7 +356,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; @@ -373,8 +374,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; } @@ -392,7 +393,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) @@ -507,7 +508,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) && @@ -545,7 +546,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 @@ -584,7 +585,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 fc837dcebf96..ef9d0b7b1954 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 14b279cc75c9..d58b50006e79 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -1434,7 +1434,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; @@ -1817,7 +1817,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 @@ -2237,11 +2237,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. @@ -2255,11 +2251,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 @@ -2268,7 +2263,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) { @@ -2281,9 +2275,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 @@ -2396,7 +2389,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; @@ -2428,7 +2421,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. @@ -2460,7 +2453,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(); @@ -2533,7 +2526,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; @@ -2621,7 +2614,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; @@ -2715,7 +2708,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; @@ -2763,7 +2756,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; } @@ -2788,8 +2781,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; @@ -2852,7 +2845,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); @@ -3583,9 +3576,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 @@ -3631,8 +3624,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; @@ -3669,7 +3662,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; @@ -3881,7 +3874,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); @@ -3903,7 +3896,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; @@ -4007,7 +4000,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; @@ -4056,7 +4049,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: @@ -4105,7 +4098,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() */ @@ -4125,7 +4118,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; @@ -4211,7 +4204,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) { @@ -4747,6 +4740,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), }; @@ -4857,7 +4851,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 b945c1d3a743..bad71b7e648d 100644 --- a/security/smack/smack_netfilter.c +++ b/security/smack/smack_netfilter.c @@ -26,8 +26,8 @@ static unsigned int smack_ip_output(void *priv, struct socket_smack *ssp; struct smack_known *skp; - if (sk && sk->sk_security) { - ssp = sk->sk_security; + if (sk) { + ssp = smack_sock(sk); skp = ssp->smk_out; skb->secmark = skp->smk_secid; } From patchwork Thu Mar 10 23:46:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CD3BAC433FE for ; Thu, 10 Mar 2022 23:48:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344500AbiCJXtW (ORCPT ); Thu, 10 Mar 2022 18:49:22 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49560 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244452AbiCJXtW (ORCPT ); Thu, 10 Mar 2022 18:49:22 -0500 Received: from sonic301-38.consmr.mail.ne1.yahoo.com (sonic301-38.consmr.mail.ne1.yahoo.com [66.163.184.207]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7408EE0AE8 for ; Thu, 10 Mar 2022 15:48:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956096; bh=bN7UjzkLpmK8Etg3af+uvO0f3fY31Npj4OxsA9N1ShA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=DKKowPP2a2LqlXrd86hkmF9TaC9rfv0BYchYmBcILdxzmHiX/HSiJ1U7kYCbR280dimCsVH4QHHY6lwHNBp0XBPL61Wy4hC2NxGKL+z7JZsZZRKWVNbz8tZcBQ4+qzqUA0INMqniRR5byY/YqQlHoAz3io9PR9bMMITvScGX8k/0OGA2MBKmByV+KsxCk61qKqOELttJ0zqGQ7kZOWpB14e3HLDFQbuCEYUIRCDVHzeEihStGEl89ENbEGUjDnUT3Usr2ZouQur9I5oBw7zVMB4bYlzlDRLxap4TnRxqC6e46fLHeGnQ8M4eXsD3xvGYUNYrKgxcb8Hxm4e7FdGG0Q== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956096; bh=0FJVnXUsm/OsW9HIHOUMMmhrs/n+3To2raSmllvfE9V=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=cTGcFB5s6HHdBR1sJvwNtrqUgAxIzGtNKJDm4XykCO6ur98Wbd4BNxaPFpllj61P0OWWL27CFTWWqYv/cUi2VQWEzwKpivp/VVz7MUeOam5qHuc25erlnLAAJmRU+Hev45XBBL9gSAHDny288mzJiPYd4Y1o2Gr7bkTHZnM6H5q80lNFRDfKp3rB8YNibFYx3fGps716TyWmaVKQdi3KpRwMl+2ySHaXmUIsHO6CVn5lJ/WedTSW6wSBoX0MCnTGi+ylO2hx7Znn33dfkXySINM/r6W7rXmjIr5duskxV+pqL+4wcF9wu72dNfBaXnnPupO2mM2wCUzemdTFZFIbkw== X-YMail-OSG: 23tlpQEVM1lyNWsa7p8yLp881Zo5wsPJUykpNuOPY_K2oWHvNYKGtNTehPCjIBu 02M8705.YvsCE2KDVB.FlYoRtwXn2kQCy4P9Od2kko.pP5m08ZVb5ngN74X_yJDtaBu7pIYMKVwL s8BdpaKcA7VhfK5Xd17XtxoGgUIKchSdUjncXneZYfTknrGQjGK2K.Utz_abOP0XRLggChIdkkAJ zKMQlzXUNdw3aeaLF9zr6VtYpyQYmUxrAOHtVHPbuG2viZs804iF2XKbwyD0cAr92vHrLo_37anl WFagVPoxuxQTy80tGMvO9XAOWQuFTPxFkJndwS5dN1nl9LlZ4cLbk7R_9Do1Uo4PHO9f_B07w9cL dxsu4JbZkzG6CX.ht4vdzaawQkwFowPT2HUuTBNORni7nji35nxAQCzbELnufpvPQzEnAy09oXAX FyhTmbWyvv_Nn7CsqZ8Gt_1hSNCGiUBxANxXkhA_lDgFjqIi3kGu9bd6qaGNFFJEtL1mFToF6sGM nouFpyIYqn5OCTG_tlQK.m7QA51moOTdkCWJfrz8yBO8ed8hMKwYr0yYAAw2bJDEn05FHBlYNjR1 fIYLAhIK3LMsVvM2hEGCjP0nF1MUopTdKuX8Z82gjjb5Tu3eLLBvbtM.jwQZtjbf63Pj3t2b7ifr HGKSg09KvGZc1AY0VNzz9K3T9yipdAylB5SwRJxUhBFIJY6JW9vjDpFBGrjvQSzLXinU3TZ4.Tam fSS6LwU1sk6l2OFWN3hQ5Pf1PTmz7XHBF5jxgPNtTk32lmvSgZeijAoiGxGRX5DebrXE3_n670hK ljnSDIWwmXCH.SNKxXkr95YGd7ThOf6b0ZY0s5cDEjJ54RnDRzMAl6nvVrpBMdC_Aoi4K4.ginh7 .N3WBkesssCQaq2asXV0DJVXJJJ0xCFz_VhIVT6pU9wJJqBa.13R5uVg.o9LDsXVjZShehbMgUIJ 4E5WDPbaiqNuCGO47.cK0ckR4AeoMybJ56CkthCghNHWV9NUvdoPSxpbg7_6eZoOjqYFcIML6En9 AnfUBKg23_zFhEZQk9PO2JfB0dp9MFjQ.4isMilng_YEAAR09Yu649HNmQJ1Qp05VXkyz44rTzZE _E0tlIYbOEvMKEhABiTHZ9.pBwhWcEPWXRMuELVmraBQBPqG1rgXABGxUbsmmm.rp_Gm.rRR8IPf RgGR6jZczsmJC3kie5.WyDxI0W67hSNHpFE5TIjwBgXFihyvEGqYh.s5alTYnxarOJYklSQOLl3O pz9tjZfGR.JQ3sEapOSEyITGpt17leowIWPyuTqCY2UuC53osSzq.sN4bZycHdOWrtt2Ldzh44S2 F52df6TlomC.lUVlhnitASRql4rt5G_k2kzdnyd4h8ah_16i915CGXV3XiM_X5kEy0ryqWjOE326 OGN9A4l9AwjBXo3KF36TR7IjJtJVLF4WGwpYr7KUv.eFSbxoC5XX8CRjJgCQOFAlR3lV5Gysrp26 gzDEQRFBeYal9oY.binHGEo_zCeW7baMBJ3mCv3h6wJNhS2QQtSom8V3ZtkPb.ka4a4vraX7u4uK bCiuPguVSxzvfMdqTMm9IXxvf9W0Z7zAYKP6aN0P1DTCjJCi3bSGs1PUdBMOh8S1jtfEMNwUmJrN gE1r0v6VMCp605GjxuulMpx378kz52gHv8pSj6Aae9pA7JiXcrHVhLFFjzi.ANVqxLOXo_GIgQ9v kwQ4QBuWRyiNKSBP1QyDf8P8TQmzi9nRzRX3LQK5WrnNe4h0lNz0am.pqVPBI8BRS.6Kj9ykx_fX 9oZDB0qGwys3aSxvcXWsmq_7d0CaANqurUwPfzTeM6rd9XN5FOW5CShQCns0b6bAgs_cbKv1Z4fX pJd2CZzGSHuslAJjGq6LL6qdteWXWID0X3tHLvRex.nSIt3ks2p8DXd51SXqjFbmHTJVavPHfieX dtCBZy1BBkzrihaA2Q.3OGx.kBF13CgAIaA7AmIKx5yIxWcActyb_2XxEebTwyhAcr.L7f7Lo.Rd mDr7Dr_XdaCb_UpZA.eM7PDaotE3aZ7MvXi2DffJMN.f3L2b777wC7GLbMs_6TAI7FtGcbHs8l16 ehVCmXBZGpsq4BkmWQ8BZEAkG9p7FwoQ43y_CcVkkJ.jHMI70ZMRW.Q32BKFFxjmXPY.CBcmbAwD PzFyaHQUn.c7DK8oNWRY4CHpe4G1iyE_78uAScWBVo82Ws8hdPfgkSy4bLKVxyUBDk3Hn9PUw5dH Y161arPcs7d_Mbh8TefvhujQ5DwM6_gi9SkzVMn4rYhk0ncyumctSg7Qohgr7qYr3ifDbM2LBNOY 9KNc3RC.LnaZw9a28zumt9Bpl X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic301.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:48:16 +0000 Received: by kubenode513.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 83925d611ffce7fcc78508743dd1e1cf; Thu, 10 Mar 2022 23:48: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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org, =?utf-8?q?Micka=C3=ABl_Sala=C3=BCn?= Subject: [PATCH v33 03/29] LSM: Add the lsmblob data structure. Date: Thu, 10 Mar 2022 15:46:06 -0800 Message-Id: <20220310234632.16194-4-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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. A new structure audit_lsm_rules is defined to avoid the confusion which commonly accompanies the use of void ** parameters. Signed-off-by: Casey Schaufler Reviewed-by: Mickaël Salaün --- include/linux/audit.h | 10 ++++- include/linux/lsm_hooks.h | 12 +++++- include/linux/security.h | 75 ++++++++++++++++++++++++++++++--- kernel/auditfilter.c | 23 +++++----- kernel/auditsc.c | 17 +++----- security/apparmor/lsm.c | 7 ++- security/bpf/hooks.c | 12 +++++- security/commoncap.c | 7 ++- security/landlock/cred.c | 2 +- security/landlock/fs.c | 2 +- security/landlock/ptrace.c | 2 +- security/landlock/setup.c | 5 +++ security/landlock/setup.h | 1 + security/loadpin/loadpin.c | 8 +++- security/lockdown/lockdown.c | 7 ++- security/safesetid/lsm.c | 8 +++- security/security.c | 82 ++++++++++++++++++++++++++++++------ security/selinux/hooks.c | 8 +++- security/smack/smack_lsm.c | 7 ++- security/tomoyo/tomoyo.c | 8 +++- security/yama/yama_lsm.c | 7 ++- 21 files changed, 254 insertions(+), 56 deletions(-) diff --git a/include/linux/audit.h b/include/linux/audit.h index d06134ac6245..14849d5f84b4 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -59,6 +60,10 @@ struct audit_krule { /* Flag to indicate legacy AUDIT_LOGINUID unset usage */ #define AUDIT_LOGINUID_LEGACY 0x1 +struct audit_lsm_rules { + void *rule[LSMBLOB_ENTRIES]; +}; + struct audit_field { u32 type; union { @@ -66,8 +71,9 @@ struct audit_field { kuid_t uid; kgid_t gid; struct { - char *lsm_str; - void *lsm_rule; + bool lsm_isset; + char *lsm_str; + struct audit_lsm_rules lsm_rules; }; }; u32 op; diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index 129d99c6f9ed..2c2d0ef59a41 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -1582,6 +1582,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. @@ -1590,7 +1598,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; /* @@ -1626,7 +1634,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 33e0f2e659df..c53bf67c4d9f 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -39,6 +39,7 @@ struct kernel_siginfo; struct sembuf; struct kern_ipc_perm; struct audit_context; +struct audit_lsm_rules; struct super_block; struct inode; struct dentry; @@ -134,6 +135,66 @@ 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 a 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 a 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) +{ + const 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(const struct lsmblob *bloba, + const 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); @@ -1879,15 +1940,17 @@ static inline int security_key_getsecurity(struct key *key, char **_buffer) #ifdef CONFIG_AUDIT #ifdef CONFIG_SECURITY -int security_audit_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule); +int security_audit_rule_init(u32 field, u32 op, char *rulestr, + struct audit_lsm_rules *lsmrules); 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, + struct audit_lsm_rules *lsmrules); +void security_audit_rule_free(struct audit_lsm_rules *lsmrules); #else static inline int security_audit_rule_init(u32 field, u32 op, char *rulestr, - void **lsmrule) + struct audit_lsm_rules *lsmrules) { return 0; } @@ -1898,12 +1961,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) + struct audit_lsm_rules *lsmrules) { return 0; } -static inline void security_audit_rule_free(void *lsmrule) +static inline void security_audit_rule_free(struct audit_lsm_rules *lsmrules) { } #endif /* CONFIG_SECURITY */ diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index 42d99896e7a6..de75bd6ad866 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c @@ -76,7 +76,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); } } @@ -529,7 +529,7 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, entry->rule.buflen += f_val; 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) { @@ -782,7 +782,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) @@ -796,9 +796,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) { @@ -850,7 +850,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) { @@ -1367,10 +1367,11 @@ 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_str) { security_current_getsecid_subj(&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: @@ -1397,7 +1398,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; @@ -1429,7 +1430,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 @@ -1444,7 +1445,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 fce5d43a933f..f1c26a322f9d 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -664,7 +664,7 @@ 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_str) { if (need_sid) { /* @tsk should always be equal to * @current with the exception of @@ -679,8 +679,7 @@ static int audit_filter_rules(struct task_struct *tsk, 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: @@ -690,21 +689,19 @@ 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_str) { /* 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)) { + n->osid, f->type, f->op, + &f->lsm_rules)) { ++result; break; } @@ -715,7 +712,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 be8976c407f4..1e53fea61335 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -1168,6 +1168,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), @@ -1853,7 +1858,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 5fc8986c3c77..c94ec46e07ac 100644 --- a/security/commoncap.c +++ b/security/commoncap.c @@ -1446,6 +1446,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), @@ -1470,7 +1475,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/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..759e00b9436c 100644 --- a/security/landlock/setup.c +++ b/security/landlock/setup.c @@ -23,6 +23,11 @@ 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, + .slot = LSMBLOB_NOT_NEEDED, +}; + 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 963f4ad9cb66..0c368950dc14 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 f2d4b20613c8..2bf21c726ba0 100644 --- a/security/security.c +++ b/security/security.c @@ -345,6 +345,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 @@ -472,21 +473,38 @@ 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; + WARN_ON(!lsmid->slot || !lsmid->lsm); + + 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); } @@ -495,7 +513,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__); } } @@ -2075,7 +2093,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); } @@ -2088,7 +2106,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); } @@ -2579,9 +2597,27 @@ int security_key_getsecurity(struct key *key, char **_buffer) #ifdef CONFIG_AUDIT -int security_audit_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule) +int security_audit_rule_init(u32 field, u32 op, char *rulestr, + struct audit_lsm_rules *lsmrules) { - 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, + &lsmrules->rule[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) @@ -2589,14 +2625,36 @@ 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(struct audit_lsm_rules *lsmrules) { - 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; + if (lsmrules->rule[hp->lsmid->slot] == NULL) + continue; + hp->hook.audit_rule_free(lsmrules->rule[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, + struct audit_lsm_rules *lsmrules) { - 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; + if (lsmrules->rule[hp->lsmid->slot] == NULL) + continue; + rc = hp->hook.audit_rule_match(secid, field, op, + &lsmrules->rule[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 dffde40d367e..d67bcd1aeaf5 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -7009,6 +7009,11 @@ static int selinux_uring_sqpoll(void) } #endif /* CONFIG_IO_URING */ +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, @@ -7324,7 +7329,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 d58b50006e79..ff832d47479f 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -4744,6 +4744,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), @@ -4947,7 +4952,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 b6a31901f289..e8f6bb9782c1 100644 --- a/security/tomoyo/tomoyo.c +++ b/security/tomoyo/tomoyo.c @@ -521,6 +521,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. @@ -573,7 +578,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 Mar 10 23:46:07 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777023 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 94FA8C4332F for ; Thu, 10 Mar 2022 23:48:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243699AbiCJXtV (ORCPT ); Thu, 10 Mar 2022 18:49:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49522 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238111AbiCJXtV (ORCPT ); Thu, 10 Mar 2022 18:49:21 -0500 Received: from sonic308-16.consmr.mail.ne1.yahoo.com (sonic308-16.consmr.mail.ne1.yahoo.com [66.163.187.39]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A2C05E0AF0 for ; Thu, 10 Mar 2022 15:48:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956097; bh=85+a9+wZHrZpcTfi46FGKjQFvpoABcpzHQd+WTr3bkM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=KbYDJtB0BNnusHtF/zpBhFUvU24wrEcMy17ykPuK3h/Iz0fVt+DIFlDBWvPu/cRSUziAuNgyT2/teSnuJ8XwaZafrSSArd6A+57u1NdPAXpSxMWuMLRqucDKdPNGKg+sw8qFmR50dBDins4GIbaFGLWiTXqN9nvnKgvJFLWZBBes+yxg5nQgUBDX+lLd8WavG48y3QFNhuL4509E1N1lzRD709c6sDYMp8+7CvbMhmLHJUE316FbEt0yc3Sf0MtBEoS9e7YpJpZpt27mYUORObTHcesd5ZYkA7jzsWPsBBgFJo3zQFThuPTFg2YE8PRhfq0kRMleL6ndMPgGdo3x7w== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956097; bh=5zvk/+9QB6r7QseCLA0iHQVN006jz8FDVYCtpKsOyAd=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=qP74nm79+xg4Y/wbJSV2Rv8SCSEFC+27+AqlgN5b33BaSTdroWHWNgMr+bEUK1Br0kThwMqExYrx+JeJxHKDRftwHb0201grP1ilJt/F6+11LSDzjVNHe9bLw3j8K/0zLn88TnAmgbQAN3AQ3XHue8oG8h2/xmgZhHberhyIC23ebRiByZ1vaQGMPGtoWA7thFsPheehzcwgHnu1cRwtFtVMdUwX6eZPoV3PXQ2rbsTtn+6KoIYK+mi+VKo29zu0ka6SOLV1kA4dckuc/fiaKWxNoJj0VwuPI523fsg0CVXi9cjCPp5qOGpJvJc8EV62asV1gYBBy1Xx6kD43L8tXg== X-YMail-OSG: AhTnkQgVM1lmqLMsO018kt2hn3QFxLVS9LWrPil7ITecV3Jbeg2gtEUApK4MSXT Va9EJ744o8eNbvf1HSzsYuj_OyqnanaD.hejB9cwzdwPsoDQzWymrVKLjfzuq.XgjMz9hGb78PVM MtzznTb8RpmGm8dFsnvWjV2u_xwh7dY9z6JyoT7ik0FQtLcHWwBhM.t3Q_dgPGq3u7xaCLUozXJt tzIfeDZZrAj2mpbN_sOyQba6gY1tf.9JQnakxFVSmrtH77TqSdhQRIixlv6MRrWK25Cxgrot8i.s QdnSw5OEG.Vx6zlRMrzliX7SpFBneKvtpxur5.X7tyg.hWzueN9D3GGddvcXyl1E3igzW6D4dlmY PftZbdB0hQacY684RoasZD_XL6zTar1Px92lZLlXx5rdW9XyPZBNShEpi8ulbC_1TjEnhbZOETGa bLLBFmVDxOWjaN0C4NN3ZKnZyBD11mDgE9u1Yji6clg1xaBiE77IIf3gUlFQHPoO_BdoW8f0JZOv e17m0Wrn30f7aTId1flvBbwBMIDo2Ogy7CzgArr.kfNt2fwsP1wRwfDia_lHZKCKtLhSjL1cheb7 vSK9r3_JS_hLHRA8ub74CxqKxKZZbrC4WVDKZ.4J9_dwbX2ODL5P.6wl8gjOBY9jrWUrZiv64pH1 kdebISDV8qN_vjgsv.t3XhxHzjcTyVAY5jLp13uZuYucRD.ZH8Hhw6289cacgaSwerGX2KbLYa22 AC7cIOP_UWj5BkuzK.WhcPrFE5mw_jUtrcSH5NvZmFjbTdQKQ0dC.t17F4mIzcLa5_or0qrQk6PN y50_IKvl8yvhwwhNj5L7i.Bmm_vAy2wYMVi5ZZfg5bKTEmNmqTXS8ocJCPszKos.qHHTFet6cfNr pfO2_Bc8ruDM6a4cbRobpwpMcFoVRqCmiNAPzGFHA7kC_.g.BjuNtgN_0p0rUigjYYglJBk_nJqq YkNs7Rh86g22_kF.lf1Y2LZySIIEmBtkbZRWNqdsYtJvuJ3JHmj15wL6pHTdHsiBMrpMPYuz30h1 Yd418RtKQjHhWjpaIlHNdIT6KyDHpdZnDEML0PaGQpJ9uLIAIWlCNSa0tSUo07fViGPvP0Tng3LX MGP8q.D6P9okSTkYmop7Aabbl7gg0hUekSH3DlE..ilgl0NuziZcS5GbnquGfaCi_7XJzRsPf5h4 VWN295CgxX5vPgDdSzLVKseceBaZxqhVYcHb12P0UQ_VH2Lkl8.PXRiZJuDdR9KG2ETDvxQT5mYr IUq0NLfV91I1377iq_uhCAvNRocSejSpE2hjszPvn8VCBRebH_YxgHeS48dt2D8uK1SwEaqYTllH _lkLjfpSkwQJtmUuDThNuN7Rk8QC0ln7Bq1AFLPlbFQqTM6JamboA.xtbDpIQk0QFLFzZaYYVmhF 4CiZ44wIhkOU9JoebY9JuF89frXmI9wuR5TYOiAEiMD79u3rEq_KvKiN.d3ug3Z2vWdOlbT5a_al GBROKaoRJ6ojTlum8wDS6JOQEjYA.sKwz016gcHddnv5B7ahU3ea6VdfdARvy8Ks2MSgDRtqBWld NI2oqUwzRjmqKvfH3uLyn_SmacF_XHvUdiSt7EI8QwHbaM4Wuem70TVJ1tZr1BHKhtpgNj2Tsyrg kkpwtRWjeVUiOG3WYeg2.ayQEn0SuQv1zH0XaG_MrozfdmLwEQvdX9E95SAWQmSI7uWUJlx7glAR eSOCDMV8cFZTLtMxQiBjgVVGLgTxt6YbNvrvW1Xo.BYI3ziuir_PFr0qzI5JxmZVD2N.e1JWMX_h tsgEpcZys.ypNaeq8krUIt_fkElK2a0GWJjeHXwIsGLIj4435lgvIXezUBV8v5_GOezmP8HGVrFp jONemCmSuFs9kotWji5XVz3Xsj9z9yu8wTX1k5cFGUcH3_oYJkmVAbMkxbkEJVq9JuAmx71s0m1k HGCWdMQx4UpTp5KrgWi1Fyu8lxUTUlT6dUwOekGvdBzdY4e7xP6hXINMqPiKl0rs4LJ7.CFYRwhz I0SVd0PWTvWSkauvp195Xqf4iugpzLll34X2iPYDl.sBMCIk_GXYLaoYCg2arLiBAPdRya_Bn_Bb z9UjCIATh.miq1CHTT1pjgSCY2OhexObAHUAlh68xVohv16NsuWpsIiWl32kcp2OiHHJkQhkYqVj kTTbkW6VGkRcTVLVUu3YOS88OoTpn2E.RSN8ubISs1o8HBsIDi3OgTVHncr21Y.V4pBN3OEJhZS6 5G2kA6dv_2A72B7j9LuBkBsAcIewSBRu.Cm3xi1Shk5r1 X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:48:17 +0000 Received: by kubenode513.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 83925d611ffce7fcc78508743dd1e1cf; Thu, 10 Mar 2022 23:48: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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 04/29] LSM: provide lsm name and id slot mappings Date: Thu, 10 Mar 2022 15:46:07 -0800 Message-Id: <20220310234632.16194-5-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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. Acked-by: Paul Moore Reviewed-by: Kees Cook Signed-off-by: Casey Schaufler --- 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 c53bf67c4d9f..882e0d50e5e3 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -195,6 +195,10 @@ static inline bool lsmblob_equal(const struct lsmblob *bloba, 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 2bf21c726ba0..03a0af7e9e81 100644 --- a/security/security.c +++ b/security/security.c @@ -477,6 +477,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. @@ -498,6 +542,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 Mar 10 23:46:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A4649C433EF for ; Thu, 10 Mar 2022 23:48:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344888AbiCJXtd (ORCPT ); Thu, 10 Mar 2022 18:49:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49754 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344867AbiCJXtY (ORCPT ); Thu, 10 Mar 2022 18:49:24 -0500 Received: from sonic315-27.consmr.mail.ne1.yahoo.com (sonic315-27.consmr.mail.ne1.yahoo.com [66.163.190.153]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 69302E3884 for ; Thu, 10 Mar 2022 15:48:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956101; bh=v4IZ6M3MNP+UA3YRVeGAcbJmER07vGRuoxMYchbXfr4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=LHnImATeMw17yFr3T1XOr8gJBGNcM6Avb/yHPS7qJySferp/nFHw8nlXEPaZxa+B2gda4SqTg2ss7wYJ3npHJg77+MgAWbcsyvMQoJ7JjLGTLaUxfvPnL6IdMVe/7hYLOp1W9PEY2E7htuaNrAbQV9sD5Pd5YtpcuUsSt95DxSoesgSyzhBfUAZMp+ZOjRCIUqBYjOYiBf/UOngowNryzWjbjMZVsCbAYHuSR0cneOOqKjhcj/VZbJUaKdBESw2yWjv0bUUD/HvjFy7uc8c3OGvjX91rHVttkspihzKqlanlqYnxlffOxWBBXenU2Vgoz/gOCaka2TunziWYsVQn1g== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956101; bh=9kHb5y6OEnQl6M9LymVFFKE6/GOoIRHHu5pC0MBs8oc=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=hJ1a3inpkCx4XOmay0+YL4i98bZEdNpYP564u8L25aIY4DCgrPSjnkn3txTpHrzzsdM1AdthPovJ05Tt/LeVRm1vF5ArfdU5uEjrqxiYdXe6MNqYWFS9g77mnqFZrqGQtABhKhZnLgulbMV64hkDywjyW8LohlI6TWtV+ssrh7Qq2dncaekmhHN1ki3rhOQSmtJTMjIooH62VxjTYlVsnsWArbDc9ITWSP2y7kRbWSSmsxtFef39LXjscdZubpHT6zIaJ1Bxy8EEex42JlDCJnSaAaBAKnDXN7Jn30Nb4+noH2IZjWpTp3aaAll2IYelqQkax6IYGFm6CxlaCMzljg== X-YMail-OSG: SBK6FPkVM1novdr3aQYt9P9Yfmtkr63imK87H8hVfZD8.pfsk3o7awZxjFrDOJR wNgCdXaLcm6HMY2Br8frpp4ebiKgjy57y_e0I5DGwO3D1JdwNUnXTuj91TvikI.KPziABYg_fNQv 4HBFgUNk3pxOUOXfiuucmdMS4NbMQ96DTA8nFR.1Yy67RscMHYFO_z.3mo4B9.wkt7QgtRyjCagl NcftT.vWA.cmqporV63Gyf9zSS.tkdrS8bNiuVMfTDLicXcG4CwX0uRIcO5x7Hj6xKI1W.g6GioL D0ygNH.oZLoTsASImDoJ.TFt3KArE.vyu4sVnegvG_QHAsXUDR7tMX80rnGg8j9Ju6GlI6dpURP7 8SvGvZ8rZ49T2Qr8eUPeTBGrb9X3xWgWQqk3KGdZ1bwbtiHIT7fryKQam8_ZcU316neZlVVn9aIU nu9vvrQKcVPYEunjXh56lwyW2gRkZVvLvKX6dLL2OgYPz8nYnffV9boxL.fBidExbuReOYKgrCxk OIZM91ZayC18PIf5bUowyQFf9kiUDG9n0IKvrX3Is8vHzTaYgo9UF3Wb6PiaC.eZ8D7vWDsxGlW7 hqJYIUKOI2nhmALbqIW0C8jVrwjAPypquVclXoOo6YrxC6et4byKqK6fiLggMoIYovQCWy3VXSsg F4duVW9d7Zd16n.d0TOq9jnNL7YvSF21N7yQNuAOqXFRZBRYlcT4LQGCIXP8JLlAf1JOclSY9M9q nQGvBWMN3D_4qWO1_pYOTjJ9ySAobgaJEXR4__nYbqgKBU6s9wCtaivSR8Mcnn13BH09ShrGZ_Ot sPEDsZ9SM9FzKl2QZskdiXxVjA.3yyySJJXZIFRpPt0NeFo2W._hnKKKUFC_DEAjSYmU0hETe0D8 BoliexDivPMOZYEhQ_MbetQucmxcb0GOsd.FzVEvmErL0fDaSdC4vGV.UU5FEM5o_2fBxRgcXaK5 fNcIsIDAB5yyVh_vP7GNdQ0lGp74UhApELhylISJurw0D8uXA.NHO7GZpCN6tshr5TBwAJzy8Wkx 5ItN7PTLGsvR4.PJWPzRdtqloNEYCzb2j2J3LmVR59Li8GogRd8PxLIh6Ff4n0DkSPRmHI2Md2HR tDMEQce7FT_BWx9nhKj2mvXTzvd._2yBkqxQsUxr0ln27DYbj.z54Op3aZL7W0B9X43YFYsBS.lK xzDiEMLLtUDVlZv_HeG3drnrz1wN2IEYTjdu7lUZv.RsJp_hK39wbGoXoGJPIesLwl_OlhRDY5Jj KOmslJPJBkSQKAxofKn34DpLJAmF_Rq2DMhjp_ABDBqZScADgB1a8Ndnjl9xXk1oEoFTJiCTOCkQ orhx8SzDZqdhGMDADNnZvhTnNkGnEg70psIoWo2.19DOmA.XhGlxSPD2qX.Sd66dyHoFAL_eyBJO YumkfOJMFq6WQszSr_0An01YqVfuKMZpr4Dgesvq6OFHWfsQywJWRoghZo5vGFGefamHUyySS8Ej NY9Xs_q_25Geh9MQWoljnzS6IwJTuSJEpFdERhzGDnistGXxCwGgZVDef9sEB3i6NEUpNUyoEvnl j__Z1KqwtYWerX2ua5vUCWweQ2.Dn0NPgk5gxhQA0DfKfmWP2FbL62vNuQFSHlJKNFCT6wl9tvd1 d.w4wAZn3qBhDFRbTMEYuoES5xuHdTocMIOUGblyV1.Hxg60kXkajVok8tpMWcNisYafU6SNibBl c2WRIQXc_uDvLpC9EnSCD4LRmUQ2yFSq4jpAUlSPKenshsNMh2dpQe76POaxAM9jaFPOTS8WUzMR D4K_zec.6fIfKOaMxAVx2MW8EKMVWc1ZMEEniUJNdtu6XzdIV5qkFsvIx2Qejl_Q6oa2ztAKYzTB oh._x9Qp1F4ddHfsPLaw50EaZBAFAG4LQ9PWfPaVWQA0kB4x4wNGP6H3iV07i_1WyKVBIaDu86I5 PECbwsJL64DMEE1YQCBPKTd5PkJPIv1Fr7ZqTvOSEyO3UJ9WwNyjRkMxBMdCqIlg1IH.n2NBkh.c takO5NAlf9m9Dt2725X86IlSsXqZr9ke2QEJ3kIGdAx57vx8MXRrPHjSpTF1O2ZDBy8giAKUL6UU hkzPwHokGBnxDZMqw71GYVY4Rc.m6vxYH_bOhil8oAkN9VlVM2gPdUMb__C_HiV34EcPHWO356tt K0KTJm8EAgAaoMEyrCPJCob6kTu3ZZ0.tvWADEhHKDOU_31A3vKnY07scrntN7_6Co_FFbrmDWgP 5t_pCmgSE_4zslsDkfhpUb5kKtghQsg86h.8gMlYvL7VvG.3Bri1cXqyMgcui8HbqwhLgd2cUVd3 bqrOypGYXSrwUnTXDGToNs0u29upBRJBofsTtjveK6w8ykb53FFez_A-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic315.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:48:21 +0000 Received: by kubenode513.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 83925d611ffce7fcc78508743dd1e1cf; Thu, 10 Mar 2022 23:48:17 +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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 05/29] IMA: avoid label collisions with stacked LSMs Date: Thu, 10 Mar 2022 15:46:08 -0800 Message-Id: <20220310234632.16194-6-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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 security 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 --- Documentation/ABI/testing/ima_policy | 8 ++++- include/linux/security.h | 14 ++++---- security/integrity/ima/ima_policy.c | 51 ++++++++++++++++++++++++---- security/security.c | 35 +++++++++++++++---- 4 files changed, 89 insertions(+), 19 deletions(-) diff --git a/Documentation/ABI/testing/ima_policy b/Documentation/ABI/testing/ima_policy index 839fab811b18..64863e9d87ea 100644 --- a/Documentation/ABI/testing/ima_policy +++ b/Documentation/ABI/testing/ima_policy @@ -26,7 +26,7 @@ Description: [uid=] [euid=] [gid=] [egid=] [fowner=] [fgroup=]] 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=] [appraise_algos=] [keyrings=] base: @@ -126,6 +126,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 + module 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/include/linux/security.h b/include/linux/security.h index 882e0d50e5e3..1c3bce00f5bc 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -1978,25 +1978,27 @@ static inline void security_audit_rule_free(struct audit_lsm_rules *lsmrules) #ifdef CONFIG_IMA_LSM_RULES #ifdef CONFIG_SECURITY -int ima_filter_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule); -int ima_filter_rule_match(u32 secid, u32 field, u32 op, void *lsmrule); -void ima_filter_rule_free(void *lsmrule); +int ima_filter_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule, + int lsmslot); +int ima_filter_rule_match(u32 secid, u32 field, u32 op, void *lsmrule, + int lsmslot); +void ima_filter_rule_free(void *lsmrule, int lsmslot); #else static inline int ima_filter_rule_init(u32 field, u32 op, char *rulestr, - void **lsmrule) + void **lsmrule, int lsmslot) { return 0; } static inline int ima_filter_rule_match(u32 secid, u32 field, u32 op, - void *lsmrule) + void *lsmrule, int lsmslot) { return 0; } -static inline void ima_filter_rule_free(void *lsmrule) +static inline void ima_filter_rule_free(void *lsmrule, int lsmslot) { } #endif /* CONFIG_SECURITY */ diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c index 320ca80aacab..22952efcc0b0 100644 --- a/security/integrity/ima/ima_policy.c +++ b/security/integrity/ima/ima_policy.c @@ -90,6 +90,7 @@ struct ima_rule_entry { bool (*fgroup_op)(kgid_t cred_gid, kgid_t rule_gid); /* gid_eq(), gid_gt(), gid_lt() */ int pcr; unsigned int allowed_algos; /* bitfield of allowed hash algorithms */ + int which; /* which LSM rule applies to */ struct { void *rule; /* LSM file metadata specific */ char *args_p; /* audit value */ @@ -286,6 +287,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; @@ -357,7 +372,7 @@ static void ima_lsm_free_rule(struct ima_rule_entry *entry) int i; for (i = 0; i < MAX_LSM_RULES; i++) { - ima_filter_rule_free(entry->lsm[i].rule); + ima_filter_rule_free(entry->lsm[i].rule, entry->which); kfree(entry->lsm[i].args_p); } } @@ -408,7 +423,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); + &nentry->lsm[i].rule, + entry->which); if (!nentry->lsm[i].rule) pr_warn("rule for LSM \'%s\' is undefined\n", nentry->lsm[i].args_p); @@ -624,14 +640,16 @@ 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].rule, + rule->which); 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].rule, + rule->which); break; default: break; @@ -1026,7 +1044,7 @@ enum policy_opt { Opt_fowner_lt, Opt_fgroup_lt, Opt_appraise_type, Opt_appraise_flag, Opt_appraise_algos, 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 = { @@ -1074,6 +1092,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} }; @@ -1092,7 +1111,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); + &entry->lsm[lsm_rule].rule, + entry->which); if (!entry->lsm[lsm_rule].rule) { pr_warn("rule for LSM \'%s\' is undefined\n", entry->lsm[lsm_rule].args_p); @@ -1781,6 +1801,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 = result; + result = 0; + break; case Opt_err: ima_log_string(ab, "UNKNOWN", p); result = -EINVAL; @@ -1817,6 +1850,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; @@ -1834,6 +1868,9 @@ ssize_t ima_parse_add_rule(char *rule) INIT_LIST_HEAD(&entry->list); + for (i = 0; i < MAX_LSM_RULES; i++) + entry->which = ima_rules_lsm; + result = ima_parse_rule(p, entry); if (result) { ima_free_rule(entry); @@ -2151,6 +2188,8 @@ 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 >= 0) + seq_printf(m, pt(Opt_lsm), lsm_slot_to_name(entry->which)); rcu_read_unlock(); seq_puts(m, "\n"); return 0; diff --git a/security/security.c b/security/security.c index 03a0af7e9e81..29fc50322b1f 100644 --- a/security/security.c +++ b/security/security.c @@ -2708,19 +2708,42 @@ int security_audit_rule_match(u32 secid, u32 field, u32 op, * The integrity subsystem uses the same hooks as * the audit subsystem. */ -int ima_filter_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule) +int ima_filter_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule, + int lsmslot) { - return call_int_hook(audit_rule_init, 0, field, op, rulestr, lsmrule); + struct security_hook_list *hp; + + hlist_for_each_entry(hp, &security_hook_heads.audit_rule_init, list) + if (hp->lsmid->slot == lsmslot) + return hp->hook.audit_rule_init(field, op, rulestr, + lsmrule); + + return 0; } -void ima_filter_rule_free(void *lsmrule) +void ima_filter_rule_free(void *lsmrule, int lsmslot) { - 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 (hp->lsmid->slot == lsmslot) { + hp->hook.audit_rule_free(lsmrule); + return; + } + } } -int ima_filter_rule_match(u32 secid, u32 field, u32 op, void *lsmrule) +int ima_filter_rule_match(u32 secid, u32 field, u32 op, void *lsmrule, + int lsmslot) { - return call_int_hook(audit_rule_match, 0, secid, field, op, lsmrule); + struct security_hook_list *hp; + + hlist_for_each_entry(hp, &security_hook_heads.audit_rule_match, list) + if (hp->lsmid->slot == lsmslot) + return hp->hook.audit_rule_match(secid, field, op, + lsmrule); + + return 0; } #endif /* CONFIG_IMA_LSM_RULES */ From patchwork Thu Mar 10 23:46:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777048 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6A018C433F5 for ; Thu, 10 Mar 2022 23:50:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344907AbiCJXvC (ORCPT ); Thu, 10 Mar 2022 18:51:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56130 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344890AbiCJXu7 (ORCPT ); Thu, 10 Mar 2022 18:50:59 -0500 Received: from sonic315-27.consmr.mail.ne1.yahoo.com (sonic315-27.consmr.mail.ne1.yahoo.com [66.163.190.153]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9156E19E0B5 for ; Thu, 10 Mar 2022 15:49:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956197; bh=5r8Ggvk44cQdmfQy96U3Kv3d7tWnf2od+pwmkwwRCQ4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=tRXDlLZi0M1tVA0AE/mVJWLBDiTUWdXNsGODgMgld4CUzaXY0cdU4rIB4/rZLc07qyk6V3/trmGsn+z4ORZU8wIbQIRr3GxZKhQLlRpxkWhHkgCMV+MU+16i/4EvZ9GzFUGVlMfM/zG3Y3GFSR8PoT7ShpvOU6iQ8OIC2wcS1cR1tQ1pnoSvNaqS9zpS2JvwaPiIGCCaEWaHYFJASrWyY57Xu2Ny3isqofl/3XnbVziAmdFw53y0qQ7PiSxuiXsdv8dhibBAUN3hBD8xrkbQDKQmmYU83I+5Spz1kRtU514m7SMcV2MWS+2/lHd3lVuApLOrA4vhvxABBb/3w5ETgg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956197; bh=ZuZtQJM5ZOWF+KCh9YmeSoIptBoAn8BYI76+kB+rCee=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=PbEUBJAI2n5kyt8heH3AHdXgOh82kRdCbEqm0j6VNiHN3gHvA3Qi8dcWXf327JyL8OSS4vZYj1L8jCSjOZ8Ky/o800d8r7QzJ/mcdfRhcTIHBgyHIjlrHGjMePUKTZ2QCTCitM37Ttv2kvo97iagSPN8Nb7Zdg9sWZBikInJotdy9orquNuezdX2zzglO8dPE+1vvhwbepLgHBi1OFjxwa8u2qJqawquc4IGEzAuhaa3mXso9j/313CeJG3+1oMbN0NBg7pVCTXVIsELaQUHn+GOrpmDQAOEaiJksm/73par4Z48zLqo04YVZqIf95bnjhXD1E+Ip732g1MieBMflA== X-YMail-OSG: srCp.GAVM1nSx1voT_KacWVz779EhpvX7kRYUJlP4mzuEFomeaSTq_KZvYTk9Ke ImeesSGM62E8R35ce_yP_LcaL.StxA6amcWlEzhrp5UY87pFH3QwYIvS60DSNZHfwi1yXn0lmVnJ 0wCUdbkhT.13qh1d6CLrejSUZ8Vy8WZhYs.EsiTmuQ3tc36AeAZoZpN3bS_DTE7FLOJNlvM9afE6 6_cEsfHUX7l.bBKrS_BSdG3JVElF7pK0oA8zK4h2kFr_7gzavElSXC2u3urOeAMTz37RKQHgf.NV V66LJYL9umsM2bOqDI6CAvzJo2OaBB..VjZZWstyWBN16ecKIT4wUjLHua64HrMGkDrh3X7tZK2y ulNF1Xv9Zn6qoRGSt8l6_.9Mkn8nmgsO.yKiY1fP6LZ4PobOQKG55hc.ysrxxnhBepAuH1sElH.Q 1UqT7.Ts99RJG5s_ctKVKQ0d2pPyKyKHBeQVyWRY6gPNOrvTz5lzEhxS9a8LG9vAojNRROygAbCQ TaiWIbcu23U0ZZbBo15IzVDKb1G6F.uuEQ1Y9FC1UD4uQxJFqJbic9huNwoiV5naNpr1DpX_wis7 6DaOHF2eIU7vPS3f1ftMyhYf7xPoogXJNLsGkr6poIDtwwIvQmt5V6lrI654sPh0WDqnHGEvCJB4 oAsbZbnQqWJSJuwIVlzOkqiQ97oFmirkibD8M6FzVNTKH2xyboc2fAkWUm7TuocM_xJet3F4v3in o3AMyIfYojPsgsM_3CUH6SZzXLkgyX0M6MM1.x57mgvJYF2j5fp4tiaKpRSDyV_KOZW4VS4u4QUV qkneoQ5TNMtmEFlt4nBOO4DTPxSTju.K7YxBFES8NcOtkuWi1S2AtXU8GAWvrWaa1diOB96T3rE9 DUw6X94uM2QHByYGRptCx70DSsqUSzwJCpkMYMrk3NBCKAppBvaFfSIH4vEv6LqQXB8xBfwi0zYk 0KqKFYlzS4XBdZb_RqH1_M2dtnTn3XaXEttreUEEJuuorkCsRO.xZuP2HGCIutDugQ68abPM2zjw 04Ym.NkWFKAN8u38..UPyp50Uy8OjUCb4G7aFTLs_3_RXuEr8CLzeCHkf_AUj_wV_ixhelVAdYdH 421iiib_7u.UBAlq.zEwCC_xP46HZaEXggJBgiVxJ.6A92TFf3rLwmkI0zQdqji19oPrJX1vQK8h 0eKdu5oKVuY7eIK0u_lG7E8w8nGXAGktmh.XiCnE_OK_83Em7gaAvimtO0lNauCEgf5qhag7K614 VClhd6HWyFvXKp0WyxwKN13GSYp.txb.IoN8gA46y8mYA.HHHzHeiTtRVl2hX4FlBkoqNaEqojqt H2linAEc5Ne_9X6jl3y9r0GLYeAfico.0K1QjWkE6cdLLQRURojtEB36KZinURAPiYLUzTlP_Nec MR.6YZ_KiPxt87zhC9vmkh_LbJaCHv7gEoRUSoJSD9BLlj68LnsIvcDyVfOHXMeMm4qzYAdPWRPR ArI_OGNu93DLw9SVFj7rr8hMShW0Gyf4RKHMR33eIQjw674BVmgdWcbv4gK.pX3geB3zAdzvLdti FyygtOSpU_.QZyFvtw4NMqiXKb8fg8FWnu3KplNGCO8W8jdWz.ug8Gf2K5QbIAUgaNQluPIOu_NM x0PXTc0sNJso9FY3UztENfvmnUjbZ1ftGYPHXRLI_9uYn0lQlXJCX1y7U3hqnd0deJzJV6T47gda Nvt_PRvoOcJWpb8kNl.dsFgJ_GAC9fgMkYH6GLnhAiVT2fk5H30_FrpIZ0bTo8PMqYd.l8unW4MI Ak7VwIQkUDfRCsAm2b8d6gk7GmJs9r3Z1NbHIob7Y02VRnIXdOQjCy92MVw82ABFbzYJUm5aDK4V tBhr50fWBogppEE6ZecsOBeXacZBHFBpMAKoCu8LNRJtYjVtZjDy4NogJbjTF.lHqmlsXcBBSZZf oGUKzQ4dhQEfsiYFEm3G2PtJVhmQkifLSAOSZZKTMsK2LAJIlzdDnSPBm_aqHBBIuC5mn0ev9La3 EfIiOY81rVvfb7zOozO01WNedZjRvKgrnKeJaveBykuUDDUTHI0jalGliaMgCSiTB9808kqgjc13 xj2ejMJ8WCf2a5IgzjueVHj2lUJ57WgOwoTPvz479o1x5LQ2tExKTg6m2lG.G8uKNUNhDlCixOPS h9BCdhpPswmMWnLbsAs.3brRgBSE2XwcsrjvpWXxXOGlX_08aaXyV2MwFekMNgtobWgwNUKCmeSy GRJOnZC8HmOl_4Yxi4cydcz_ezKh.ZCLHYRsV.Re_zgRgeU8pAp.cx6EL9Fao5usf22A0_B0cINX PIxB.qgrXCbhHxZpUS8yKuq8ufA-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic315.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:49:57 +0000 Received: by kubenode513.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 50d9cd6aba58fa399bba8dff0c177f96; Thu, 10 Mar 2022 23:49:51 +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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 06/29] LSM: Use lsmblob in security_audit_rule_match Date: Thu, 10 Mar 2022 15:46:09 -0800 Message-Id: <20220310234632.16194-7-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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. Signed-off-by: Casey Schaufler Acked-by: Paul Moore Cc: linux-audit@redhat.com --- include/linux/security.h | 5 +++-- kernel/auditfilter.c | 6 ++++-- kernel/auditsc.c | 16 +++++++++++----- security/security.c | 5 +++-- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/include/linux/security.h b/include/linux/security.h index 1c3bce00f5bc..d02af9b77f8c 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -1947,7 +1947,7 @@ static inline int security_key_getsecurity(struct key *key, char **_buffer) int security_audit_rule_init(u32 field, u32 op, char *rulestr, struct audit_lsm_rules *lsmrules); int security_audit_rule_known(struct audit_krule *krule); -int security_audit_rule_match(u32 secid, u32 field, u32 op, +int security_audit_rule_match(struct lsmblob *blob, u32 field, u32 op, struct audit_lsm_rules *lsmrules); void security_audit_rule_free(struct audit_lsm_rules *lsmrules); @@ -1964,7 +1964,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, +static inline int security_audit_rule_match(struct lsmblob *blob, + u32 field, u32 op, struct audit_lsm_rules *lsmrules) { return 0; diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index de75bd6ad866..15cd4fe35e9c 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c @@ -1337,6 +1337,7 @@ 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]; + struct lsmblob blob; pid_t pid; u32 sid; @@ -1369,8 +1370,9 @@ int audit_filter(int msgtype, unsigned int listtype) case AUDIT_SUBJ_CLR: if (f->lsm_str) { security_current_getsecid_subj(&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 f1c26a322f9d..e5ca89160b5f 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -468,6 +468,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; if (ctx && rule->prio <= ctx->prio) @@ -678,8 +679,10 @@ static int audit_filter_rules(struct task_struct *tsk, security_current_getsecid_subj(&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: @@ -692,15 +695,17 @@ static int audit_filter_rules(struct task_struct *tsk, if (f->lsm_str) { /* 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, n->osid); if (security_audit_rule_match( - n->osid, f->type, f->op, + &blob, f->type, f->op, &f->lsm_rules)) { ++result; break; @@ -710,7 +715,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/security.c b/security/security.c index 29fc50322b1f..5b2dc867c57d 100644 --- a/security/security.c +++ b/security/security.c @@ -2683,7 +2683,7 @@ void security_audit_rule_free(struct audit_lsm_rules *lsmrules) } } -int security_audit_rule_match(u32 secid, u32 field, u32 op, +int security_audit_rule_match(struct lsmblob *blob, u32 field, u32 op, struct audit_lsm_rules *lsmrules) { struct security_hook_list *hp; @@ -2694,7 +2694,8 @@ int security_audit_rule_match(u32 secid, u32 field, u32 op, continue; if (lsmrules->rule[hp->lsmid->slot] == NULL) continue; - rc = hp->hook.audit_rule_match(secid, field, op, + rc = hp->hook.audit_rule_match(blob->secid[hp->lsmid->slot], + field, op, &lsmrules->rule[hp->lsmid->slot]); if (rc) return rc; From patchwork Thu Mar 10 23:46:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777047 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4D475C433FE for ; Thu, 10 Mar 2022 23:49:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344532AbiCJXu6 (ORCPT ); Thu, 10 Mar 2022 18:50:58 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56008 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242283AbiCJXu5 (ORCPT ); Thu, 10 Mar 2022 18:50:57 -0500 Received: from sonic304-28.consmr.mail.ne1.yahoo.com (sonic304-28.consmr.mail.ne1.yahoo.com [66.163.191.154]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A23719E0B5 for ; Thu, 10 Mar 2022 15:49:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956195; bh=LFedpjKaSHoLpI6CM7sE9P2ATDJzUAMQYIYdkGRF0a8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=GrIqbMABGW5AMvuUWhab8mCJxdXRaDGWBd5OQ9juELVyIC4nra9uxdYcNZn3kF5j5MIw0RAZEP2wM0dvESRfAeHG0YxfE58PMgCDj+KK/Kpo/0KSJzj3tRz8kKCWeFm8f1ktiwgxiFAUdbXq5QIh1gA9kbcBM8gLlHLTAg8Pih8f79CazGn5BJ1Z2h2GJioWPB8qtMusn6OKBEcGmYhhx9Q2qvHOW3kSnZaDuvgjlsrBHOs++7shlVZNUtUqbnRv8YuRTUSzVlHEkaoO59/cxGFFyWfbX7bxTECXPTAgrsSbmCMDdFDbGjFCKTeVvUV5KwdA/ye1GDJxEMOaVTlILg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956195; bh=5nAvq/RdhPCEPK0CjkIQZsaHQfrv+ZNYhvNSyVVOhrj=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=p2vD8n+K+yhWojAgE8BUDoz6XAdtlWKWH3uLkXAVZYQvyCjjl4fs6VaCFhL9qWJ+HRgviLinCmHH5WRHH7s1mLCI3BaBO2eLWpu7TeYmT4JBiZ1GYkuXJ/gva/xS06dsHdOM90nqYn7CD3171sJc0CIi9oQdrxm6JPE4K1MhI45cUbhyIzCwHK/a0GPPQq6GKqjE+b0O5sYXaXzeAYoYZpHcK8IV52r7ShqSYZ8zTgl3OkFprC9pX4V4uoBQNN1U7gcOw9K1BFJktpyjwsl9f+e+V7VUjVNaa+kdY8aVwj+t+ik78F9asntArcDfLm0JVIPCWKDBtDVWvhboletRfw== X-YMail-OSG: aY_cSn4VM1k_CnMMAskjMyc_BEBKPijOEtkYGBetFihT62nEsI6UVz9MDPcEGWb AmLy18H8.r6S0UrPiudwzkt1U8f55txr2rTgHFq3pNgbHU6_sQayl7V5htoYmp8ZZkyAXQ4mdF3j kYDYeem.svny47kHO60jl11wel9SJix5BBBXN.Namdv6.Qdw5HTXS86FcF1dzHemaR9umxZ3C6FH O.y5vhpdtnHWQJ1K2zg446N3.CSkCnraEA8zDQAs5y_9IsVXSoVYAvpib3cnxQd0bif2wyWsa1yx SsB.FqMVBPnPeIEhIR7fxfz5Hn05oFDdzChTD.cQZSwEhyd6kF.crbv5fsrvOkOfo7FXCTlm74xu tX2yHNE39CazyuBD3WR4gKSDGK8nBwSkGg0N86jqHbufveFUbnCFlv9ksLQKJOnf7Fla3Da05aNw w0VDVX84aF1Fg1d5cpdn_3wGD8grCDPq7Dy5pyeAcne8MMYX60uy0TvLjuqLfiW7VsgUPB3RqTJ4 o39omOIgti_06qYKKcfpFWMA3kXwZCn9K36pQlnWkE1itF62aYifySq451j3_BesNj.nD0lDDnNG ml4MRO83Tq35YplBYmcl9vDFcIHRNYxyuojFqOIDSOQRfKFcP8s6SAr7rq_AiQx20lewDB2vbhh0 xAFe8PBQyAI3r8TDuZDV0VxeAyOezf9dn1olmIAMgRlS5wDt2ucxiTWz3pL_hoVZdGDLqdHjRM2q .DmNDX.LHvlM5NXcvpqqOOMz4Ta3YJmJEqINla6xfl_JzoQ0N2UVfR.CqkdFO9QV1XqIFz_Ln9sy tthUtPgC91zTAWwQ6bRk69s9GxCRZ4M1d.WjH_d_hxoLn1lJDo_xoiXL7VD2DmflWKxOdFZixOp0 2XbROkRk0QGEKprzQ7s2SPEpsHdRlBnuXl2YPYpVJjlz2ujdqjm0tjBK62HlP6Kb7IuHTPD1Imvv swpHIi9gqOWKyXG5xOaB.tpuL22ZYhyMSF0mXeuGvWDDxgFWJhEgo4aprKldEg5c4XWBehXuId1z POaF2h321PPnFDZ3yvZop_FhytGHOKJbrHMQswHtbetyGY4DDdtIQ3Ue2dMuIEv.YAZZMtFNumdy wy1UOnLnxk46hhL2dOFuKW26fPJhpBeYTOkzgX6YrQfUwW1tQ3GDA8Yyta0BNnCoLpiyMk8czEH3 aO1ZrVIztjiJQy.xGPSM6ZjinXfcTKTrKLJJxZBjeoh61xxtrP11hRBVDkqsIEuj5BtZZuW_Y3KH SaI4fpWcriM.yRMOEe2VJFQ0bLGEetaLQ6qvkFMJwvGdlQ4XaqRtYv2HKa8oAIyPVajlW_CagZBJ pum_a8NI0xkgEBYShmDxMoaiz2LZn0Tqs7Jegm17hCAOb.FlWtEoa2dIbZIe6g32pK_mDYns1wMV BdwnLIf8c4VQbRvLiQjBWQ4_VOXw5wRbdGngU.KxSXEsTnox5CP.IOpSuKfN3eUhFRvNGLidlmtV JbddzIpjf4EeCL0WQaJjCR0.UQ2aOBs4WCGOmVmUYYj7qVM0xUWMFO83SJb2fQkfMYMSKMYdzjxh QRka_1fl6coGK39jLYWQoAmjWcjZ3EPPj_FjbO3ZjM8rWLidPVDqGNjemyRHA6GSTQDbsDZVgjrw lvgPGCPcLxBD22C4hHVysqwNBb4vg7DrpxHWPFTpq.VnM0by2RoI5RclShT_ICrpd8BFyOeSC8iF zsMavvUED0mmMIzFlThWJNeUSYSQWU9X2Xon.JmKkW3Q5Utf81PlEsEZw0OGfMyFfKRmCeR2Zyje RYYyp0JwOxFp6pt97qfJWcd0NBSmd0UZTHU12.jvej86.6sS.jUvxBd0fBWt1_bZlwgQ3MwhWOZ0 9MGUXuTNduqCk16mmmbDMuLLHqlEV6ebJWPTpEkO_oXWJQWwTb6gfOVDJYLTKZk2TxqSn5_39vCR z2aHiXi5E2HnP6R5pEdIgy5VfES7lqg_XxOtpQ3ApyzaMV8sUlzXcs5LusAVCwhyy9Lzrbwj2Jdx _nATph.LRiahhPAslSrAunCIMXSvVqVQqmeID4xJS7E630drY5cBq2bKFpmAzYbY904ewwooLS3c AS5XqcUVbpZe953u0mVSgZY_McnK3pndwiA2_4OnTqDhlN3WCSLw83Mnw98myizE9JhzYeZA.3Nt xZvAn0BHIxjF6fHuem6ugiBPcAG6DXiG2BDyojJbXzJo9S.lVHdTJrQ7j2F6FcTwZ.c34WX6DX8g Y0Zz09hdwFi6R8hlL3eoYXEWjdNc7jew37No_pNjKGENsym7S2Q-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic304.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:49:55 +0000 Received: by kubenode513.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 50d9cd6aba58fa399bba8dff0c177f96; Thu, 10 Mar 2022 23:49: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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 07/29] LSM: Use lsmblob in security_kernel_act_as Date: Thu, 10 Mar 2022 15:46:10 -0800 Message-Id: <20220310234632.16194-8-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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 fcbc6885cc09..eb02e8514239 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 @@ -165,7 +166,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 d02af9b77f8c..4ce8dbeb3dad 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -463,7 +463,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); @@ -1105,7 +1105,8 @@ static inline void security_cred_getsecid(const struct cred *c, u32 *secid) *secid = 0; } -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 473d17c431f3..e5e41bd4efc3 100644 --- a/kernel/cred.c +++ b/kernel/cred.c @@ -772,14 +772,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); @@ -795,6 +795,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; @@ -802,7 +803,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 5b2dc867c57d..2178235529eb 100644 --- a/security/security.c +++ b/security/security.c @@ -1803,9 +1803,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 Mar 10 23:46:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777049 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F3DA5C4332F for ; Thu, 10 Mar 2022 23:50:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344911AbiCJXvC (ORCPT ); Thu, 10 Mar 2022 18:51:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56318 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244700AbiCJXvB (ORCPT ); Thu, 10 Mar 2022 18:51:01 -0500 Received: from sonic308-16.consmr.mail.ne1.yahoo.com (sonic308-16.consmr.mail.ne1.yahoo.com [66.163.187.39]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CAB7919E718 for ; Thu, 10 Mar 2022 15:49:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956197; bh=dD4riyUphI61MKz1/wBuwyC+7Ex6yvPbDhq41i61veY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=QThjFjN80mEdYmisy4P7a7sgOfvIPUWTYFiM3ewpoMem2ECAkpap+S5FmmDterBVCU+HvH4RJZNaudZxH41fAcqz+f6I52OlsTDfKNyY/gb5P5rbVXXRcPDOuHhYIHOxSQhRGVc/C7OaBxaFSySagzjZ7GJXI5dFSLm2rhqaNlS+RZzMLime25uZ0saxbnT/CEQdigMWPmJCZzUP98BsQE6SJW1VCzjB4tNXTa0SPQD5NRGLx5EAMS+5NXclhDXm5o/tDkIgckl+G1gDL4SV/IRMhZ5fg4iOtoM9pJAHXu1xIOeyGJNJkrBGD6PfSCZp1NIVsOZis95n+xJlZhqIuA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956197; bh=k/MHUkF7nZzr/IX6mQB/CPPVrw+Hx5E7Aafr0bHaNSG=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=PFP+dABbkyNNJjycq56XGJoXPUzZHjGtWzKB3nfR3DB1Ul0hDzz48bswHpWwAcoTaaRswnuzy3AzMTpgJJJLKuKdaJv01hfgXopSpc9vijT6rAbS4N/bPR4JGdean2VMSQb4fr3XzsvEhAKSXKTAYDWwwN1nEv8DxHSeBwpwNN953bLqmImWMe/0BMwrmszIbxjmWa60bxikj2qTDohydvNJW3Rv95IMW/dJGkYuYj4iTJNBmoY2bMzhtM6o9pe/1bsm3NI3piPayxiCyNgtCCTtnuGdj6NLp+yztsB6bqVtwhpESx3gFjItDOz4Th7jIAEV7YusN44GNT2YumDliA== X-YMail-OSG: aIh5iRUVM1kaa1xGkZfV2uqxqGFltVtPrLvpXymvY7Z0vf_EUGtRwGYiNanfAvR dblG2RK1OPl4dQ9VAbkGM3P0F3KwV957jB8PQgDg5ZjU3SNU2CD_8jKp7dVkXU6EaQfRdTSgsIW. Jul6.OY0Mhh58wSxLDhozBt0Ktu8jMOeTayrp_gtoYwvr4F5F77dVSW16oQBJk9GymkgPWvef0RA 3HaZrk3ubMGGrEmgUTroPFt93KULsr2jkWVEXfGKv1qYlzLOYKBTt0J8Qm7gx3WpSvYhcB218cuK FixnHb.p2eMSpW0z4H_LtJIc64ftkTRTUoa9ZCBWO8bs8lsZvV1Eaqmpi1UbnL7p4SajxFI5hyGq DRXoVwJ9l2tMNSATSgUBx9Df6p.usQdYANo4fXOFBrRwfxNziDJ0e9fSyZXenSKaRSwfUhFg2FUa th521cWUcf8Yb9UFFFzKYdg.s0O9fq2J9PaiqVJXpVi1T0_txvUIFseRtCVTz13W35417DxvmDmn ghY1yEH_bq_bRNDDzDJb74RGi8yIVwaF7IeLFBW4LCgpLa6P8gH.C29CBTSW2OlCAz3oiQubEsd5 KRRyxruW9RQ3g3La3ypgRMPx.m7_C_gZtpaoXHYZoHkTA6p3OVqovlWwErknP4Vd8TTV5veUFNy. IK4V7ouDdihDNC.1Udfu35feBAtwqWdJqv7V.33iT1idVE2blKHJlC80Vzd.1Q73z.l2C69djQdr lkcJed5cMWDGc2U5Day9PcaL5qfpGUWx6d_NxOW.bp1QnFAphd7dfr.g.Z00ZEG6wj.ZZbb.AAI4 m_VUYp0M.GwOYP78pwd3W89lcH81hdIWryKw5Od3irbugdeXqBJsvR70zBMD1BSXbx4ytAl03UAh VZhYgQlzvKzCwAnj3hz.go96bYuN8eSz3xnkBM962epjHkMq.jkWejv92kGV1RkbsZU9D4ydLuYn jRdlyt7KbMHQMZR509WN1a4dtY8FKc643Hnnk3.pCVwe04hcSlX_8RsIJrrF5WCKX7Fva9oLo3p1 bbzsy675vxV0BdSdcgbtQBat15QdHo_B5sBKhZzuU7NWiVIel4uLTIHSvdhokwTY7V6Qpw_gXBYp sCKurycQ0ZGOcYfBMHwxkF15yu6TYoqf5izJFz_a6t45fI.2qaArF5VfASGHmFMfwBiqMIkMj3BS kUr8jBAeDQZV.sGVAju82BZS_Lf04vAZVBMTvKy_XfF2S9GanIUZABOywwINGSa2cjN7xI3t_urw gxFjdlpY9VNBHujEeSOM62.wUezGosIQWtBr4N.K0D1MemXbyjOcmkrAELwQIE33aU_ujOw.fP2i 6pb9.WDfPSA_iG9dsCPw8vVHhPLHpXwRPomXfVOC1XGnWdmUlQrfYSjbZodD4xnZK5k80ymf4g1e rkH2GCjgnXRcUEVP3q_6suj9pCN1CqV84tHhtVCGEmalwaBBR3WArZwOgezWAskYe0_23LnrEZvw VCdbSL0vZBTdzRJ7b.pqWEnrm9mHF9i1yGMehlJIVwlUi16mwVh25S10IJKZRlqM1VEaJilqRnjq U1P2ZZIx1ER.DU9mLGcd5JZK8t2bTi.tLj2Jdo.EOM7xrmbOwrHAU4CXH5LYJFz2cF2.RgrIbXOX EbZt1qWupTQFsqSzcAfhnlToMSWKiws1u.0TlyNYAZMGEM.0OyuzLycqa7BKsU5M4kuNeJsTH7XX xjNe2nRPxAcIOw2du4qcSOT_1tGoSG_l6OvVU7SM6ZtDw9RCvjxXd94YMiAUsv6lJfFWJN0JGvhw IBZsiLKeN1..phVqXLfb5ZnE7YrdNUdLiBOONKrp4Q7wSLcFWbLFrqDvmKtssiwB9MoZamKW1L8K 1HSZ6rtMcIfiK4NhEjWwfYvsNtk4BZMPaozDNTiN_aGkIrhSewRnCKYa146C4.yjtrxowxryOntw s1wMgXShmjH3_RHMsU04dCgoE0NtqzyuNQUYmBgt8LMNur9wrRUb9IZDy2Hl1S.a9j35VRQqcqj7 UfkohlHEU4HDWzJhtstdJuXmpYAcPjtB0OuYFa_mNj9_OaHNmVpo.QaI61KgHXJIMBxBk8k8Z7io oBT_JVyLnqBrUeRVMZDYeNWbO6GadL0xLZQFDFr42N9Kyyr5y3Ve2UMM5WsCYr5d_rUZzfBzsezH 1svj2eaKZceD5vOb3_wCZ9H4Uf3sx5w885FvPD3mgqYliVBjSTINCXtc_Sn4mYI9XI0SRfHTmURS in7ZL1EWrf3mUfVZ7nYlxXovSznYoD4PuU_EqsHhr6SeKH2P1hnhU2BMuPc1U_LiQHRp54iSjj7G 4UQ-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:49:57 +0000 Received: by kubenode513.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 50d9cd6aba58fa399bba8dff0c177f96; Thu, 10 Mar 2022 23:49:53 +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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, netfilter-devel@vger.kernel.org Subject: [PATCH v33 08/29] LSM: Use lsmblob in security_secctx_to_secid Date: Thu, 10 Mar 2022 15:46:11 -0800 Message-Id: <20220310234632.16194-9-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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. Acked-by: Paul Moore Reviewed-by: Kees Cook Signed-off-by: Casey Schaufler Cc: netdev@vger.kernel.org Cc: netfilter-devel@vger.kernel.org To: Pablo Neira Ayuso --- 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 4ce8dbeb3dad..231b76d5567e 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -199,6 +199,27 @@ static inline bool lsmblob_equal(const struct lsmblob *bloba, 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); @@ -529,7 +550,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); @@ -1384,7 +1406,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 e5e41bd4efc3..a112ea708b6e 100644 --- a/kernel/cred.c +++ b/kernel/cred.c @@ -796,14 +796,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 5ab4df56c945..6763188169a3 100644 --- a/net/netfilter/nft_meta.c +++ b/net/netfilter/nft_meta.c @@ -861,21 +861,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 8490e46359ae..f3e2cde76919 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c @@ -880,7 +880,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 @@ -904,13 +904,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); } /** @@ -931,7 +936,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 @@ -953,13 +958,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 2178235529eb..0fc75d355e9d 100644 --- a/security/security.c +++ b/security/security.c @@ -2198,10 +2198,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); @@ -2352,10 +2364,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 Mar 10 23:46:12 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777050 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6FCE2C433EF for ; Thu, 10 Mar 2022 23:51:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344563AbiCJXwf (ORCPT ); Thu, 10 Mar 2022 18:52:35 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60656 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242092AbiCJXwf (ORCPT ); Thu, 10 Mar 2022 18:52:35 -0500 Received: from sonic315-27.consmr.mail.ne1.yahoo.com (sonic315-27.consmr.mail.ne1.yahoo.com [66.163.190.153]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B176919E727 for ; Thu, 10 Mar 2022 15:51:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956292; bh=8xc7JSiuXl9qWs0czVcQ7nyJb4RJhDbN4yyU2JfWl3c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=pzZYv2V3i7VoIzsV53iYLes78CISc5mFmvDlkTj9FOcXes9iS7a8hEl7UJX3Xl4G42eiKj94wyYHCnyXOCkTPZyzCVVIy8I0Fs86c5WuIkEenBPMtepPj6HRyTD4NxWDFKSQp7wHEPllfQa0IRWSTjAzn6JUeK/1A+24WVGGcaGPAyHfAzVvbAZ6cnj/LVOexH9CjbetEiEdgF8QzhIyj6/1xhqSUoOLoIOSnzMF7LPlcgdzVy2ufuDIlOVYeM6W7Q57y+FfeTuRbygZn+3ASYaLzelutcOGiYx5UyK70ycbnh77AWDwxtHujG3kfeSxSynVhZa/NoKatRYV54XH0g== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956292; bh=s9hSTqw/CAvCx5SfSOhKyunEVtemBjWEbvUoGtXZZA1=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=VCG2/LhouSgeEhhFALCBr63XHLX+1nfEgltel5yin0BWvaRLs4Man4wveybXFZfFDfnMRnJrCRnmVEVj0VhN6Z7OS8LqFiLv673siMSHUhxOn6yDyMcukzUFls8YoVOCEp5ZfsURxgfIFKeZNnRuGvYJpNBL8efo0nMNATpTdj5XG8oh/pm9XoKf2Qe2vrYcZwdja+vL7dBmYQ0YGDDlho9IidYpqEi5QfL33LWUWdK45gPd32IGH9Z9WaOHG3pL+zUwgBQYgJEii1ekGOv/hSkmb3u2GKVtkhBbhIFcpVVT6KpzHeV2e3uu4HGE/3PPfD2c6GZqcT5nCdrk4WptDQ== X-YMail-OSG: YTm5QsMVM1ly5QPcdXPadoYmYmR2_JDMAKehcRlfz8p5IfQEztPJ8Lmm2vUYDsd qWSj89XuObMtWeQM9botjHt7jLTWcocOoZncncqG3owtwLlOrNTUZoK6FzXaAyrrtZYQ84h0uz0V 5WDgZq2anw_90GYEKw3d6hqyzeC751mTPHk52F6OAFIEOhsLMw4fVfzY7ouIj2bi6o0YZJxFUm3F GKmOX1TBmXvfRE10Sy67Af9QbeVOKZLet61sc0CCm7zjlKbU62PNAcdpOyxGfRxhckS9sreomj8S 3fBUCabtsfG8pUWH2SDzbjt6Rt_rClp90zIBsz08vOyKDtVu5JsBag2qAeZVrzhe5yV0ekPzkzu1 YjdAuluCZnGggjgt1Tmp_wN76DTAvoD8FNICRAEA3RHJyfsZFqFa9rr1sfPRwPGanVq.AmtL1tH_ 6W3y9Hsrob.L8GuLTLDPqUi9lmzl3nLDBz1go4s8Z_HuNm_sOwlRmr86MklwtUx15VZqZxUMyB6A q1IKRmD8Hc8vh85t.bNXnxRfNWfoAiB_Sh7A.ITM5l7htWdmEjvmucacnRrL22ig4eVkkH4HKehL 8ZbXSXiF63HoxE1xaXjmyhOhUdKlj.ZGlArzQ06kjPXszOFX30Pm9Q6hNvYVQv4QS8HA81ulFqC4 fZJ7cJ6CpM_vO5hFinPlHP_JNWgfuo5H3ye92xpRS.FoDjdvagbJ4ZX4U8Ay0eAHk7cWlJ30Cxcg 8Ko_DhZt_q53I0zicbahwI0VBxEXYqDKepApqwKC3By5F4KkMe9jxxgLfRTYKuoGYXvfgVBcioqk d6Dw_oivCWmEi9VP6fsZg8HKRuiLf4ew9tXtaFqQfeNmCm_8o7PZDulQoks88EpmRha5.fsZi1KS ZMFWIWm4KH4HMI9qWdqh61P0.VsoXq5g9ac2ouoSb61GvlbVpvZUjj9letNO2tDcNr9udItzkCEe W_YqR0q9v5Z46J0dhXvF4wwhV_brGalx_mzbUkVJjWsuUOR_NUb7rDrQtX_6AQo4rlALZpBBmaqy lsVBEsUgvoax_94jToxgOSTRe_vnmX5YGtdtUb6Q4b679MOx0KS4FkdAJKZUBfEbSP9VqvqAo3zn fD1gVj2KzyWNRDt6cHjPljC4Jg_EPGa8plXjO8oHegz0_mMwa.TWPnr9tFVFuYGfkVH8qaafYYiQ SfPHPo5up0pDdvZiZGVaWuGUdGt7BAEjsPiVBka9VM_RbVPxfmA_NIdsQg95yeME9elMc9DHK7Me dNyu99EE7s1onShDs8E1MTchtLzenBfUvlx_8g1VVjvbMxMIwYa0b1Xpyh9JACtLydstzq_2Aqo3 pgykU.rvuQ7C0Pxm1B_ZY82DpZQ9Pmv.ec93MOUDY91SD4I98Rfp5T3SB4Z6twJOHyM9_RWzgJBK sbVUBeHFYHA1Tu8aUJC4vtvhoS7oYqkWTG3aguutI8IJcsiJc8xQk5NXBt_uveCuq9QNnDqX06Rd mvnzNj_e20LgKXyf5Jf2GuKs7mguWp4gjzI7aLfvGz_JGsU7wSfLU.TKuuVnliNza0RCTsBaQvMM d07vWRBDj.9W3X9vBaNOr240guLpv1goimhH0Et1WQQTgiRqIG_7EKYIh01DWLIQjaYpERnUcUOt hgpX0nYHYWhzFpPyFnAY5L3IkW_HSY7IVKQy19K379W8KqHBQKtotI8WApJ0O3xZIMbdvkrHC4Ur Yz.8npOHIZDHOvSWK4QQ8UioP5RRE9psKH.nfjZGiTEbhhuK0i_PK._r1EUwfYqublxMTomQWeX. 5dHXTPFTIyF1V6Ff81Vs_25uTYJfjUIGBA0t.7UBwf3C_za2C.fkaZuIj1AsAaSerfaMOycunzf3 w0D8bpVnudVggNFI5pTtiPh_t8_u1qM7TZ7iZ_UeTynVOFA4Xi_6T_UNUoOU1te6ogGPyWuoS_Px FjX.qJXHJ7M_OYfYIkTI9BMaaMEicJ.XpmIcQEIQNtmuWhoa5u268P0O.7mOLBwongGJODz.2cWk PlqiOQMm.JGoRf_ftFc4q.epm4zgAD_OcDqJJonFU5MRpjU_K8vlgwkhQbHvpfyZtm8FhF8zeM9R kZXwqgxYVedSVyp..xctMyDg8jLr6EZVz6YSM1OvnKZqIjcSq6s8ztX9A4clebdDq8ynd.YFd9DD JOfYBjgL3KOuySt4Y7JmShovJ7VV973efajI0_Ng2aGdDAyg9DKhwePhCVqzsMdyVWzUj8SSxO4t v24jvSMmJ15LSratts_Cz0LRV_h6YoqXdGk0H.RkTBSEaxs4X9gko71SymZzg.aSlxRRDrE7O1Fg P.NONQMTj2u.0CH.ctxPSnBYOFj4WGZJ1Qp.Opaouiu3mhRYXy4Z4uutP X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic315.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:51:32 +0000 Received: by kubenode514.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 02d0d7342d647b4cf843030be84eedee; Thu, 10 Mar 2022 23:51: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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, netfilter-devel@vger.kernel.org Subject: [PATCH v33 09/29] LSM: Use lsmblob in security_secid_to_secctx Date: Thu, 10 Mar 2022 15:46:12 -0800 Message-Id: <20220310234632.16194-10-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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. Acked-by: Paul Moore Reviewed-by: Kees Cook 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 --- drivers/android/binder.c | 12 +++++++++- include/linux/security.h | 5 +++-- include/net/scm.h | 7 +++++- kernel/audit.c | 21 +++++++++++++++-- kernel/auditsc.c | 27 ++++++++++++++++++---- 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 8351c5638880..381a4fddd4a5 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -2981,10 +2981,20 @@ 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; security_cred_getsecid(proc->cred, &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 231b76d5567e..a104ec0759c2 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -549,7 +549,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); @@ -1399,7 +1399,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 e4bbe2c70c26..40d8cb824eae 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -1440,7 +1440,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; } @@ -2146,12 +2155,20 @@ int audit_log_task_context(struct audit_buffer *ab) unsigned len; int error; u32 sid; + struct lsmblob blob; security_current_getsecid_subj(&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 e5ca89160b5f..5edb16cb12e0 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -679,6 +679,13 @@ static int audit_filter_rules(struct task_struct *tsk, security_current_getsecid_subj(&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, @@ -695,6 +702,13 @@ static int audit_filter_rules(struct task_struct *tsk, if (f->lsm_str) { /* 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, @@ -1118,6 +1132,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) @@ -1127,7 +1142,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 { @@ -1371,8 +1387,10 @@ static void show_special(struct audit_context *context, int *call_panic) if (osid) { char *ctx = NULL; u32 len; + struct lsmblob blob; - if (security_secid_to_secctx(osid, &ctx, &len)) { + lsmblob_init(&blob, osid); + if (security_secid_to_secctx(&blob, &ctx, &len)) { audit_log_format(ab, " osid=%u", osid); *call_panic = 1; } else { @@ -1533,9 +1551,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 445a9ecaefa1..933a8f94f93a 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 ac438370f94a..073510c94b56 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -341,8 +341,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; @@ -650,8 +655,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 3e1afd10a9b6..bba3a66f5636 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c @@ -178,8 +178,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 ea2d9c2a44cf..a9f7c9418ad3 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 f3e2cde76919..0a99663e6edb 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, @@ -493,8 +499,13 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, (dev != NULL ? dev->name : NULL), addr->s_addr, mask->s_addr); 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); @@ -536,6 +547,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); @@ -553,8 +565,13 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, (dev != NULL ? dev->name : NULL), addr, mask); 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); @@ -1080,6 +1097,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, @@ -1134,7 +1152,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 0fc75d355e9d..ffdd366d2098 100644 --- a/security/security.c +++ b/security/security.c @@ -2179,17 +2179,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 Mar 10 23:46:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777051 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2DDEAC4332F for ; Thu, 10 Mar 2022 23:51:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344947AbiCJXwg (ORCPT ); Thu, 10 Mar 2022 18:52:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60684 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245226AbiCJXwg (ORCPT ); Thu, 10 Mar 2022 18:52:36 -0500 Received: from sonic315-27.consmr.mail.ne1.yahoo.com (sonic315-27.consmr.mail.ne1.yahoo.com [66.163.190.153]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C99E619E732 for ; Thu, 10 Mar 2022 15:51:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956292; bh=j5PSxx7pxMuUob08WR476BkBCAlorDOEyvyzPeGaYoA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=iTdfDZ8eI4pr+BhOrRpsZKPRbRKowKfHlxXR7D1YDdYl4tgmNhj+4b7h/oIOBYq5MFQXg650eV6zg+pF3GD56NEH0VGkz0RDBnX7d4Rwffbj3AXugKqhPUnpKaI1MlmdE1MElEPSJxggGBjx+H0bXd6q1AuspdSz7ZZfhEuNvCWw7GiVCKft0K40zPcmFiNtC00ZDA9VZEHD+zQstdG73NkAZiuOX5rc1jGLiHlBz+mv2mJlv+huGp1Gm7DABHtOTm7V38kccapJgkJDJuBqrFb0qnp2Rf0G2H6nmu5CbQYWwysjQC+NbIzjunW3uknmFqlpPTdJ+Co78HY2MnDWTw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956292; bh=DptinqG2ColU012LyJkUEyjlm8zZSqkDFpan41FTMsY=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=X656Ei2rV5uPy4DNbOhu99IUXqSqXhgmHfXxnhqfZgZOzhTWjARbV+6rgjqTCNT59rIDA2iekPjW4zgakdNXyd+ixa0A2m5fiVM6W0eif6AvC2pTPzC9LdS7h6uZTQtxif/IIXTjNYPNgzarIecekTTbcXVry+Wd4iJ7g84aZo4grcGcntwF29XlAvpunAmGosADsnhYbVr1zxA4NHu5BWai/t7bpagaUziuo2aj9Y11OrgSNaw8D/jikuT179xs+2Qv+5HRXlc5GWG8GwPCZap/T0UG1eYDhGWnmzhvZtJu9/H9xCMNrO2gNtgxp1EAhpKA+HXc3GGqAkTjgb4xvw== X-YMail-OSG: .jbe92UVM1k2UuecCC1FC4xDqNgz00Ua_AT_g0exjcVYmn.Jp3nqylaF41Nl46b fCcWZM.aMMfCOWitJ3swWQhlrkh1995KC8Griq5vfv6xKVxFSAostnQPi_wNmpjVUMSQYRmaFJ4y 3UrTInIoXqa8XTznJi2wk4B4VHnrhKqJJrDkO5O6VHhTDwvIzclXq16EoniFLuSODB376qL2TCkU a7kFMHmBkl.UE1e.AzLame22qzIVo8LiZNAESUyPAnirdcU9zNz1Rl9WZOr.0T9DWLiyL1ANO3v6 sagazADYM9dzW6W76SqnUDi_VojuzSEbWZO45xiUPwdk_0ozb2Q7W442ZEJkLG4WUL2QWGFDZoTk aG3yYTwjQwXngHDtAWWVMuCCAElUFpGgzhzriGyRhmWRMh5rurXRxIrf7Izcdv913Ju6qlrbomop nn2o2DHfXLqCWzzEUyAKs0ykfsFLKOCMwzMbzqauxxNJFUcqWAZ3PwR4BDSWnHu_6ea8Sbyyo6pJ FnqRPWYjqNWZ_qBH0hBxz1yUFXV7WXi5VMK2ImKQuYLxZoIoSbT3uSYl_lWvMYH5bGKNQsqInA6W SoEVLb7oQ8Yh9DE5LvhLcF8NPYRfOjhI.aq_gIf8OANW6fIW0bOUw770HHU.dhFhe4EDaBL_5Q3w O95Gwv39zfU0NhRAMj8fn9hxik57IprX5_vKUvcGFFUb_JUPfBlVTt0MDeDzG.PxzHIkCMId7sOw oIzBCS76LwWXMG_dOWsFf8jNomV4JfHL3I272aWG2XKCCVfaKLjPLQB.E0xWTCdioZ1dN60YjqNc n4n00l7.4TsRnZjlsX1r_g70sCq16w.X69YbbOJuYmY6AbkYrWwqMOyRlYbXM0RpskLkpJt85PsK ePiCuKDUQWI56xYQmtvprlbJSe_4QOSGeUZdq2qBSKHU_3t10EF1uGSloXvBVivHry2nfMxLjvhl n9jnHqZamn6lWEA6RAELXKwVeiEmBJxdHAoIH2lcZtVO.tkj.GBcVIijlKo.I1n0OFv1DDDrnZvm mlzRbX_GP7fibkhZ9NYuGbQODOs5Fep9uquhncpGkpUdIhIUvIn8cuqk5TQC5BRZNEsu9flAGIDx S5aYMaDEzD9GBAY3U0yb8yUJEBj5hkT7Km72SEpACOoqTqyfBPZrCbSV6PJcUZTT44rXr0yTXFmK neK1cLdK3PGpAugzWLhZuV9_OvBb0rmixXNj1UdN4C_N3no0N3b8qKjoO3vy4pn6oaJ3tML6c5RB FlbMl5iR4ATfsfPcFDQTFURhA.j4l5Y87FWf3AYUn0oIIacbFaTflH9r9PomkhasT1ZY8kwWjJ9Q lILWGmEcbqfIQVdzboWlzpJahkxJmCCzm12wd6D26eh7nc6FkwbscZBJc01D9ADii2QCJY4qipV0 k05ShEEMcfQ9_BHPlD9J7CuMoaVgY1Nwcn0Pdd7qOhQR0SW32sZbZW5.qaNT1k_vmDjDQK1KVUPo 7MUXa22E8BJKJjSajSqVu_jgH4YEymHHTInHnxkfUf27BLRGX037TnuvC_9.md5o9udqF92FG4R2 .7bBROnWjjjyB2siMhQvjTrsSRYXLdswy41p_H12L.ctpSUhkkl_jPyoyX218HDyMiUViK2rxnaS vMD9.1pc5wtGp2ChHKvB1AxD1ucWC.nasbtZ5pt0psda5xtpISsMTQu5d0MsN5vEaZBlnfv400Cx TkR01L4dJU2DGc6YGKlL7UFj5tFE_ZxrEmK99bEi65eMJBTtUk3M8escSkx214FraFOBs3_WiqG0 uRg5j7pTxqrMiuIZezRKguv6VChtH53ebeK6vW0yFUWAdzjbj95oQr8olIF61beXT1NN_8Dms5e1 VXAyDOajMM1zPcaBZfZuL.PPK.K8vg67qWPxO8UbnqdWjYNZYGjtWBollGJifaZe.sZRzIQcrj9g Vd36767nBGjM.AVi7gXdP_y8OALEaCMZx9Acacxe2aTf2dEn59EoP6nWS_Y1z9ohCsBuEhdOmsG5 8p2J._aKOliIk4Ob_fS4O3dU9u7KlVhohAdZSKIQy5iPjKfZYCiyW1LahO.468GxPGSBwyNaJnfY EqYtGWi1F.ToSbTok5foAvkW2PjHs1NsVRuWcNWeV_I.9IO.y3tutPpYD0YnIrzJtkePWQ6u8XgQ Sk_Fvp7gwc4xRH_VHYulPIbSiO_902E7ItY7N7OlXs7wXj_5pUOsCarEe.SV33FlvZUBAhCo01u5 B.tFxFDwbfCpF4DmyNfZygjXCmTJNXS4S38LAAYPq3KdylmMNkOND7.loNOfq4u1ZY8NvIXQ8ubn cTqBPzjwQrS2WuaQmi7DzdSu6YRgQ X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic315.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:51:32 +0000 Received: by kubenode514.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 02d0d7342d647b4cf843030be84eedee; Thu, 10 Mar 2022 23:51:28 +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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 10/29] LSM: Use lsmblob in security_ipc_getsecid Date: Thu, 10 Mar 2022 15:46:13 -0800 Message-Id: <20220310234632.16194-11-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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 a104ec0759c2..1814516509ec 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -520,7 +520,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); @@ -1277,9 +1277,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 5edb16cb12e0..598e0de45b04 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -2610,12 +2610,17 @@ 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 ffdd366d2098..815200684bcf 100644 --- a/security/security.c +++ b/security/security.c @@ -1999,10 +1999,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 Mar 10 23:46:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777052 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BB1DEC4332F for ; Thu, 10 Mar 2022 23:52:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344957AbiCJXxL (ORCPT ); Thu, 10 Mar 2022 18:53:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60704 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245226AbiCJXwh (ORCPT ); Thu, 10 Mar 2022 18:52:37 -0500 Received: from sonic308-16.consmr.mail.ne1.yahoo.com (sonic308-16.consmr.mail.ne1.yahoo.com [66.163.187.39]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E2C0B19E73E for ; Thu, 10 Mar 2022 15:51:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956292; bh=E8MURJmz0LV4/J9e8+2M786mlXNzUX9F2mLnAQJ7BbM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=msgsWTQsSdxFNaktQQTCdwp+uf/F371m7uemjslbpuGP+qkGmaMtW1hrG+XVEu2W0BOuAJvL5AQBwBfUGnHsNwdMNZgCzumXyr9vi/ifS1YHNiHm1LolyPLb7qkrlx1kB/2/bGLw5RO28X4z0bDLd4cGuHvXzPwtAs1gA1Uxm/Zn5hdEDqspJyzhFVvXLUpfkvcMpLS/DKCg3ZURblXz/npKYJRnkuzHLryI7Tw29vjIAO/JBQLYWGFyTef1RGdnrUxArVL20pWN7mm5sJC7OdqJSbYo4c8TNuaPZu05S2RLZJRXQCBPjoRc3eP1IuyGpDGYigdiE3LGLSAjZNcksA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956292; bh=j1fCpAd3ABVIvrM9/w3UlkRKHS/XbWxp7tu7hcGc5Yq=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=WxeB+vSWYBYwvU7O+QDVkAU0N9bhmuGQwK5mNTm43IfEZpK2mEyfkmSD9ATistBLOPP7hkzLpa5CNsHSY+fbwZEk7MTrFweJe7QWJ2JvdUBm2T8bIv38b2c+nGtzDLe/VBFFTdcfH6QZbyjrLmQrmtZxMUJPxcU/XMymN4AiNBo2lxkUgANTjAw4J0xu5fBy8lZZzJjLxNk90n5iKMZz+NX9gtkx/UW5nrpB8IKOiOkFrTj2LenTfJ0aW051XvSkDpmIE/DGqamdD9iAuw3I1965RfF6z9WS+AoMKNs0D639sryu84SQUJj1If/915q2MstGnsPIUU+CaixvqDeHug== X-YMail-OSG: k53x5rUVM1l1nmiHkw0PZdOjgvtPHtQegZUfc12DF.MKrSwsq4DI6S6gpm6fzHn R5ADIKngK355XmdsiSv2qHJNKkdvsfWVW.1ID2PD1kPHRDFyEXYm1pfdB9NMD4PD0kkeT2KKDCHi LMaohXwNmrg3Eae8bFOLmZ42IGEG21PBdj14NgxSQy9WAzJRMDv8VixAYKTPh8RXf.Pj.riFXYdf 5KuJ6hblKrO_3A5SlQWjLzwXfZ4dv.ubYg4QA0vbfvpISuCQP0wazyGQY0Hza.CJakQWRYz7y.D7 L1bA78yTvUMw9JbLegZRJMGZ.tCqSl0KBIDfp8XuluxMAkT01uS3eb8ZHQqe9GXPXeKqRn4H0g7r 3vIh4bkg7woE0ySDKqEuG9df6NEseLC2Jdxomp6myektCiwsGdwkBOlnywem9KliVI8ADjQo3IgU qCdFJvk7.YaeoeysBgz0P0NUUpSVsstAwoVWOy8XlIoqlgNPw63z1Rq_3b7w9nLQL_pLvYC32Kfk UQNmSxWmg4n9jDMqrG.XsfgeN1siC6Fk6NdKNnzi5IwDjz4WcNNm52pyTC5Y7aNxTHnot0sIITp9 7cn2xWrkvNRFUU1WjATXpWNPA6_0TwHvdJPoOfRFvcWe4NH00u3l62b3e8rT20.8HbSG0oObYjwW lTb08dTkg8kOtK.q_UV_8iZlDTifOvx6wGv6MY7UuClhqFCsRgEC95R5VpfrH2fd.9N0UiF6sX4K qpqu8ziKmOHEZ1iaJ2YuCkeX9D2v9_gHE8dBG6ZRq7FynB_Ts6jKxPMMVF70f.Erq.e06jhy0ZrI 6SgcNLEZxwgW2vkR4tl6p.q4kIKZAqQg9pcA6Y.bLHoLDXOzd4atyNLmxkLDG7N33ziLv8Jydxq. N2b_tIxSMZMbXdCUBqE.fhyeDJPhEEaQpDaFiEOo9kQiNv3FwA_a75KbvsFrvPusyJwcB0NxfMLs 6LBAEjehHKLYpwBt0y0PszzcXmUx91tYa1_9MsFtUuu4StwaJkzVTilxGixQ4uuOsxGAYScDA_.K s4OxcvTKyjEn2L2ZtfD_ZjlTn_8_0aGRBzo2R9gEEt8BZEBdl9S4iVG5Hb3JJA6sC1BnDVVEtWPF Fvd0CguToiIQJw7.Xci2gso9G3KcEDgdidtJGc.ytUXs2MhiuAwYs.nXQaL6Dc4YAE5wLwbUqYZu JWeXJPn87VipAk.Nc2qi6y9WotUbVx16B0GQWAiJjg1wZHeFPFKugxgAHi_kf.olrLfY5mxLR93g IBJsTAqtEu5nrBKNpWNIuhDKBxynzDhT1RDfDxcupxLJJkIhtaqYacib4.SW_LoaPFI29DqzSUZB eMyFws8gYLueIzJ87kHWr7jtXEM6bi_B7YYiCo9Y1OTviJXWfn6.do9a2E4z1en9FWd1QTXAq16U g.rxA961PtdB7RWf.6aMAJYmzAzW6CCbNzuBfcM14nzyoNydln3eTyYlGN90_DetTC1_k7dzGmhI gTz0Ut8koX9Zv0XO3t16eUtw3paQ_cKYMGH99_YhA4dMnMgmLuWxTdh7d1gFub7fH9dC6bvVEPeP a1ddJB4xDUInFFN5jS28.NCQ3tKYABoUpBOqwbWsudQSbfaxaaaDIQ13eE_gRjx11LOD39pgMZPV KlwVKpXP8OuvvcESMrxgjhzGJclcab6nyOSCrvTh8IQKsaQEEHTMFO19orxJaah35cmvB3PAWSY. 27UurYIQDKTahUucuzI_QGfuUYNp32chBMn4tiDECXwMbwfXDV9z.VRAH3AoHqxy5ImvgtYUSxm1 MP1nGflAFyb4lsqWgH.noHB6DvqXvstMiD1rXHHvq5k4RD2EQ1mzbqO43qdL7rS0PsgihsDhiXBv 0qK.6aEcpzO4RP7r.Acq3UfixQyGRmAUaMF4BevdUKSiC3ZxVHVEVZvXgf.0mWfkBwWMfNYZ2.hG bEgvioJgZraZFSxzfhcVHgeK4VroDHdmfuuV7aALFkJLwhbEf9R3pdmNm0F2MHLlZV1JLJUnxrjj iduYWnzDR4reYjgxei56y9j_NhGTkUggUAbFHD7HzEWj06TbEO0D_chmdIVh1R6JYhuW8zu439hQ nMCUqYN_7QoOgVkZPEaJ2YAgsuCQpgWipRShdZRaP6nhBq_BZGkE3nz_M9kSNwOH6TyxMjk91tnX tBxFqiq9zKwPOfBpRXnoF6jHQvdalDD2EcMvzzRgdYSTsMwcm0NV459seoY1sKv.159qhK8ZLJpB .Yq22Q0.lMrmRCAtOwzaXHy3vpGtS6Gp69Ul_fyRKeMeMHL76yVXo7VwMeiQn4ZSmnQ1nI56dXJk gCj9z4YSEte8Ulz65p95Kwg6o0GFcwcDSUWiteOjC2K6gZDb4lTvszqtH X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:51:32 +0000 Received: by kubenode514.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 02d0d7342d647b4cf843030be84eedee; Thu, 10 Mar 2022 23:51: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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org, linux-integrity@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v33 11/29] LSM: Use lsmblob in security_current_getsecid Date: Thu, 10 Mar 2022 15:46:14 -0800 Message-Id: <20220310234632.16194-12-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Change the security_current_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 | 6 +-- include/linux/security.h | 13 ++++--- 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 | 12 +++--- security/integrity/ima/ima_main.c | 55 +++++++++++++++------------ security/security.c | 25 +++++++++--- 10 files changed, 95 insertions(+), 72 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index 381a4fddd4a5..bae8440ffc73 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -2980,16 +2980,16 @@ 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; + u32 secid; security_cred_getsecid(proc->cred, &secid); /* - * Later in this patch set security_task_getsecid() will + * Later in this patch set security_cred_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(), + * get the value returned from security_cred_getsecid(), * which means that the one expected by * security_secid_to_secctx() will be set. */ diff --git a/include/linux/security.h b/include/linux/security.h index 1814516509ec..5f20c0c68f67 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -502,8 +502,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_current_getsecid_subj(u32 *secid); -void security_task_getsecid_obj(struct task_struct *p, u32 *secid); +void security_current_getsecid_subj(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); @@ -1199,14 +1199,15 @@ static inline int security_task_getsid(struct task_struct *p) return 0; } -static inline void security_current_getsecid_subj(u32 *secid) +static inline void security_current_getsecid_subj(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 40d8cb824eae..17ac6e74b5bd 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -2154,19 +2154,12 @@ int audit_log_task_context(struct audit_buffer *ab) char *ctx = NULL; unsigned len; int error; - u32 sid; struct lsmblob blob; - security_current_getsecid_subj(&sid); - if (!sid) + security_current_getsecid_subj(&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) { @@ -2375,6 +2368,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 || @@ -2385,7 +2379,9 @@ int audit_signal_info(int sig, struct task_struct *t) audit_sig_uid = auid; else audit_sig_uid = uid; - security_current_getsecid_subj(&audit_sig_sid); + security_current_getsecid_subj(&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 15cd4fe35e9c..39ded5cb2429 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c @@ -1339,7 +1339,6 @@ int audit_filter(int msgtype, unsigned int listtype) struct audit_field *f = &e->rule.fields[i]; struct lsmblob blob; pid_t pid; - u32 sid; switch (f->type) { case AUDIT_PID: @@ -1369,8 +1368,7 @@ int audit_filter(int msgtype, unsigned int listtype) case AUDIT_SUBJ_SEN: case AUDIT_SUBJ_CLR: if (f->lsm_str) { - security_current_getsecid_subj(&sid); - lsmblob_init(&blob, sid); + security_current_getsecid_subj(&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 598e0de45b04..2570bf5979e0 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -467,7 +467,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; @@ -676,17 +675,9 @@ static int audit_filter_rules(struct task_struct *tsk, * here even though it always refs * @current's creds */ - security_current_getsecid_subj(&sid); + security_current_getsecid_subj(&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); @@ -2712,12 +2703,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); } @@ -2733,6 +2727,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; @@ -2744,7 +2739,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; } @@ -2765,7 +2762,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 0a99663e6edb..c86df6ead742 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c @@ -1562,11 +1562,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_current_getsecid_subj(&audit_info.secid); + security_current_getsecid_subj(&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 d6c5b31eb4eb..3d5610ed5f0e 100644 --- a/net/netlabel/netlabel_user.h +++ b/net/netlabel/netlabel_user.h @@ -32,7 +32,11 @@ */ static inline void netlbl_netlink_auditinfo(struct netlbl_audit *audit_info) { - security_current_getsecid_subj(&audit_info->secid); + struct lsmblob blob; + + security_current_getsecid_subj(&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 17232bbfb9f9..217d20c60e1d 100644 --- a/security/integrity/ima/ima_appraise.c +++ b/security/integrity/ima/ima_appraise.c @@ -71,15 +71,17 @@ 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_current_getsecid_subj(&secid); - return ima_match_policy(mnt_userns, inode, current_cred(), secid, - func, mask, IMA_APPRAISE | IMA_HASH, NULL, - NULL, NULL, NULL); + security_current_getsecid_subj(&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, + 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 8c6e4514d494..6abbaa97bbeb 100644 --- a/security/integrity/ima/ima_main.c +++ b/security/integrity/ima/ima_main.c @@ -405,12 +405,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_current_getsecid_subj(&secid); - return process_measurement(file, current_cred(), secid, NULL, - 0, MAY_EXEC, MMAP_CHECK); + security_current_getsecid_subj(&blob); + /* scaffolding - until process_measurement changes */ + return process_measurement(file, current_cred(), blob.secid[0], + NULL, 0, MAY_EXEC, MMAP_CHECK); } return 0; @@ -436,9 +437,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? */ @@ -446,11 +447,11 @@ int ima_file_mprotect(struct vm_area_struct *vma, unsigned long prot) !(prot & PROT_EXEC) || (vma->vm_flags & VM_EXEC)) return 0; - security_current_getsecid_subj(&secid); + security_current_getsecid_subj(&blob); inode = file_inode(vma->vm_file); action = ima_get_action(file_mnt_user_ns(vma->vm_file), inode, - current_cred(), secid, MAY_EXEC, MMAP_CHECK, - &pcr, &template, NULL, NULL); + current_cred(), blob.secid[0], MAY_EXEC, + MMAP_CHECK, &pcr, &template, NULL, NULL); /* Is the mmap'ed file in policy? */ if (!(action & (IMA_MEASURE | IMA_APPRAISE_SUBMASK))) @@ -486,10 +487,12 @@ int ima_bprm_check(struct linux_binprm *bprm) { int ret; u32 secid; + struct lsmblob blob; - security_current_getsecid_subj(&secid); - ret = process_measurement(bprm->file, current_cred(), secid, NULL, 0, - MAY_EXEC, BPRM_CHECK); + security_current_getsecid_subj(&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; @@ -510,10 +513,11 @@ int ima_bprm_check(struct linux_binprm *bprm) */ int ima_file_check(struct file *file, int mask) { - u32 secid; + struct lsmblob blob; - security_current_getsecid_subj(&secid); - return process_measurement(file, current_cred(), secid, NULL, 0, + security_current_getsecid_subj(&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); } @@ -689,7 +693,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 @@ -709,8 +713,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_current_getsecid_subj(&secid); - return process_measurement(file, current_cred(), secid, NULL, + security_current_getsecid_subj(&blob); + /* scaffolding - until process_measurement changes */ + return process_measurement(file, current_cred(), blob.secid[0], NULL, 0, MAY_READ, func); } @@ -739,7 +744,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) @@ -752,9 +757,10 @@ int ima_post_read_file(struct file *file, void *buf, loff_t size, } func = read_idmap[read_id] ?: FILE_CHECK; - security_current_getsecid_subj(&secid); - return process_measurement(file, current_cred(), secid, buf, size, - MAY_READ, func); + security_current_getsecid_subj(&blob); + /* scaffolding - until process_measurement changes */ + return process_measurement(file, current_cred(), blob.secid[0], buf, + size, MAY_READ, func); } /** @@ -882,7 +888,7 @@ int 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 (digest && digest_len < digest_hash_len) return -EINVAL; @@ -905,9 +911,10 @@ int process_buffer_measurement(struct user_namespace *mnt_userns, * buffer measurements. */ if (func) { - security_current_getsecid_subj(&secid); + security_current_getsecid_subj(&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, NULL); if (!(action & IMA_MEASURE) && !digest) return -ENOENT; diff --git a/security/security.c b/security/security.c index 815200684bcf..e33fa677181d 100644 --- a/security/security.c +++ b/security/security.c @@ -1909,17 +1909,30 @@ int security_task_getsid(struct task_struct *p) return call_int_hook(task_getsid, 0, p); } -void security_current_getsecid_subj(u32 *secid) +void security_current_getsecid_subj(struct lsmblob *blob) { - *secid = 0; - call_void_hook(current_getsecid_subj, secid); + struct security_hook_list *hp; + + lsmblob_init(blob, 0); + hlist_for_each_entry(hp, &security_hook_heads.current_getsecid_subj, + list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + hp->hook.current_getsecid_subj(&blob->secid[hp->lsmid->slot]); + } } EXPORT_SYMBOL(security_current_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 Mar 10 23:46:15 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777053 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8A6B5C433F5 for ; Thu, 10 Mar 2022 23:53:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344575AbiCJXyI (ORCPT ); Thu, 10 Mar 2022 18:54:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35016 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344968AbiCJXyI (ORCPT ); Thu, 10 Mar 2022 18:54:08 -0500 Received: from sonic304-28.consmr.mail.ne1.yahoo.com (sonic304-28.consmr.mail.ne1.yahoo.com [66.163.191.154]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C525A15168F for ; Thu, 10 Mar 2022 15:53:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956385; bh=tmh83u7osd4pu4GiZfbJMQrqUIl/l7Z9iBCkVV4+kWQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=s1lmXJs7rvJDfkCZsOLglwFpIZZ3TMkRfYFcep3I+j48y9wwLRKHdEpaLauKKR/lUm9LBkvf4fs1NX+MqI5rvzl1DLyMxB0VEUllkvFh5a8Ur3jmpZSccJmoFHezEcB+lwp3NbCVZvcqpa43AtQNuVMfgoGx6dVZ/fIo9WWnknWVOJEmqV77/Nfkwtt3usk0Uv97FdJTJJma5d1yBCp5ldAsgf6jXZc17Udx1k4LWRt3n7WemxxDjcuLs4Vtfxa8AhJWIPSUscoUpVkLxW9yNCPy9irgpm4+VpzBDrXTjstYrLhFjpWCD3nh2moe/naQLVtZ4KidDrsSGv3P7nGfUg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956385; bh=CilM74VtaqTeJCDFFadjb0pK+9MovmYk4HID0FF99Nx=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=sDKFM6gVVXvHaEp7FSzVQe3XA5fnGXhuCiXqGkXLsR+6ZHImpfO9dX5naVpodqg082K3HqmpeNc/NFZBFzk/1ezlsYWJOtfc6HCixFGpbCeswidp/AUmHcfDJ2FtEnXcOkbwNyCm/caNtVCDs5u/DxkQ67BuFx/0VB3JA9AYnaHVAd4n1qEMizihAmOaruwepOIla4Uv8Yg1XIkyFzzG0LBC5vbNCUaEeUT86aGF/ya3tk8V3iIhK0h94u5NNUal/tRKd9aHD4QPHmEr3hgGDER9SZEB/vBOUzUVFL6mW5QlvmxBe6Ir+r759hdQ/XOHwZP4wtbCIOukjHeJHvKFaQ== X-YMail-OSG: vH_L3ecVM1lcB5cHAeb_CHZU5UecIaTjkVZAsD0gUCgEaGcom5C4qeIxF6mbEJE D_pXruOPgylVdjpdpo3QbRw_.SOMLHg6gtf49GoC2DYRYxNM5rdR3dbrdyUo31OrSpPDireOGhEw IOuRDqSQQjx2uXN.E1nYQ.lbO7Jt55eZMOCsFEB.v0Ce6RkSlmqFDCaBg5FYpVF1SHZDhc.xG2L0 Ds.vuZI1qHMEvfLfcWoFB75ERPy1nLrPZp7ZaF2biKS9PVzIDqs.OXhYy.Twq2FDXsbEIBaArssz f5EMdaHGYUtIbX0hSGsHUHoKKdWeUvu7CUZ66FcooJ6jwmQPSLeYZ_.s.rGQfycvQNWxcWih9zav 3fuIWKiGtzYciJwS5NJXnUjg8mBIEfaMwdZwHH9CgnYw3W1iu9m0oapJS4LovqcaJ41_6M2DvlyQ W6ItnerNRGnkByifipgbL7S.XNYp_2I_AkLz9mDVbA7XkQSKym.fEFYiPk5Zt36zhYHtNaA7r_xo lVwj.9p3Ce_iTuRE6l9qHtmcQY2z_cZL6I_Yxg0R_vRDxzbt52N6_vU5Umyc6EVW.hhNcbuk0WrJ _K6NhMfTO47ygyYBKc3nsCalNruNB01nKkbUSUb4eB5EkAYwyYKBYgLisRBf.U.E7l25MXLOXgKA ctfbi_I4XDBC4PQXanUxpnqoxmNuKEiJ0BfXmE2xzaJZpmPPc2o3RPRtH2zf2.E2YKUIrPSen._V domV6YzDR3HsTn2h9Vu3T_A7QP.O1KbbJfWXe89X_V8zPU2xJY7rKm8oRdmPTiySE65EKyduoOV7 AWMH02dhi.X6ChuKqK9VOpnVI6hDAw8DtMAeCUxgSQZOpU4nf_75X7l58MQ1lSgSllBb.50MVn1K VPsiIA_MYwMpIvzvI5WngfGcXqAQphlfNlDjD5IU..WUMDXN2O2P_9gLFbJ5D7sVCosnjv__Eygw K0eecMtkF7EV6Lo_7PLGX6mR2enusEnpJFXjbR6C8eWqBbnA.5zAlSWIvTxHy4hLYq1Ios8ZEnVz F4B5cBTxHltAcouh2RHV.FjsjTD7Aqn0B1Ddx25pdzT9htTCRxR0jGbXuMAaR4R0RB_qW8t_DCNQ cAn.AnmNWwEQW1Y8_JEEqySmJ9mn9zHjfqr_KmMdG60TukEcyiK9Vr9h7Mlf6qEl0OjjHOJMuW85 uuJ1rDfqRE4AWvPS0duiR6nb941HOTDS_UPMuwLj8G2R4nrlZ.FltNEaUAUn0EPow66VCYzhh0_7 AK8WuI0q2mtJEelxkDjgUNBM0tEzP8uBfcIUW5wMtCUsC5pyJqxaCKAwTkJeeyUDYnnRJiQ6G4b0 9wzN7IZg.wRNKEWPKJim_qhLvQkj3L1KkZLUISEHdxqjkV65xlXVsfNFjLCTFs.6i6EBbrqGmGED fxsraLkCCyQVo2PSzbxGPeiFWIqbhG1OBCmcywrt7BMkY.IjUT0zdCsRXewjNmqDq9Db2I.OGMEf 179cW6s3wYl0OEbYgL2LIQZXQ.v_ViAutmNwgTvfjRRcMe6WYo.L7FZFZrpX.koHLJwlIJ8NMD9a G65TZDT90YRt7XLrwjFvFFgXUl_y1E5N_spQRScCYmO1RKVMpNTNXAFg1jxdunFm35s3xDoz.1V2 TkPEmzO2YVsCeyfwK105zK.PxJXtprhCkelWZsNsXglHrSuilP97o4L1IqROlgmU4UXXrcp83zhj KrJkce9bjZxCTWmzLeqspK9GvfIancm.qP7awfG.8yIbOqOrAwItYIg1vspSmle5JYyDLAIMx7By TpK_PABFtVI9Cw4BR87VWbtOyh.rbtGjGXFwPv8lSN90DNNyUQulbEJAOcySQxG7kzFDQXs6rudm tREAf5s97kpZ9HbfhmQwwC8D1t6h76hGnTJncPodHdFe5ZsiU8ZwLc5NVYCxIynB9hP5nKO6j0xM 5xiO_WXHzvsX1f0DaVfRmQxXEh4VCR.q2AOHHsb2y5X_mDVlcIH9nDI1RtTsoAnjM3wzwC_XwqFx itpV7M3XSgblZlp27Qpf8oWJFAET85gHUjCirz3pSwP_lCbLYDpizKoKB87WNgB4_U_PCburq1vX 84JRNspzxaJiJdWhe4AQx2zgIz0RVh9iF_MbbgT2YjC6c9caHIfhZkvQduckbWiyvLnxD9C.ZfEU ekqCwApWa0gmEr_HZFEkfCCGK90VYsOv4BZzGI2uCzOv4DB80qpBSXvBYxaTqq8G_agW1vIbyLGP _..4ena0rj0f1WuArghOy3ChpWLjDUhPAMwBOucL2hb4KJ5lILPzoyQnGA9iISiiDKsAF07hyqy2 P6qWvy2ho40QM7pZDdRVNR7EQrJLGd7SQ4rxNzmdLuTDoVdOV_FoL2WQ- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic304.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:53:05 +0000 Received: by kubenode525.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 5fda70cf8d38a19ec9bc1b4fcf47812c; Thu, 10 Mar 2022 23:53:03 +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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org, linux-integrity@vger.kernel.org Subject: [PATCH v33 12/29] LSM: Use lsmblob in security_inode_getsecid Date: Thu, 10 Mar 2022 15:46:15 -0800 Message-Id: <20220310234632.16194-13-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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 | 7 ++++--- security/security.c | 11 +++++++++-- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/include/linux/security.h b/include/linux/security.h index 5f20c0c68f67..6fc573d2c253 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -456,7 +456,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, @@ -1002,9 +1002,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 2570bf5979e0..6cd15abb99c7 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -2248,13 +2248,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 22952efcc0b0..34ecdd7b01f5 100644 --- a/security/integrity/ima/ima_policy.c +++ b/security/integrity/ima/ima_policy.c @@ -625,7 +625,7 @@ 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 (!rule->lsm[i].rule) { if (!rule->lsm[i].args_p) @@ -637,8 +637,9 @@ 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); - rc = ima_filter_rule_match(osid, rule->lsm[i].type, + security_inode_getsecid(inode, &lsmdata); + rc = ima_filter_rule_match(lsmdata.secid[rule->which], + rule->lsm[i].type, Audit_equal, rule->lsm[i].rule, rule->which); diff --git a/security/security.c b/security/security.c index e33fa677181d..0253c925a272 100644 --- a/security/security.c +++ b/security/security.c @@ -1553,9 +1553,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 Mar 10 23:46:16 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777055 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 39800C43219 for ; Thu, 10 Mar 2022 23:53:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244209AbiCJXyQ (ORCPT ); Thu, 10 Mar 2022 18:54:16 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35398 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344991AbiCJXyN (ORCPT ); Thu, 10 Mar 2022 18:54:13 -0500 Received: from sonic306-28.consmr.mail.ne1.yahoo.com (sonic306-28.consmr.mail.ne1.yahoo.com [66.163.189.90]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CA5DC15679A for ; Thu, 10 Mar 2022 15:53:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956390; bh=GO/Bqxwgc9VQWSjrcC6II8HoCihtitHg+71BIsNkOkg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=bcribzaxukC//3I43/UEOxJtsaOp4Wrt36CinOvSDlTRKw2L+HF1xUxbajY6bOtv1mo7gFJkKhrhmQ10jNIaqL/Cmrx5cIstFivUzaK5/ERi0G7CLXBwgVmNYuvNOtOtD/5cbWKyFNkkiGHPZCBhq8KwxGh5e9j75ARhpeDTmujbZOVo4o5tqRYAU0jyvEIAbbi0GMSGlvNzTcZY6ZkpMlivSjbBCLBawtamLVz/QUsJDcB5IVNP3vX+RnKFBFL1BNn0fnXsiniNBL4lZ+B82Nfs3Evv66rnaClF9sxUT+ibZrlJe3dpSA6XSM9bO22JqY9yhzEYzOR1ZNuFwlVbGg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956390; bh=j/dTt1Kuc63+yIrAWM78sgq5GtPXFBERyH8Dj0q3xw0=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=N/BPgceDDuGpnWlovQHVyrOcwkEuhQvmz0SIidArqzpSHtCxjFecD2EQyAY4TSC62JidrzbH2s8DxGWoNwj9U/qGeLbQvg6Dt7Nk3V4QE4e+nJOkpSE/4DKLM02nzRpC3RIAmIsw7/LoLkXUy8C/jAdlAU9PVbGL165r5eYYjr4DB53WngCHA+E88px5P2G2IkpYt80IOw8/EPjLNVGdgVknfaIsliEpxQRQhYZzcb9uXTLchX9Qvj1VmAWHRCO7geV8ZJgHhw5OegpvR8sAx5VFFMRTBIjWotzjvCpKmruJHbPvan6pd8mS1YkqIxeJmeVwsCdIIGYePJfMrAoBaA== X-YMail-OSG: aZ.0F7QVM1mM.6wziF2fr4zOpZHqxuFodqH_5qUEAYuTQZTi0rftXiQ7yImRaP1 CJlMTSt0US3guItLiPMVydBGe7gU2xAcuvwx1UDm5Yvc_csLo4KfVHm_F4FzHOvUhhcT.jZ8z6Pq DE22oSUlCvnO5sX3LXeJL7K52tw7gDi9dcwIva4XbxsB6ssKlv8nLZTTrymEtyhdDZ7jm1yY4u34 OC7MazEowaQEocXI8Xh75BvrNw7hfXVeRXrFrvMlRKc428k8.1ySjCIuvTGP8d1xEnccEFSd..t3 Ui3H5bKHcvmZnSdGo.B7l.NIKIsGfbCXAPadfiNytFxXBnmL.L6zLglpJ2VQL4vmaTZnq5qYY7D6 wWuDFCJcdqzrVTIq1VbVt9aHm8MHEAE_szHOuZaR71msR0gOedVm9tdlDutYL3qjDT.Njq2Nu.Tj J6SNslxW0NngnCaKRn.tuyCW58A1wdqKr._GkeEyurZ2uGMwQtimaHEnuEAj.N2mvAYumCNHl84t lmw3ER55TiyOD8cwstNP3a2bfLljAc1yOLpI6hEPVLASQhUc5dUSCzBOvRiC79hJ8E5XntcTfWH7 MTRCkJ_xoUq.GdC_GIZaFolAFLiGfYdUyyDFVZ9ZFoKtN25CTgy4i4E4it5zXMF4aOrmaU1KAL4s 33ED1NysFVGXA6qhqtkzgJLvX8WBIKD0WTtHpwor_Sfo3Bibf6LuNOPjEOPK5_dmmqOLgNtb479l 2RrRxq4AtWwFGu.pKxzF1tG2CFOsG4ry6VtC5LYvPcTZX9xaGbOSP7xSJ3KvlMJDCRRTo34a3VHk 0LQ5dvfr3n6qMcWZtvE60pd_Kk0bwCyCblwda3uqII2.Y1rpfBa3uvSEqOtndIchUozsyA4ZKxR_ PFk6sqWY11SYYKJ4kP4aFg8rZF3oVDUUpViME.NB7WIvlg_LwyEM3ila2ioagJ.ackkukOwqhpjB pUJGwUYSgMcWxOHJwB73oP9vDPHTtETHQvfmD7xfzQX3zz.xBOqWLH3t4s.mXMKMw8HCc162j.Oe jJxbQ.qN.1K_sI5h1HZ_4zaLz4p6ENK3GR3.MKhTz8LfIeFTsCkzh1nmMlEKY31rikQvwJNWoPIc 9.il258YKJO1i1E3K3h_gWLHwDBl9ijkHODkP6qk4kVK.qxiJ3jjYjp_hrG3xmDRQHI8NKgkZeCX pWZUbyyBoaSqVyTihVRDOOk9TCFMbDj6G7Hgk7R49qdAC4FNdFI5VxtcTq6ZEiK_FsOc0kwY2MXE hFLebJJZS7i3QGyq7C3c68DqLgZoDq70cS7Q0GPupZP_H5sRVTVm8lEgg99zaCaf6LX9KJ1FJmGw krRr7.DV0X2R2Qw4jEFIEQqaSGW6GQFjkbuzkuhkdlyr_qJRUD1uXo5Vzwa8FxDqnRUeIWctrJUe W4e1.KwYe.1d9U15VJ6DQNotKcpZPdpQf.TYK6pHyQcW7BSNew43erNX2P_BZk_hKTMWv7pcPC7k 2CYfyiXuSTduNBssahtBNk6BiCcBR044bbr8G4reAoY2vqYjWZe1HY3SJHHVm80lUZ926eyEpOCf bqR4cZriYDn978XkPQft0ibR4gH296mx3HH2J61svYGIels7xgF5MLAcMmszjcUDqpUKx4SjPYgv RtZgMmqpULqgtACjWMd.ODUx2FXKbGZDCUBhWTO7REATFt__RZtymf6qrBHiH9KIKze75qatHaBM IvMmgfzLd7rWFflSCVq_jZ2N.OtDCGwdvYnQgQ_s9eJ6gDEUYrx4xu9LAAdRXKr8tfsKQlmgFLdn Nsqyfl4HHYXNhc53sFyLFtt_tVwjEVbBhHs6N_giCK67Q7xVA0nywjg0Wiit3XM_YJ.xEmeC.HNa GU68DHonNO.vAoeTLOt27JsKhlExcg0tF_bCkbllwpSRfkgGDy419Kpa6ItOXIBoDauumDNDm1cQ NxUJx88DRYSMzninHW7sKFXjcUtZVwzSaWmHslg7nqkqoaDwvgJ5r30sUNbSXPgocsxxQs8aMY_C e9eihdFokL7KIH0iULCHLCER_pnBWVriPN_44XM7h6CPFTcV2yWXkHCev_FVaKLTvB8q.kNR7oou HIVqyK05wBXQqEKvSI72N0KkttSRmpx1nbFEE0gJdVM4xZ80heLXKqFvDXfBzpfjxtBTkJIXA6fB ai2HnYzr1LbVBlGJZjgIFfMxl1zKp93umivtKaFmyzLxG.pKRkzC8kQUPYOlj5KnMhqUyjZhXvWP 4GFM40B8A4Xp894RRPn9aYumbqvjHMpvRzHBktZL0p_YUoBRZW002upvU3DEIyXrpoDE8f99E0q5 S X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic306.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:53:10 +0000 Received: by kubenode525.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 5fda70cf8d38a19ec9bc1b4fcf47812c; Thu, 10 Mar 2022 23:53: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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org, linux-integrity@vger.kernel.org Subject: [PATCH v33 13/29] LSM: Use lsmblob in security_cred_getsecid Date: Thu, 10 Mar 2022 15:46:16 -0800 Message-Id: <20220310234632.16194-14-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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 Reported-by: kernel test robot Reported-by: kernel test robot Reported-by: kernel test robot --- drivers/android/binder.c | 12 +---------- include/linux/security.h | 2 +- kernel/audit.c | 25 +++++++---------------- kernel/audit.h | 3 ++- kernel/auditsc.c | 33 +++++++++++-------------------- security/integrity/ima/ima_main.c | 8 ++++---- security/security.c | 12 ++++++++--- 7 files changed, 36 insertions(+), 59 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index bae8440ffc73..26838061defb 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -2982,18 +2982,8 @@ static void binder_transaction(struct binder_proc *proc, if (target_node && target_node->txn_security_ctx) { struct lsmblob blob; size_t added_size; - u32 secid; - security_cred_getsecid(proc->cred, &secid); - /* - * Later in this patch set security_cred_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_cred_getsecid(), - * which means that the one expected by - * security_secid_to_secctx() will be set. - */ - lsmblob_init(&blob, secid); + security_cred_getsecid(proc->cred, &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 6fc573d2c253..955f75fc1007 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -483,7 +483,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 17ac6e74b5bd..c7cd039e258b 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] @@ -1439,29 +1439,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(struct_size(sig_data, ctx, 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); } @@ -2368,7 +2360,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 || @@ -2379,9 +2370,7 @@ int audit_signal_info(int sig, struct task_struct *t) audit_sig_uid = auid; else audit_sig_uid = uid; - security_current_getsecid_subj(&blob); - /* scaffolding until audit_sig_sid is converted */ - audit_sig_sid = blob.secid[0]; + security_current_getsecid_subj(&audit_sig_lsm); } return audit_signal_info_syscall(t); diff --git a/kernel/audit.h b/kernel/audit.h index c4498090a5bd..527d4c4acb12 100644 --- a/kernel/audit.h +++ b/kernel/audit.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include // struct open_how @@ -143,7 +144,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 6cd15abb99c7..c4c3666576c3 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -99,7 +99,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; }; @@ -1018,7 +1018,7 @@ static void audit_reset_context(struct audit_context *ctx) ctx->target_pid = 0; ctx->target_auid = ctx->target_uid = KUIDT_INIT(0); ctx->target_sessionid = 0; - ctx->target_sid = 0; + lsmblob_init(&ctx->target_lsm, 0); ctx->target_comm[0] = '\0'; unroll_tree_refs(ctx, NULL, 0); WARN_ON(!list_empty(&ctx->killed_trees)); @@ -1116,14 +1116,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) @@ -1132,9 +1132,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 { @@ -1762,7 +1761,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; } @@ -1771,7 +1770,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) { @@ -2707,15 +2706,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); } @@ -2731,7 +2727,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; @@ -2743,9 +2738,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; } @@ -2766,9 +2759,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 6abbaa97bbeb..93c6addd8389 100644 --- a/security/integrity/ima/ima_main.c +++ b/security/integrity/ima/ima_main.c @@ -486,7 +486,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_current_getsecid_subj(&blob); @@ -496,9 +495,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 0253c925a272..27154c39d109 100644 --- a/security/security.c +++ b/security/security.c @@ -1803,10 +1803,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 Mar 10 23:46:17 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777054 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B1321C4332F for ; Thu, 10 Mar 2022 23:53:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344942AbiCJXyL (ORCPT ); Thu, 10 Mar 2022 18:54:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35194 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245214AbiCJXyK (ORCPT ); Thu, 10 Mar 2022 18:54:10 -0500 Received: from sonic301-38.consmr.mail.ne1.yahoo.com (sonic301-38.consmr.mail.ne1.yahoo.com [66.163.184.207]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E2FA2D31C4 for ; Thu, 10 Mar 2022 15:53:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956387; bh=Cf7XpOaRoLb048SbSW7RBk/D7NmluyjJipC5MTUl6n8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=hBJ6/nng+oKUdh8ODvyI7rY/vVI9GgfAXqgEKShXC9DQHJDiX1LOlIFH20u8sXfiTWvZR9ZSZRPtzG7OHQ+27/Ljdzfhd71hVZrtWelT7YD9nIht8n4cjFFwGPpiPDUkzSsX5jhYePHCpi6Q7wum8WrxuoY1bDLDl5MxLHALGo8kJh/H2VJhjZMJWZ8Jd4f77uR0hinRUqrKCYAANNi1vvSWjvApg2mdGGbLKFkkYw9C75023XUZFPXlNgJlsZARTjP+i9hDccubHXQSi+rZKx8sfgdvpYcL9OV/GjPGuoUf0jPjTmWJrERzMyEH06mY+tcbxSDoQtuEyGQ5n4g2og== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956387; bh=sVvzc2BHpfSD2QAQZcFxLWfl7+8op7mMDyj8RIWFaW7=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=EuJA53hSzA/XyO862grM1sirx8p6cHJ6SDWdTT76/NFO0O7ZJKfTepkVM0kZ1IRuFVS31+cWw4bnuAy+TqkZzEM6y4Li3BFfumHAvMZMBTTON+76/o/97u+aLxiFMYKLGWk8FHgiQp365plFJm+uFM5KX+3z3BgAoWEJT6q5NsnndA7KJWc7EqONNcGygl2N7cTl3wLttJvyewl7y4N+qTvEKLckdgfCLHFTlpdwTH81zPSlIZjp6lCqUru65u3W+KrGrCVTggBzPGO2VFtxXYAJUEKARriyXn7SNCd7yotmhwkl+FU8CWweoEsvz4FpP6NIRkKLNyp9s3mTzarTAg== X-YMail-OSG: cw92imwVM1mJjO39w8z85W3LmKlaM0Q8wJbztMIMG9kczvYzsSGVQfVLZZjmQLx lPGxCIN9wk217yv.WQr_jisBcuKuG2PfdZtUDpmZ24DoNS7yucBM7fvXZSgXeFoZmpmb8STt_3Cq UqEsvaZxMRCsgZSFRIWs1EOULFiuCjFPIvnnUg8bWBYYId0sOYMzYQe9oImV7EHR91R6OB5jJ4H7 P0v8efilSq0fklgriUJi15XrEtmKIZc.FNbujIdPWpuvrLrJbeXc6o8GTKk1rtwxBoNw05kohxZZ ibv_lVqbN.MUgr6mBIm4Of9GE95opF99xNlcKguW_bugl5C_XoubvUCCa94qtCcVSM.OJTpbtmNh WryLMPFK45E7OAr2DUf4Iy3MfwyZuX4Epi0qugr6z8pcX712W_nS16JzMRAceQARJxNXJL_eOO2I kPGZn7frJlYmYQt05ww.KmwO4w6lpLEtBFGwvL32_S4OENkSZQWQFLvB6HxZf61CDf3D95wB94MC C0V8JkuNw55VTuZ48e5B5EsPUpOyruy26HzIR6nKKHrKO5aNCFfLo_qRWvglxn3N2dQ3GL4Oq9ul YAd7tSnVsnyPNtDog8n7o7yZmc4TKnV43i0BvsCcu84AVZBh5vhAZn9fTxSo8fWwGCjxqH7871je .i1sC4hhaIzbo5_JgeMbGsd587Vj_wnDGkU5T.zpxgfT9czSR68AneGm8eErY39JTN6VG1jXMWLx fBAvg01KqUVZKwzvJaYS6IfUVgkpjxGGdcmrAiODE8sWrXWzi14I42m0xtm.vlJHKq0e7fgylFa4 hnlPVqKnmroNZDCmtgbcqod.a_.EruF51usTz0SrQR7W3g8WWCVGe.bmyf2ElGKDAMWyLsqPu2iW .yggY8cTXh9PsrK5y8ecnR0gjzDwfyqe7cQWfHNm1prIIE.S7.6nlYR5Kgc9GY_R9iIblX9cq1bl W1Ds7Wg6nAhHhr6lvdRCLEMlC3XfnTrTX11jBzZW21uFLoGaJlG5NUcMo1e5B_gMs2G6QzYjNban SMbz4HhWT4pJ6dHDGl1rbLtEXj6_lHnx.u3gfSs_fOmZGEbHokoerNrsT1ghCqmt0O425PdUGGB4 LPEfPZSIyehq05hrfXnNLlJF35dtrAaIupe1ttnWgjZ7ruF8UOCSZDQzrApf8jxyRwstNECXYJ5E Co84cxIM.7CP.BXG2JYWkWRCv0I0MMK2qIigHXj1TyUu1rItoIFUH9uSJ0k4xU8VvfvqYyBSrpZ4 p4VMAYdmq3nW1PhUdjtKTirNmm5iS2e5Mq3wqDQYl4dsSICojd.XLIu.ABG8HXYMpBhs7yedW9_1 RltMbwSj_gQLjzGDpHTGz6086g0.ugeSbzm73Vi53pnXhdpBtSxrOzdKYo1Douu_UcibIO2J1olY c3uLEXrERPKEUb11d_a5tH3BOdD5nOMEWLqO7EqNHiWArm4AquhYyFw4hJjx0ddW7Sbh5DdgO0mf tbOXMUs5yVboooGYhXiM.HBq86Ot86mXKV0uESo4_aLVkcBmvejkv6PcDS4p3d50AlvVZkmNEaHk clMMvAu92hBinqq0SROzjZt_kyfnBsk2o1uXXO.6T.T1DADcP7xgENaHPaqgtivdvJTENKg0ZoRL iaOI7Yq._.RuVaE6GnNyrynNob1WNyTUXrE9CNnCKEWYE2Mc6J4nA.rXSzqC0e3lWqT3UJcJFqqs gG1fCPCaOv.Wwb4w884K5coVqnMhjR.vXlM2NBAj19mzZlkSl6qbbzcWxcsJ.BqboMXHqmtv_7Sk rNIktn4nPFB5.AsCC79nDmnZvHR0Qi7GmubEUtdvZDS0ljFCO8h8aLnuvVw_r44EAeSC4CvdHhT_ uJ.dRmggEnvDdoNuzKNbRzinycpblLxUUIbKAFFgtMmu8VXXRVI_CBFMjjU.M9dAcmwjNAoork0q 3MyV5.nQcStMDd1Pyhk6M2fRWioSvA6Z1HrZ0H3FJCXSyg4RcT0WBVmbXxRicIF8R1Gihy0E39Xu 5Q2Zx5G8O79w9vfxDET8c7IPXbnuSt13tNAHyCNgkzTNrMU7owQbHZnQGILER1xQkNieieut99po 6aelrAYx2V9cghWv_reAz_IOjimcVpMT8RVSZujtfqeB3xpsVXPbRg4YecJEneqb3_VZ8DZa18Ar scf54zWCWo_eDGxXLKTQ97YOZZvNDcvq5BUSA035Lm3X3q95ns3dsl0iy8Kf5MoCUQoc8SKQ._1X CShoKdQDqciJCPDTIv.tzAfTRAhX_K99oCSY0IT0_ssPra32p90tcFW6X1d3IkrLS3CJW.rgzLXt MlDdRVn9gkrFrT1nMjFuMbQrJeXQz0NltYZaMvQnk X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic301.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:53:07 +0000 Received: by kubenode525.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 5fda70cf8d38a19ec9bc1b4fcf47812c; Thu, 10 Mar 2022 23:53:05 +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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org, Greg Kroah-Hartman , linux-api@vger.kernel.org, linux-doc@vger.kernel.org Subject: [PATCH v33 14/29] LSM: Specify which LSM to display Date: Thu, 10 Mar 2022 15:46:17 -0800 Message-Id: <20220310234632.16194-15-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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 --- .../ABI/testing/procfs-attr-lsm_display | 22 +++ Documentation/security/lsm.rst | 14 ++ fs/proc/base.c | 1 + include/linux/security.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 | 3 +- security/smack/smack_lsm.c | 7 + 10 files changed, 257 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 d654ce7150fd..e0d41adb38ba 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -2828,6 +2828,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/security.h b/include/linux/security.h index 955f75fc1007..9753bd9b4fdc 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -220,6 +220,23 @@ static inline u32 lsmblob_value(const struct lsmblob *blob) return 0; } +/** + * 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; +} + /* 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/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 1e53fea61335..29181bc8c693 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 27154c39d109..0bca482166d8 100644 --- a/security/security.c +++ b/security/security.c @@ -78,7 +78,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; @@ -672,6 +681,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; @@ -680,6 +691,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; } @@ -1739,14 +1759,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) @@ -2178,23 +2210,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); @@ -2214,15 +2333,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); @@ -2233,16 +2352,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; } @@ -2250,7 +2368,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); @@ -2391,8 +2516,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 d67bcd1aeaf5..3469ffe195e6 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -6405,6 +6405,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__SETINTERFACE_LSM, 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 35aac62a662e..79b480983bdc 100644 --- a/security/selinux/include/classmap.h +++ b/security/selinux/include/classmap.h @@ -53,7 +53,8 @@ struct security_class_mapping secclass_map[] = { "execmem", "execstack", "execheap", "setkeycreate", "setsockcreate", "getrlimit", NULL } }, { "process2", - { "nnp_transition", "nosuid_transition", NULL } }, + { "nnp_transition", "nosuid_transition", "setinterface_lsm", + 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 ff832d47479f..3c1cf65cac87 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -3516,6 +3516,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 Mar 10 23:46:18 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777081 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B38A2C4332F for ; Thu, 10 Mar 2022 23:54:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344993AbiCJXzv (ORCPT ); Thu, 10 Mar 2022 18:55:51 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41872 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245572AbiCJXzu (ORCPT ); Thu, 10 Mar 2022 18:55:50 -0500 Received: from sonic306-28.consmr.mail.ne1.yahoo.com (sonic306-28.consmr.mail.ne1.yahoo.com [66.163.189.90]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D635E19E087 for ; Thu, 10 Mar 2022 15:54:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956485; bh=tIJ56PEQZpBSEOX/gZGEurZf9l4kFo3rQXYBXSi7jvc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=Mdjf0THosuziM6SWXri5jjE/1GWwUC4J1nyJ7gkvqB/WCj8/QdLnYUHXH1mCYp0o5JFCIQFC55IUtZqWB9mTKjRaHK8w4sDoAe77o4ley+16/vE7ra2mvVpF8+LEUhHet4J/TO8gdgzYMILLeDYyinUPGyCnpEanX2c38IUq3/Sx9kOak4TA6IvBIk3wA5PcBHUoA512ybO1v5ws8dDnM68dXOdC8Cu6qQv86bdw8P1X7ROI38V2Np4yWDcZLN+2JaNzb1L8jgPGBZaRJ0gteHaNTiZBikCThFq32j9mwpdFdJWAkIcLA717iwWoXdLQhoHDwpYYh+TCcU/mxmr+yw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956485; bh=ZCSh/oLHAHPaExJlnEJ2GaF1ABfpvlNuMvLofDUgi7a=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=bqYu2TdnBgaNgecy8j459U9dSN+94E0R9dr/XgKLCE+rrf077dv40qT5uHyoCbD+sZQxBL/InOm/tvGBAS3K296SM1EtgB8E8PeJBJ7LAMQ++nBQV2rInP+pv63Xiwz+xALJ8vnObZttmXz+ud7pXd8ykosEquuooSewVuNfUXUcXLvGTU2ydC/8U2tbCFO6IOr7tdW+4aXKEKdzrvHOKkzFdU2AN9zPQdoThc5DUYvIEc05ZX12M/mx+iDJUX1RwxoQagXEWOMb2AoJq5HRLDB1/4StPzzdNHLHmjF99u7Npl090YPq4FXp7SS3nPN7+67fXx+x8Ir2V4FX4n8rZQ== X-YMail-OSG: AoU5VcsVM1l2o_VmGwaPlalORd9OqiPLRlClxryHwjP4JEfgt25_tRjueY8sImq 4iFBgM28HJ3AgyZ.32o8lABKsk6gEpmW0Gpfn5LV3C6v_0tSixdWyUgTHUTB_2JUdCMrWstGeUQv sW_LmcuBIxNe5g1KbwVJ6AnwNCoV6Y6Ytnwj3k96G3hqHXBsa90Y3BBydEaTfhl80uwuQ3i78jI8 X2NCX3UgMZs5Qd502gLxCJctZ8exV_J7OWgPJ0L0j8pNxEWZZBiKvKEBnJEI2o9.zGR_e.WA8zs7 SxpV1xM188psObvgL7edD1e2uVUMvt3tH3f1yiEOux8oBiOwRBtADy2yUK1B9CWX3Pz6Wzi69fhm FL03IWir5nR82Z_solmsKGBCZAnq94OcFNObxkeQB6nZiGoLhnNvF5UXqwxSPwWFp91NKZzNtvPo 020cOCZfCJUeT4EhL2JPU1TmP2i23is_OFL79S0Jq2DFLFiImoPTZYm3o.NxK5lbwLI0NO0NUOH2 yEeiawQfFcRcmua40fLDBAPMWNr6rc7YLJnvfofZslihNAoVVDk2.FUKLnWy1IvLwJAMGTfmug.0 4fUcSoU8DBah8yzhjPcF60kG6GjRmTqqxHw.0UEl3FDxGxGO4QSnKjxZ77xXeBbGxeIWpVr523lR x7VUavceb.sLyHGkf0N1nCOCm4MVD.fVGoxUie3Hu04nxuUX18DBTdn3QR7USeds9YxaOmRwMswg m3Ip7pAC14EuN6a.z0yvXIi1iXBqeWAiT68kUWdV1TDVEdZCpe61.lR0vNoe7MTqtf6tjkRmzBzO zQwQyv8XegSJv7NPuwPuZ7zILSsAagQdykc7quKBkqVF9Yx3OBQDVWP.9M5.OrpQoaEWE8.GZFcO fkP14sGCq1Ir1uzY83jKUrnNNQjJuJ4PQOYaHnLeC1wDWU8EJyWtUC5.NwiG2Joi0d9_yUmJvom_ EfCFDtpmekLbplQaO1.V_1Xxw3Jd2ORfr3B5QBAk.lI2CtTp6XxEx1a80IcTvmdORAvF8SoXmRDT GNV0wUWb1wXCslSzM.5nrG974DplYMJ2z2tN3C1DS44TApU8qfxXMR4FU_pM_B7CkMJS_itRNkP6 k2VaBj6L9ni66XToYID9peJDB2rzWx0lI2DYjGWgL56UrXgN_4eApKlayKKMEf.vSIb4aEJ87XIW TjY17qTYHPfPtpz9pw70x6l2RgevTlx09NA7DnwZ8AlwX.w189tys_Zu4BB0jZWf28__lZ.5E69u ilsRwddIqS5CS.fjeL1f__ebv_9C4M6FB7vwLvCXLLvfixdj6F4An1Ooq9dgv9OrJq9_sGTyi1K3 RnL3ZRrYjvuvT5Vdnd1juk0MTcBaRvYJ0oq3yj4oGxeqyfwOqesoZxnmZk3ACiUD5UMvA4wOzP3w E8INC93zMyDj7jAs.HBMjmGLDN4q9.CYRrzhtzCVjRH4LxQrBU772u81JS6TSp4IU43QRkDsS3tk HQYjIb7tE86w2nuAJwdYuM7kjReBwJi8xAsaiGqQ571eSH9wlDD2mCO3sy1m8p120vNMmka3uytI B8oNmsAcn9g0YuLTF1jiYavxecreqp3uHfaqsjY7i5PyTipW7dk_wx20f2J5kWB0u6WKR.dMYNue 77h4p5ix4lzLXwfPfqAwNr6fDNz_8aLwVdxP96djO_yXzWGFq2s7LV19e525KaPj.9EsNMGgO.vl bR3qpXzkXI7d.0tTuzYYiZiRVo_3Xh3PwwLt1lQnPPS8JCEg0Y5.D5M8pMWfdNRKkqYVNY0grBR. 8le44.1e5TjicJF1M0c0xJZwWeYxGwiQ1qieeDyGwCmdfjaAO1k5t914ai78sVpVIdaog4cZUTEr SaUGq_SjZL5bK46kadLIZkFwVG5DfiJzqyV1J49TuGBSxnNficwy2VJJe42c8uDEwDm_Ddp09p5Y ON65CqyvV89dEqWKK6mGWv7Vc14kgt5sjyLNkjOd6sW6Ze0zZ60aCO9wXosxYsCA67vinjUvIAMO 9Apd.vgspqSa5OPx.1qq3Xsp4wcnoaZ1JjWjfv_bONTovLlIbtiEGo5NsU8xRSwzJ6YiyUsKNO8e nuV5Krc0Hl6A7M0t1AfiIys1u7xf6aJq.s92lYuzzKPQRsUdQA0BoMG.hji4XNdCYGs8RsMNZp_x 8ISarzgDwGui3HOb.AiQOLkKALLKPrLZjcXadhvSzrXDM_Qu5cYmPo9K5iwZOLoacIyksm1wiVT_ RMG3T2NGb1h1Q8lLPs4qRJlqq8Q09a35JOqJjWDi_wZFcXv6mExuCm_BNppLCHbCftMH4ogx2SE. F0xcu4u7qtBucztyAfxHKSqJFNoFWChthvUhflcvGV72RSMnUY01rhw-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic306.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:54:45 +0000 Received: by kubenode520.mail-prod1.omega.bf1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 8cf1c259c50308b34237c785a039407c; Thu, 10 Mar 2022 23:54:41 +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, stephen.smalley.work@gmail.com, 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 v33 15/29] LSM: Ensure the correct LSM context releaser Date: Thu, 10 Mar 2022 15:46:18 -0800 Message-Id: <20220310234632.16194-16-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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: Paul Moore 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 --- 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 26838061defb..2125b4b795da 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -2725,6 +2725,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 */ struct list_head sgc_head; struct list_head pf_head; const void __user *user_buffer = (const void __user *) @@ -3033,7 +3034,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; @@ -3433,8 +3435,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 fcf7dfdecf96..df2b3bf46364 100644 --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c @@ -1374,12 +1374,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 b18f31b2c9e7..c6237b5ddd93 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -133,8 +133,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 899de438e529..fedc4b0292d6 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -2830,6 +2830,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 @@ -3331,8 +3332,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 9753bd9b4fdc..11c4d088f7a8 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -135,6 +135,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 * @@ -569,7 +600,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); @@ -1432,7 +1463,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 c7cd039e258b..5aa2ee06c9e4 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -1190,6 +1190,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) @@ -1447,15 +1448,18 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) } sig_data = kmalloc(struct_size(sig_data, ctx, 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, struct_size(sig_data, ctx, len)); @@ -2147,6 +2151,7 @@ int audit_log_task_context(struct audit_buffer *ab) unsigned len; int error; struct lsmblob blob; + struct lsmcontext scaff; /* scaffolding */ security_current_getsecid_subj(&blob); if (!lsmblob_is_set(&blob)) @@ -2161,7 +2166,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 c4c3666576c3..1626d8aabe83 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -1121,6 +1121,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; @@ -1138,7 +1139,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="); @@ -1351,6 +1353,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; @@ -1385,7 +1388,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) { @@ -1542,6 +1546,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)) { @@ -1550,7 +1555,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 933a8f94f93a..70ca4510ea35 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 073510c94b56..212e12b53adb 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -342,6 +342,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 @@ -362,7 +363,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 bba3a66f5636..3b6ba86783f6 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c @@ -179,6 +179,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); @@ -187,7 +188,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 a9f7c9418ad3..d986bae1587b 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 = 0; const struct nfnl_ct_hook *nfnl_ct; bool csum_verify; + struct lsmcontext scaff; /* scaffolding */ char *secdata = NULL; u32 seclen = 0; @@ -627,8 +628,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: @@ -636,8 +639,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 c86df6ead742..a8e9ee202245 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; @@ -508,7 +512,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); @@ -545,6 +551,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; @@ -574,7 +581,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); @@ -1093,6 +1101,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; @@ -1163,7 +1172,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 0bca482166d8..163cf0ae2429 100644 --- a/security/security.c +++ b/security/security.c @@ -2366,16 +2366,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 Mar 10 23:46:19 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777082 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 838EBC433EF for ; Thu, 10 Mar 2022 23:55:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345037AbiCJX4C (ORCPT ); Thu, 10 Mar 2022 18:56:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42202 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345012AbiCJXzy (ORCPT ); Thu, 10 Mar 2022 18:55:54 -0500 Received: from sonic304-28.consmr.mail.ne1.yahoo.com (sonic304-28.consmr.mail.ne1.yahoo.com [66.163.191.154]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D7BF019E033 for ; Thu, 10 Mar 2022 15:54:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956490; bh=cMoIwmLyMoRpd3TVJBV17iDlYLCrNiGFgnFrMEkzeXQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=miejDwqdm6ACE/ZgPztkXJhdHCjUvjj6vIoM4RBdF9YOmgLqOmb09I3FGcakcWS72F97+llN4d1pKEmXtuDAKZz3nyuJegZdLqgpnNlrDSyCI7fvZALn1Uu+ZQXo9ZgfXPiCHgU2WI0tz/yWBdXDXlCUHnJNsLfw2dKOJxaZoeU0Jx2i2d1a1lmelVi/13Uc02L/s5EFUfxAH8ut7qLTa5TCbmPXumFCjcwKd0VJIKAq4+YAvfQpIK3L6R5w+1gtlIJpKbnkehu6nggJDuAKITK0mWG1wtX/f83lVo56W7RgVUHX//qDdxHPWgGW8Fj2prpWOjX9YOAYafAoSlC/7A== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956490; bh=+UdwixZ0KEODQzQd0c6ddrC7HwP7QXi2nsTAU9FzkmB=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=ay3NBsQGcy4TL9VxBoTfuY/W9Tjaig0wdqKHRw1ofmc+L1XKXMiPYK0y6tbc84F7t/Aa9X232nv6MfJVyL+RgTqHoULYoUjf6jQ1Z+WFZ2l1A5y900rHcRVE2L1bLOxk9ciIwCM/VqquDNbVMlmHm0cGjbvTTus2aHcpYgcm5kseuZJIlNCneqlneeJiedAvYWDUUHCTHv/Bk4gipeYvZESS/8cXdzR7sVa3ozOgmufly1PPc9n0PjhWNU/7kmLjvU2d/kCjQyOIpBy3D8k6lnlTcT9byGRjLeHFEfIyaDdyeWhpxMWUzD7XFbhO/uwJbQp5qvZ4FFXp4sKlbUjsZw== X-YMail-OSG: .T.ucoQVM1nr4udtqKmeb8nWazk3xvRdE0RiHI_7hm.1OD8PMeBYoQdGLeQIUTt tQr_J6x7zAEJvxwZSFKWveZD5SrEVrPYimNNaxkUPNpCjXkAi3LMHQMrO211PpBtX.2U.kk_FXtB Ci99AgWVEcRFe4sAu3PTzmotI2TrY56yL6ny84KfiZWsK1lV1GjKnHyBNUghRzt_Yk3lHcWPFtsp KjYqDljcYmmTQUJHuqqkXJCgutv57aZCtwBqIHYOvwKda3XrsPLUyvVhMGL44QZnu_yJIera6g3G ttU7KhQscmI3MfGH3wqkKwhrIbuNE6s2y_sI6VN.ZdQ45oNarRkHhrXKqUOLN.SQszCxbRyCvZhq 4QzGk8.jqL_K8mRuSAmDP3gAVGdNb3JYkY4uw5o7TIUpkBZYMB1sE9cbozsk3znnfBZFTreOiyyO ihGdeyChhS.7OsqpeYiKM.PrI1izp_G0zJxW8hsSWMSfIIjK97KIL_eS6aD_627qlpI3ZEMgCG9J PfVULrIa8r4oTsKjZoYh.02XHA9Sn8KEoq0JvXGmMtscioIEYRKA8Qf.HTJxOmbgfpl0vnXE42q1 DR5W3BxKwlB.HfgwSItNN82YWtedIRchvxtZPEhbBxM1l2.qyPQTcSGUMySE7pQkw6i.mGb1pTiK KN6nQRVqpWqvrk53RbsoAor3IE5A1FGKSYfuwnuGWkgcXuyFvOIA1chWi8ZE9P_A_bCy86g9k5mA MhZpz1TeGOiMWZkpEWvNYh2baYIKQOxQH1dvaGjJ.aB0QDmYA4L7ZUVyU0XwkU0lrY.JWSCSGBvx 8jc1PaPg6YMV8IzFcajGXgj78gV91dO.3q6k0EewjuzETDspDnI33UakUT17.Pagrd9xMBnvuGui RXPKGYPcs.kbBUvRufBT2GejHPMK3s327eXgpUT4ePitnmrbXCariS7VNIwLqq0e29N2u8XG5wrK wNcfdKuI0Rb5Joj8d6RzwrMxchGmwr8Saf15SK6tTM6BEN5kHaobVsTcesGcODfe2fzOrnakKyir 9YC6MEVdQvDHtiPh5QFsZwcqNojBkwQ5U6UTfKwdOi0QXAkqjikUUK1h5PCtTAeXV66yleHdiAOj CcLnVK86UigHDUXZOf6lQsSjrCZKA2mF2eecFm0dOiSsW_aNXx0Xl4gL22EhABOAT1qXdybR94hR Rg6sq2BbXfyJ4vf1j.2aaPoHjEr9.TSqt4ieVlSs4vSAFCODCmVUk5AnVTPXNhz2uvrq6l0ZhI76 Kx.hb6WEPXBlnQ13o43LD5IJdrlx6xgVRGAxXbQZl.zaB1DlTht8u_V4AW6Zs6HOZMNhHOH3b0EC 6LLzUeWhqd1mIjOOtcnQVwr2NMEUzoG5ANzpiy_HwizzYu88c7KiXyI2ERRXpDDDlvL17.iiy2ix UJwJr9nFmnnBIZ0Gmgh1s4kZ4dadSo3K2oYzjvKp4cSqaknCmDMOoJKU2o9eks.6hKh1vB6OTsTD OvnEp_h7fIRzUhG.sv15z9xOsQHQfJLD_BM6DxNfGu3hHuoCRu.VoSLZaqNROTKKPsst9RkCMOXp 6tmbvDTZiHPcodNgtUVVayGbBBNdN9Ha7vf_t9vPtCq3Hz8uuGlbLKCufzSa1awepMbLQ2whNiNC fVfb8O36T68drj0sZSFf3XZpN97b.kLde2GSQXVK13c8Pwwsx_.uGZhuqFOvI6CrVBrUnJgGAIki 65ORqGQM8NBQzLhv.3i5.LsrlR.BDwpulZb7pTwUksSnk2GtQrBB.9Rpe6Zno1L9hpPB80lwpZ47 _dtJFbpaNYnd7DPhuXqG.iQEkrW1MdUORKB0fpIPJKEIUHUGEa9zTVglfAx2_f82oBU_3F6N4uZv R_zJ5DxABAYoWBPzfhCe_FfwpxHjz0mOyYCGClEMieS_oIUBt8hwbhnG0eX2VrzcynubkhGoClZn cHqi1m4pmC8MWQnrIx15kx.0tcMNemXBDR5sCYGUaHwe7KnRPphOXtnMLMuM5gYnryjamA.rq8s9 Cy4EtRQ6MPYPddxGqEadXWbhBlvAZAxCd75fjcfQGMJQZcMVygLks9r5NG0.oikEW3OVsQNKx6Pm bowCM4Dg9Dkzr1JzqdHjAeIVlg_HRp5nQH1Gw96muwTibq4HzDsEWYyYhGqGRdAHtmvms0BTtAJn 4641yEmIbTmDsFVtFqHQ1m4usHeOdIWMea66sy.2u8qRwrrNgj6Dqo2mDUZjIJLW7tS6TlyJ4O_3 K7AQVFchCdUsYMsxsTQbLoaGhCIk7IfUeKWtVm3RvXpSxLwkcXReuPhHnyah7y9xNjS6vRX.orMw zVETReBPYtpeGDbxYP.unvohPLH70iY7U_EwYJRrjANFvtBwn5hmcdUI- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic304.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:54:50 +0000 Received: by kubenode520.mail-prod1.omega.bf1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 8cf1c259c50308b34237c785a039407c; Thu, 10 Mar 2022 23:54: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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, netfilter-devel@vger.kernel.org Subject: [PATCH v33 16/29] LSM: Use lsmcontext in security_secid_to_secctx Date: Thu, 10 Mar 2022 15:46:19 -0800 Message-Id: <20220310234632.16194-17-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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. security_secid_to_secctx() will now return the length value if the passed lsmcontext pointer is NULL. 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 | 42 +++++++++++-------------- 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 | 29 +++++++++++++++-- 12 files changed, 99 insertions(+), 127 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index 2125b4b795da..b0b0c132a247 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -2723,9 +2723,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 = { }; struct list_head sgc_head; struct list_head pf_head; const void __user *user_buffer = (const void __user *) @@ -2985,14 +2983,14 @@ static void binder_transaction(struct binder_proc *proc, size_t added_size; security_cred_getsecid(proc->cred, &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 */ @@ -3019,24 +3017,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; @@ -3080,7 +3076,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)) { @@ -3435,10 +3431,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 11c4d088f7a8..1bb26971f825 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -597,7 +597,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); @@ -1451,7 +1451,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 5aa2ee06c9e4..03824cca058c 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -1188,9 +1188,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) @@ -1438,33 +1435,33 @@ 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 = { }; + 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(struct_size(sig_data, ctx, len), GFP_KERNEL); + sig_data = kmalloc(struct_size(sig_data, ctx, 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); + memcpy(sig_data->ctx, context.context, context.len); + security_release_secctx(&context); } - audit_send_reply(skb, seq, AUDIT_SIGNAL_INFO, 0, 0, - sig_data, struct_size(sig_data, ctx, len)); + audit_send_reply(skb, seq, AUDIT_SIGNAL_INFO, 0, 0, sig_data, + struct_size(sig_data, ctx, context.len)); kfree(sig_data); break; + } case AUDIT_TTY_GET: { struct audit_tty_status s; unsigned int t; @@ -2147,17 +2144,15 @@ 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_current_getsecid_subj(&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) @@ -2165,9 +2160,8 @@ int audit_log_task_context(struct audit_buffer *ab) 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 1626d8aabe83..7858da40a767 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -1121,9 +1121,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); @@ -1134,13 +1132,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="); @@ -1353,7 +1350,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; @@ -1378,17 +1374,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); } } @@ -1543,20 +1537,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 70ca4510ea35..ad5be7707bca 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 212e12b53adb..9626e2b0ef12 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -339,8 +339,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; @@ -348,7 +347,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; @@ -357,13 +356,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; } @@ -656,15 +654,11 @@ static inline size_t ctnetlink_acct_size(const struct nf_conn *ct) static inline int ctnetlink_secctx_size(const struct nf_conn *ct) { #ifdef CONFIG_NF_CONNTRACK_SECMARK - int len, ret; + int len; struct lsmblob blob; - /* 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) + len = security_secid_to_secctx(&blob, NULL); + if (len <= 0) return 0; return nla_total_size(0) /* CTA_SECCTX */ diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index 3b6ba86783f6..36338660df3c 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c @@ -176,19 +176,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 d986bae1587b..625cd787ffc1 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 a8e9ee202245..46706889a6f7 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); @@ -509,11 +502,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); @@ -552,8 +543,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); @@ -578,10 +567,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); @@ -1104,8 +1092,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, @@ -1165,15 +1151,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 163cf0ae2429..d56fcb794ff4 100644 --- a/security/security.c +++ b/security/security.c @@ -2330,18 +2330,41 @@ int security_ismaclabel(const char *name) } EXPORT_SYMBOL(security_ismaclabel); -int security_secid_to_secctx(struct lsmblob *blob, char **secdata, u32 *seclen) +/** + * security_secid_to_secctx - convert secid to secctx + * @blob: set of secids + * @cp: lsm context into which result is put + * + * Translate secid information into a secctx string. + * Return a negative value on error. + * If cp is NULL return the length of the string. + * Otherwise, return 0. + */ +int security_secid_to_secctx(struct lsmblob *blob, struct lsmcontext *cp) { struct security_hook_list *hp; int ilsm = lsm_task_ilsm(current); + if (cp) + 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) { + if (!cp) { + int len; + int rc; + rc = hp->hook.secid_to_secctx( + blob->secid[hp->lsmid->slot], + NULL, &len); + return rc ? rc : len; + } + 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 Mar 10 23:46:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777083 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 908C8C4332F for ; Thu, 10 Mar 2022 23:55:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345012AbiCJX4D (ORCPT ); Thu, 10 Mar 2022 18:56:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42710 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240717AbiCJX4B (ORCPT ); Thu, 10 Mar 2022 18:56:01 -0500 Received: from sonic315-27.consmr.mail.ne1.yahoo.com (sonic315-27.consmr.mail.ne1.yahoo.com [66.163.190.153]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9913219E73F for ; Thu, 10 Mar 2022 15:54:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956492; bh=C3V8aXlfNRwUKUxTH37n2MPW6TsksKc2X8ONpGDE+4I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=G2O9gybgWL9Ysj7GFXwfEWnJRMYEJ8DxTJyygdjr3I9efA2s00bw17YAuXm3xV/4utifKAI0Jeo4soK3DEeFo4ErsztJKHrB2eDplBNy+2SMuJPGdNZApCFYLWN7g1GkCGh/5tVNAy9+V5pBjUnQ1EoxRSBSmULJ4wd+9DFJjZASzRzDj+UO4M/RazRkmwQdEq/ABFI5oQ/WN+Nz9wfTUWrmJuggOS1PYQpzYwRf/cmYgQvjOS51RYE8HfbsSvVRTr1hsRavcoUm72kDsa6QrtXqR14G8fo18EoTZJejWPqbQLLWHCvsuERBfsZ82WWGpCiI8krxFUwVr9OxLxVbYg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956492; bh=3vip0HdfIWshHXaepKYG7HLgUUcQ8kt9xnmoOXdKMXu=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=CEzZ2SxwNel+GpBQos8bfIElP//pUqC7fI6iEkr0ZIjHr4j/3Dq41p4ml+U5m+f3BoDIh6jnICinDwvOtRyh9nMjXmt2fvrgdm/K5XWEVEn1qgu1wJY9v88DhL5hEuTMOpCJKBGlcmGk4Fn2J4zWNqwSnB8ttWv6kWYx4X/9ZR5CBB9s/LVr4g+1syafvYw0P/vXA8BFNHJMsZealzJfLZRNURLtYK51SvzXL+7psqOP/nC16GMg7tQ70HO6boK4cN0SpcRSEABctWzW56qkz2kueGBgM3NuzCf1EyTWIDpeVW4XK3grZmiFuYUpOP9io96YJjrJMoOA52Jc3P6NvQ== X-YMail-OSG: Y2vpp38VM1n3lzNPGaC4HipnQdb8hGW4phksNCCcETNdGBGEAAk6glNUy2.xPpl 87ga.DDWl.2EUE9jrJ6H3ScVweaswVAYSWYSfsD6nSIKP9u3jt9dVdC3KXYFrMG87J5Lpemd68DV qJz77hP.WupFCc7eDNHJ0TDrerMKGJPyen1yq1.tr.SiaJ6FEUMvkwK0BhvrH0bgRDK9VoIgLPdY ztNKgrkZ7MmEgKBXsBEXvApdLC20agg0SiSi1MZPPf9Xo9arsh2jhiZ.2bCjZhCtA8QnpRfu0oou d8Ak7wy3qMktVF9tqM16ZYEDEBsrw9sJO3dwHqYluEO.YTDzWSNSWtB5DKf_6wp0QJlO2ZSMM8c6 bYty2xzID6Z2lFOp9k4qmvFlaA8wqB6juiY_kDrJLk3vBz1IBboKJgO3kDuftjG3O_KX0TGG1H85 Gl7yilzgoK9YIoEF_Oprge3jvGMqvwehUkVPqv_jNRneMkm1FFjupvruX4J00LcbzNfWb2OQSpGz 3jNhx3JBsLJhg82Xg.inpV9bUmYi8cjmDku9x58wpZh9AmlhuhB_FqUoj2sAeJROhyo1pgGytQNw 3aUb3MdcvUsF1Vy19K3tK02VjBnlOzpt51rLs8shbr5myBY.oWiVCjAOHnTTFS31UBGtuDA0OCNT cF2sEPK9kx.pae1tFkIc4qigGtHbH_3fvrQodQR4I62rUrxXDk3CmfglQrvKvu2BhwSg_tWM7cZA jDfMNg.HXjDVt9uVSUK.8stsaZ4Pg9NzdWxFk7DdZiTrnxP29sf6WI3PR5sCC391nHXltRQ7mV8V jFOezQi2mhSvRZpvGzIktfWuHQLc8_Jyqp9dPfPSAREug7WIK4_aPCfMkYUGiI1OplT3dDU2OzJW P4xo4p3vkeRCdX6GEoUfo5pF6tUfJdz.5Y_i8UoPfjO6kM0Dq_6EHjtWwhXydabIaOWGeHRWTfJU HXivTapR0BZYV.bype2LQgloFNdma9GalqLJtsA2ZWoPYV1Tq1Hd6Ix6vuAS.dyTfQfrAgBX4v77 UOgYByoLPWIKlhpqfcZXEfDeueXH6H08CEDjwtUF2OiJaPkDmY5CLDWyvgOE0U.D.OwIUwMmaX8U QCPJDXKZaSgtd5T1to6dQ8fUOElDigx5M8doRqvokcbMmBB1X1kukvjh95vd_LXXMYe14VkzDvbp D_KWouag8_D51Ac9ExQCD8aGIHLSP6uxbsG53PzeI6rauUS9JXI5uYbd9dAPGC9NZLTfT7H3FwjV sSHQ9cdoJhVl0uTQVyeNqOmLb6XFFFFXgCNuomk_.BKqGKfsCYzTdzpuviVsdhDGR3kLI8ssZjS3 vZzxdUhEYc5q2DQWG.fjJRw51SxJXxDhxnvrQKM9GYEyUqXlaBUANHxGaF2vmzVSPMQeqC891qkP olivykJaTCQHjei3uf5gXw6DmLMg3tQNi3_gDJ1V8jqntApUbGSBosfwtErlun4r.J5zob1amKf4 IIX7enudLMtadwL6Brv.Xf7dD.44N5QtTICm4JVRg.wwRpvXZKskQ3DLUV6f0R0dfKJgRv4WFz0w y3cehzssv0kz8X0H_ATVwJMFd5GZJsi5qR4FrW5f0_ApC33rYfz0O2pBbdZI2ACaHWCgvjpei40b Mou.i6Yz8ezANKIxg3CsjBfTePcFLafjEMYhXv4c.jC_yaOvt0eHlIEswhSRw_lJ3oJ_L8Hik0ql OSlm5i7c8VzpF1mvjmmP1CnKbO6g10LZ.EseExqB77oU0RRL7yUaxNH97XeRM0eOLTUFfIdXgZFE h7b5NlzkPaG0r98Wi.ds8qvTDIrSENLU0ob_JkFgEC7JHI2.KlBLV0y5a_5Pi1tCAI1PFjm9MIY6 zqHiN8QizjmCVqoAKLzR5IVVEeejpjKpr1bhrZ_hkXw0PKzNnTB.KUMP7bgVYuE5l0Y1KvfC775j .y8esdEnhJJ0qLr5KU2vOz01PkE3zqj2tWPoKulci5VaYAF0m9yfDGxMQNsJ9VBHfOeo_MOBbbl9 xmbK0TuQm8N4mOWGfYskbEmAzWu7YZUlvmPcmSrRjRdtgZtaiw392XAiFqcafK.2t9HYekDOJ7oP ndWPXmyYXITOrAGFLmaNgX4SKxFcoPJ9OJyhnYgkMoojDma5R6MgRnnupd2utjn58rEVQ.PzqS6f lnk44dinQ_ZQgjLcI.BM_rM20XfCDKzH6ERhbr7lpeJ7cDN1pBmoj1LyBpg3GKfomsHaCqbFqJZf xkI0wdAbJwBhXuynAQ6MdT1saekpvEqdaPaRIh62l8tkEt5i55y.L X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic315.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:54:52 +0000 Received: by kubenode520.mail-prod1.omega.bf1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 8cf1c259c50308b34237c785a039407c; Thu, 10 Mar 2022 23:54:47 +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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org, Chuck Lever , linux-nfs@vger.kernel.org Subject: [PATCH v33 17/29] LSM: Use lsmcontext in security_inode_getsecctx Date: Thu, 10 Mar 2022 15:46:20 -0800 Message-Id: <20220310234632.16194-18-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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: Kees Cook Reviewed-by: John Johansen Signed-off-by: Casey Schaufler Cc: linux-nfs@vger.kernel.org --- 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 fedc4b0292d6..4b77e6a13e78 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -2713,11 +2713,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; @@ -2727,13 +2727,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 @@ -2830,9 +2830,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; @@ -2890,7 +2888,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); @@ -3310,8 +3308,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; } @@ -3332,10 +3329,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 1bb26971f825..65db769a8584 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -604,7 +604,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 */ @@ -1479,7 +1479,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 d56fcb794ff4..c9459c4754f3 100644 --- a/security/security.c +++ b/security/security.c @@ -2421,9 +2421,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 Mar 10 23:46:21 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777084 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EC391C433F5 for ; Thu, 10 Mar 2022 23:56:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345034AbiCJX51 (ORCPT ); Thu, 10 Mar 2022 18:57:27 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47198 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345013AbiCJX50 (ORCPT ); Thu, 10 Mar 2022 18:57:26 -0500 Received: from sonic308-16.consmr.mail.ne1.yahoo.com (sonic308-16.consmr.mail.ne1.yahoo.com [66.163.187.39]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A21BC19E087 for ; Thu, 10 Mar 2022 15:56:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956582; bh=OPmcc6RxdekExVViioUe9rMhP6xIsP6mDCh0RBi/+Qs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=ZTnoooEHvtGmaJR7s/T+fN33dVCzNFRinpgZQm/9pcbRNcnuHadKYzueRV/i34vLqYracBfmq0STVDuu7NbMnp1qtxCQjGsAXHbgl1eGNHAZtc6Q+xvjBzEKbYoEC4IyMae/3IuamsTyuV6Wuv0BU1dMjU6kAocXTw4x17iG8JCrPdxHI5hcf3TO5//W7ugb0vI8Oszmx9hM1e4jNmq1aboTLaQ2f2aR4hvqcoNwQos46TAHlArob9Xu+DgLXGFhcxP4edY6ms6h7oye0wjD4N4TtVmH72nnpd8XlOSZphiUM75l3zxZg5Wotri+EgzAZcpGBvGLFfviZ25FwAwMVg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956582; bh=zx/ZlmAdyeukqeKIc6uLlAB8jfa4F95BXi3gni6qPlE=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=tM9mBldcIsd8uiEKWgEJwjbeCzCqahOAFu1B9n078pf2zHkBXVwdCVtSO0mMzjauhsDv7296KMSTMcKNT/vHAJcxcfIfRX57c+5x8s2+jHlG/xKuEEVIY89LWahawoi2CySziXy+PN1A+7v1PwHgvSx5Eym4zFFt9YQGGRXZFgftx2cqELKXLgFoAzfZdZTT70V2zBzkddZUa8G2+UqKJnuilp7iMhHzivzY7u/pIfcm9knWV4mcHofuMV0Jp/4YRo0PAJo18lLThhVl9PX9WNu7aHmlY6l21YwqWK3OLLvmfHgc+ySXMCgakx4xea4HIPqCrO5n2sb4k2r9RPLwEw== X-YMail-OSG: 4Pso2ZwVM1n058ndWUGBbvG5hshml4p6ImW0hUEPPCXOgjXGkQAeoUL7a3LjEvy 3l9ouau01XTLocS3f5mGXpY5ewEeWD4.3oXm8QHmMq.PCOFlBl6v2VamBez0mpS7KhnnX0mNystM DRkEmJ5DHKJm2pCN3O_dRkC4bwZWRFSmKzFNb7g7gcWIuOhHx9EGtjfTULeydh2RFju46yKJXq_9 1z22sptcePMem.8O8U5Kzj5XHox8mbs1_FIgV8PvbXaJrWmPkSmTMGmMxTBdMdbA0CA0Uxp8AGcJ HOogIWwWS2MRO93FqqCc5dquRHoLoMbAhFPKT9X.y_ympk78pOmkai7wPui7gjwyGvOmrLe024KJ 3._gjEEoks9ORysMmoPm.Z1rYHQlKOPBl5WLv0Z79bX74rF0xUUDGGQ.9RNEQBRLaiV8dxkG6KLO feZPh.G6u9Wle33cfNXTspa_M8iKMwVp79M5HIgmWqcOlgsouQf6lC1xqWYu3ybk91psWHD2AzY7 nsmssZjk7.mIDnQW3AnJ7eqA.GY.v7D.XDXCkbedJRnDTkoLE6AiTNWHLAkYjMd5gi1rtYcqlc9x VdanH.8oqj4k9fT6Z4RixDg5_HVuVR56ZKCSazCN5FamElKsq456FUEyL2deB41321Pan4wspciC JqNLrOENre6m44CDM.w2BodA_eoCP6bqOe_5ST6ynd4I0bsoWPc8.9nJxNXAuDjVyy49cR4wObJc RmVWGd2ooZXmpsZBvuK9IqVN6.t3m7QR7kZZbpfJvWkGfk8byUWRCVuX2CbuID_Fyhm9sp6x3bMG 1WNSZUm88dD0hU7wMWTcz6nG_D8o.RBiTsGM2Jlgi8hartfAIRRxvWQPpFgKdc7nT2wgMiSFvPKt _tzuTYazV9yhmCfEqnCpYeBuVJ0dU76OVKw4O3cND2TMSxqCcvGLHqhV2MMYEW5FeTv3D.zxWjkz Nyrcp1y5JYYdBO746DAkqNjEma2b.TTfKOcXMoGgNlpEMUbkoeaDLeH4aS1OM.k3awtmk0d.4ihA b28i0289Xf8xSZknjnp6H2DvzvH6_4_oe2BBC4WNk6DOqQ4jXi07X35PLSqy4ZFCbLgrYi3DZmcG jc9NWMOuKJrkc9wKJwrhhHQbPhWZVY_XesX4oG4uL3EdLct_MGSKcR7T8tnkloreb9Md6DIdism_ a3XD.xeOkroc03MzVK_g1ItYVdtv7Cg33VmkaRfO8LW9Hgxqm5vbZmPZqne9iaEoDpxcj0IB1zTm OXwa0Jxi3wrzMJEvBtwGjdOAwhoAf3ZVSgp8io3S61vaGuGh.Y.a2TBbsEJfvwgChxME_YXXGl7H nAFw6t96T0q4bBCmM6ChyuANs91erBz5uvFTMQRXUda5oPp9.W7kEhs8mmf.cQixO2iVjFwEDjxM ff8Pi7n8Y27luMM46exVjWoAr4c.Ohh9y30jmsxd.qXgOQHkGinIkJIcSNrh9EOkUG37EnJX4.Xe 1KBxAXrx_V5i7n67hxj5FoGoOD_Jjj34AnHVlFBh9GcE5n413gl8a2YrRQU.kwfEAVrz562XOMX7 vQlRzJppywD4TmUK9DI.C_b43pczRGtrYQYOAIZ8Wd1OZvmrrr5k7GfGZ8HNiPKUjW7RWJUsqkkA 5ZEqa1FvNONGSMBzEkyWROM3N4pLW7oiNFzDHywTV7O0XzOKMz8AgPkjrifDw4hS9TQQAyOYVey6 jUAeCuvnhQ9H2brgLkFvL1tV4NzVegz_gFEGT.c9q0.kUEBO9uj6BpqQR03KMbVqQzdHMH8x0mKa T2nUFgezyXlhCk1aDs7u8A7Pq5p7m.9FENu7ZiHqdaelfw2PWrHnd6MWQToWhJfYgAlXgcK1qWdq 1VFxw.RUPAeyERhRqSQ.6eSULo.otfRZqO.iN3q90WuRo5M92SBkaRN8jj7RikYnCZN0IEZFH5ki zhwbAw1728EgVagmz8N4qT5_kYrlBtQ9a50hkNWn8tKvmly50..ShIcyuCFtb6xJUBFUEM78CIP2 xtUuI3n12Cteu07uz0y8zRyg8ghsf_NE2tBh5LVxB7wmyv7hFMoyqaRlZwXqH2m3iJtDSQo6W8kG A4KTmnL_Gu8BhYNHmDgCuFU9aZNMmBGw9KuO5HTcJ3DlMVNSYL.mUy9RGCZY14i5.0Q7_Pj50YMZ BIP4yuTozlfMPKgopb525jWqIvszq95h4gTtrk3jcdLwl8u2tkDzJEbzbUSOc._Ewen8HK9a0kKc dsEVfPMPByUOvWF9g5lYvJn7m653wU2LEARFe8t3M0.3qkWRsr9vvs2E6A4U3NvG9nrrzYDSEY3l QqRu3lW9CypkR2WOflLOuOzJDh.5gEB4C4jq3WiFLURmurBn.z0eB3iJ5 X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:56:22 +0000 Received: by kubenode537.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 85c60a74110af086a1e93bbc48c45823; Thu, 10 Mar 2022 23:56: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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org, Pablo Neira Ayuso , netdev@vger.kernel.org, netfilter-devel@vger.kernel.org Subject: [PATCH v33 18/29] LSM: security_secid_to_secctx in netlink netfilter Date: Thu, 10 Mar 2022 15:46:21 -0800 Message-Id: <20220310234632.16194-19-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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: Paul Moore 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 --- 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 625cd787ffc1..2aff40578045 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 = 0; const 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); @@ -603,7 +597,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) @@ -631,10 +626,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: @@ -642,10 +635,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 Mar 10 23:46:22 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777086 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6555FC4321E for ; Thu, 10 Mar 2022 23:56:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345042AbiCJX5d (ORCPT ); Thu, 10 Mar 2022 18:57:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47278 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345048AbiCJX5a (ORCPT ); Thu, 10 Mar 2022 18:57:30 -0500 Received: from sonic306-28.consmr.mail.ne1.yahoo.com (sonic306-28.consmr.mail.ne1.yahoo.com [66.163.189.90]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 191E819E08A for ; Thu, 10 Mar 2022 15:56:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956585; bh=qvgUu0vofJzjZUietoxZexLdMa3YX3sit8IIoQiY16Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=fJesSw2NvuK/u2CVRWeSEtg0gnuD9hlWdmO1RSAa3mboTqxs4+7A5VoKSP4YmeCTaXz2KX2MjFx/eLoGlVwsU0bJwu5otCZ8P4IFcejIiCo7ohFvt1F32S3n8mP9ZsCm1kDvWGQPIm/8VpPlX1YlaMwkGn7HhVF2pvHCPj8OFWKYiT+vma7OyaMdhoyCwukJUx3X39HR8f71iOnM2nccpcOLeVYoW5Zs/gVq99klak4k3DCdU6KKkk5+MDkbViFrXe49zXqABE38bOmuL0iMNp16ss7rr9AlZMufeLjIgMuMBfKVXgx0g5LSoUwdGVDPIFhZMIqG9QO8a5zMHg/TfA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956585; bh=yFf3b9IqG8Ba8MxiHhxpchyvdD5BNwrCHLNJCXGc/Ox=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=hatLxFrb/YVg13ga03/Km+RWVm9MgWIuqwd1yJ5RSidVWsXXNMiMsSU/6jTvyifnde24i0vXq0DcCxwVl6slsvRmwcY/eSMsdmRBvxiAKwIrzJsQtmnEeAadscqSKT2dnyPufwa0QWHr6l3W727TubaZky2h7f5tC8dxup0+vtrksfRPOVqRzLB7EFSy6kbBN0K1qJfd0Jd1t/vYJ/G8O7rC32d2iUpXC2Mstxa/1zuLUaeMjM+sTPWxK8f+wcfCIordrsC/yFo4H7GDIbSqPYJ9PR13/HpbRLrTI23jN1fEKiDrEZ4cBxIgC0y4c0HfM3vhjvt6GdA+BQKUVxh/jA== X-YMail-OSG: sYpUKNcVM1kw8KufndDHcu_vaTh40nxMtKu0_Lo5uZ9jk5dJpnm9zZKKSb8YWPE zP4rkvog1F_.kW64UcNs.zyVUChOdHZqyH3ERJWWGdQUGfT3pD7MQu8B7UdbEoGiNmK4EzBgglAl 3tMrmZlCxv.Zyo1PI4Ko0aHRRjkeQDZpAeNMa0U7sz_hlJXFQtykexCN2._0gE8WciVD27GQ4sFf hyBlL8.YmapaqEmd1oWwbvE2Qli6sjRXb7Z4gIUITO2aRuheP70bT6zTuZ01pIeIk8SunBoZE9Md R8Vfrr19_no_sIvAgwqpURgeO9u3.sj.wTGXhPbmEIuZIitqQ1oUW6L5LO0Qs47Go9e9d3ffN9KA ZgtM_JA_C_4A73M8TZPB0avfQ2oyoEVkP4SsTWysznASwv0pvsEL35Q3Zd_9O2dLgwcxTWWjpDy2 4.48dHiVVa0NO2E59WD2jQ0H4PGYeZYwgbB0VQLIsb4yfMdUYHRn3I9MUGh2O81Hdl1YGXa_9gtp 6qo6c95LeSedMQtg23uG.e9isfmUNazBuoifbKNX8oeMyRhyeS4owcox2eRnSTheF..AlAn7SGvA LmVbizWmZ9wQXaeGBgqdYkvyod0MWcM7WbVHrtyj_SzMvsO4ZX.MNJ4T293XKFAM83ylB4JB6Trl 6M8Ark6RgVV1Shz8GK29WbTQgiMz5mtkqe3JjqtzB10ewXm9ywcXdNk28Rzf_KBKoyHeGKppCpAd 8ux5wUpNDf2i_jiHfrtYCHn_LoGG9MgG63d0LFLTF1qSOHuzEMbB7gX60MFdr8ymvr8MA3phUsX2 HpcdR7y71ThVuPJBPOLgoKxZwVAHwz8IMt5q_lJH7wj5pUw83LqbuNx0siGJT56JxOKuLL1.l2Kj HOvLlPY6CsRxzGKPsVNJ.fKWZxVRk0HcAV__dk4OZ.Zh_2kCy9i32ZVUBaW0qjIs7kvhPjlrcSzN bllDjOBEKnPNvnrzp0zEM86VyfRld4c8_22k54fXUznPpz4y69nHvVBSGbmTs_AXwPbtxQvx1iM3 .lWA5JjdcfiA0PhvcIjRRi6NWPdA3Xma6sWQaXEitNh1sv.F59MEwvEl0OpVgR5o.pus7ItJi6W7 axLJVdHEl3aXUNtn6d947RS.6mM42VDoriRCUegFwiMfXI9nTBItw2gAPfaXyxk5CEY5nU7bd.hT F4g5DlSwfUN1WuRUcCkbt0TOZwn7KXZfzrJsYVaiq713hvDHKJSNc6DPq1fj30OCut2K.fChtPdw .etKk0q1Mo89RJYfpuQ3kBKg757sRbe_UTLugmulQOFw9Liu6mac.cn4anS3R8ttq73oKMhH0neo 3wQJGyIHTesQjRVB62NcqQg3X6r6r3vDBEQzVg.JL2NZ1Bb1fp_WGSO2rrvtSS.HE.Mzcgsp6QXX jGTwShRhRmbujxpvdXOTRs3FQ4L5Q36R7xgnSsR0WhWgCiYoo1qU31T4xbkPjjaMxF61NMWLH69Q SDVEVH76aptFrKXT5Nfsm_CTzgS7QblOk2g9SPNEEeidmXi5Xx5STojzVbfvlXiJc2_hWeG1I2GA tJQmZmKdw3MEJmL16DH8L_tkuUqY3J2Pd50lCrXFM4laLY4WHU9f9Cbt2WbgNYTZIiY56yXsY.zp M0nZbqkTLwwp4j3mjaYn3Sqml_hfPfffFqRGwwnTcqO2HyqI0s325dsIzf05BYM35pjtME1Gr_XW 9_GLbumdM6D_cfZ4g0Dm7FAUL2L2N3A_27MA4DnacS2GwcoVZU0wdYY.ad_W4ZfNXphpUjM72QcT lHmA._o_VDSayGvHcvJML_kQg2kDdLEuTtzouAhmT0VcJx0R.0.iGkDJAUDOEsh10F.lHdKFBbI1 13jnF6.vndGcFnphKzztFBOGR5_.0_JlraLeV8K4BTfx4UwfHCnBdZWmUR9weIdBt.drXQQBN3_9 hBzzzsDD1RFVZJOEpyWVvEm7.a6z8BXx5H7X9dlxa3xA63XdKNMBsjFzn6y0tgGj8xDm4QJ7AnFX aZ7WZAoeNY56TgUJtGjV.KoeA08b0.YJ1C4QlLOu_OW8s3byRvJ27_6hF0sT3mJ_1Ymnx6ueBJgo 8kHHJ1NQobyN._d5v9Hv3pgl2x_6xpkcwcB2T1Iwt5LJLnqaUE6NmBaZ7c8weMHRFQZWk2InUPfF fP.7P3cct2DAHPyCMmqpjTucF1CFFISzlQSa3mJV5ViZ5EuL9ZnjcmFu0Dz8XprGHKzyqpyaSG1y KUO03waQ3Qt5cXtH9i1yWwJNBZTvXYp1Ap_ChNrONCl4AlIMuJfgQ6y9E8XR8KzafT07_YsZl3rA hKET.3EqxAgjZ6OBh_ZShRwMmHEdueG0- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic306.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:56:25 +0000 Received: by kubenode537.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 85c60a74110af086a1e93bbc48c45823; Thu, 10 Mar 2022 23:56: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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v33 19/29] NET: Store LSM netlabel data in a lsmblob Date: Thu, 10 Mar 2022 15:46:22 -0800 Message-Id: <20220310234632.16194-20-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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 62d5f99760aa..bb9c900da6b0 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 beb0e573266d..158bab993e32 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 46706889a6f7..3aab71ba3841 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, @@ -496,13 +490,8 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, (dev != NULL ? dev->name : NULL), addr->s_addr, mask->s_addr); 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); @@ -543,7 +532,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); @@ -561,13 +549,8 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, (dev != NULL ? dev->name : NULL), addr, mask); 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); @@ -921,14 +904,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); } /** @@ -975,11 +952,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); } /** @@ -1091,8 +1065,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, @@ -1130,7 +1103,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, @@ -1144,14 +1117,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, @@ -1510,7 +1479,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) @@ -1523,7 +1492,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 3469ffe195e6..7b9cb4d263c0 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -7020,7 +7020,7 @@ static int selinux_uring_sqpoll(void) } #endif /* CONFIG_IO_URING */ -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 800ab4b4239e..0b8f99703462 100644 --- a/security/selinux/netlabel.c +++ b/security/selinux/netlabel.c @@ -109,7 +109,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 8e92af7dd284..23a45c9dcf04 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c @@ -3899,7 +3899,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); @@ -3977,7 +3977,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 ef9d0b7b1954..ac79313ea95d 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 __initdata; +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 d2186e2757be..c6dcafe18912 100644 --- a/security/smack/smack_access.c +++ b/security/smack/smack_access.c @@ -524,7 +524,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 3c1cf65cac87..46d81f638a2b 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -3728,11 +3728,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) { /* @@ -4751,7 +4752,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 658eab05599e..13c2fa728054 100644 --- a/security/smack/smackfs.c +++ b/security/smack/smackfs.c @@ -1143,6 +1143,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; @@ -1274,10 +1275,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 Mar 10 23:46:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777085 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B97E2C433EF for ; Thu, 10 Mar 2022 23:56:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344607AbiCJX5b (ORCPT ); Thu, 10 Mar 2022 18:57:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47248 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345013AbiCJX52 (ORCPT ); Thu, 10 Mar 2022 18:57:28 -0500 Received: from sonic304-28.consmr.mail.ne1.yahoo.com (sonic304-28.consmr.mail.ne1.yahoo.com [66.163.191.154]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1A83519E738 for ; Thu, 10 Mar 2022 15:56:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956585; bh=H/2k79voQ0fOdYkvuAiOfOHnDBkNBUmiw2X8r7f2tmM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=loQZCca05tIQkjzt70YXDBkJhkPjaGueh/2TWU10Mik1YJYLRPTFpIqaPOBsWWlbNTsmVSLDMNOAAhB4FX0n2Ylx9E51H/pDt0gOmVvlb9OM69LztGG6x7MiAx/zg8zxZpuMjP5Shyxg0KqGYKeRdl4s5PFuOW3zO1SwcCuy/sydjCn+qe3CIIhD5bkioioOtoz1avXLnifJqipUcLCuVtt46Yzm6DbXZuKjsKHT91BrbfljcJO9URINyThaviJ81ee7lsKSZj6ESBH9pFPQxAHA00xr16auY6TOrCAHK2l+nE5/3BsbM+CLIJYWAh5aJjGOZcAPkE4JyZ5rHhGj0g== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956585; bh=Hf6lYf5hX9iLiDPKZ8yd6aGPwAzl1BrsRYbF4zZmdaN=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=JIVZH8XE7EyFlw8JYkaB/ZdIL3/URtwgaJgiLgoGOlbRE/mBSev6kLCZ7wyKqpp5FljHjDwYPmzsVtHxaGzsQRhy/LwgXYTmByNB43em0W7tUVApCz7Fbl+PlWCob2sveH0q3WOaKW/t0TfIlJUxStGZWKZ+R3FtwGhNcdqaoFsxaiWCPDnJN711MXoXA2HYX+3ZEwna87hvwUZtmtrbLNQGS/v8CxF5fa2VEbZWMfKIvfMfdf2xCZ9G5ic2H4siIPWxgdJUGEpJ3PQ+tMl6lGRhjYh756AJhHNwdcip7YKecxUzMModn+neHGTbRdUOe8Vwj8faz7Hm+225m+FiQA== X-YMail-OSG: zOlMbuwVM1l8XSQlN3OQN8O30YzMJmthOinLtLSzFVQ5L7z8UNQYKdzGmUR22y5 uBeAwINUWGDkjy2ZakTDPVQA7h22wXeXx.9m3risJfVeB56_QnjDCdzMGi5uj_hi7EfwVWHzDT.b HmnE1w0Kph0LzrD8TU4zhEMFo4kDNYcjV2AWAJLMYET8UqMevYFA5_LbAsUKUrSWN32oU51ipSqX pzjEz.KwhNGz3LQkOOeZUrvpXA7erxkRb0lhqwbDbnYw0pJ6x4Tfdql.f2xg1noBASCchcqMcuP3 jPWygOLdJ9HXmd1Ky_K7m9g3vsC_zzt13Wcjc_0k2Kd7XDSzryfHXV1irhXa0YLwm2t0ZCjzVLq7 WrE8CtgqqSNaxfe4NXufTE1Nk4JYvZ4Rro1O0VY7TnqNGB_x6btHzhS2uw8FsqqyezzWiSd4TfFO jRrsnPxLcQc9_.twapESs2wOoioZ88EdDCkN3Q0yJDCl1fDWSV5ys9PGZzL55qjbYAgqxl3fHiFG jVGfNdchJYPc0dSZDK79oYgoWWaqTqLhwphdFlpkhkJUpM.fy6bolEXFSYwCBJU4uixg1RlAX77j gZV_AfEFxlnRniiWYOIwETPOrxv1x3vzeA2B.Mh_m3MLRJDs9kZEZ2JSTsA1G_eeuT9r_NPyZ3PR YouNoYfAeCRzsGZRM8H5o7Kf.BZwYK6CEmdaztsefxxHpcpAYv6iHuNuSoEzLqd1DSBLAzxYEa4N risgmBOU4MtkfeAGb0LWrzcILaE0knsAzcwH.SmbTByoulWVZLZfgph29quYJLBi5p8LDVNz1OXG 8QqpioKnB9O88YStE8.ViIrIKEo9EUI19gT39l2mEKL8IeJ6pywOopn0Wrc7ENUMvXrWRfslX6Su 1z_iNTJOlzorpPZ.npw.7w1LX75G3_.HFrP940t9UBhkc7hqBXJbug6pCI0PqSa7bCIR_ZrSZYxt fj1ljK8VwINLmk3t9vJ1p5OeSG507Cn1jyjALAp16vXQju2fI6zB6nSYRr_2E8l.DRx7i8lDC2M8 .DE4AHhQEBWjfCHSkEiHLjFV76SEleywXvyy2ao_EIO9yj5uip7svBrt3ye1gis7MBYUlt0gaM.7 Ew6KPFQ1_s_4UPBnxiXWDmKtIhs6eQlLTXcYzmV0DkTYr4xg2CbNOOXCtACI1Rwbl79TccmTEb95 g5wFka_3bLGLJZA5R.MOX7xmft46TP0W4KEV6Zc8COGWkWMlxn45pVI.r4uZUufgJEgbYphvv8HC sUsQWyzV1Afezpwg658nHU.6MSRL_z7HC0O5V8MRZERNByFjSYz6iKU.A7XQOZk7Z7M2NNOwzRuI ACkLzuuU4fQ3OpdAcCj2Qhw3P3jNwn46nbDZdURQubLWGYiTiYalRt.9AfOJgZxGOniMQreeUdg4 tBzKvGyZ6ZbKLHqLYk3uK2oeuUirRDIWkVNG.cr6_cKaAPQS5gw9wTEdruqwMKFbVk9tPzvJQ8OT b9JRTUUiICK9vnXmXkS8gZiPJ4AXLssaNaNHKfTeso8ovLAbJA7YOKt3gJserokaNzU4b1qoFkXI w_zccRswe7bjGttTe.cs9VMuqOfEKc14ci97qup0v0peAOGM9CC.aL_CEDlqwHDklAuFcMFrkUge LM2v61N.yfzpaqA8znQAIWY79r6cadlhyBIcXbGZx5at7bp2h13OEo8vFvnP9hE0mMddI5cZQTBQ J2TzqXz0.jrxei65ZeHA0q_4HLEjbtD40.xAtJpg2oBohiCe_ghEON5h90...YmV3BlEiP8Y2gxM 4Btz07EBVm.Rx33z_NioCHxkIs.CCRdPHPZMA.k9Ry28bHQvTgnVLZBnnXch.AlSb0s967DiQKlX zgNLEJKrYVY3AhJ6ajm7tttpbjHd0tx6GxlnTiz6qwEVaLuIYMoqHl0Vh_7YosunFdSzb54yttgx V4aWZc.F9_tr7saWDrHMAdB7JHVN90oQv9yq1P7Y7.uJ5WwK3qURabKbvXdvDg6Il0XR9Kdxwuqs 0MIeFqPhRf4raFYiE4ld3RwELN4GiAHj8xdw_fsX7mp6g3DymRYvfVUq73NJWX90SeZvudAlkOyM XWfiGPfhOCaSySifpRuZ5gVcczWj_IVxTaOWVBLjHSWGAy5szSFwOkKK_fCeKKSKF_78Kk5sfPwO yvyB3.vmXPi9qaqm36xyITkeCgr2ujJL7l1epTgUnzOqJXL3.76nD5Vy_lWS6i4iGU1qMUCeiDdt iNdfdkVLJgwVfcHh_2xK53JnhN0AcoHKeSYUK7SnUFb7KwhSqyZJpLgaR9_LKe9CRtz54hmI6GjB yYw8R3FU8VxNVCRuOEkJq9Sw8y4_gkQ-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic304.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:56:25 +0000 Received: by kubenode537.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 85c60a74110af086a1e93bbc48c45823; Thu, 10 Mar 2022 23:56:22 +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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 20/29] binder: Pass LSM identifier for confirmation Date: Thu, 10 Mar 2022 15:46:23 -0800 Message-Id: <20220310234632.16194-21-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Send an identifier for the security module interface_lsm along with the security context. This allows the receiver to verify that the receiver and the sender agree on which security module's context is being used. If they don't agree the message is rejected. Signed-off-by: Casey Schaufler --- drivers/android/binder.c | 21 +++++++++++++++++++++ drivers/android/binder_internal.h | 1 + 2 files changed, 22 insertions(+) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index b0b0c132a247..259f5e38e6ba 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -3024,6 +3024,7 @@ static void binder_transaction(struct binder_proc *proc, ALIGN(extra_buffers_size, sizeof(void *)) - ALIGN(lsmctx.len, sizeof(u64)); + t->security_interface = lsm_task_ilsm(current); t->security_ctx = (uintptr_t)t->buffer->user_data + buf_offset; err = binder_alloc_copy_to_buffer(&target_proc->alloc, t->buffer, buf_offset, @@ -4453,6 +4454,26 @@ static int binder_thread_read(struct binder_proc *proc, tr.secctx = t->security_ctx; if (t->security_ctx) { + int to_ilsm = lsm_task_ilsm(current); + int from_ilsm = t->security_interface; + + if (to_ilsm == LSMBLOB_INVALID) + to_ilsm = 0; + if (from_ilsm == LSMBLOB_INVALID) + from_ilsm = 0; + /* + * The sender provided a security context from + * a different security module than the one this + * process wants to report if these don't match. + */ + if (from_ilsm != to_ilsm) { + if (t_from) + binder_thread_dec_tmpref(t_from); + + binder_cleanup_transaction(t, "security context mismatch", + BR_FAILED_REPLY); + return -EINVAL; + } cmd = BR_TRANSACTION_SEC_CTX; trsize = sizeof(tr); } diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_internal.h index d6b6b8cb7346..e3a0718ce17c 100644 --- a/drivers/android/binder_internal.h +++ b/drivers/android/binder_internal.h @@ -545,6 +545,7 @@ struct binder_transaction { long saved_priority; kuid_t sender_euid; struct list_head fd_fixups; + int security_interface; binder_uintptr_t security_ctx; /** * @lock: protects @from, @to_proc, and @to_thread From patchwork Thu Mar 10 23:46:24 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777087 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 797B5C433EF for ; Thu, 10 Mar 2022 23:58:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344477AbiCJX7F (ORCPT ); Thu, 10 Mar 2022 18:59:05 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49724 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243323AbiCJX7E (ORCPT ); Thu, 10 Mar 2022 18:59:04 -0500 Received: from sonic304-28.consmr.mail.ne1.yahoo.com (sonic304-28.consmr.mail.ne1.yahoo.com [66.163.191.154]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6602EA76FC for ; Thu, 10 Mar 2022 15:58:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956680; bh=i2dn2sGdFwxB+wuWuFr8AlZTakbfKjayCTv+Mnj6KNs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=lZq0ZtJBkGu/AJh9WN5pJ8F13cI9ZvnJOBznZqnlcT5N8n+WwuH3QVAU51kS0NYnja31suPsOmEXTLl6yGxW46LUTe9wORSrJWT3HipBE7D4jPym8zGzQrRdhWWEs4Ba9dgS1qJMh5+vj15VMd9w0qbdZs4oXCe7WQdlBY7RCNaUix8u/NqVqX2LSZDacroVhUQsvKrIiEDJC7FSL5XlZEAoGcOP6gPOpLo/VMC86tM082/ZJ+0aNyLot0gA7uYjY5u5pMnyasiiQq+f9xvI0mfyM6bRd0y5N7bL7oo8+bStwukqc4sdieOO19ZxY2e1zibcQvugw4AcoBsEnPfqWA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956680; bh=b1eGRnX91MNiXzR4Birec9dBdUmhp+1YaLukTViqSzb=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=bC2K7KsWUDQacYCTQqPGY5Db2TgzLidhTmH205cqqyM66VUq+DkJ5XegZZPophmRHzeNpS2BvUH8ARv0Er00jBWHcWi+ZXlyz6GzHDLyGjTb/Af1q98uVxq7n/2l5EflZUUWyt86xCOalI5IfM6vB5W54JvwdOJ/svafHt0nayrv5BEh4k4ab68Lt3qStZSs0RIO4PdBHLlfjcXPdwx5DWP5Jia4VWkJvJoM5s38YSi5hL2ALpHXEf0ZvZL/9IHliJaJYjwh/476FqBusnbxcEH6TWw3g27TGM+gz5L4TH+2xWHDtGqb+EdeMI9rKlkHZHAUS2OLbgHtXAscsrrD/w== X-YMail-OSG: 2TECTt4VM1kxK.jYRCSkwN1m51bw9jx3sG5E7_2bSnyHGysdclGYyLI3U8ZHq0R M1kUYotMDa_dP65mJ9YZVNxK8NSHH7vbOU_dqbenKFeMTHtUxe8ow0grGZuM8IDviPfpLN4Vj5ox 3RIoFyEb90qxxnButcmd98fjAAwTnwKokb_FCgLTn7DOWZIiQsiomp_UT.C6DfvmtAlPX0RKPlZA amrgBhPl4H4xge026pUZs5jeJTTs.U80jDMGGtCZYCsQXCYVnT64uDyIgKXi9HSt7ZkXgjmfYQ7f QPZ9qDC78kgkbVHLYVAbzy4cr3mxkMmYj4C1UNFeED_Z5Toacyzqe9z1biIWUw6a08kIF30_7LqP UNZ2u_pYY6FedHx9L.vh.oSOM4zKd8E_uwr3_GJrVJvKWDbgpblh92JAM3mfsizrFj6mAqQlkpRo HIitzlguonJvWlAidfEPv8TL8Gca2mQSua6myhxc2rQVGQpVy_uqmwZ3c362g6IN3i_HdXOYZoFL 0eHtyRPqQXZqVKOktXUlkfpLiZIA6ZJOyUPn9MxWeB6gTBmF.cvQZX6De.Tp7bFUOrZOS_xTTri0 HjFq7HRsayTcnw6MpycejH5sEUvJBXpFuGwAFuHw.7AuE_889I_bOhYp.z8oozhY9sh.DJgxmRpi 6EfYTYApWzikQkgKbERVCh471_Ruduw2V.WgV84KJrix408nBfvERLhZWL.fUBRvaWp0d6iubnKr 7oX_72kMWEpeh_YPOqSaNFps4HyDN7QhEPnCCOASLJcJmlSLj_UX_z7WMA6CEvqdqmtVZu4YnTp3 _fI1pqbJ7vs.E32ljcKr4_kPAlRmI_PVw8quqnIoOT0kNo8mcGyJhmdGIWc.hWb6xNaXG0lH3nBQ 6F9jOCzC0XQCb.bKnCPrROdp_7XwwQ7g.fFtmbYlGSMKqp9empldFHOeAatgDpU_MA4liU64FJj6 8pPGk6kv93lWSbHKq9z4PluaUDmRkyv873LXcvfqb8or0_JeDnfJeHLQ3ARZvkkO2dWhDeqV8SRK wxgmFGRBYsq3liX8lPT.krnx71suBhJsFmXajSs6.dAA.J0GoCGR873BfcgklnfMoXL5lItrUPbh 1U6.N5MqSIvEFlMPS7JXun.8lHS3zmsZRjh6oXb.5pfGxbhx6gz1f8wWMpyIxxeM9B.JWqEXs6Z9 8rGikEEH4AHVX7pr49CGOlvob5O0Onzs42A58kzW_aiIsHaJGDM477iqv3hFm7UtY_6zJhCalFbx NRVV.lAO5hMmXeoSxHT7dU.2R_HAHhr.Inmz5aqpYKTdPKb0_EtKk2Od8lrZGPZMTruQYtEUZ5z7 3RxSf35fv__u8TTRm6Y6s4ro80.nPXT.b27rbgJ0UJDXI_EsXFFZ881r0GS8DqfX8JTb4adJ5o3b vzACO9KHesrwG4L4my.c3aC90MEOnLhu.a1dGUwNu6AXU.apfwWxlM651Ni0794DiZOQWp7oGjsJ pjanz8L5N3pEbxymnf8S.Rs8DCQURYsY_3OYIh0hdMlkCPov1kQdlP.mtlIeJckIIyRtJa5ibKGY iL2E5JLO9rUbH7H_0rDCGMn9C52N5xGGL8Bc0LCJOzFlWEgwBQRMmnH39cQSkLcROzURchAgiydI SsCu6lIgwXON7sgf5HEF6XPWnPH4c4b2irM.IKdRmODJymk.n4TlH9qTCCiF7oE0tCItOjZ32D4X yXxnTrqbQMpMhEI2eVVTlZc3bGO2TpF35PmViIMQtm7HJU5GEGA7Oe4DneyHI1XjMBTpx8L8a4Fr V..Lgt_REZb0_IrpN92dMQbVZLeSQr5pdMgsSirwDEoCSzuECimDre2oQKiuT__n4To.qP4kPngP Voo5Y_y4wuRA97jVDkDj5GtMdN7Y.B3AENC3_qIAoDOcosAgR.v6JX6Cd0RuEcJjdtZoUEbOitXV c5uNRLQCv8477ABHH7fF5I3GA7NcQODL24hZJBefxkJ8qXO6MzXRiu5HXCp65BNM.w0Lyo8_bXK9 TMkODMRl3xLQvoyjE8.jRsK3nLjhEhib5yDROnk5ejbTlXiiolLuEW33p6inf_N3Lc1onYs.bqAx jN.JHoQkNH4dxMh4hDcaBfeaAxuWTX9bGionPf_ytSrtWgQAi6Hq.iGyllkwKPZ2Mol.nSz.eQ29 vC40OLzd8eoK7fInxLqJE.jsP3.NehitqLFfILKcaTyt3RWO028YAc_07zpYvOfS_2QWjQbPT0aQ x8MABeuKiErx5LxqyJ9u46.JdqQQB0EhDiuJ3l7t.0GItBrRStCo- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic304.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:58:00 +0000 Received: by kubenode526.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 075078af6eda9fc0a8c4174c138d83b1; Thu, 10 Mar 2022 23:57:56 +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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 21/29] LSM: Extend security_secid_to_secctx to include module selection Date: Thu, 10 Mar 2022 15:46:24 -0800 Message-Id: <20220310234632.16194-22-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Add a parameter to security_secid_to_secctx() to identify which of the security modules that may be active should provide the security context. If the parameter is greater than or equal to zero, the security module associated with that LSM "slot" is used. If the value is LSMBLOB_DISPLAY the "interface lsm" is used. If the value is LSMBLOB_FIRST the first security module providing a hook is used. Signed-off-by: Casey Schaufler --- drivers/android/binder.c | 2 +- include/linux/security.h | 7 +++++-- include/net/scm.h | 2 +- kernel/audit.c | 4 ++-- kernel/auditsc.c | 7 ++++--- 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_unlabeled.c | 11 +++++++---- net/netlabel/netlabel_user.c | 2 +- security/security.c | 20 ++++++++++++++++++-- 12 files changed, 44 insertions(+), 21 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index 259f5e38e6ba..d59c4ebf7e22 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -2983,7 +2983,7 @@ static void binder_transaction(struct binder_proc *proc, size_t added_size; security_cred_getsecid(proc->cred, &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/security.h b/include/linux/security.h index 65db769a8584..6dbdfd12fd79 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -184,6 +184,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 "interface_lsm" slot */ +#define LSMBLOB_FIRST -5 /* Use the first slot */ /** * lsmblob_init - initialize a lsmblob structure @@ -597,7 +599,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 ilsm); int security_secctx_to_secid(const char *secdata, u32 seclen, struct lsmblob *blob); void security_release_secctx(struct lsmcontext *cp); @@ -1451,7 +1454,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 ilsm) { return -EOPNOTSUPP; } 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/kernel/audit.c b/kernel/audit.c index 03824cca058c..0fad7317cb09 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -1440,7 +1440,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; } @@ -2152,7 +2152,7 @@ int audit_log_task_context(struct audit_buffer *ab) if (!lsmblob_is_set(&blob)) return 0; - error = security_secid_to_secctx(&blob, &context); + error = security_secid_to_secctx(&blob, &context, LSMBLOB_FIRST); if (error) { if (error != -EINVAL) diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 7858da40a767..e091d03f9184 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -1132,7 +1132,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 { @@ -1378,7 +1378,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 { @@ -1541,7 +1542,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; diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index ad5be7707bca..9b5c44dec1e9 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 9626e2b0ef12..e919c35f85fd 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -347,7 +347,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; @@ -657,7 +657,7 @@ static inline int ctnetlink_secctx_size(const struct nf_conn *ct) int len; struct lsmblob blob; - len = security_secid_to_secctx(&blob, NULL); + len = security_secid_to_secctx(&blob, NULL, LSMBLOB_DISPLAY); if (len <= 0) return 0; diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index 36338660df3c..cb4b8b636f6a 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c @@ -180,7 +180,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 2aff40578045..6babdf5fce18 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_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index 3aab71ba3841..b53cf90bb6f4 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c @@ -437,7 +437,8 @@ 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); @@ -491,7 +492,8 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, addr->s_addr, mask->s_addr); 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); @@ -550,7 +552,8 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, addr, mask); 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); @@ -1120,7 +1123,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, diff --git a/net/netlabel/netlabel_user.c b/net/netlabel/netlabel_user.c index 951ba0639d20..1941877fd16f 100644 --- a/net/netlabel/netlabel_user.c +++ b/net/netlabel/netlabel_user.c @@ -100,7 +100,7 @@ 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, &context) == 0) { + security_secid_to_secctx(&blob, &context, LSMBLOB_FIRST) == 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 c9459c4754f3..b694eca9d4f1 100644 --- a/security/security.c +++ b/security/security.c @@ -2334,20 +2334,36 @@ EXPORT_SYMBOL(security_ismaclabel); * security_secid_to_secctx - convert secid to secctx * @blob: set of secids * @cp: lsm context into which result is put + * @ilsm: which security module to report * * Translate secid information into a secctx string. * Return a negative value on error. * If cp is NULL return the length of the string. * Otherwise, return 0. */ -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); if (cp) 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; From patchwork Thu Mar 10 23:46:25 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777088 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 620DFC4332F for ; Thu, 10 Mar 2022 23:58:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345074AbiCJX7G (ORCPT ); Thu, 10 Mar 2022 18:59:06 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49792 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345048AbiCJX7F (ORCPT ); Thu, 10 Mar 2022 18:59:05 -0500 Received: from sonic308-16.consmr.mail.ne1.yahoo.com (sonic308-16.consmr.mail.ne1.yahoo.com [66.163.187.39]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7944FA76FC for ; Thu, 10 Mar 2022 15:58:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956682; bh=vgO//PFYDezNojD/b4WOsqsxvAcTkDNEtP0WkzWCjT4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=eA/IpXYlxN7FaAJKltc0323QG+pnB8rwJcKw7eBCfiNUQjct104HQIEnmv8FngIWL1nUJuAN986xR/TGVuRicolLxcCvp/rVULygTDqb0CZg4hUbfBvk6iHC6jatcq4iXNcbwm5cPke/tOXT69lFdeWfuYD4m8TUnN8MY+vRaL/8YkaDdOjeC3NeHPIfRyg6wd21CJly/STnwauZbSXaEb0EcFukCX4qSW6yknMJw5EdePzMlM3VNh8qfIEmmEvRTY+uJKBXJcGYDc2i8m6gU5ipG4bnfZOiN346oOB5TizNZHpxGyHBWKcaoX1RqUHD+0S/g1VahaSlgOp73BjqDA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956682; bh=QeAKXrHutqGOEC52e+GlO1m/pSV3Kse9tjSES3QeLzV=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=Ao0AYVn13hCVnKezqkERjeh/qFfptUzo/hNwms2KDHpkXPcgG0cSX8ByOqImyglHLfhu6BUFEg/g2zNxhpYxTFL+bwL4B5QAYALdDHHjkM31tjxAS35NzGwA4J5b5uMXbg7oo+rgj8ixQeq7S2qsHuobrCOMQ5xHpJ/Zw8fpi2hDYQX9w+q7QeRV4YHRb6Et5vcW1YuOlwzCts2JN2adktYauQdSatCMUzDKg4gGH7SasfHVJyOiGaX69vBokrJ0N1ceFQiwV1fhKNF+hgTCXlPz7CCsmdoLdPm5E4toGWylcOP84+Yso6yWFcGfeyT5vTfez0RY5S1PX0hKzli31g== X-YMail-OSG: ffF50pAVM1m_JFZkzp8s088rBK3QE.AN_MjkNcsXIDmVvlP9j9xR5glvc4_syGm 1R31EvK.QxGpy.z6X4XEYaNZaEk1okBuT.AaJNxqitnTXF.kCML897_Sb6UPmFEjQyOnDYyXMdsh XvPdNkAaG8mjw42HyEUGqPHns8JqZvTybyxeK.Y7LWNCLUOxzbz3g8aokWuxHxxqa8aJS44rNpaQ O0jU_HIcm4qtSyHnhKpaVH_44gvog9I.p4zzfXFVuYxrEPS84NIC0W08myCIM9.G8Xl8u7KraK90 PKMgOPnOmgEA7tSLjdYEsMUunF24mWH2utzwKFRBEI.a5Eu68DTEj8HxvFvabGw1O_2M3gA7GWMp RVTJ8Nwh5Zi.2KhEnWG0mGvVaOgvynE6EkLbNA6DFAvu8q.fnwEjRVoXu_Y4inY1_Il.8A0XbKVu SpGjslMSIlw9OmtmMd2PY1C0K3EVXcWXTkVoBhjMWd48v9aRF54h.nbPMyWbq9nK_8OmL9J83RAn Z.W6L4Pqd86CXm9wMdog0_ak1iicM6iKxWRZuP5PtNc201CGWfqdbBYvUiC6W18rYHl5IVAm4puu AnRK7Ju_9TXoTCiv6T.c62jgN1hRPm7LDEqEdkFf0BQdFkivAh38UffWr84j9kJUv4IIIkfen2YQ hakBwT_i98AdF2Z1IpUO9_dkpY9vvYfvM5nr6e_GDXnt_zdRPa00vjcA_Nhgc..bEDhq8UjB0xFk 0UiWS4TOGR2KAjbr6DVVTn9emy9BVRXVw6D5JF4hEnBoN8jnpMJTXujeDT.ztS6GJtIACYEdabgM Rib.vV3D..iujDqyNh9f7EccT3YN1nTwOmDZDknuUGJVB0TytxYOxfuZs4y.n.SbO8FCdrYuVfT6 SKYtDjMX2jVWGjJaiL_BzJiE8HOfUDtP8eTQKJhigm5Qm5ZUMt7Udog9IGVTnq6MK5HJcNudNQEY 41kVRFV7RpCtHN_mDepIKcJn_ZOeslDbsoheiSKldoJB3E.ifNti4PafUgGIpVO3nOl2R634MBc_ 2qugaLNPNyrquu_pgJNZ6wmez6FU0nB2zs89zkBMIZdwV3YBiWfHaVUuKBIOiGFG4Y9X4Wq0SP42 H268stdIv6G7nrpGlidZRDsIhtaJFx3DSKnbNqmydPA24yp8T1U39kC9RKabgOcjhT6nWHXhC7vV 0Rk49CXZqCcATmxDzZPURaCsOAp_kXQk15dj3fnJWIeSwPi0s0qcJBVWa2bonxcTN.T0fPlI2FQI Jp9r83PDCYu6yl2L5.wcWc4.PIVvFvf1sQvTTvYll8KLfiwrvbzytwf3_uLiQy9_QZ2fALoTOabA gEQNwoVysOxu8XctyzoS.utPJJyKFbEu8npOzMzflCGcRnjtZDSQhdHSrAJXmnY4JM7G3tt6P9jV 42XqDTm4Vt8d2Xdxl.qtofORIIh.OZK24TJaOyj29gp6evkR0V0M_.vRwkWgRs83BLLeOCJqbHcj YqevVfX7GIFdk3WdqpPauevj3KbS4a0JlpbJXlI_e76jS.yxZgvTzzxZ3Js3Dh0lKA15ZWv3hbbW dgTxSv39VX_rBJj97Xn0Ua_ItKqffXrJ4Lt.dxcPMY8zHTYXExeNlnO48.HBAuzmhUpzi3eyYoHY VtMfilgggvMlPrFI0FwCa8TaJ3JAbvJLKdkNGzjeKIfP3GvOIKlueeZqdeFeQKqWKShkqK.Gv6rY 7dU3LXJeNIx79maQx3vrhyKoBPZ7Uffa9u4AtGmBgOAuj8r8tI5ihAhW5Yb3sfRCBZcR9yFueiYi SrusMTdMpcz95DnlwLZYJ0PsAvU0TD4bw5LoWUPvnnTXW5TJVNKFf7PeWMvNUb6IW2FZkTiU4gDI VXKfPKwV9emJ0i6fmP0ccDqMl7ORDOotk.kmTQfGFpeADmwc9kmX9GvEQbe7318xx0FUR9k97gmm 879wTFllEENNsFVjWPPChKCzWJ4jcZZnPotAkGWgboH6VY3e6DwzDmYuodIqvWDBBtHDTe73UlRE e6_7iJZg4cDuSJhapxytSqrVtHIBaRJPSAPs3gg3ygXOvCcu2z.jIv23b7Fpx2RPjGmaW1OzajiY hnHTAvC2_22jLnieA20rhI.jA9UrXdBJJEAYf8TdQMAwIL.Bd4PVcs6aTwWXasA.Od5Y8Hsd4emP 4_.T74xBAIFkh9QpEl67bhnHrkL1D6yymGJRRfyyqxgo3qLjVbepr_9e8L6cv_KjEWDxW9PYpGHt 74pb36U2hWZo38g7o0JRb1z5GkM0To7SHtVnvzCDopVfqCGweWh8- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:58:02 +0000 Received: by kubenode526.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 075078af6eda9fc0a8c4174c138d83b1; Thu, 10 Mar 2022 23:57:57 +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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 22/29] Audit: Keep multiple LSM data in audit_names Date: Thu, 10 Mar 2022 15:46:25 -0800 Message-Id: <20220310234632.16194-23-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Replace the osid field in the audit_names structure with a lsmblob structure. This accomodates the use of an lsmblob in security_audit_rule_match() and security_inode_getsecid(). Signed-off-by: Casey Schaufler Acked-by: Paul Moore --- kernel/audit.h | 2 +- kernel/auditsc.c | 22 ++++++++-------------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/kernel/audit.h b/kernel/audit.h index 527d4c4acb12..a2fca1134519 100644 --- a/kernel/audit.h +++ b/kernel/audit.h @@ -82,7 +82,7 @@ struct audit_names { kuid_t uid; kgid_t gid; dev_t rdev; - u32 osid; + struct lsmblob lsmblob; struct audit_cap_data fcap; unsigned int fcap_ver; unsigned char type; /* record type */ diff --git a/kernel/auditsc.c b/kernel/auditsc.c index e091d03f9184..47d34433b91e 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -700,17 +700,16 @@ static int audit_filter_rules(struct task_struct *tsk, * lsmblob, which happens later in * this patch set. */ - lsmblob_init(&blob, name->osid); result = security_audit_rule_match( - &blob, + &name->lsmblob, f->type, f->op, &f->lsm_rules); } else if (ctx) { list_for_each_entry(n, &ctx->names_list, list) { - lsmblob_init(&blob, n->osid); if (security_audit_rule_match( - &blob, f->type, f->op, + &n->lsmblob, + f->type, f->op, &f->lsm_rules)) { ++result; break; @@ -1537,13 +1536,12 @@ 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; + if (lsmblob_is_set(&n->lsmblob)) { 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 (security_secid_to_secctx(&n->lsmblob, &lsmctx, + LSMBLOB_FIRST)) { + audit_log_format(ab, " osid=?"); if (call_panic) *call_panic = 2; } else { @@ -2245,17 +2243,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->lsmblob); if (flags & AUDIT_INODE_NOEVAL) { name->fcap_ver = -1; return; From patchwork Thu Mar 10 23:46:26 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777089 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B2CA8C43217 for ; Thu, 10 Mar 2022 23:58:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344884AbiCJX7H (ORCPT ); Thu, 10 Mar 2022 18:59:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49814 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244680AbiCJX7F (ORCPT ); Thu, 10 Mar 2022 18:59:05 -0500 Received: from sonic315-27.consmr.mail.ne1.yahoo.com (sonic315-27.consmr.mail.ne1.yahoo.com [66.163.190.153]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CB99AA94FD for ; Thu, 10 Mar 2022 15:58:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956683; bh=dTXhzuopyuHsOK2uVsPAMqd3JMR3iQuSAYWnNMHmUjA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=LU9lCSiGBlXOjpNLEOjF5zNCVpAGnmQYmCIlfJNlZqYjxoJbV17jGVXfJnxKTT8A6dAj3ooJgArixb5o0juMjkgZHOuN5t5Ac5J11xholuaBY2MjG+EIRIvwQOEAYxYqESYjHtVLIVWkBUVpPaZZLOpolAGsuG9NLuR+PfmSyzcZy51buYxT+E4KJB5C/raZgizMzWifmxlnX1svCyl2D0BtAFklOswS3fqhOsdUzCDYuMLiKmIvu1Wa0JTNfWvfEquERvJw7SXMorQstTQTH7WqPoOCqqZklKmEoSoMhfSxMpAgDfBcCGMoIyDVMQlEZXrFYIqdC6P8EVtq4F09uw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956683; bh=KdQ4NRGiTU0mP8SCXYLvARfZvH5ABEc2KKHnvBwJdZG=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=RxVoBkTCpYPgyt/juLDNwTXHRr0aWppoY8q3N8wa9WsMBORp6yGyu91037hMhNFRtKGGOgeNl8bYYK8xHTYxc52otju2tC+fUvP3YOtu0CdWa1zEhI5mnKntmmihfhWYb623NUq5043rI72qFFDpnFnyoIGP/Gwi+NPY1eb9mLHnXsOY64UVIobFHiWPrW+a5ZMc4NSoNj/xFX5wwxpQTk/+0FAsESA3iyKACBhPX6IYyzNGd3pmgmkSFlAtW32ZTrgGNTluFrStjlRUvtHbVkaZo1Kzi6OKBnSkXs6fTDDT6x91MEzRsfRL7CXqTQcJS1xJCsxsP36+KwVzj/VRdQ== X-YMail-OSG: PzsXQ7MVM1nmH3DF3DXd9W5I.OUbt2BFDq3N0M0eaRavqfsB9l1ltNBOuoRdfOq d8iVUBNNSfsvPciaX7HbSHw3nzTtVGjNCEDRCRcLrCnV4Bt1QIXHVoNCDGww9blsWU.j4iL8FERt sDCxG0mZ1jZUh7dPDorCcoYgo4zrooGjDkdtXS0YOTCz6GpjIJZVXAYZLvo9wBwsn249BeXXLR9v FC7gbo.p6lqQUe0MdjxKT8sOhHAEmKS0D_0sn7nUOXupS07H5bEuiy2EwJ1vKmNEzz0uL81rcZM3 uInLVXDHG6yX3dOlH6_h5hHWZybDP.UhXuwWy9qDh4yrJ.PlvFrYdXFuL0irqOZNtApG8sdEtdNo XWXZU0A0P0y1hCXSsxXvoZkm3ipgZOvEtY4rG8.M2ZQ3RutxnPm17R3AA8Ml6vWkBMBqcbBUy2it f5a9b5nk9l.siR_7EE43f28tRmq743XI.XbdqDYUfCFQX1eat4FMMMTka5WMX5lrfxs65gB0o4Uw jJ7HRbGwTUKFaOOc0IQT6vlx3KznG9MWcPSGrRWaz8x5c74PXKlYOBMOXgqVtIB14ZLz68Ifxo1N 9EQpUykd8FLUmeAFyrXEf4GOcd1FaneR3gFBrF7WQNOAH70Ch.tqVHeXUV7WckqXO4WoD4h6mcCP H_qv0kX4D0HTlGng69cYJUDCdsWXpylo.iOu.680OpKUIobmW.MHCNGu3t3ZTsFOx3j2f1yWts3d 0p5EzUid3eEKtkuDwoZzkR7YHcoj6z8ztXQRBttEMChu.zPXPmMAj2iQ7Cr2NfPHcuMX_SbCVzAz 8r7lkGBRQxaEaQ0Ftsv99HzL0ABTx4GFEGTg2TbdLyiyJ_B1nvYSizTCMSoce8zbgl3khWeDYbpc KjgQoc142gz4nDCgcp58dUDG2HvmpOfrYFrqOnVKVbX_5g0e0KNoV6ohR66B.qx8KbzBVlkrGMbj VXmVLPvZGqQq3iOoBn28mKppAA03PEfe3AEFiOs94ligC4.taQHD1Il.fhjNDDArKPLL1NyJ9uRj 28t0UInzC8JmFunITfQmZpkbca63U3i3ug5rFHUmFEMVdtt_apczSK8HS4amC4mUSuNRCEkUqdU6 9RUINlgr8qHRXQPnyVWqfV2UMWDMbBrSOLzUP6UWm4VAvT4YLTArcszOiu1A3ncli4RdFV6T1Lln k9C7TxI2fxvudc7dChDzFsGkeUBy4973SF_0dfQI466aslGNqJ6fLpuyMAWKSNJG5aH8HsGuT9mW f2YbxDFr4NAYQBrW7siS8n26qcWTI91y0.ayUWXts6vprXzTxPWVh.WCmxOUekd46BTHMCOid6ah _r9XgFnYZbXwlTpRa2GxuM_4iu3Rne9Lj5WvT9Np5_uaZ.96VSRX9xjyKWi47DcLcUYglBDybJ3C BqPMkk854mvSQG6y3c5Pz6rHPUHHXSX3VpWVutZPbAC_cCyMgMXgDAmjFASQc1MHsFru57xXiZZc ta84N3Uy2p8Doxm04El4vPbEDIrKVnFXpW.uI3VfszQQ34Ttaj9Zhc1.XeNlSN04JghnLaLuS.gu zQd9BkLctkJ5VGG4Q3voCBNd6UoOIDXOJ9C7rTre80l4Vfmk26Szt8OE2m93TASx8pwzGuB2PITM aEL2XHBdSx6a.HGYeasG4_LIe0OlP1HXLPBLCaGlV9PC2rUnEhDHnE6OX_6zOPi8vKRf2A6d2khc AS8BY1sRzlU80Uy_sjRwPD5AdH1QZ05IjlBJp.ET5MTp0tS8FdSu1do06iHJ7Cuzd9HTw94_hcYZ OSJygy.AM37rzT.K_ge0ijpgNQt2aNzExJJ_uFrqhqYsO2MCPGO_rlTikvdzl7lajmyhJcJt2I0R Qxtr7jdhdHKZq3V72ngfTkkDXDnA1dCK9dsNkuVV8OF8.d3knhvCoGnvERYxLs.DRFnAIRF5IPSN xVXM.mTSOH8qvn8OTBs2Ktz6K7BJ5V6yQzOgOJ8eRVfNJK48rSwEaeSIcTY9UOkb085bfkfWYtsl YMxZEYD6gdWBU7gWepoCIejH6Ykj7P_Cc8gWd4EoFSq7fADc_rISkpGONW8kbULwkFLtiu30JvTs 5Ij_DLfqxjYAccQuzVJWVxActyw734wZg.QjKM28CMjI8Ok2FITutYvVN6fUUYNVaNhHicvFhBEQ Nox4Nys0miyx5iHJIcQF6u11DCfauhIdPqHMtmeaFvbwnRQFZkKPBN5lH8coYHd3AoHwzk292G0l ylrXS47HeiBv3TbG6.8_UhzSK7c8KTVzgACGqWs6MnC7Ld_NqIVE- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic315.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:58:03 +0000 Received: by kubenode526.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 075078af6eda9fc0a8c4174c138d83b1; Thu, 10 Mar 2022 23:57:59 +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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 23/29] Audit: Create audit_stamp structure Date: Thu, 10 Mar 2022 15:46:26 -0800 Message-Id: <20220310234632.16194-24-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Replace the timestamp and serial number pair used in audit records with a structure containing the two elements. Signed-off-by: Casey Schaufler Acked-by: Paul Moore --- kernel/audit.c | 17 +++++++++-------- kernel/audit.h | 12 +++++++++--- kernel/auditsc.c | 22 +++++++++------------- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/kernel/audit.c b/kernel/audit.c index 0fad7317cb09..f012c3786264 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -1798,11 +1798,11 @@ unsigned int audit_serial(void) } static inline void audit_get_stamp(struct audit_context *ctx, - struct timespec64 *t, unsigned int *serial) + struct audit_stamp *stamp) { - if (!ctx || !auditsc_get_stamp(ctx, t, serial)) { - ktime_get_coarse_real_ts64(t); - *serial = audit_serial(); + if (!ctx || !auditsc_get_stamp(ctx, stamp)) { + ktime_get_coarse_real_ts64(&stamp->ctime); + stamp->serial = audit_serial(); } } @@ -1825,8 +1825,7 @@ struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, int type) { struct audit_buffer *ab; - struct timespec64 t; - unsigned int serial; + struct audit_stamp stamp; if (audit_initialized != AUDIT_INITIALIZED) return NULL; @@ -1881,12 +1880,14 @@ struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, return NULL; } - audit_get_stamp(ab->ctx, &t, &serial); + audit_get_stamp(ab->ctx, &stamp); /* cancel dummy context to enable supporting records */ if (ctx) ctx->dummy = 0; audit_log_format(ab, "audit(%llu.%03lu:%u): ", - (unsigned long long)t.tv_sec, t.tv_nsec/1000000, serial); + (unsigned long long)stamp.ctime.tv_sec, + stamp.ctime.tv_nsec/1000000, + stamp.serial); return ab; } diff --git a/kernel/audit.h b/kernel/audit.h index a2fca1134519..56560846f3b0 100644 --- a/kernel/audit.h +++ b/kernel/audit.h @@ -99,6 +99,12 @@ struct audit_proctitle { char *value; /* the cmdline field */ }; +/* A timestamp/serial pair to identify an event */ +struct audit_stamp { + struct timespec64 ctime; /* time of syscall entry */ + unsigned int serial; /* serial number for record */ +}; + /* The per-task audit context. */ struct audit_context { int dummy; /* must be the first element */ @@ -108,10 +114,10 @@ struct audit_context { AUDIT_CTX_URING, /* in use by io_uring */ } context; enum audit_state state, current_state; + struct audit_stamp stamp; /* event identifier */ unsigned int serial; /* serial number for record */ int major; /* syscall number */ int uring_op; /* uring operation */ - struct timespec64 ctime; /* time of syscall entry */ unsigned long argv[4]; /* syscall arguments */ long return_code;/* syscall return code */ u64 prio; @@ -261,7 +267,7 @@ extern void audit_put_tty(struct tty_struct *tty); #ifdef CONFIG_AUDITSYSCALL extern unsigned int audit_serial(void); extern int auditsc_get_stamp(struct audit_context *ctx, - struct timespec64 *t, unsigned int *serial); + struct audit_stamp *stamp); extern void audit_put_watch(struct audit_watch *watch); extern void audit_get_watch(struct audit_watch *watch); @@ -302,7 +308,7 @@ extern void audit_filter_inodes(struct task_struct *tsk, struct audit_context *ctx); extern struct list_head *audit_killed_trees(void); #else /* CONFIG_AUDITSYSCALL */ -#define auditsc_get_stamp(c, t, s) 0 +#define auditsc_get_stamp(c, s) 0 #define audit_put_watch(w) do { } while (0) #define audit_get_watch(w) do { } while (0) #define audit_to_watch(k, p, l, o) (-EINVAL) diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 47d34433b91e..7848e7351cf9 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -992,10 +992,10 @@ static void audit_reset_context(struct audit_context *ctx) */ ctx->current_state = ctx->state; - ctx->serial = 0; + ctx->stamp.serial = 0; ctx->major = 0; ctx->uring_op = 0; - ctx->ctime = (struct timespec64){ .tv_sec = 0, .tv_nsec = 0 }; + ctx->stamp.ctime = (struct timespec64){ .tv_sec = 0, .tv_nsec = 0 }; memset(ctx->argv, 0, sizeof(ctx->argv)); ctx->return_code = 0; ctx->prio = (ctx->state == AUDIT_STATE_RECORD ? ~0ULL : 0); @@ -1898,7 +1898,7 @@ void __audit_uring_entry(u8 op) ctx->context = AUDIT_CTX_URING; ctx->current_state = ctx->state; - ktime_get_coarse_real_ts64(&ctx->ctime); + ktime_get_coarse_real_ts64(&ctx->stamp.ctime); } /** @@ -2014,7 +2014,7 @@ void __audit_syscall_entry(int major, unsigned long a1, unsigned long a2, context->argv[3] = a4; context->context = AUDIT_CTX_SYSCALL; context->current_state = state; - ktime_get_coarse_real_ts64(&context->ctime); + ktime_get_coarse_real_ts64(&context->stamp.ctime); } /** @@ -2483,21 +2483,17 @@ EXPORT_SYMBOL_GPL(__audit_inode_child); /** * auditsc_get_stamp - get local copies of audit_context values * @ctx: audit_context for the task - * @t: timespec64 to store time recorded in the audit_context - * @serial: serial value that is recorded in the audit_context + * @stamp: timestamp to record * * Also sets the context as auditable. */ -int auditsc_get_stamp(struct audit_context *ctx, - struct timespec64 *t, unsigned int *serial) +int auditsc_get_stamp(struct audit_context *ctx, struct audit_stamp *stamp) { if (ctx->context == AUDIT_CTX_UNUSED) return 0; - if (!ctx->serial) - ctx->serial = audit_serial(); - t->tv_sec = ctx->ctime.tv_sec; - t->tv_nsec = ctx->ctime.tv_nsec; - *serial = ctx->serial; + if (!ctx->stamp.serial) + ctx->stamp.serial = audit_serial(); + *stamp = ctx->stamp; if (!ctx->prio) { ctx->prio = 1; ctx->current_state = AUDIT_STATE_RECORD; From patchwork Thu Mar 10 23:46:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777111 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B1C20C433EF for ; Thu, 10 Mar 2022 23:59:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344613AbiCKAAg (ORCPT ); Thu, 10 Mar 2022 19:00:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55906 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241852AbiCKAAf (ORCPT ); Thu, 10 Mar 2022 19:00:35 -0500 Received: from sonic308-16.consmr.mail.ne1.yahoo.com (sonic308-16.consmr.mail.ne1.yahoo.com [66.163.187.39]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A8228DA860 for ; Thu, 10 Mar 2022 15:59:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956773; bh=Qn3mawfTU6zuyXVFnxb7r1Zgbfgfem9YSsefTT+IZGs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=Z0AHUVBXBh3H5S34h7N0LLFN1Pem17DhmOdsp+HHmKWTaQ0vIVx5ZNpSWsk5E7GXb7jNfKDgKZuWHx0KgTX+EJhT4dwGJqtF8342rVI6K1Gw0Fivv7bHhBlKkg0swYMjFiiCv0wQEKogXk2LZed3f9aiKnvU5F6qWo7/g7FQC+llgd4MG2dQzweUdjPlRCdldvm9yC1LB7m25i+7h0vBLeGspX+1q5AG6j/7OybKvRNZndPpHRQf9rRMVaJG2jgr5QegD0pRtXgRVjxkgupjerZqAgJVyTorYD23qWeMNJOas1ZiW3OA33OBGGKby2JiNDOZzBRPMsSoWEkfCmJxSw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956773; bh=waGFu/15HgY3B1DYoOM2HK81bNtOEyZxEDMwpgApMTH=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=ku/pQIJ0uDBS7isvOPCnh/rqerZcQRrdNpTFv3smyZjxQZIQSDSJICupNsW+EvQDc3wpzpNn8NZLG7WuqOd1lyqOPPs3Foa+vqWB9Pze/mhpUKQqz8g2W1q/xsHG3I5oPvxjNwAEZuPMkpftdKvO8Ywfwuy+UQzPXLmW0zAuzjDoCE9wFU0S18r9C8mgkOR0dNPSzjoryAqsA//2zIuHpCGlhFnlj1kHW+qH5x85h1g4ewDGgBa4T+oOaGiFO9UIWNx+06QW5fY5/n+LDPyFV2Zc7VgqFpQe7tu9Jz4YKjB/1UO3uUejoV2/AbydDrwF62CZNzrcJUcU+zcSTlbRzQ== X-YMail-OSG: pPzVHfEVM1keXy3lV0cqLzq.B1LERk5l4GM_PgesuBRAgdOs22fIG2MNwXfzwFn wFJlKX5kABGdkiwvlTS.ty5w8FauagumFWQ3Vxz.2Nkm__V8hBLDLBCPE_4N463bn9mvi4d31.Lo 5PDuMo7Maf6fZXcrPLc1u87tf7AaSFdVmxQ_TYHj2fN.DHLJN7osCB_632RyOjlOUobW9NiKJO9Y DsvkH16uDiBl8pEpm9zg.XV1xaOy_edU_AUa4HEo.PBzysVBusu1Dy6DpcbnWT9amguVoJ2ZOJxk z_eLfnPZ78_ASqdoH5GpJhofOMilOqnR1JuKmbEYsIO4DMJNF4orUhF3jmx9.fVCueZhmKXhTppJ zwISSbY7roI4od0xvtx8uWoCxm7RoMTvtkPs1mgDCSacszeiKwDFUQNUbAyyA6Kj6Kcxp86egJ8U BWc9KHWD0H5pvjyp258aGWsCd3oKydvld3T28Qeh.s49uXLplZ2zAsvR2qggkOGLJfAsnQ4_7VN9 ElCaSEpfRQUInPALlKgSJfeGMbkqTftJQcXzx7HuulBFuxiJt6kjP3ENidX7IisWAnrTI95G0yhb l0hYmvakNWtEwyNXCBlF1akOH8RPACD48Q.bd5Ekrap0B8VXxgmmjB6PnSXesmNFiS80a.G8oLrU 8D4s37hRvY6eEPpObSDOpLgumOE..QexWOtvtNKBgzbS2dkyquHNcuZLjTsLrIDwOdV1FTnfbSKN Z4GNN1FS3awxYGUxDcHf_8kCsGArninpliZy7qDdVYFkjaFUugdA_CehV8Gq9r5AGKXJgl9zXvUg xI3gFzU.nFHzKDsV804wZvJ0Ew1fIPtqpLNx554XiYxg0MVJDx7bA.kd79E.AChtZZqMVwz_NzqV ZUeeDv49qi41Nh7fMkn6ETtRIEnEUJ3z.C.n8nbqzvk3ceY_1Rsi9qTYPemjBhK.B3oB4.QCFsHU .RF8j2yGJqqbBX9HCi0ivgYiSD5Gm4Z3WWlysOeY2Yyuh1BsHyMAdQalA79GIDReL3MItAQ40T00 QOuOvj11GZkbXe3jnuKcAe1ByQk_rAifuVuoddW1.rklLpUyRjj4yvvgXSlDOuckfta0q1lRCGU1 IwjADhMEKuw.NQjHoKksuRrkuQn_n62GSF3BKIyVlsWNeWuVGEp0jePEVNwgH4s9omfsiFeGD7mZ U4FJn3iVlP6j9EdUXE9tBEsvgBLLyshng1viiYjmH0XadXPRmO7JKubMy6BiWJ3JHQIFY6TDPGGv Sd0wG0.bJBFD5UR.Y9U7lnbi2_3yki59.0yy.kdFxKN507rBkB38FwL_6Q.dwXSL2QygYFmty5.2 X2MvITLXHeVEUxWIg5WvCQrshktmGh6PFMzZcuE.qlDLfVCqNeROrEBmVfXDXucPkF0d8WWpJ3s2 G34.C5ok1rb3AZIic60NiSs5neSXw8_RsW80W4GPXsgMPSnRbTrInCzMsEknXsJWTqM0mZpssEui .EnbHvQJJkz5FZeNBpEojBL4HB3BiPh8pDzBqg7zSrpMJsmP4GyV9dNUSgreeFl4TU.KcKBau31s 4Skn4ACSiXL1Hcvbstkq3TSx8VNMLELwzTnTJsK1faYI7.SnW4RFvZ59DQ0vfKJUd0RaPd3KgggH .cO5s7fZwDfBLq6Vj_WUbn0bIJIN5qvocVuy7W6E7CK6PLC9tzaO5S1EMO8fajjOxT6noLEjNhZO Nu9wBIJbCtBQQZCRKp3B4pdfAmpgqzNzne4vJCDAeEJzhuuuFZAx92JKMfS3JOAnhiSQouc8n3hb EcDMO52NrxXU80c2IX.mpaDrJSSeNCMpizvF0sIpxiSWV82wzvcHWpeGnhd3ptwtFd.IcSKlRPps 9F8FT5rPa2pRSTQXibt5rwyxRKA9UbKip7Mxe8_TWFm5lSdisdRIQ1o3a_GPi_tU4.ktbxyHwDKe 5gM_nBVexbfefQvUv9fcCXQfS0fzLGZBcdeZsW5ub43fgIs08Ba3TwYiAlzRPE.5J4f17RycO2cV 1jBOl4BF.SO_Oy77xfmdNAQk7c_7pp5BB.fBWAO.4tFd6AeQ5wD6zd0Z4JRd8pyos_bZ7cm5_KYf NrOWDrJlMrMxm41t2xsAXTlJqS8VcmU0GinDAyoclnrchecf1_DkLdyqfm_sjRwepbYzC4s9v0NH JwZge4XI2RZ4wmOfTsXGDMzSH1bPk4yuUqRrXV3Dpf9lMnh1RLAirEvvCnrn1wmT_qb4Fnd289n4 aziq6A9o08pKPMxMP9cOsFlelbrDiN6oZvA0IP42CJbTPpraQiyfcaq_K2VC_LBJt9SH_IPOBnU3 BVWXUkHQwUAj2QBNUvxtG77YkVIE80w-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:59:33 +0000 Received: by kubenode510.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 33032615d5bc216242260d2cf82dc739; Thu, 10 Mar 2022 23:59: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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 24/29] LSM: Add a function to report multiple LSMs Date: Thu, 10 Mar 2022 15:46:27 -0800 Message-Id: <20220310234632.16194-25-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Add a new boolean function lsm_multiple_contexts() to identify when multiple security modules provide security context strings. Signed-off-by: Casey Schaufler --- include/linux/security.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/include/linux/security.h b/include/linux/security.h index 6dbdfd12fd79..13bc38970498 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -232,6 +232,15 @@ static inline bool lsmblob_equal(const struct lsmblob *bloba, extern int lsm_name_to_slot(char *name); extern const char *lsm_slot_to_name(int slot); +static inline bool lsm_multiple_contexts(void) +{ +#ifdef CONFIG_SECURITY + return lsm_slot_to_name(1) != NULL; +#else + return false; +#endif +} + /** * lsmblob_value - find the first non-zero value in an lsmblob structure. * @blob: Pointer to the data From patchwork Thu Mar 10 23:46:28 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777112 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5DA75C433EF for ; Thu, 10 Mar 2022 23:59:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345098AbiCKAAo (ORCPT ); Thu, 10 Mar 2022 19:00:44 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56334 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345062AbiCKAAk (ORCPT ); Thu, 10 Mar 2022 19:00:40 -0500 Received: from sonic308-16.consmr.mail.ne1.yahoo.com (sonic308-16.consmr.mail.ne1.yahoo.com [66.163.187.39]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7D223DCE03 for ; Thu, 10 Mar 2022 15:59:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956778; bh=VbhwXI7Kk2NDgj+KoKdyrDp0/Yhrsf03FmAkgkRnJE8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=YZG1B99igcOdLxPI3c71s+QZDNob1IJn/21iHxOdKksGWW3ok9Cw2i9FHYfh76lUBmxDf7KfPVg108vdcuUrPfd7zHFcwsoDyR8GJg7hXlHtmhNy8Z8KajX6hWKHhbKgN/HE4dGAfOEM+6ui/tvlJocCtGhV9UYZ7EAjU5PeisKAcFuH8V6gFPPRdVqd+acdh+D8bQAGY+uIyLg1qeRLFHxL3Ebb3J14X/Jdbk3vZtG1d7z8KmsxL/vdXxleycKLmafR/Q+RXXoGioWVaktGpPcoLWim9e2yHY1CQhGy4N8rMwI8HH2LLNZOWpKg+58fb3DDCH/3OWYgNcj0sYtKsA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956778; bh=tsVCtN8ka58ecqVBljT1qnDLqTs7l8o9jNh2W/Jq4Yf=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=hss26eVc1lBC5ldeQNugl9Gzja7yLtMva/UsMXi3Me2lexIEVjR5Dfh8v7sqSeQrsyPiWRnqKYDBvhF4Pn3boL990EjkaZi2rmna6GPKYHPINMasa2mHQHs2RyiKShTqrJucN4BgkJ6i2SiQkJJ98282WZU4UvEYZWjNBt8QrSSqcGPtVt6Xg8b8MoBchn9oOx+G2BRnPOmj6iP1RqliTH6eqh5x+pYI/i1dsgfc9dPGpDUNVqA3E2Nx5YYMW8vyglI84Q/H2wZ+52a83go639NKkJ1vh4F7W/o8PHnk3uj8lG5ohB93h5Tnc5IoF2jqd3AhByhOPkor/VonQ4I10w== X-YMail-OSG: sCQRGiQVM1mnCamP6LSrgVW9s6fGbpeMQi_XgO7aREOJ8cIgQxSecE2yArPXAZM 9Ko2h1XkkewUdaI0scvCrp8oiqQdt1ej9YNZM17_jNfJw0a1ah_8qBymrjBHj5uIhrXbqbKtt8Fc wKsvn0gBJdogIgDAU.GL_d4ohEyqZSqYiEvnHbc2Cguv0b6QYWjhaPTZgdOGKs2C7RLXbrBfHaVK YHUvw_MIqezorPV9M4f6S6dL9UQuTEbcGgHg2BHjM.8D8XcLcEQI3xaVfEu4U7mhpMd5Cw9G_jXA 6PYT9uUngiNlE35awAOxJrgt5dosMG52s.mjW5iV5xBTjd2QA.x.qhzIMaq9kNt04kSWqaHI0Gn. Qq2rdziG_26Ye2KBNfLXCJQWZUsg_VpKC21_680tUGbEZmw5yvcD2j16p.hu9PyP2YiVBoSFe1NZ aTF686nG7b8pIMNkxfCxz5A2JfBQI.Mi8RrLqNSyFHPP6ATXbG.MLzHDedX6xiZI9DviKYhBjgNl yZUom6VDuTXp9uxlVLtvRXmSkW_lgpYdHvhIw6qawmf3PbnLlonvMj7YAlUGI_N2tvOOEORnvYkT 30njnZhaBMvjD7m9NxKRLL9bIEALWBUr5VLQrXnyAC6Ypu8hngM9BG_MBAvYTayU0yToJSUtC1lG Xvrq7tmnkcnexekLDctuJwVORzZVKn.h0Vr.kTWJZ_c3IC7tPvwEpFTZU9vqvbI7S7pSbibfGBw7 Gsmp_eQ8AKLm1.xW5YBFB.ehWRy7UpFMe7qvd8cnKCYd7z6Zx.Mwr4WHreM44KSZe48aMQa2MoqP stuRET6hBLt2xoMK8gNfcf02AuWLdfmpEi4CJiUTBrNj4gUjOMDJcOoaY66FbUQ.Jmp_9DJmNcoX _9SnFkirOnPBI_bmM1SFG.Dv.VYFENEzBLeGT0lIyc5vR5Ds99bMRa3MNkUnCejbMM071kGrowm_ OQ..tCqfLnlgIiTLqwDWtONi6CCCAcQKSLRrNXAGAtNWb27sBog0Q6wP4y_rx_bDbrDpJkZfFGKM FeSKjoy1HElkAiGDCsl3yIA.0Y40NmDIOf.mBzpoGq97EnnmCmCEdnHEYQxUsQH7UUsW8fUaYGNm 1R9hnxwgTeuRSSyUM7KPI2vzhfOXcS_0FwfQB5Xh2xeeTXgn5iT86iQQLMRw49omrDh2Okrc_ddz t7n9jOL8u2.nkJ_yQq_fTH8As3QNNickoG3_xgJVNWHLMM4rt0KKCbGd2587MtNFrZC7UzgT9LsA bKAMGkgLhaUSLiFtrcU3QLVCk07uPqg1ARfloDDRAZYSxo8LB8cGq1I_N1cQCBtAi0vUnbChfFkB wfOzRrLHo3i8F9zzhKgfIIUsSzmtbzCyW31q4GIlM1qrhnpUhPZr1eQWExzp81MpJZsH8QxtP.No YUDGTGPhQocjZH7.9FZzzR7eg.XkGPUs7v4U8Uyq4zaEEQLugE6dRtm.1tB_p5977ISqJrMP371E ABqfTnGR0PKNsrsO4IhOXacV0QdFUA8v7YZGXBVtFqcRPLpFQRM9Ikjl3luFBoRHVxZwurpLC8GR 8NQoVJOnwmzAcezzFwlib2s5h9qoQqevyEaU9nUDVH7Xb39yJ4zWVep9SRADqFcMf_EYHRI0z.IJ BQhwwVWJu8Stz5V73nN2lwttYZU51ZmSSHOSm1BV5pFdiSXGbRxUlsXH_ZZ3dJvzPzI7bMxihCMv 3C0mMVXbWJ4HxNI_Eu8.C6eOjUCyQ_XtWl1f0hrNtF_hhe72klJ2xxmyDa8iw5IOagyIKJFB3luw YGFr5bQFci7_pQoNUJZcM6HIyzjLsWEQcmQoLF1Z31ecIFhO2SEU_iCPMvmKdy2n1DX3Nht0bgku ikITOrmXgqXjIxIPxjSPCywF6DhSzRmJxtFcjateC2BwxXRrO19jH.rOpDY03y0q._oJznvTL9vc JvpMXD1ns0pe.ezCZ2886GwUGIE5tjphGgiVSBzyCS03eE0qXcdZm2Wz3WMV2_mmka7D5JnPGoCV 9SJMfC1G611UtPPCOjeQkDua.kYC0P1Jny6BSBu2IgZJe8mWrrE4GFrKCGT_.e00JFt_f_t_ptFT 5C9UHwwsA1ocrxvFP1KvWwsgK1_r6bgzXdTwMoZ5g8vk.2Nku.nmaKW7556NNyJfya8kzMWZEb5u PdwQxjUJ77TOqeFFSbfgcDmjsWIVeQqbqvHeHab2hVEevdDyxVO5LIHJ7ky4wZEkoSjWfcFv7Bz3 SPwDCOEN0vgy49J1NQTzG7ggH4PdVqLKdadkLwqcR7AbTgE8p X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:59:38 +0000 Received: by kubenode510.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 33032615d5bc216242260d2cf82dc739; Thu, 10 Mar 2022 23:59: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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 25/29] Audit: Allow multiple records in an audit_buffer Date: Thu, 10 Mar 2022 15:46:28 -0800 Message-Id: <20220310234632.16194-26-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Replace the single skb pointer in an audit_buffer with a list of skb pointers. Add the audit_stamp information to the audit_buffer as there's no guarantee that there will be an audit_context containing the stamp associated with the event. At audit_log_end() time create auxiliary records (none are currently defined) as have been added to the list. Suggested-by: Paul Moore Signed-off-by: Casey Schaufler --- kernel/audit.c | 53 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/kernel/audit.c b/kernel/audit.c index f012c3786264..4713e66a12af 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -197,8 +197,10 @@ static struct audit_ctl_mutex { * to place it on a transmit queue. Multiple audit_buffers can be in * use simultaneously. */ struct audit_buffer { - struct sk_buff *skb; /* formatted skb ready to send */ + struct sk_buff *skb; /* the skb for audit_log functions */ + struct sk_buff_head skb_list; /* formatted skbs, ready to send */ struct audit_context *ctx; /* NULL or associated context */ + struct audit_stamp stamp; /* audit stamp for these records */ gfp_t gfp_mask; }; @@ -1744,7 +1746,6 @@ static void audit_buffer_free(struct audit_buffer *ab) if (!ab) return; - kfree_skb(ab->skb); kmem_cache_free(audit_buffer_cache, ab); } @@ -1760,11 +1761,15 @@ static struct audit_buffer *audit_buffer_alloc(struct audit_context *ctx, ab->skb = nlmsg_new(AUDIT_BUFSIZ, gfp_mask); if (!ab->skb) goto err; - if (!nlmsg_put(ab->skb, 0, 0, type, 0, 0)) + if (!nlmsg_put(ab->skb, 0, 0, type, 0, 0)) { + kfree_skb(ab->skb); goto err; + } ab->ctx = ctx; ab->gfp_mask = gfp_mask; + skb_queue_head_init(&ab->skb_list); + skb_queue_tail(&ab->skb_list, ab->skb); return ab; @@ -1825,7 +1830,6 @@ struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, int type) { struct audit_buffer *ab; - struct audit_stamp stamp; if (audit_initialized != AUDIT_INITIALIZED) return NULL; @@ -1880,14 +1884,14 @@ struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, return NULL; } - audit_get_stamp(ab->ctx, &stamp); + audit_get_stamp(ab->ctx, &ab->stamp); /* cancel dummy context to enable supporting records */ if (ctx) ctx->dummy = 0; audit_log_format(ab, "audit(%llu.%03lu:%u): ", - (unsigned long long)stamp.ctime.tv_sec, - stamp.ctime.tv_nsec/1000000, - stamp.serial); + (unsigned long long)ab->stamp.ctime.tv_sec, + ab->stamp.ctime.tv_nsec/1000000, + ab->stamp.serial); return ab; } @@ -2378,26 +2382,19 @@ int audit_signal_info(int sig, struct task_struct *t) } /** - * audit_log_end - end one audit record - * @ab: the audit_buffer + * __audit_log_end - end one audit record + * @skb: the buffer to send * * We can not do a netlink send inside an irq context because it blocks (last * arg, flags, is not set to MSG_DONTWAIT), so the audit buffer is placed on a * queue and a kthread is scheduled to remove them from the queue outside the * irq context. May be called in any context. */ -void audit_log_end(struct audit_buffer *ab) +static void __audit_log_end(struct sk_buff *skb) { - struct sk_buff *skb; struct nlmsghdr *nlh; - if (!ab) - return; - if (audit_rate_check()) { - skb = ab->skb; - ab->skb = NULL; - /* setup the netlink header, see the comments in * kauditd_send_multicast_skb() for length quirks */ nlh = nlmsg_hdr(skb); @@ -2408,6 +2405,26 @@ void audit_log_end(struct audit_buffer *ab) wake_up_interruptible(&kauditd_wait); } else audit_log_lost("rate limit exceeded"); +} + +/** + * audit_log_end - end one audit record + * @ab: the audit_buffer + * + * We can not do a netlink send inside an irq context because it blocks (last + * arg, flags, is not set to MSG_DONTWAIT), so the audit buffer is placed on a + * queue and a kthread is scheduled to remove them from the queue outside the + * irq context. May be called in any context. + */ +void audit_log_end(struct audit_buffer *ab) +{ + struct sk_buff *skb; + + if (!ab) + return; + + while ((skb = skb_dequeue(&ab->skb_list))) + __audit_log_end(skb); audit_buffer_free(ab); } From patchwork Thu Mar 10 23:46:29 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777113 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CEA3FC4332F for ; Thu, 10 Mar 2022 23:59:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345113AbiCKAAp (ORCPT ); Thu, 10 Mar 2022 19:00:45 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56342 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345085AbiCKAAl (ORCPT ); Thu, 10 Mar 2022 19:00:41 -0500 Received: from sonic308-16.consmr.mail.ne1.yahoo.com (sonic308-16.consmr.mail.ne1.yahoo.com [66.163.187.39]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B916BE02C9 for ; Thu, 10 Mar 2022 15:59:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956778; bh=CA7uJV6tefTVDxUjGl1tCyNZ2ZbFLUSTedcSfuXVSx4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=ASaGEkofQQBycWVbjZoJgqOINbe8Ig7sGI6kouTP4nuO39u8A/VY+qXH3yN7n1bAw7h17m28HT4egKOKqx7x7i96Rva+DUkDJgDTyBdAo4BJVTtCvL5zytuwJV3WGr8n0Bsb62Q9I/2BWjmUr6/866Hjn+2lML0DQcBEz7jThcO/a1e/RAxRyZcGSFySyPx+Z1zQfg9SgXTWPB/n3zokIuMptUYtRMX5716YFj+1m3r/eYPz9lFVho+AXxyD3spEdSMXYYVga2KQfcBgrbO6GhuIgODyMgi6OzJGOih5CviSRykRGCSqPAz+VTv1tnkAyXm7crIk4XeUyVimdOOE3g== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956778; bh=tnxBETGvTNaLB3bucuBvOJK9fzvEYSrMZbOWVtxF7SU=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=HearUBV6FsKUqC/k/MtzEaOO+i/+H1Pt5P807YV7vWTl0BAmrnU1+dwUaDCLF4aqPvfYqayl8+uxJ+Z0SMv4tC1pu6v811qoaFFprRE/4AMdXG9cwvrbd1ffLpYyl0KVYx3SSb+0SGPGEym9CzwkMM6Q1eRkb6bjOcaxKammBhQw/2k2mGi1qAH6ohc9AONdK9rsH04KvkrNJwqo2e07rGT2OPEsDRRuDJCulq/c4y3Mu0RvULTHDoU5Lofw2JjKq79o7VHvJN+CcSdgzQQfFsljUz3XmaX1VQCwYe4LiEzCfqMdrvZONUkOuHAHEzxR4tfxpNTUIu0HsiQIhbD8nQ== X-YMail-OSG: ffRpECAVM1m_F4UQwx6YSD0fsLvJ1iEQB_97_4p1sRjaluUVwhAYVdbXgrPP5bT P2.9.L_NEi2yNwCQB.IK8vsL9hbofCyfBY1o1OleMtAxLIgJoOiT5l8EcGmkviMSmOmd4G.ubMII pBjqL.w4anrBvOGCo_2Mr9vuQArYOlS2OAoa8AQ6rAxSKCvY9QDevWkUtNEbMx1vRsZW6aCyveYQ qRw9IhJ6gMeCArJxMA2ic5iOy_owjmtonKdTJbop_vgp2ZwXGsGeOTHNM.U21iZnTsFMOrJuPszE v1l6St0eZ2W.vpJ2VyYbhzPeHMw4RG60C5e9u.79IgQsBBCH4m7_FYcf5pu4ghCzTZVA7M_p12aZ QQJf61qdzL7xBD4psGaj_bZgvMPFvlYTcVSSeUPW3pPkuBSe6oxJFltaVcs1KUjO3WCiGpw64OSy UNXHH.g84TKR8S1jJRNfZaFqOYXSwWMmTKiMsQCr1xZEo6aRtHbhQi3z9sEI9HiniB8CVr2sFstx PhnMiVRl4ECx.WcbvLXHzVmYu7V6CtAeJoku3FCV5H9Y74bzC.6NSYMM8XTjCpwZe_V2W5CQ8636 HuDRuzGnkxv3d6786x9zlU3m65vQlrUP_xB6XRGejtTcRL1eWb77NDuQlyoDVmMiZB9vxV.nNHMR CnxCWEuAmF15rHlc1jaDgENtf4GgtyNJuvkFvJMrB9tDXNfU8Bem9tpDc8kRF2QdQw7s2bf60x9V lIkjlfSkJlsE1r.1aRr4D9sW82J1taZa36ldSbmnRMzU3ReU_Ykc9rwmzZpOG1mh5lKRbuBiPNWH pFPc.VL57VKjlYTnDA4mmRtrli9WojS_pMj9gyTC7zlrp_X3Udq__a.8ZitZOKt0o97oxqgpShKZ C4JrgfNLLOlAmpfDMemNzArdtV7FYKkPKNbDHlDKbYgyXBvdh8MiMQLCCj8fkOEIDAyDTdrwgb.K rNuRfIKVkoyHcCfEjAo6UcHghlBut9GO.kgZyw8bRC2O84TRxAr2raA.GSi.S5QvDlmNGhaerqRM p3TG6ZH7vuiNM7sLcVOQQutrO3dFlyaFEWCqvpGpLD11U_vR8V3CO3k2D27v_1RuZFjoi6Yrrp8v IesfTWk_A78k4i8N13_JY7EDrvvklMcidiAF.rbBAvNBPHHz94Z4cGv_QDcV485JgMCgil9RmU0E alQVRgms37unrmJWIOloLQiHdcOUYcLB0J88GzwIKHVwnaC_aFVY_WVJXzDwq0iEWoqxHsUI7Ohd w4o9.z.iTA6sVYhihb8srFLlIn2tDd2muEG33pDN2KLjvE2dzGipcsGlIKYs3nTpPr_UYCfG9dUc hjcppQifv3i32Xouu3OADeu_CePJfuIqDD3NAdlUFZ6kjCybPjGsnKIc0dUGDjZ6HiroKRO7pD4t gZ0EvAqf2Kj.ZIz.3vSNKyWiUoPOxVQ_mie00AChYHixcbibDk5upoThn7xnEgurqQcP2FcckFzP AKMNXOYEPhnjWKz1Gs8Jv_CLQ_bLtnNbrgaFFf.oNszxNvV1ICi0rmxgSJIL.fPd_ENMk14GHjG5 5sWwfz9uqMXfvqMJAOiXValH6NsGmLdBQMvyCgIRWcX1Z9C8SRIGRJGiULFtASgo6fQKkmVEeDhL uVM2ehkRc0eCGzSU8Hekgh923O.FSfPB6fexm0KQ04yKMvZavspTeTEI0ryHFnpkLJtfo1G502gX 2l3GCleT.HS3_.RVngjaR2sV7EPzhcDAHI2JDwgDiiVXGVEpr4SjfoEHO4EF.aM.v_GrJ5M2P5IO gVZMuw5DGMQj7MqbGmif4pran.2GrkB8N7afsDnTlDUGhbKHXwytr2tYVk_NmmrG22r4JrvnVXV5 DA_bmyHmEh_okGPVQyKafZcBENn_QSpT0PF0hKYhj8Gez0_jNhb7Bozjj12Oty13Uqw8Av4B_fQ. btQGXLCGu.nSQ925c72q_5vIaTkTkjMAtxme3FBWs7G29aS_eJpjmvtjWzZk_fN4wqstcSE53_wl 7c_Xb5rySwUYd6RlQGi6ckBwL_J24WFUAXEsMozNNBSexDrlfsX7paADefuMRR06fwEWmUfFhpjS YYXqClyGqzjG2SPWgFTk7dNYafCbYzsdhq99d4XwS2aDYMfb7D75wHg2BILhgYl1RF0F7BWmzsM8 4CWbItd0UwRmLgnnK1nY.j1ka9ky_DPV8F73YFhra7OVdzVBMzGY6HsoECFXdJ4ymoH2WvjZaA7Z qE5e95SwLZ7Y7Qu7eoAU_TGqZhahBPBPZxEfw5xGo0.pJo_W0Pa8- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.ne1.yahoo.com with HTTP; Thu, 10 Mar 2022 23:59:38 +0000 Received: by kubenode510.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 33032615d5bc216242260d2cf82dc739; Thu, 10 Mar 2022 23:59:34 +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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 26/29] Audit: Add record for multiple task security contexts Date: Thu, 10 Mar 2022 15:46:29 -0800 Message-Id: <20220310234632.16194-27-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Create a new audit record AUDIT_MAC_TASK_CONTEXTS. An example of the MAC_TASK_CONTEXTS (1420) record is: type=MAC_TASK_CONTEXTS[1420] msg=audit(1600880931.832:113) subj_apparmor=unconfined subj_smack=_ When an audit event includes a AUDIT_MAC_TASK_CONTEXTS record the "subj=" field in other records in the event will be "subj=?". An AUDIT_MAC_TASK_CONTEXTS record is supplied when the system has multiple security modules that may make access decisions based on a subject security context. Functions are created to manage the skb list in the audit_buffer. Signed-off-by: Casey Schaufler --- include/uapi/linux/audit.h | 1 + kernel/audit.c | 104 ++++++++++++++++++++++++++++++++----- 2 files changed, 93 insertions(+), 12 deletions(-) diff --git a/include/uapi/linux/audit.h b/include/uapi/linux/audit.h index 8eda133ca4c1..af0aaccfaf57 100644 --- a/include/uapi/linux/audit.h +++ b/include/uapi/linux/audit.h @@ -143,6 +143,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 task 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 4713e66a12af..ad825af203cf 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -2147,8 +2147,65 @@ void audit_log_key(struct audit_buffer *ab, char *key) audit_log_format(ab, "(null)"); } +/* + * A brief note on aux record management. + * + * Aux records are allocated and added to the skb list of + * the "main" record. The ab->skb is reset to point to the + * aux record on its creation. When the aux record in complete + * ab->skb has to be reset to point to the "main" record. + * This allows the audit_log_ functions to be ignorant of + * which kind of record it is logging to. It also avoids adding + * special data for aux records. + */ + +/** + * audit_buffer_aux_new - Add an aux record buffer to the skb list + * @ab: audit_buffer + * @type: message type + * + * On success ab->skb will point to the new aux record. + * Returns 0 on success, -ENOMEM should allocation fail. + */ +static int audit_buffer_aux_new(struct audit_buffer *ab, int type) +{ + WARN_ON(ab->skb != skb_peek(&ab->skb_list)); + + ab->skb = nlmsg_new(AUDIT_BUFSIZ, ab->gfp_mask); + if (!ab->skb) + goto err; + if (!nlmsg_put(ab->skb, 0, 0, type, 0, 0)) + goto err; + skb_queue_tail(&ab->skb_list, ab->skb); + + audit_log_format(ab, "audit(%llu.%03lu:%u): ", + (unsigned long long)ab->stamp.ctime.tv_sec, + ab->stamp.ctime.tv_nsec/1000000, + ab->stamp.serial); + + return 0; + +err: + kfree_skb(ab->skb); + ab->skb = skb_peek(&ab->skb_list); + return -ENOMEM; +} + +/** + * audit_buffer_aux_end - Switch back to the "main" record from an aux record + * @ab: audit_buffer + * + * Restores the "main" audit record to ab->skb. + */ +static void audit_buffer_aux_end(struct audit_buffer *ab) +{ + ab->skb = skb_peek(&ab->skb_list); +} + + int audit_log_task_context(struct audit_buffer *ab) { + int i; int error; struct lsmblob blob; struct lsmcontext context; @@ -2157,16 +2214,44 @@ int audit_log_task_context(struct audit_buffer *ab) if (!lsmblob_is_set(&blob)) return 0; - error = security_secid_to_secctx(&blob, &context, LSMBLOB_FIRST); + if (!lsm_multiple_contexts()) { + error = security_secid_to_secctx(&blob, &context, + LSMBLOB_FIRST); + if (error) { + if (error != -EINVAL) + goto error_path; + return 0; + } - if (error) { - if (error != -EINVAL) + audit_log_format(ab, " subj=%s", context.context); + security_release_secctx(&context); + } else { + /* Multiple LSMs provide contexts. Include an aux record. */ + audit_log_format(ab, " subj=?"); + error = audit_buffer_aux_new(ab, AUDIT_MAC_TASK_CONTEXTS); + if (error) goto error_path; - return 0; + for (i = 0; i < LSMBLOB_ENTRIES; i++) { + if (blob.secid[i] == 0) + continue; + error = security_secid_to_secctx(&blob, &context, i); + if (error) { + if (error != -EINVAL) + audit_panic("error in audit_log_task_context"); + audit_log_format(ab, "%ssubj_%s=?", + i ? " " : "", + lsm_slot_to_name(i)); + } else { + audit_log_format(ab, "%ssubj_%s=%s", + i ? " " : "", + lsm_slot_to_name(i), + context.context); + security_release_secctx(&context); + } + } + audit_buffer_aux_end(ab); } - audit_log_format(ab, " subj=%s", context.context); - security_release_secctx(&context); return 0; error_path: @@ -2382,13 +2467,8 @@ int audit_signal_info(int sig, struct task_struct *t) } /** - * __audit_log_end - end one audit record + * __audit_log_end - send one audit record * @skb: the buffer to send - * - * We can not do a netlink send inside an irq context because it blocks (last - * arg, flags, is not set to MSG_DONTWAIT), so the audit buffer is placed on a - * queue and a kthread is scheduled to remove them from the queue outside the - * irq context. May be called in any context. */ static void __audit_log_end(struct sk_buff *skb) { From patchwork Thu Mar 10 23:46:30 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777114 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 051C6C433F5 for ; Fri, 11 Mar 2022 00:01:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345100AbiCKACP (ORCPT ); Thu, 10 Mar 2022 19:02:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33632 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241475AbiCKACO (ORCPT ); Thu, 10 Mar 2022 19:02:14 -0500 Received: from sonic304-28.consmr.mail.ne1.yahoo.com (sonic304-28.consmr.mail.ne1.yahoo.com [66.163.191.154]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7545F19F479 for ; Thu, 10 Mar 2022 16:01:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956871; bh=RTvVwzxUtupt+jWvRX6MSAbe89oWko2Af3H4A+UakNU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=uYId9BIOR/aa22wKFP7ZaHT5rRi2MavrVtX/QH5ksk0wirA5HidFpQ4RE1mVPsm/DU5Yhg8CryCPk3Q5QPeffukhfEqi5T/pw0aS0Z1SaRh4f6gKiCTb+YtnIZJ99CcM/v6MZzglnwiOSBUQZcd+LW8Jr902uLlT/Ev9fgiDGdGBaWs7bsXLVkZSgCCt879Kr1FMKPt/KtoQkl+scXon1zT/HawJG0CgWrJgiRDOMlw2evvf5eeZjkzYK736ZIGgrmevZqGKldPe2Hogix4vgL/owdAI4RPiny2yB55kR7I+aEJ+FIwuACh8zi80FgRhuLttnBDuCOUllw94VqE1Wg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956871; bh=I1MXv7MyUoL/dKYY5ykBAj5y4X2A/9pbUd1PLz+yTon=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=k3n4cQg0XaVjDduHmcvG+a3rA7Kn8V9dlktb40YXu6wS4vSKDRhh/KXJKxiQfrRp1bYp99O4q48Sn8Spx8C5mLX+YD31XPWgbpgvpcea2AetVft5Lg+27c1jpJ/jLrm8mkVgbrjdSn6szfFDTHdIKR4s2B64g931S/JicZOgQSFRxIqTgAqnwQcfWJMpOBwp2Bxx2HCO7WqnFfpCAJH2F3jrKaxqz8XGTggA4TwDYMxbTz/B6NkHTI9Ek7eM5mYURuMgFZPrfJIJdiFuTbPGGkbZLxoGXK4cnSyqHv0f0jlLVZK4h+0NH1FuGu8VdepUdUO2DI7/m+ny6jFAOzV1Lw== X-YMail-OSG: XYTl9NkVM1km3lRQCivx58.oqZxbDF8HtbQGh0EslpJmHKlnWj5D0NJeR3W_o.3 K5bMgKMpUACnQru_6eCGb0XN4Y5jYvvyplYQyXSGeG4JV0W0_6XwSVBhGE95YGMoS7PkWE4mK7Rr PY1TUAiya31NEwXCVTKpjprOJdacjWASQVIeJZt41w3_Oais0bpXRcR30..cZEC1ulBR2T2HjxCK Dk8IMdi5nS7YvsddGEAXeBB7HztD2qnxxC7V.o8OQp.l..WKeJaf3SXR.rRG_WoTbOdYe8h1jb2m 5agGHJBlYJGX9kPCvblGlr2xvPNujn78j844n_ljoPEh1aIH2O93.IIxiXUfzq779QyW7Enar5Hy zCKJ3sAJyPcR3GRG4TgMmyLFCmeCa97T0C2jBWQ3X66xtUdtGi5uqrvp05ozCDVEmj67tAgNb6Up qnKsPp3LR6n7wFHA8swVr7JAfPwrD1PlxY5QnyVYBJe0UQnshVOP7.xe_kRRy_7isRfgE7uLg1wX tqkFFKwZrGYoUWl0CpMZEak8TsTbG65HmKXPHmUMkTdFT76ckVEv6kMOH10DcYOKdAN5g483Stu9 1mEXUb0sbck11mqlCyFyEVuNtrrsE2Yih8X8pGsU5OHh3TcyMf8DaFyX6.GOG8U7.kQ8X0U_aHU9 hYm2MA1vIkx8sJ8EUhJ70EfJA0GSws4ZcL9QlYm65UeuNNv0ro9p4y6CP9Eq7WxhXrDopuXG9PXG YQIWB1FtLUTKYa9ArL0PP0bmdEKl8cKOjIBq5pJTBGH67dWH_0ecxdIdtq3zT7LpyynfliUUc.b8 6StHm7S.XCH.yeNbKf8Wc6sFTto0Bc1gRcVTZnznpS53P2BYweXrtvzchpSi62_k29AXLCs8m6r1 lN0psWCg_D5XwaDGUHo91z3uU0tBjygsv8yu3293yeHzZUmnflNPRkwQBkBxOYydUOZe1K2N8Pft knITeK1ETaWugzQh1J5VYTw65Ooiq4dGezOPm4.uUuVGZxYWi9Bh9wnltVc4aXZ32SZJ6FkuODzD HJGstusIdQHmt1PPPRnYFG6PtfYIwjyK0BpbLpfqM.fojcafLc6SPEAgrtCd9T3DCRTXb3moZxeB T950v4xylnCHMk92GjhpUUkTpgW45zzxEb0_FbWhWLqWXxWC3.09.l2_.uXHPgBOaiY_zBwjqUb. j8w93hFjpPVReERAsL8GM0FLKhd9_Vg3jUWfP9yEoR0eNymKsllr5ODAMT6gkB1kQQK_vLRZbwqx 7N1QAoV3nJ4rz2zoqRii6cboP3XugkFf7qvD1uQcU0flh5A5PJBVhDakX2a33wC4Mq69ljtrepEP zKRZiTkfPwVAwTazu4tGGRVnLb_GYUxLMvkuodbpjUqvzCLnzpBH0pCQTVE0PcdRyiBObZTkSpHK W6c2lPNB3QmX9RYnsxxbxwkoJp9fFDUbEPI.zw8rxik3LM5y4bxyhXS0iSq.C3JUUotPh3pe.CC6 R8xWcYWedTjYwbhk5e0xV1MGv67Sb6ix7J.wQgZGa3r8dqz80JF1YgxI6VjftQTQHegOG0iOL.T7 GeizyNpzD12pi35tHmRmkGOkU8dnH_cRHtzI4gi4vATvGjgCZCxm2rC3ULFi271r8P_FptXVC6hj x1JGqheAQTBX0Ovewgcqw9ElKNvN3RBB2ykQWDnBHDyZstEa.B44V7MRFA4NGJ4atRg3GmFCTde_ WC0h2dfNwUozlNbR5QyFqCzaQiUXfzQhs0ipqFEEBlzFeifpTdF53sysnF.kYV4nkp0ch09wK6nv fI91nZaj8ZKDsPl.omnmlv4f83OyLmHqHhm7DEhMpLwM8VQGqXkGeCzcOGMbPe1pdYIxysRzB.aH J._TeINYkGqsj0PsKc_W5iSPj.Vvol5lBXWPYFFDplLPujAZXP0b_JCGWFa8v1bHEBHaQooQYJ15 lbBsGF6JNPRMiyKH81GELGZ08kxkO1jzMB9PkqIh.f3U9rtslnHt1OWWvwXEj4N1Ndq0zmN_zOpm GfAOfLvwSDnQ8mr2xkWYevyp9UARhUuxCSHEaHzexgwMGmcrtZoRJeb03xv_bj5uwlZGIt4_COQV s9.O4N2EAUCy_43kVJxdBteD_A5cOhM681RG9zrxCFx8qQ2R0R4Tca8GxZ.BOuGNlkZ9YVf4w8BK R8nVNpDNVw3xjt9zGC663X6d43QDfKeErRFSwt1XiLYk7ogHY0VzGMPIkkTLk0PTSxgpHYNiKz.u CXnm5wWkTKmSXdzrdrr4Y.7oTudJAv0RkwKNrxwhbs9ZEtbCIHU60NCwOGNIfbewVbJyaAZaZqv8 G8dCAxPBrstFyAGeS7Me2o3WFcCKGnQ-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic304.consmr.mail.ne1.yahoo.com with HTTP; Fri, 11 Mar 2022 00:01:11 +0000 Received: by kubenode532.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 14d447c144378bdd823ae563645b8a4f; Fri, 11 Mar 2022 00:01: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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 27/29] Audit: Add record for multiple object security contexts Date: Thu, 10 Mar 2022 15:46:30 -0800 Message-Id: <20220310234632.16194-28-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-1-casey@schaufler-ca.com> MIME-Version: 1.0 Precedence: bulk List-ID: Create a new audit record AUDIT_MAC_OBJ_CONTEXTS. An example of the MAC_OBJ_CONTEXTS (1421) record is: type=MAC_OBJ_CONTEXTS[1421] msg=audit(1601152467.009:1050): obj_selinux=unconfined_u:object_r:user_home_t:s0 When an audit event includes a AUDIT_MAC_OBJ_CONTEXTS record the "obj=" field in other records in the event will be "obj=?". An AUDIT_MAC_OBJ_CONTEXTS record is supplied when the system has multiple security modules that may make access decisions based on an object security context. Signed-off-by: Casey Schaufler --- include/linux/audit.h | 5 +++ include/uapi/linux/audit.h | 1 + kernel/audit.c | 47 +++++++++++++++++++++++ kernel/auditsc.c | 79 ++++++++++++-------------------------- 4 files changed, 77 insertions(+), 55 deletions(-) diff --git a/include/linux/audit.h b/include/linux/audit.h index 14849d5f84b4..1b05eb2dbe77 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h @@ -191,6 +191,8 @@ extern void audit_log_path_denied(int type, const char *operation); extern void audit_log_lost(const char *message); +extern void audit_log_object_context(struct audit_buffer *ab, + struct lsmblob *blob); extern int audit_log_task_context(struct audit_buffer *ab); extern void audit_log_task_info(struct audit_buffer *ab); @@ -251,6 +253,9 @@ static inline void audit_log_key(struct audit_buffer *ab, char *key) { } static inline void audit_log_path_denied(int type, const char *operation) { } +static inline void audit_log_object_context(struct audit_buffer *ab, + struct lsmblob *blob) +{ } static inline int audit_log_task_context(struct audit_buffer *ab) { return 0; diff --git a/include/uapi/linux/audit.h b/include/uapi/linux/audit.h index af0aaccfaf57..d25d76b29e3c 100644 --- a/include/uapi/linux/audit.h +++ b/include/uapi/linux/audit.h @@ -144,6 +144,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 task contexts */ +#define AUDIT_MAC_OBJ_CONTEXTS 1421 /* Multiple LSM objext 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 ad825af203cf..ac92e7fc5aa6 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -2202,6 +2202,53 @@ static void audit_buffer_aux_end(struct audit_buffer *ab) ab->skb = skb_peek(&ab->skb_list); } +void audit_log_object_context(struct audit_buffer *ab, struct lsmblob *blob) +{ + int i; + int error; + struct lsmcontext context; + + if (!lsm_multiple_contexts()) { + error = security_secid_to_secctx(blob, &context, LSMBLOB_FIRST); + if (error) { + if (error != -EINVAL) + goto error_path; + return; + } + audit_log_format(ab, " obj=%s", context.context); + security_release_secctx(&context); + } else { + audit_log_format(ab, " obj=?"); + error = audit_buffer_aux_new(ab, AUDIT_MAC_OBJ_CONTEXTS); + if (error) + goto error_path; + + for (i = 0; i < LSMBLOB_ENTRIES; i++) { + if (blob->secid[i] == 0) + continue; + error = security_secid_to_secctx(blob, &context, i); + if (error) { + if (error != -EINVAL) + audit_panic("error in audit_log_object_context"); + audit_log_format(ab, "%sobj_%s=?", + i ? " " : "", + lsm_slot_to_name(i)); + } else { + audit_log_format(ab, "%sobj_%s=%s", + i ? " " : "", + lsm_slot_to_name(i), + context.context); + security_release_secctx(&context); + } + } + + audit_buffer_aux_end(ab); + } + return; + +error_path: + audit_panic("error in audit_log_object_context"); +} int audit_log_task_context(struct audit_buffer *ab) { diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 7848e7351cf9..923e4e3a5697 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -1114,36 +1114,25 @@ static inline void audit_free_context(struct audit_context *context) kfree(context); } -static int audit_log_pid_context(struct audit_context *context, pid_t pid, - kuid_t auid, kuid_t uid, - unsigned int sessionid, - struct lsmblob *blob, char *comm) +static void audit_log_pid_context(struct audit_context *context, pid_t pid, + kuid_t auid, kuid_t uid, + unsigned int sessionid, + 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); if (!ab) - return rc; + return; 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)) + audit_log_object_context(ab, blob); audit_log_format(ab, " ocomm="); audit_log_untrustedstring(ab, comm); audit_log_end(ab); - - return rc; } static void audit_log_execve_info(struct audit_context *context, @@ -1373,18 +1362,10 @@ static void show_special(struct audit_context *context, int *call_panic) 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); - } + audit_log_object_context(ab, &blob); } if (context->ipc.has_perm) { audit_log_end(ab); @@ -1536,19 +1517,8 @@ 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 (lsmblob_is_set(&n->lsmblob)) { - struct lsmcontext lsmctx; - - if (security_secid_to_secctx(&n->lsmblob, &lsmctx, - LSMBLOB_FIRST)) { - audit_log_format(ab, " 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->lsmblob)) + audit_log_object_context(ab, &n->lsmblob); /* log the audit_names record type */ switch (n->type) { @@ -1753,21 +1723,20 @@ static void audit_log_exit(void) struct audit_aux_data_pids *axs = (void *)aux; for (i = 0; i < axs->pid_count; i++) - if (audit_log_pid_context(context, axs->target_pid[i], - axs->target_auid[i], - axs->target_uid[i], - axs->target_sessionid[i], - &axs->target_lsm[i], - axs->target_comm[i])) - call_panic = 1; - } - - if (context->target_pid && - audit_log_pid_context(context, context->target_pid, - context->target_auid, context->target_uid, - context->target_sessionid, - &context->target_lsm, context->target_comm)) - call_panic = 1; + audit_log_pid_context(context, axs->target_pid[i], + axs->target_auid[i], + axs->target_uid[i], + axs->target_sessionid[i], + &axs->target_lsm[i], + axs->target_comm[i]); + } + + if (context->target_pid) + audit_log_pid_context(context, context->target_pid, + context->target_auid, context->target_uid, + context->target_sessionid, + &context->target_lsm, + context->target_comm); if (context->pwd.dentry && context->pwd.mnt) { ab = audit_log_start(context, GFP_KERNEL, AUDIT_CWD); From patchwork Thu Mar 10 23:46:31 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777116 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 109C5C433EF for ; Fri, 11 Mar 2022 00:01:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241205AbiCKACX (ORCPT ); Thu, 10 Mar 2022 19:02:23 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33704 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345136AbiCKACR (ORCPT ); Thu, 10 Mar 2022 19:02:17 -0500 Received: from sonic315-27.consmr.mail.ne1.yahoo.com (sonic315-27.consmr.mail.ne1.yahoo.com [66.163.190.153]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D77C91A06DD for ; Thu, 10 Mar 2022 16:01:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956873; bh=MZ4vJagyUghLy0nswAC0kHp8cwcJQt/yZ0z4gmY7kX4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=ig70eH/rEFJhyxDGoupbVviuyoFnOaJY9wFPJ7PuuuVGLfxrv8nk2ZjQjCTyrQDd8xAa4eBst7oC3/K3A5rtz3gVIEXPlXrlVH2U+RyP1HZdC2DGwPgsD6tHbg0JnRikLl74VuU9RfYD7vGLrpOWiMxtpyb/w+L0bbHx2hR63mIfuAyjVUPe+K3Htko3eL1Eh5d/l3zIc3I0KNSxqMnZZMGhmib0SSZcLT8PGTfQ2KslBw66RtOUETgmMaM8270ma+GIrBUIitOaT/JHMrm5EASCV45piTm72vZm6xiw3iq0mg+pGCtY2qhm/gyDateAm2z9Fnr/qWHOd4jfKCk9dQ== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956873; bh=vGRJHIJZSYEWXZlx5Fvz+ng1B2+1tOzbyPFQtvPAr/N=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=b342qMk8gwDDob3788lmsbuknJ0sYtEKRR6TiWTlWWRnYTiR3QIwPEMd68P0wNzvsoalYBZ5KGfU22jkqN8Q7BeHn1VWokeT3leegwf0FRtXAry0vls7Pjok06/DNXL/4VSsG+2LzgYAyKoF3BlUfUe2gwqNsa5sta8w+YoFe/jroxWafG2CZpC6QTqkEjoXb3td67M52nEzhykjCZpNXoIQqB0OimBHa3iKI1Q0b6I20CwQmFo274thPnIeT5RAyWkkKQnMDTibdpJOcxItBhDwvmXa5anRWbHkbPPr4pDHRXMV5dkB1HryWlBDuPYlBG380995ILtDbEpq7JWYew== X-YMail-OSG: ntLwRWIVM1mIgPib9dDCnnNQqzt20f6uYeRl_KbRsrElABaFsreDF4THjv9TfF7 8Y3E7ONDGOUWJUKEOfGkC6GHfMeoH_pV4eUC7YAnHyX1mCJbKkceCBv6ixLpfamg7t8YuIFWKcZr jC6k8_QXSJUqC0hUkjGftvxou.umkYEOcLxtPVMts3gDrajwBaNZC0ZaZmpTcJAY6jqnirLs7PKL 13OA7qJjt8o1mabWj67nUwbKxReEEp0auVCU0hY6QWRr2SMH0PFv4Ton_DKTusjAyeYCh5fypMSD mI0ySeTZvpb852RaoXGwn.mnj99ZmEhMocJltdY06JUGv2v0xVFkRw8xaQy6iiVIH8QtqfZJ7Eup fh91AqOioMb_uhJN7P9OdjIDCVbB6C5O30X8kQgK2YLVWgKtSkW.UajRztcPZ76ToA5zzBZYegR7 RxvO2vLCaZCVQxUM9f2mTWSDdMO9heD4sw0A1HjbVFMomQ9zVa4oLE2u_htoxPh5PkzvEEehIIYu 2diwtIPjBNUqYrAKE4WSx.iv7lyrsVhMOGILyrUG7bQqnHC07tZ.PJD8fOmBpOt1_wyskzrZHnl6 WnlZo3kPFYXbFUuUNxs1IP0Jv.bKHHzkEHGDKNbhK3nx_G74tcvW2nt993ATQGoCnFfd85EJcohR ADn9nR.4K4jgRorkRV5A9j0zSdaS9tiUUOJmCOP8xUWlVHaSF9TgXnSxf_Hu_2nUxsWVKrxL9XLK 3KGSmWc4.aRK0WYQ5pX3opDUsQ0ZDvFsuqjS6.lBxqAHVpfCNjzCn5fc9X_avLuq3bb1QGSm9GDB Isjv3DGX1IQUGTuQRdnbIo_fWa76BXkeTIa9ZJROYjXRm3uCdDZ0ydhRaUAMkGMn.aIJI.J_XUKH pyl0IhczSeLWTyr_W5nlNtFZ_wEWs81P_q0Q9G75kSiEBZ5k.kAZYznFqiq.8FWIln8kjo5_F8Q. 9uyf7TSccTMlgjA43IxfNyFOAM7rfdCzyw49Y.mtJcuECeTQSLa78.K2ftugK0uA9AitImPHQSmT VXVkzieeghLVHIUgahNRA4TGFbCYrqz2Wp0mUpgBKQow4KUapOZTn5OcKzp_t2OgnxX0x4HOg5zS GPSpi3k3vn7G1jQQOj8bCKuUMNJyDYwziNtgA4KombnhX4pcoXMpcQr3xMikpR.FlkX5itah0tK2 si8wo69YhzeQqe_5Q8hG83IdO4UVUtUkqxmJhrzKNRLvHBez7vRHnoYBrrWWMZ6Oj4mnaYA.yEfg dQT171w43OhesGRhZClRCrkNXlrYID6wXdR7MFHvmEEQX4PyYT4ec0sEq4161srT5nUaTIUGisVj SwZAjTVMhsNL75pfkaCsMYCi87kKcNf1wPoJcOhAzIJt7tE5wKAk8ozCQbncTp_7Gn8ahZAYOFP8 TV8cKOCETPmEC3niKS6URLUxL_fTBrJhIFe5Og596xPM_cznUxyGK13dMe6xNtjBSyUn8DRXjLmZ YulUsXmxGtVukXv9x.yu3e8PGuKiZTg3Oj_204BPYbpK0dB1Ngk.jCqc6t39H1R7DrbzZ1z9Bk8p EgFpsfmk6RA.v.x5oURHTjsuyEjCk1SclfGhFCLrU6Bx.y9u4.iDxlnwdSY_Xk15SXz61dNPVmBG qtgU6qkKqZHPWm969UDBSvySXp06KbCBtCZ5nnSCSaFedMA3YT3mJc1vkj4q.0nUyMk0ByNtJGWW EPvoc3y9gz7fOf6vU5IRrOhTMR4j3mJkLei1mrxzpyGT9KveJfBFjCLDkJObejUBmqklLoG8Xqw3 qWyiFfAZHyHrVvTDCqtw8dCdXQE93vys3BOdM3BjmKuTccy3s1DgBq5xqSU11xuzIDmUJmYMytAj V7iw4guRu5fN8mkX_HeYmGEO174T.QyvM8ndKi.mL5X7.B_R70uHWvd8GsH0haWEeUGXqzrdJix7 qQcr5vgX9XVxLe62T7J8FzlSJeIIQ1byXI7TiFsA_f8h_z.qLqCaU.5p5KEKkDkQMWwM_Td0vqV6 5hMwXBgDOt6lpV76AQwn1fiz3wRaFIAMJ1I35aueGPsLuUKj1w1WHZAzO85e2vTfaPzr4HIdtbTX 9_UC9fOBK9KPhMKhtc_9R4XDfrAFdFS_SYjpWgoHflh9ygnmeZsyuj8r9HB9kQmy9rud26JmqpUK v9D_8WH.aLxXp4SwnkFJt_DtBtJDdz3kdIGiwOTXiQP.nZKtRhmy.naNw3vjR0vjT2RPfZ6EUsyr DnnI0bi0IUODL7aBX2WPloqrXfxzb9JMhta7xQf7TjkPyLb9ET663tzmuc4BfaIDuOA5e14kQhIH 3n9T2YDUTiJ7JLSKj3dxM7JUhmd29JU7X X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic315.consmr.mail.ne1.yahoo.com with HTTP; Fri, 11 Mar 2022 00:01:13 +0000 Received: by kubenode532.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 14d447c144378bdd823ae563645b8a4f; Fri, 11 Mar 2022 00:01: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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, linux-doc@vger.kernel.org Subject: [PATCH v33 28/29] LSM: Add /proc attr entry for full LSM context Date: Thu, 10 Mar 2022 15:46:31 -0800 Message-Id: <20220310234632.16194-29-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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/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 +- 9 files changed, 121 insertions(+), 15 deletions(-) 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 e0d41adb38ba..324370d048b1 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -2829,6 +2829,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 2c2d0ef59a41..51b5acff7f0e 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -1396,6 +1396,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 29181bc8c693..1ee58c1491ab 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 fde332e0ea7d..172550f67fc0 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. * * Requires: profile != NULL * @@ -28,20 +29,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); @@ -50,19 +52,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 b694eca9d4f1..b1a95ede7fc2 100644 --- a/security/security.c +++ b/security/security.c @@ -802,6 +802,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: @@ -2210,6 +2261,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; @@ -2237,6 +2292,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 7b9cb4d263c0..beb0e1cf02b5 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -6363,7 +6363,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 46d81f638a2b..d1677339e677 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -3485,7 +3485,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 Mar 10 23:46:32 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Casey Schaufler X-Patchwork-Id: 12777115 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1B9ECC433EF for ; Fri, 11 Mar 2022 00:01:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345130AbiCKACR (ORCPT ); Thu, 10 Mar 2022 19:02:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33640 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345104AbiCKACP (ORCPT ); Thu, 10 Mar 2022 19:02:15 -0500 Received: from sonic308-16.consmr.mail.ne1.yahoo.com (sonic308-16.consmr.mail.ne1.yahoo.com [66.163.187.39]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A2A0D1A06CE for ; Thu, 10 Mar 2022 16:01:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956873; bh=ufFIfi+QJcABRY0VK+r+pIW1TjiSDfvy9tEFxMIQ5C8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=mobOI7BFWqlqOI7w/QW+5ttyB+ulpgTo4PDQaRD/jBdp+2Wfh1YOZxvXxNyaLR98fbfjDahOeS9YqUgr8/9vIxopbx9NAnU9RfzBr2DKSnc/DjlI38XWXjgBgruSCApK+RS87qbXVqlpfg+4/+78VoUkj7KcD89tGQ/GYzxN4eTSkFtv7Vo+RVWWLL83ekJ85YlDpBrYsfh3SVOebFlvoGQGGi88p/nu6aZZbEHM4XJsj+6aR3KLU+WR1fNR52B/AkJPnuX+UyXYboYaov3gnGTifxndR9MhUY4KA4klQWvy5YIuGIhwPbSwseabOu0vu8XId6cyn9glmoDiien5Tg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646956873; bh=aOP+pLUA6Rg1M2NxD6rHfWgXBkXW4mkGNdVoDRvsjiM=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=shMzy+BtmeE6A3DzgYmaXqfLTz6WoN5sgnkOeXNrkQLk4tseVhM7PhFf1JYxC4AZY8WT2T0dQ7Jif6Wt6J+ZGLDAGC9HYc5KKFxp3iu1S+YvvEWzlI73pglKojfSFKfS7nCuF/B4xmhx9/zAIJMwxakCNPCr/jh2keuY6gtgyc7oad7rIN+ylDhtCrxP81iK0s2wrgq6LCo04210Zw587cNSb9F4Bly4LxMH5HvQxxhgWhsQeHaelu3PvMZHVCkGKpefjtdBagRUJ0c5ehL7fdgsAso3C12vLpZ3a7OUdckLzKazuxmF7bt7tNu9EvXNf70aCmyTEO4ugVBADA6S+A== X-YMail-OSG: 8tsblVoVM1nI3rfpUcBqY7AcjQtIvs70pdPMglNT3QeSGMzp9dxs31ZHCJhXjVX t5gBBAj1fvLEakpTj29YEQpvdu0fieT1EskkDOVGZvND2ZivH2ZsV1hlb6gMyMI3dxqPBFOBgGS4 G0mx5j2L_IedkrgUA5FqH.aVVh0GZnbrcZUHNyiqqG.GQUS_lqiHpUdGTBBoFwPZYmvbu4c77npS RTiF46ziQa_AYalCVBw2M9ff2mPh1D6iCrBnZbhG_uAaR4T6jcIOzed9a28oMCqV_n4LdS2scrFW AAPXgm2G7p2.1.oRxIN6rf9uZ.XjxP_r49saJos7jS34_8UnrbMo5qSjdt.3KO8zvSHEc3xY9j93 aOnvhEQeboGYs4B04.9br8y62VstH2Tjf2TQCnvFODqJR33DDEp.FIHtTNN.FTJyOg9wxFJbxvlk LLSmPBWaLwflZkd1k3ct1eME86cljZnxSM11ghf.yvLVpnGkZMb9cwMly6kuG5P2uyCtOz3Y8s.g UxC_Y1kCIecFCHkeXk7hshkFXPVKcPDKAKbOt3o5Yh1RlfiOehV8e6TH1nnC0TeIbXj8RQ9e1gp7 2FjWZbdcwYQqXWe.eKdU2vnmXV4ZZHqJ6K0G20tMAZEZ4BiU3Plj9WvUL8LSbk6CB53FsUzNuULo MVmR.PPLjWHiis0wE1ZauaGHI0T4EbZYBx4BqfvShe0STyP_YlKU07ZDQrK9omZ5y93FqXcDKMlX zQBNKnjp65vwkiF9yrVzODSxjP24ROQmiitjjaEfVhW1n8KvW1jJWUqcBXnoEYV2H34WJsUK4DtB up_7.RS0k26SoIofhu7Se6Brtd5BEmgOejK9YU8jgq_mL_fNTPm8LdlGD9iKdHByK6sBHSo21J3C 8_iN5yBO_gE.HDCznvZM7XmxUAn766pafUzwZQYPRK4Y0vcwyuuZMqnTnR4za2Q50EbtBSS6CNfC i29E9dcAWcZPSABroMhePiKPaeYF9VeWn.lKfx3C.rCmb2UA3FNUzxrh0hl4bco2cmMMIvrNR3s0 YH5dSFsiOgJzNYm9gV9UogxL84565c0tseseKW26ovwJbel2d7wS.JQsq2LhA.TmCtaq.bhEWhpO V3LjzqCO6csOv.CSOy4hqiv4c7sRWnrCjSqOcKbwF0hV4kkfHBIs_U1aJviztz6FHAP5QLuK9DQk wAWQhcfSYzDU6xe6MBl0SrNIZiS_cBHL.Wr7QVm8zRI1ZWpH9KsiTryFVX4tgTWxw_bh5n9Y7zwl 6kbZcZ1xgPvJaSe.U1rxgTh1cyGKJj30ekwCEpenTGtC0mw_8hEMPo6QX8BN19Rvl6y0bsuJCjFu cYWzd6jIP8xD51S5u3IOEU__JXjOL7jK8KNAJuD1hJRy9bFvR9XqaYwcRC774O_MxscOjiQvgg9C YjzvvYdbLQ7sHKBeyesa5j6y2BnpTOBlx3nzfh2Oh8uo_21L4F9pwNvRQicGqw034MhZxjnGqhw3 YcxIboMNKMOwyV6YWQCl3tNArEn2gguIIEwkl12pvoXWd0wWiQ77a2KcVSVCn1cEdYD0cV.vLYcw pI_cqTQuk0Sxi5Ur2vg9hNvIkMcKtdUPSgGIBQcRwgLyI0_OASXCP81H2QzUz6eO9ReiOt5UJ8C1 yTKvA8dg8pr860.h05AlXFPaNuR5ioQTqZ9w0r3vg0CmONsXNnJAUoIlk4r04MH7O9iq6M83ut58 F0RzZvoB4_mMRNYZURtJQU51A2fQOjQTHfIB_LvwPz2hbEhEwcglzzkvTXFMd8n3xSmPS98Nhfr8 _Fem4h_bsffiLotJfH7dl15IdX5oqszM5YNFdTtLnZWzAbKLHLArFy_bX1Q2NC6a7Zg_FpNNxWtK 9GUfJSx5lBuDl6eYkpK_7BFXxYbdHPpMu4P8ZwJRHcjisqF_VebANcmturstjhRubdKapzDW40J. 0yEbpO7Ch9oUebTSDokcqCLyjdhVth2nnJ.kfPdghB7TOFEoD5QZXu.Ziz7TsbkC6XE.CwNT_wdh rdkXdVCsksqF.xlCiDQDr7NAGaAVSYKmJvKvQdGvWecivfInA0H0kC7P74HGzjiRNrHGVpjuavHj _YKiZIfy4lsVbHlWJl7X1C56lNprq2Q2GeC.T5CLmqNDPY6UyotdTWkegBmUFlv4_Uyou0fj23Qs 437TRYKqmWBBjV.RmUrKADS5.20OHPtbtbT5YZFOb6tqbbEabXyJFVOK7qsVYeD0yWfl5k9hHEI9 D7QFH03.X_XHIqIO6CuhuV6f1Tjzelv6sHJbXcuG6BbqgzqHihvtecn9JqYPNqEkLGcxGq9rN8Mv qULYEJxB3UJLvmR2S7AXup7opwKzI X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.ne1.yahoo.com with HTTP; Fri, 11 Mar 2022 00:01:13 +0000 Received: by kubenode532.mail-prod1.omega.ne1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 14d447c144378bdd823ae563645b8a4f; Fri, 11 Mar 2022 00:01:10 +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, stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH v33 29/29] AppArmor: Remove the exclusive flag Date: Thu, 10 Mar 2022 15:46:32 -0800 Message-Id: <20220310234632.16194-30-casey@schaufler-ca.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220310234632.16194-1-casey@schaufler-ca.com> References: <20220310234632.16194-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 1ee58c1491ab..388298a15556 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -1145,22 +1145,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 @@ -1264,8 +1248,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), @@ -1919,7 +1901,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,