ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

给你的Agent写一个沙箱:nono Rust库与FFI API开发指南

给你的Agent写一个沙箱:nono Rust库与FFI API开发指南 给你的Agent写一个沙箱nono Rust库与FFI API开发指南【免费下载链接】nonoagent runtime security - zero trust, zero setup, zero latency.项目地址: https://gitcode.com/gh_mirrors/non/nononono 是一个零信任的 Agent 沙箱框架它的核心是一个纯 Rust 编写的沙箱库和一套 C FFI API。今天这篇文章会带你了解如何用 nono Rust 库给 AI Agent 加上操作系统级隔离以及如何通过 FFI 绑定把它接到 Python、Go、TypeScript 等任意语言中——全程无容器、无虚拟机、零延迟启动。为什么 Agent 需要操作系统级沙箱AI Agent 会读写文件、访问网络、执行命令。如果直接让它以当前用户权限运行一旦提示词注入或模型“犯浑”你的 SSH 密钥和云凭据就暴露了。nono 的思路是把沙箱下推到操作系统内核Linux 上用 Landlock内核 5.13macOS 上用 Seatbelt。进程一旦被应用沙箱限制就是不可逆的连它自己加载的动态库、派生的子进程、发起的网络连接都逃不出去。这种“内核沙箱边界”的模型正是 nono 库的设计出发点库只负责机制机制层策略由你定义。核心实现分别在 crates/nono/src/sandbox/linux.rsLandlock和 crates/nono/src/sandbox/macos.rsSeatbelt。三步用 Rust 库创建沙箱nono 库的 API 围绕一个核心概念CapabilitySet能力集。你的思路是“白名单”只授予需要的路径和权限其余全部默认拒绝。use nono::{CapabilitySet, AccessMode, Sandbox}; let caps CapabilitySet::new() .allow_path(/usr, AccessMode::Read)? // 系统可执行文件只读 .allow_path(/lib, AccessMode::Read)? .allow_path(/bin, AccessMode::Read)? .allow_path(/project, AccessMode::ReadWrite)? // 项目目录可读写 .block_network(); // 禁止出站网络 if !Sandbox::support_info().is_supported { /* 提示平台不支持 */ } Sandbox::apply_auto(caps)?; // 应用沙箱不可逆几个关键点白名单思维必须把“让程序跑起来”所需的所有路径/usr、/lib、/bin都显式授权漏掉一条程序就跑不起来这正是最小权限的代价不可逆Sandbox::apply_auto一旦执行当前进程及所有子进程只能访问被授权的资源先探测后应用用Sandbox::support_info()检查平台支持情况优雅降级。能力集的完整定义在 crates/nono/src/capability.rs除了文件路径还支持 Unix socket、网络模式、命令黑白名单等。C FFI API让任何语言都能用很多 Agent 框架是 Python、TypeScript 或 Go 写的不会直接依赖 Rust crate。nono 因此提供了一个C ABI 静态/动态库nono-ffi任何支持 C FFI 的语言都能调用。FFI 源码位于 bindings/c/src/lib.rs编译产物为cdylibstaticlib头文件由 cbindgen 自动生成在 bindings/c/include/nono.h配置见 bindings/c/cbindgen.toml。API 按职责分为几组非常好记函数族作用nono_capability_set_*创建/释放能力集授权路径、设置网络模式nono_query_context_*应用前“试问”某路径/网络是否会被允许nono_sandbox_apply把沙箱应用到当前进程不可逆nono_sandbox_state_*能力集的 JSON 序列化快照可在进程间传递nono_last_error取走当前线程的详细错误信息一个最小调用序列char *ver nono_version(); // 获取库版本 NonoCapabilitySet *caps nono_capability_set_new(); nono_capability_set_allow_path(caps, /project, NONO_ACCESS_MODE_READ_WRITE); nono_capability_set_set_network_blocked(caps, true); NonoErrorCode rc nono_sandbox_apply(caps); if (rc ! NONO_ERROR_CODE_OK) { char *msg nono_last_error(); // 人类可读错误详情 // ...打印 msg nono_string_free(msg); }设计上对 C 调用者非常友好内存所有权清晰不透明指针和返回的字符串都由调用方负责释放所有_free()函数对 NULL 安全错误码 双通道诊断每个函数返回负数错误码枚举见NonoErrorCode同时nono_last_diagnostic_code()提供机器可判定的诊断码nono_last_remediation_json()给出修复建议的 JSON无策略偏见库只提供机制拒绝/允许什么完全由你在能力集里声明。官方也为 Python、TypeScript、Go 提供了语言绑定仓库底层都走这套 C ABI。沙箱在运行时如何强制执行在 Linux 上nono 不止用 Landlock还叠加了 seccomp BPF 与 supervisor监督者机制子进程发起敏感操作时会被拦截由监督者做最终决策——批准则直接注入文件描述符拒绝则落到 Landlock 的允许列表上由内核返回 EPERM。对开发者来说这意味着你在能力集里声明的策略会在内核层面生效被沙箱化的进程无法自我提权、无法撤销限制这是容器和 chroot 都做不到的保证。网络隔离三种模式按需选择FFI 里通过nono_capability_set_set_network_mode切换三种网络模式Blocked0完全禁止出站适合纯本地计算的 AgentAllowAll1放行全部出站不推荐用于不可信 AgentProxyOnly2所有流量必须走本地代理端口配合nono_capability_set_set_proxy_port使用。ProxyOnly 模式是生产环境推荐姿势沙箱内进程只能连 localhost 上的代理由代理校验会话令牌、核对域名白名单和拒绝 CIDR 段后再转发。这样即使 Agent 被注入恶意指令数据也出不去白名单范围。快速上手步骤# 克隆仓库 git clone https://gitcode.com/gh_mirrors/non/nono.git cd nono # 构建 Rust 库workspace 成员crates/nono cargo build -p nono # 构建 C FFI 库并重新生成头文件 cargo build -p nono-ffi --release然后按你的语言Rust[dependencies] nono 0.1直接引用C/C链接libnono_ffi.a或.so#include nono.h其他语言通过各自 C FFI 机制ctypes、cgo、node-ffi等绑定同名函数。平台支持情况一览与 crates/nono/README.md 一致平台机制最低要求LinuxLandlock LSM内核 5.13macOSSeatbelt10.5其他返回UnsupportedPlatform错误—延伸阅读与关键源码索引库入口与平台说明crates/nono/src/lib.rs能力模型定义crates/nono/src/capability.rs诊断与拒绝记录审计用crates/nono/src/diagnostic/mod.rsFFI 头文件可直接查看全部导出函数bindings/c/include/nono.h错误码映射实现bindings/c/src/lib.rs平台沙箱实现crates/nono/src/sandbox/linux.rs、crates/nono/src/sandbox/macos.rs官方文档docs/cli/features/tool-sandbox.mdx 小贴士开发阶段先调nono_query_context_query_path预检路径授权确认能力集配置无误后再nono_sandbox_apply能省掉大量“程序起不来”的调试时间。给你的 Agent 加上 nono几秒钟内就能得到一个内核级、不可绕过、默认拒绝的沙箱——这正是 zero trust、zero setup、zero latency 的含义。【免费下载链接】nonoagent runtime security - zero trust, zero setup, zero latency.项目地址: https://gitcode.com/gh_mirrors/non/nono创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表