[PATCH 0/5] rust: lsm: introduce safe Rust abstractions for the LSM framework
Jamie Lindsey
jamie at matrixforgelabs.com
Wed Mar 11 04:56:06 UTC 2026
This series introduces the first safe Rust abstractions for the Linux
Security Module (LSM) framework. It allows a complete, policy-enforcing
LSM to be written entirely in Rust with no C boilerplate required from
the LSM author.
--- Motivation ---
The LSM framework is a natural target for Rust: hook registration is
unsafe by nature (raw function pointers, C ABI, __randomize_layout on
the hook list struct), and the trait system can enforce correct
implementation at compile time.
--- Design ---
The abstraction is trait-based:
impl kernel::lsm::Hooks for MyLsm {
fn file_open(file: &File) -> Result { ... }
}
kernel::define_lsm!(MyLsm, "my_lsm\0", bindings::LSM_ID_UNDEF as u64);
The define_lsm! macro generates all the plumbing: the lsm_id, the hook
array, the __init function that calls security_add_hooks(), and the
lsm_info descriptor placed in .lsm_info.init so that security_init()
discovers it at boot.
Hook implementations receive safe Rust wrappers (&File, &Task) and
return kernel::error::Result. The C-callable adapter functions are
monomorphised per LSM type -- no vtable, no runtime dispatch.
--- Implementation notes for reviewers ---
static mut __LSM_HOOKS:
The hook array is static mut because it is written exactly once by
__lsm_init() in the single-threaded boot context, before
security_add_hooks() copies the entries into the static-call table.
No access occurs after that point. UnsafeCell or a lock would add
overhead with no safety benefit in this strictly init-only path.
unsafe impl Sync on LsmId / LsmInfo:
Both types are #[repr(transparent)] wrappers around lsm_id / lsm_info,
which contain *const c_char pointers to 'static NUL-terminated string
literals that are never mutated. The Sync impl is sound for the same
reason that &'static str is Sync.
MaybeUninit hook array:
security_hook_list carries __randomize_layout. Rust code cannot safely
initialise it by field name (the field order after randomisation differs
from what bindgen sees). The array is left MaybeUninit and filled at
runtime by C shims that call LSM_HOOK_INIT() -- the macro the kernel
already uses for this purpose in C LSMs.
Function pointer types:
All three hook signatures were verified against union security_list_options
generated from lsm_hook_defs.h in this exact tree. file_open:
int(*)(struct file *); task_alloc: int(*)(struct task_struct *, u64)
(u64, not unsigned long -- tree-specific); task_free:
void(*)(struct task_struct *). All match the C shim parameters exactly.
checkpatch note:
checkpatch reports "Non-standard signature: Assisted-by" and
"Unrecognized email address: Claude:claude-sonnet-4-6". The
Assisted-by tag and its format are defined in
Documentation/process/coding-assistants.rst; checkpatch has not yet
been updated to recognise it. This is a false positive.
--- Limitations (v1) ---
- Three hooks: file_open, task_alloc, task_free. Additional hooks will
be added in follow-up patches as safe Rust wrappers for their argument
types are contributed upstream.
- At most one Rust LSM per kernel build (unique static symbol names
require a proc-macro; planned for v2).
- No security blob support (SecurityBlob<T> planned for v2).
--- Testing ---
Compiled and boot-tested on Linux 7.0-rc2
(commit 4ae12d8bd9a8 "Merge tag 'kbuild-fixes-7.0-2' of
git://git.kernel.org/pub/scm/linux/kernel/git/kbuild/linux").
Boot verified: with lsm=rust_lsm_sample on the kernel command line,
/sys/kernel/security/lsm reports "capability,rust_lsm_sample" and
task_alloc hook invocations appear in dmesg.
--- Patch overview ---
[1/5] rust: bindings: include lsm_hooks.h -- expose LSM types to bindgen
[2/5] rust: helpers: C shims for LSM_HOOK_INIT and security_add_hooks
[3/5] rust: kernel: lsm -- Hooks trait, Adapter<T>, define_lsm! macro
[4/5] security: rust_lsm_sample -- reference implementation and boot test
[5/5] Documentation: rust: lsm abstraction developer guide; MAINTAINERS
Jamie Lindsey (5):
rust: bindings: include lsm_hooks.h to expose LSM types to bindgen
rust: helpers: add C shims for LSM hook initialisation
rust: kernel: add LSM abstraction layer
security: add Rust LSM sample (CONFIG_SECURITY_RUST_LSM)
Documentation: rust: add LSM abstraction guide; update MAINTAINERS
Documentation/rust/index.rst | 1 +
Documentation/rust/lsm.rst | 246 ++++++++++++++++++++++++++
MAINTAINERS | 9 +
rust/bindings/bindings_helper.h | 1 +
rust/helpers/helpers.c | 1 +
rust/helpers/lsm.c | 49 ++++++
rust/kernel/lib.rs | 2 +
rust/kernel/lsm.rs | 295 ++++++++++++++++++++++++++++++++
security/Kconfig | 2 +
security/Makefile | 1 +
security/rust_lsm/Kconfig | 14 ++
security/rust_lsm/Makefile | 2 +
security/rust_lsm/rust_lsm.rs | 66 +++++++
13 files changed, 689 insertions(+)
create mode 100644 Documentation/rust/lsm.rst
create mode 100644 rust/helpers/lsm.c
create mode 100644 rust/kernel/lsm.rs
create mode 100644 security/rust_lsm/Kconfig
create mode 100644 security/rust_lsm/Makefile
create mode 100644 security/rust_lsm/rust_lsm.rs
--
2.53.0
More information about the Linux-security-module-archive
mailing list