Received: by 2002:a05:7412:b130:b0:e2:908c:2ebd with SMTP id az48csp807914rdb; Fri, 17 Nov 2023 13:26:24 -0800 (PST) X-Google-Smtp-Source: AGHT+IFA0+nXauDjs1FVVvIUdft6Kjax3+eq8b4XXwdAG6zWTdrGZtQcoJhKQZSmfNZI1wbP1UYd X-Received: by 2002:a05:6a00:2d0d:b0:6b2:5d32:58c with SMTP id fa13-20020a056a002d0d00b006b25d32058cmr717306pfb.22.1700256383710; Fri, 17 Nov 2023 13:26:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700256383; cv=none; d=google.com; s=arc-20160816; b=HiMb9lAxArae1QXtfhJltlmI3ylARptR6zucJ1whtp7Aezm8dFOKs2DZtd38GHf+wx QntlIys8lx58dkLT7FU6P137BNC0VJOqulHETG7tRoH2M2bvcjcclTOWd+FvV+6WOY4Z 9tkZ/K/DK673Pu56cuxDgwxRVtxWebFeysR/ITkUFm0qcfNMxsgD8FRV+DySoOIJoHCl mesOtkpcQhaHfi8oYMIOfW0JfXN1uDHZG+j5/J7YLOOdQyGE2hLlHsRcPMZYgDQwMLpV LSuZCxPQ/Akp5iXCI6X88Av1cJalo6fNVBvU+m3cbxHu6noxAlfcgGndmbR3OUo6VCay dWkg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=7VlTgLQgobFGG9PZZStnDlmcBu7nmiBF+q+s3UJ3hXY=; fh=s9Iuyz1kEJMk2gmQIedHGVeqIbfYEjpayR1DQWj8YhI=; b=TnBoRmo3biN5wRW2n/SiRQQyLw2zpWLxbt1c/hMDW5pGeKeEPF2jbBMrwxlz7cPr2G tMDEfJUCqLLQjF0L1ngRIH+ziwNlTvB4bt73GqXTL8AZYFebJ7hL7qqhmmnTPQ+NEaUE Zie5m7zs1+gurqecph6h4a6Q7L2PtdNGLfG5IZgeempsMlrbzLyz7IR48eJ+fYiaPpQD SGpQwt0THasIJf1UmQ0Qp3+RIZZvYeDybYLEBTs1cIXZL8BeJGuQ/SJwj88sYUda1aZi hSLrTIe/WWo1OP5XzuY9cGHRp1N7dThMYv1KCuEuNrj+66vdFlLsbwcL+Bgemc26umGh YuJA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@paul-moore.com header.s=google header.b=dY0g61TI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=paul-moore.com Return-Path: Received: from lipwig.vger.email (lipwig.vger.email. [23.128.96.33]) by mx.google.com with ESMTPS id c11-20020a056a00248b00b006b771ad822dsi2739768pfv.286.2023.11.17.13.26.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Nov 2023 13:26:23 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) client-ip=23.128.96.33; Authentication-Results: mx.google.com; dkim=pass header.i=@paul-moore.com header.s=google header.b=dY0g61TI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=paul-moore.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id F2D5180958AF; Fri, 17 Nov 2023 13:25:47 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235842AbjKQVYA (ORCPT + 99 others); Fri, 17 Nov 2023 16:24:00 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45572 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235818AbjKQVXp (ORCPT ); Fri, 17 Nov 2023 16:23:45 -0500 Received: from mail-yb1-xb33.google.com (mail-yb1-xb33.google.com [IPv6:2607:f8b0:4864:20::b33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B49963257 for ; Fri, 17 Nov 2023 13:22:25 -0800 (PST) Received: by mail-yb1-xb33.google.com with SMTP id 3f1490d57ef6-daf2eda7efaso2451302276.0 for ; Fri, 17 Nov 2023 13:22:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paul-moore.com; s=google; t=1700256136; x=1700860936; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=7VlTgLQgobFGG9PZZStnDlmcBu7nmiBF+q+s3UJ3hXY=; b=dY0g61TIlRN+hRurbcp/9nn1mUxdFaB+a/xJadYgi4t8eIYBYVIAz/Ru5FfvpS0cja 2BUtKjga6tWLZGA2I4PBeEaOu5MWt9UwyrWFRSYTCY7sTtZV2RzRVwFkhqqA+O8OOsIy JPeHLrHYuEJ8RL8U93ZQT18EvbHiTz5PCjWjbL3q7JfKiQdHoGzBvLNJDfNFE7mvHze9 sqqomks9/Mn7bOSHMfXsAZP738FRG5j5BHmBkTZ/1HB0nTisVNQ2xjKlLslMIgUyV4I5 wWiuBIK5GgAJjZpBK0+rlOlXQtrM2f8g5ue3QtlPuk12dYGh7Zujx4+wQP9y+yI7FtNQ qG3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700256136; x=1700860936; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7VlTgLQgobFGG9PZZStnDlmcBu7nmiBF+q+s3UJ3hXY=; b=p4qNn3l6QdIOSbWb/TLEiPw/sYntACNJaCLld7kLhiT8sWixCA6qzdH8VXd5yTPi+f w8MAA+3iIUupXfXcQxe1MXLIA7SLy4YBu7oPEcKSSnif4V9YFPAHk4ZowyPhAnNZ7Bd5 pI/SucTyKznKtdO0yCJXkzhv2IWewgS4uube/U08YI2UMnOYWz8JBZOBbyVp6oDSpEjm EVIUJo0RfxMs6flwYbaDDEoiGBHSCwAU0Z27k+CvrvWzDMMos5k2Mgm2YUW4sjjiyNb9 L55toMRyYVzUvJJsc5qGU8qPv+n6J+6BZ+h/cbDhAE5/hUQAVVeZlShnnxyG+NIxwaFP 0JeQ== X-Gm-Message-State: AOJu0YzDn8wyJrsmLBOxphQHQ5padB2RJH1lpGMR5RGbJKo4uwO604L9 d5BHdLF4ONEusoEemVeWaiRDUreXitR/cbeUlRr3 X-Received: by 2002:a25:2693:0:b0:da0:86e8:aea4 with SMTP id m141-20020a252693000000b00da086e8aea4mr790094ybm.57.1700256136343; Fri, 17 Nov 2023 13:22:16 -0800 (PST) MIME-Version: 1.0 References: <20231107134012.682009-23-roberto.sassu@huaweicloud.com> <49a7fd0a1f89188fa92f258e88c50eaeca0f4ac9.camel@huaweicloud.com> In-Reply-To: <49a7fd0a1f89188fa92f258e88c50eaeca0f4ac9.camel@huaweicloud.com> From: Paul Moore Date: Fri, 17 Nov 2023 16:22:05 -0500 Message-ID: Subject: Re: [PATCH v5 22/23] integrity: Move integrity functions to the LSM infrastructure To: Roberto Sassu Cc: viro@zeniv.linux.org.uk, brauner@kernel.org, chuck.lever@oracle.com, jlayton@kernel.org, neilb@suse.de, kolga@netapp.com, Dai.Ngo@oracle.com, tom@talpey.com, jmorris@namei.org, serge@hallyn.com, zohar@linux.ibm.com, dmitry.kasatkin@gmail.com, dhowells@redhat.com, jarkko@kernel.org, stephen.smalley.work@gmail.com, eparis@parisplace.org, casey@schaufler-ca.com, mic@digikod.net, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-security-module@vger.kernel.org, linux-integrity@vger.kernel.org, keyrings@vger.kernel.org, selinux@vger.kernel.org, Roberto Sassu Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Fri, 17 Nov 2023 13:25:48 -0800 (PST) On Thu, Nov 16, 2023 at 5:08=E2=80=AFAM Roberto Sassu wrote: > On Wed, 2023-11-15 at 23:33 -0500, Paul Moore wrote: > > On Nov 7, 2023 Roberto Sassu wrote: ... > > > +/* > > > + * Perform the initialization of the 'integrity', 'ima' and 'evm' LS= Ms to > > > + * ensure that the management of integrity metadata is working at th= e time > > > + * IMA and EVM hooks are registered to the LSM infrastructure, and t= o keep > > > + * the original ordering of IMA and EVM functions as when they were = hardcoded. > > > + */ > > > static int __init integrity_lsm_init(void) > > > { > > > + const struct lsm_id *lsmid; > > > + > > > iint_cache =3D > > > kmem_cache_create("iint_cache", sizeof(struct integrity_iint_= cache), > > > 0, SLAB_PANIC, iint_init_once); > > > + /* > > > + * Obtain either the IMA or EVM LSM ID to register integrity-spec= ific > > > + * hooks under that LSM, since there is no LSM ID assigned to the > > > + * 'integrity' LSM. > > > + */ > > > + lsmid =3D ima_get_lsm_id(); > > > + if (!lsmid) > > > + lsmid =3D evm_get_lsm_id(); > > > + /* No point in continuing, since both IMA and EVM are disabled. *= / > > > + if (!lsmid) > > > + return 0; > > > + > > > + security_add_hooks(integrity_hooks, ARRAY_SIZE(integrity_hooks), = lsmid); > > > > Ooof. I understand, or at least I think I understand, why the above > > hack is needed, but I really don't like the idea of @integrity_hooks > > jumping between IMA and EVM depending on how the kernel is configured. > > > > Just to make sure I'm understanding things correctly, the "integrity" > > LSM exists to ensure the proper hook ordering between IMA/EVM, shared > > metadata management for IMA/EVM, and a little bit of a hack to solve > > some kernel module loading issues with signatures. Is that correct? > > > > I see that patch 23/23 makes some nice improvements to the metadata > > management, moving them into LSM security blobs, but it appears that > > they are still shared, and thus the requirement is still there for > > an "integrity" LSM to manage the shared blobs. > > Yes, all is correct. Thanks for the clarification, more on this below. > > I'd like to hear everyone's honest opinion on this next question: do > > we have any hope of separating IMA and EVM so they are independent > > (ignore the ordering issues for a moment), or are we always going to > > need to have the "integrity" LSM to manage shared resources, hooks, > > etc.? > > I think it should not be technically difficult to do it. But, it would > be very important to understand all the implications of doing those > changes. > > Sorry, for now I don't see an immediate need to do that, other than > solving this LSM naming issue. I tried to find the best solution I > could. I first want to say that I think you've done a great job thus far, and I'm very grateful for the work you've done. We can always use more help in the kernel security space and I'm very happy to see your contributions - thank you :) I'm concerned about the integrity LSM because it isn't really a LSM, it is simply an implementation artifact from a time when only one LSM was enabled. Now that we have basic support for stacking LSMs, as we promote integrity/IMA/EVM I think this is the perfect time to move away from the "integrity" portion and integrate the necessary functionality into the IMA and EVM LSMs. This is even more important now that we are looking at making the LSMs more visible to userspace via syscalls; how would you explain to a developer or user the need for an "integrity" LSM along with the IMA and EVM LSMs? Let's look at the three things the the integrity code provides in this patc= hset: * IMA/EVM hook ordering For better or worse, we have requirements on LSM ordering today that are enforced only by convention, the BPF LSM being the perfect example. As long as we document this in Kconfig I think we are okay. * Shared metadata Looking at the integrity_iint_cache struct at the end of your patchset I see the following: struct integrity_iint_cache { struct mutex mutex; struct inode *inode; u64 version; unsigned long flags; unsigned long measured_pcrs; unsigned long atomic_flags; enum integrity_status ima_file_status:4; enum integrity_status ima_mmap_status:4; enum integrity_status ima_bprm_status:4; enum integrity_status ima_read_status:4; enum integrity_status ima_creds_status:4; enum integrity_status evm_status:4; struct ima_digest_data *ima_hash; }; Now that we are stashing the metadata in the inode, we should be able to remove the @inode field back pointer. It seems like we could duplicate @mutex and @version without problem. I only see the @measured_pcrs, @atomic_flags used in the IMA code. I only see the @ima_XXX_status fields using in the IMA code, and the @evm_status used in the EVM code. I only see the @ima_hash field used by the IMA code. I do see both IMA and EVM using the @flags field, but only one case (IMA_NEW_FILE) where one LSM (EVM) looks for another flags (IMA). I'm not sure how difficult that would be to untangle, but I imagine we could do something here; if we had to, we could make EVM be dependent on IMA in Kconfig and add a function call to check on the inode status. Although I hope we could find a better solution. * Kernel module loading hook (integrity_kernel_module_request(...)) My guess is that this is really an IMA hook, but I can't say for certain. If it is needed for EVM we could always duplicate it across the IMA and EVM LSMs, it is trivially small and one extra strcmp() at kernel module load time doesn't seem awful to me. --=20 paul-moore.com