From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753751AbdEJW0k (ORCPT ); Wed, 10 May 2017 18:26:40 -0400 Received: from nm13-vm3.bullet.mail.ne1.yahoo.com ([98.138.91.143]:52745 "EHLO nm13-vm3.bullet.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751096AbdEJW0i (ORCPT ); Wed, 10 May 2017 18:26:38 -0400 X-Yahoo-Newman-Id: 472793.26270.bm@smtp217.mail.ne1.yahoo.com X-Yahoo-Newman-Property: ymail-3 X-YMail-OSG: oRmVAVQVM1myTWX55Qb8t4UxrCaUwwhZeRXawAW7XVCBZuu 702VqQe0wCdFXCCPTFTM_zact7FNAYgvMggYUcblWOKSe247ppRpdnweXrnc vSY6kPU2OvNiFbThztQql_FslVHW2ZBZVn8B4HDc9np.4JvxieSt0QfIzre2 K1BeXeoH5fhIr7zY4Kok5fKd7r88TZ6sIJU5YFxOEOR0o9h3N7pqWvzfl5P1 .MNKSeYI.ecptBJskbr41b.gnLBH1PWsuQJF7Zzr.vGcszqOiwdpv3pqoO5C mmp32hJ44QeSy57YWCHxQTt_r5RjcJ3Fjb3GcEqYOeZ0SG6h5WfOLdQdav2u kQy5JDdneXtKN49_QudPmlQajl1Za61vAXwJ3aysKV69cihMAG8vRZb28bva 5hXXVo3v3w8gel05yFi5b5fHJk6DMfQFqIN_und0Hhg9No7FQ3HwOJ02jTfm 0u3XnhyIfzzuW5FmHobhNT3IwK3X99OH6t7_WvfTnrTXkPkK3RaYPSr5eiBp 01_6_gKWRvNuLOenaZqJ1cEYDwxddKmqizfPvEi71rnoePO4- X-Yahoo-SMTP: OIJXglSswBDfgLtXluJ6wiAYv6_cnw-- Subject: Re: [PATCH v3] LSM: Enable multiple calls to security_add_hooks() for the same LSM To: =?UTF-8?Q?Micka=c3=abl_Sala=c3=bcn?= , linux-kernel@vger.kernel.org References: <20170510204848.1555-1-mic@digikod.net> Cc: James Morris , Kees Cook , "Serge E . Hallyn" , Tetsuo Handa , linux-security-module@vger.kernel.org From: Casey Schaufler Message-ID: Date: Wed, 10 May 2017 15:26:35 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 In-Reply-To: <20170510204848.1555-1-mic@digikod.net> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 5/10/2017 1:48 PM, Mickaël Salaün wrote: > The commit d69dece5f5b6 ("LSM: Add /sys/kernel/security/lsm") extend > security_add_hooks() with a new parameter to register the LSM name, > which may be useful to make the list of currently loaded LSM available > to userspace. However, there is no clean way for an LSM to split its > hook declarations into multiple files, which may reduce the mess with > all the included files (needed for LSM hook argument types) and make the > source code easier to review and maintain. > > This change allows an LSM to register multiple times its hook while > keeping a consistent list of LSM names as described in > Documentation/security/LSM.txt . The list reflects the order in which > checks are made. This patch only check for the last registered LSM. If > an LSM register multiple times its hooks, interleaved with other LSM > registrations (which should not happen), its name will still appear in > the same order that the hooks are called, hence multiple times. > > To sum up, "capability,selinux,foo,foo" will be replaced with > "capability,selinux,foo", however "capability,foo,selinux,foo" will > remain as is. > > Signed-off-by: Mickaël Salaün Acked-by: Casey Schaufler > Cc: Casey Schaufler > Cc: James Morris > Cc: Kees Cook > Cc: Serge E. Hallyn > Cc: Tetsuo Handa > Link: https://lkml.kernel.org/r/ccad825b-7a58-e499-e51b-bd7c98581afe@schaufler-ca.com > --- > security/security.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/security/security.c b/security/security.c > index 549bddcc2116..54b1e395978a 100644 > --- a/security/security.c > +++ b/security/security.c > @@ -25,6 +25,7 @@ > #include > #include > #include > +#include > #include > > #define MAX_LSM_EVM_XATTR 2 > @@ -86,6 +87,21 @@ static int __init choose_lsm(char *str) > } > __setup("security=", choose_lsm); > > +static bool match_last_lsm(const char *list, const char *lsm) > +{ > + const char *last; > + > + if (WARN_ON(!list || !lsm)) > + return false; > + last = strrchr(list, ','); > + if (last) > + /* Pass the comma, strcmp() will check for '\0' */ > + last++; > + else > + last = list; > + return !strcmp(last, lsm); > +} > + > static int lsm_append(char *new, char **result) > { > char *cp; > @@ -93,6 +109,9 @@ static int lsm_append(char *new, char **result) > if (*result == NULL) { > *result = kstrdup(new, GFP_KERNEL); > } else { > + /* Check if it is the last registered name */ > + if (match_last_lsm(*result, new)) > + return 0; > cp = kasprintf(GFP_KERNEL, "%s,%s", *result, new); > if (cp == NULL) > return -ENOMEM;