End-to-end patch attestation with patatt and b4
One of the side-effects of the recent UMN Affair has been renewed scrutiny of the kernel development process that continues to rely on patches sent via email. This prompted me to revisit my end-to-end patch attestation work and get it to the point where I consider it to be both stable for day-to-day work and satisfactory from the point of view of underlying security and usability.
Goals of the project
These were the goals at the outset:
- make it opt-in and don't interfere with existing tooling and workflows
- be as behind-the-scenes and non-intrusive as possible
- be simple and easy to understand, explain, and audit
I believe the proposed solution hits all of these points:
- the implementation is very similar to DKIM and uses email headers for cryptographic attestation of all relevant content (“From:” and “Subject:” headers, plus the message body). Any existing tooling will simply ignore the unrecognized header.
- cryptographic signing is done via a git hook invoked automatically by git-send-email (
sendemail-validate
), so it only needs to be set up once and doesn't require remembering to do any extra steps - the library doing the signing is only a few hundred lines of Python code and reuses the DKIM standard for most of its logic
Introducing patatt
The library is called “patatt” (for Patch Attestation, obviously), and can be installed from PyPi:
pip install --user patatt
It only requires PyNaCl (Python libsodium bindings), git, and gnupg (if signing with a PGP key). The detailed principles of operation are described on the PyPi project page, so I will not duplicate them here.
The screencast linked above shows patatt in action from the point of view of a regular patch contributor.
If you have an hour or so, you can also watch my presentation to the Digital Identity Attestation WG:
Support in b4
Patatt is fully supported starting with version 0.7.0 of b4 — here it is in action verifying a patch from Greg Kroah-Hartman:
$ b4 am 20210527101426.3283214-1-gregkh@linuxfoundation.org
[...]
---
✓ [PATCH] USB: gr_udc: remove dentry storage for debugfs file
---
✓ Signed: openpgp/gregkh@linuxfoundation.org
✓ Signed: DKIM/linuxfoundation.org
---
Total patches: 1
---
[...]
As you see above, b4 verified that the DKIM header was valid and that the PGP signature from Greg Kroah-Hartman passed as well, giving double assurance that the message was not modified between leaving Greg's computer and being checked on the end-system of the person retrieving the patch.
Keyring management
Patatt (and b4) also introduce the idea of tracking contributor public keys in the git repository itself. It may sound silly — how can the repository itself be a source of trusted keys? However, it actually makes a lot of sense and isn't any worse than any other currently used public key distribution mechanism:
- git is already decentralized and can be mirrored to multiple locations, avoiding any single points of failure
- all contents are already versioned and key additions/removals can be audited and “git blame’d”
- git commits themselves can be cryptographically signed, which allows a small subset of developers to act as “trusted introducers” to many other contributors (mimicking the “keysigning” process)
Contributor public keys can be added either to the main branch itself, along with the project codebase (perhaps in the .keys
toplevel subdirectory), or it can be managed in a dedicated ref, such as refs/meta/keyring
). The latter can be especially useful for large projects where patches are collected by subsystem maintainers and then submitted as pull requests for inclusion into the mainline repository. Keeping the keyring in its own ref assures that it stays out of the way of regular development work but is still centrally managed and tracked.
Further work
I am hoping that people will now start using cryptographic attestation for the patches they send, however I certainly can't force anyone's hand. If you are a kernel subsystem maintainer or a core developer of some other project that relies on mailed-in patches for the submission and code review process, I hope that you will give this a try.
If you have any comments, concerns, or improvement suggestions, please reach out to the tools list.