Re: ANN: new LSM guidelines
From: Paul Moore <paul@paul-moore.com>
Date: 2023-08-02 21:56:59
Also in:
linux-doc
On Wed, Aug 2, 2023 at 2:38 PM Mickaël Salaün [off-list ref] wrote:
I like this guideline. I guess this is your goal and I think it should be part of Documentation/security/lsm.rst (and move the introduction part of lsm-development.rst into lsm.rst) and get a few SoB.
Thanks for the review and comments. Responses below, but I'll post an updated guidance doc in just a bit incorporating your feedback as well as those of a few others who sent me comments off-list. As far as moving this guidance into Documentation/security, yes, that is the ultimate goal. In fact I have a todo item to go through all of Documentation/security and give it a good cleaning/review/edit, although please don't expect that anytime soon :/
On Tue, Aug 01, 2023 at 06:47:12PM -0400, Paul Moore wrote:quoted
On Fri, Jul 7, 2023 at 6:02 PM Paul Moore [off-list ref] wrote:quoted
On Thu, Jul 6, 2023 at 8:32 PM Casey Schaufler [off-list ref] wrote:quoted
On 7/6/2023 1:42 PM, Paul Moore wrote:quoted
Hello all, With some renewed interest in submitting new LSMs including in the upstream Linux Kernel I thought it might be a good idea to document some of our longstanding guidelines around submitting new LSMs. I'm posting this mostly as a FYI for those who are working on new LSM submissions, but also to solicit feedback from everyone on the list regarding what we should ask of new LSMs. If you think I'm missing something important, or believe I've added an unfair requirement, please let me know. I've added the guidelines to the README.md at the top of the LSM tree, but to make life easier for those reviewing the guidelines I'm copy-n-pasting them below ...I've updated the README.md doc based on the feedback, and copied the two new sections below for easier review. If anyone has any additional feedback or concerns, please let me know. ## New LSM Hook Guidelines While LSM hooks are generally considered outside of the Linux Kernel's stableWhy "generally"?
Good point, I'll remove that.
quoted
API promise, due to the nature of the LSM hooks we try to minimize changes to the hooks. With that in mind, we have the following requirements for new LSM hooks: * Hooks should be designed to be LSM agnostic. While it is possible that only one LSM might implement the hook at the time of submission, the hook's behavior should be generic enough that other LSMs could provide a meaningful implementation.We should also avoid falling in the other extreme which is to add different argument just-in-case. For instance, there is no need to add a "flags" argument to a kernel API if there is no flag for now, especially if there are only a few users of this hook. I would say that we want generic-as-possible hooks (e.g. well positioned) but not with useless arguments.
Agreed, although I think that's hard to properly describe that in a sentence or two. It's going to be impossible to capture every requirement in this doc (I added a new paragraph explaining this in the latest revision), so I think we can just leave this as-is for now. If it does become a problem we can work a bit harder on describing what makes a "good" LSM hook.
quoted
* There must be at least one LSM implementation of the hook included in the submission to act as a reference for additional LSM implementations. The reference implementation must be for one of the upstream, in-kernel LSMs; while the BPF LSM is an upstream LSM, it's nature precludes it from being eligible as one of the in-kernel LSMs.To avoid misunderstanding, I think it would be better and more generic to focus on the out-of-tree nature of hook implementations. We might also want to give some pointers for the reason(s) why out-of-tree LSMs use cases are not supported.
I'm open to new language here if you have some particular wording in mind?
quoted
## New LSM Guidelines Historically we have had few requirements around new LSM additions, with Arjan van de Ven being the first to describe a basic protocol for accepting new LSMs into the Linux Kernel. In an attempt to document Arjan's basic ideas and update them for modern Linux Kernel development, here are a list of requirements for new LSM submissions:If we go for a kernel documentation patch, it might be better to put most of this historic paragraph into the patch description.
Agree. I was looking for the original comments from Arjan but couldn't find them in an archive anywhere, if anyone has a pointer it would be great to share that.
quoted
* The new LSM's author(s) must commit to maintain and support the new LSM for an extended period of time. While the authors may be currently employed to develop and support the LSM, there is an expectation upstream that support will continue beyond the author's employment with the original company, or the company's backing of the LSM. * New LSMs must include documentation providing a clear explanation of the LSM's requirements, goals, and expected uses. The documentation does not need to rise to the level of a formal security model, but it must be considered "reasonable" by the LSM community as a whole.I guess defining the threat model would be a good first step (and we should probably add this kind of description for current LSMs as well).
I believe that should be captured in the "requirements, goals, and expected uses" portion of the requirement above, but if you believe it should be more explicit let me know.
quoted
* Any user visible interfaces provided by the LSM must be well documented. It is important to remember the user visible APIs are considered to be "forever APIs" by the Linux Kernel community; do not add an API that cannot be supported for the next 20+ years.I would also add tests! For new kernel developments, especially those focused on security, the interfaces should be well tested, part of kselftests, and run at least for each kernel release (if possible with the KernelCI infrastructure). A good test coverage should be a minimal requirement, even if this is not enough. Additionally, syzkaller should be able to efficiently fuzz these interfaces, which may require some tuning.
I added a test suite requirement to the latest revision. I didn't explicitly require kselftests, as not all current LSMs with tests make use of kselftest, but I do think requiring some type of test suite is important.
Extending the kernel documentation should not stop developers to write man pages as well. ;)
Of course not! While I'm a big believer in manpages, I don't believe that we need to make that an explicit requirement. However, I would expect that the documentation we do require would make it easier to produce useful manpages.
It might also be useful to add some standalone tools in samples/
Or in a separate standalone public repo if the tools are significantly large (see the requirement below).
quoted
* The LSM implementation must follow general Linux Kernel coding practices, faithfully implement the security model and APIs described in the documentation, and be free of any known defects at the time of submission. * Any userspace tools or patches created in support of the LSM must be publicly available, with a public git repository preferable over a tarball snapshot.
-- paul-moore.com