always-further/nono
GitHub: always-further/nono
内核级强隔离沙箱,通过能力集白名单在 syscall 层面阻断 AI Agent 未授权操作,解决 prompt injection 带来的安全风险。
Stars: 715 | Forks: 58

**AI agent 安全方案,从结构上杜绝危险操作。**
From the creator of
Sigstore
The standard for secure software attestation, used by PyPI, npm, brew, and Maven Central
AI agent 拥有文件系统访问权限,可以运行 shell 命令,并且天生容易受到 prompt injection 攻击。标准的应对措施是设置防护栏和策略。但问题在于,策略可以被绕过,而防护栏也可以通过语言技巧攻破。
内核强制沙箱基于内核机制,在 syscall 级别阻断未授权访问。每一次文件系统变更都会生成带有完整性保护的回滚快照。破坏性命令在运行前即被拒绝。机密信息在不触碰磁盘的情况下注入。当 agent 需要访问其权限之外的资源时,内核介导的 supervisor 会通过 seccomp BPF 拦截 syscall,在用户批准后打开文件,并仅注入 file descriptor —— agent 自身从不执行 `open()`。无需 root 或 `CAP_SYS_ADMIN` 权限。支持任何 5.13+ 版本的 Linux 内核 —— 无论是裸机、容器(Docker, Podman, K8s)、Firecracker 还是 Kata。
## CLI
```
nono run --profile claude-code -- claude
nono run --read ./src --write ./output -- cargo build
```
内置 [Claude Code](https://docs.nono.sh/clients/claude-code)、[OpenCode](https://docs.nono.sh/clients/opencode) 和 [OpenClaw](https://docs.nono.sh/clients/openclaw) 的配置文件 —— 也可以通过自定义权限定义你自己的配置。
## 库
其核心是一个 Rust 库,可以通过原生绑定嵌入到任何应用程序中。该库是一个无策略的沙箱原语 —— 它仅应用客户端明确请求的规则。
####

Rust — [crates.io](https://crates.io/crates/nono)
```
use nono::{CapabilitySet, Sandbox};
let mut caps = CapabilitySet::new();
caps.allow_read("/data/models")?;
caps.allow_write("/tmp/workspace")?;
Sandbox::apply(&caps)?; // Irreversible — kernel-enforced from here on
```
####

Python — [nono-py](https://github.com/always-further/nono-py)
```
from nono_py import CapabilitySet, AccessMode, apply
caps = CapabilitySet()
caps.allow_path("/data/models", AccessMode.READ)
caps.allow_path("/tmp/workspace", AccessMode.READ_WRITE)
apply(caps) # Apply CapabilitySet
```
####

TypeScript — [nono-ts](https://github.com/always-further/nono-ts)
```
import { CapabilitySet, AccessMode, apply } from "nono-ts";
const caps = new CapabilitySet();
caps.allowPath("/data/models", AccessMode.Read);
caps.allowPath("/tmp/workspace", AccessMode.ReadWrite);
apply(caps); // Irreversible — kernel-enforced from here on
```
## 功能特性
### 内核强制沙箱
nono 应用操作系统级别的限制,这些限制无法从沙箱进程内部被绕过或提权。权限在执行前定义为 capabilities —— 一旦沙箱生效,即不可逆转。所有子进程都将继承相同的限制。
| 平台 | 机制 | 最低内核版本 |
|----------|-----------|----------------|
| macOS | Seatbelt | 10.5+ |
| Linux | Landlock | 5.13+ |
```
# 授予 src 读取权限,output 写入权限 — 其他所有操作均被 Kernel 拒绝
nono run --read ./src --write ./output -- cargo build
```
### 凭证注入
两种模式:**代理注入** 将凭证完全保留在沙箱之外 —— agent 连接到 `localhost`,代理将真实的 API key 注入到上游请求中。**环境变量注入** 从 OS keystore 或 1Password 加载机密信息,并在沙箱锁定前将其作为环境变量注入。
```
# Proxy 模式 — Agent 即使在自身内存中也看不到 API key
nono run --network-profile claude-code --proxy-credential openai -- my-agent
# Env 模式 — 更简单,但 Secret 位于进程环境中
nono run --env-credential openai_api_key --allow-cwd -- my-agent
# 1Password — 使用 op:// URI 并显式指定环境变量名称
nono run --env-credential 'op://Development/OpenAI/credential=OPENAI_API_KEY' --allow-cwd -- my-agent
```
### Agent SKILL 来源与供应链安全
指令文件(SKILLS.md, CLAUDE.md, AGENT.MD)及相关产物(如脚本)是一种供应链攻击载体。nono 使用 Sigstore attestation(含 DSSE envelopes 和 in-toto / SLSA 风格的 statements)对它们进行加密签名和验证。它支持密钥签名(系统 keystore)和无密钥签名(通过 GitHub Actions + Fulcio + Rekor 的 OIDC)。执行时,nono 会验证签名,根据受信任的根检查签名证书,并验证 statement 断言(例如:在过去 30 天内签名、由受信任的维护者签名)。
直接在 GitHub Actions 工作流中对指令文件进行签名。用户随后可以验证文件是否源自预期的仓库和分支,并由受信任的维护者签名。
### 网络过滤
通过本地代理进行基于白名单的主机过滤。沙箱阻断所有直接出站连接 —— agent 只能访问明确允许的主机。云元数据端点被硬编码为拒绝访问。
```
nono run --supervised --proxy-allow api.openai.com --proxy-allow api.anthropic.com -- my-agent
```
### Supervisor 与 Capability 扩展
在 Linux 上,seccomp user notification 会在 agent 需要访问沙箱外部资源时拦截 syscall。Supervisor 提示用户,然后直接注入 file descriptor —— agent 自身从不执行 `open()`。敏感路径无论是否获批都不可授权。
```
nono run --rollback --supervised --allow-cwd -- claude
```
### 撤销与快照
在沙箱执行前后对工作目录进行内容寻址快照。采用 SHA-256 去重和 Merkle tree 承诺以确保完整性验证。可交互式检查并恢复单个文件或整个目录。已知可重新生成的目录(`.git`, `target`, `node_modules` 等)以及包含超过 10,000 个文件的目录会自动从快照中排除,以防止在大型项目中发生卡顿。
```
# 零参数用法 — 自动排除大型/可再生的目录
nono run --rollback --allow-cwd -- npm test
# 强制包含一个被自动排除的目录
nono run --rollback --rollback-include target -- cargo build
# 从 Rollback 中排除自定义目录
nono run --rollback --rollback-exclude vendor -- go test ./...
# 完全禁用 Rollback
nono run --no-rollback --allow-cwd -- npm test
nono rollback list
nono rollback restore
```
### 可组合策略组
安全策略在单个 JSON 文件中定义为命名组。配置文件通过名称引用这些组 —— 从可复用的构建块组合出细粒度的策略。
```
{
"deny_credentials": {
"deny": { "access": ["~/.ssh", "~/.gnupg", "~/.aws", "~/.kube"] }
},
"node_runtime": {
"allow": { "read": ["~/.nvm", "~/.fnm", "~/.npm"] }
}
}
```
### 破坏性命令阻断
危险命令(`rm`, `dd`, `chmod`, `sudo`, `scp`)在执行前即被阻断。可通过 `--allow-command` 对单次调用进行覆盖,或在配置文件中通过 `allowed_commands` 永久允许。
```
$ nono run --allow-cwd -- rm -rf /
nono: blocked command: rm
# 单次调用覆盖
nono run --allow-cwd --allow-command rm -- rm ./temp-file.txt
# 通过 Profile 覆盖
# { "security": { "allowed_commands": ["rm"] } }
nono run --profile my-profile -- rm /tmp/old-file.txt
```
### 审计追踪
每个会话都将命令、时间、退出码、跟踪路径和加密快照承诺记录为结构化 JSON。
```
nono audit show 20260216-193311-20751 --json
```
## 快速开始
### macOS
```
brew tap always-further/nono
brew install nono
```
### Linux
请参阅 [安装指南](https://docs.nono.sh/installation) 获取预编译二进制文件和包管理器说明。
### 从源码构建
请参阅 [开发指南](https://docs.nono.sh/development) 了解如何从源码构建。
## 支持的客户端
nono 内置了流行 AI 编码 agent 的配置文件。每个配置文件都定义了经过审计的最小权限。
| 客户端 | 配置文件 | 文档 |
|--------|---------|------|
| **Claude Code** | `claude-code` | [指南](https://docs.nono.sh/clients/claude-code) |
| **OpenCode** | `opencode` | [指南](https://docs.nono.sh/clients/opencode) |
| **OpenClaw** | `openclaw` | [指南](https://docs.nono.sh/clients/openclaw) |
自定义配置文件可以通过 `"extends": "claude-code"` [扩展现有配置](https://docs.nono.sh/profiles),以继承所有设置并添加覆盖项。nono 与 agent 无关,适用于任何 CLI 命令。请参阅 [完整文档](https://docs.nono.sh) 了解使用详情、配置和集成指南。
## 使用 nono 的项目
| 项目 | 仓库 |
|---------|------------|
| **claw-wrap** | [GitHub](https://github.com/dedene/claw-wrap) |
## 架构
nono 采用 Cargo workspace 结构:
- **nono** (`crates/nono/`) -- 核心库。一个无策略的沙箱原语,仅应用客户端明确请求的规则。
- **nono-cli** (`crates/nono-cli/`) -- CLI 二进制文件。拥有所有安全策略、配置文件、hooks 和 UX。
- **nono-ffi** (`bindings/c/`) -- C FFI 绑定及自动生成的头文件。
特定语言的绑定单独维护:
| 语言 | 仓库 | 包 |
|----------|------------|---------|
| Python | [nono-py](https://github.com/always-further/nono-py) | PyPI |
| TypeScript | [nono-ts](https://github.com/always-further/nono-ts) | npm |
## 贡献
我们鼓励使用 AI 工具为 nono 做贡献。但是,在提交之前,你必须理解并仔细审查任何 AI 生成的代码。nono 的安全性至关重要 —— 请务必彻底审查和测试你的代码,尤其是核心沙箱功能部分。如果你不理解某项更改的原理,请在提交 PR 前到 [Discord](https://discord.gg/pPcjYzGvbS) 寻求帮助。
## 安全
如果你发现安全漏洞,请 **不要公开提 issue**。请遵循我们的 [安全策略](https://github.com/always-further/nono/blob/main/SECURITY.md) 中所述的负责任披露流程。
## 许可证
Apache-2.0
标签:AI安全, Chat Copilot, DNS 反向解析, HTTP工具, JSONLines, Landlock, Seatbelt, seccomp, Sigstore, 不可变审计链, 内核级隔离, 可视化界面, 完整性保护, 快照回滚, 提示词注入防御, 文件描述符注入, 文档结构分析, 权限控制, 来源证明, 沙箱, 系统调用过滤, 网络安全审计, 能力安全, 软件供应链安全, 远程方法调用, 逆向工具, 通知系统, 通知系统, 通知系统, 零信任