The Problem with Application-Level Controls
Many AI agent frameworks implement their own permission systems:Why Application Controls Fail
-
The agent controls the runtime
- The agent can modify its own code
- It can call system APIs directly
- It can ignore the permission checks entirely
-
No enforcement boundary
- Application controls are just code running in the same process
- A compromised or malicious agent has full access to everything
-
Single point of failure
- One bug in the permission system = complete bypass
- The agent can probe for and exploit these bugs
How OS-Level Enforcement Differs
Key Differences
1. Irreversibility
Application controls: Can be modified or disabled at runtime2. Enforcement Authority
Application controls: Enforced by code the agent can modify OS-level (nono): Enforced by the kernel- Agent cannot modify kernel code (without a kernel exploit)
- System calls are intercepted before they can succeed
- The agent never gains unauthorized access, even momentarily
3. Process Inheritance
Application controls: Child processes may not inherit restrictions4. Attack Surface
Application controls: Every permission check is an attack vector- Landlock and Seatbelt handle edge cases
- Symlink resolution is done correctly
- TOCTOU windows are minimized or eliminated
- Implemented by kernel security experts
Comparison Table
* Requires kernel exploit to bypass
Real-World Implications
Scenario: Malicious Dependency
Your agent loads a compromised npm package: With application controls:Scenario: Prompt Injection
An agent is tricked via prompt injection to exfiltrate secrets: With application controls:Scenario: Agent Self-Modification
Agent tries to remove its own restrictions: With application controls:When Application Controls Are Acceptable
Application-level controls still have uses:- UX improvement - Provide helpful error messages before hitting kernel denial
- Auditing - Log what the agent intended to do
- Rate limiting - Throttle API calls (not a security boundary)
- Defense in depth - Additional layer on top of OS controls
Summary
nono chooses OS-level enforcement because the agent is untrusted by definition. Any security model that relies on the agent cooperating with restrictions is fundamentally broken.
The kernel doesn’t care what the agent wants. It enforces the rules regardless.