restrict
Ergonomic and DX-first Linux syscall filtering crate
restrict offers a clean, expressive API to allow or deny syscalls on Linux. It generates a system-aware Syscall enum at build time and exposes a safe policy manager to configure syscall rules for your application.
✨ Features
- 🚀 Auto-generated
Syscallenum tailored to your host architecture - 📝 Ergonomic API:
policy.allow(Syscall::Write)?; - 🔒 Safe wrapper: no
unsafeblocks or raw pointers - 🎛️ Allow-by-default or deny-by-default policy modes
- 🔍 Runtime inspection: list allowed or killed syscalls
🚀 Quickstart
✅
allow_all()is the recommended default for most use cases to avoid unintentionally blocking essential syscalls.
use ;
Or, for a stricter base policy:
use ;
🛠️ API Overview
-
Policy::allow_all()Starts with all syscalls allowed; then call.deny(...)for any you want to block. -
Policy::deny_all()Starts with all syscalls denied; then call.allow(...)for any you need. -
policy.allow(syscall: Syscall)→&mut SelfMark a syscall as allowed. -
policy.deny(syscall: Syscall)→&mut SelfMark a syscall as killed. -
policy.apply()→()Finalize and load all collected filters into the kernel. -
policy.list_allowed_syscalls()->Vec<Syscall>Retrieve the list of syscalls you’ve allowed(byallow()). -
policy.list_killed_syscalls()->Vec<Syscall>Retrieve the list of syscalls you’ve denied(bydeny()).
📦 Generated Syscall Enum
During build, restrict parses your system headers (e.g. /usr/include/asm/unistd_64.h) and emits:
/// System call list generated from `/usr/include/asm/unistd_64.h`
This ensures accuracy across architectures (x86_64, aarch64, etc.). To override the header location:
SYSCALL_INCLUDE_DIR=/path/to/other/asm
License
This project is licensed under the terms of the MIT license.
See the LICENSE file for more details.