十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Aptos Flow 评测沙箱深度解析:bubblewrap 命名空间与 Landlock 规则集如何双重锁住模型会话

Aptos Flow 评测沙箱深度解析:bubblewrap 命名空间与 Landlock 规则集如何双重锁住模型会话 Aptos Flow 评测沙箱深度解析bubblewrap 命名空间与 Landlock 规则集如何双重锁住模型会话【免费下载链接】aptos-coreAptos is a layer 1 blockchain built to support the widespread use of blockchain through better technology and user experience.项目地址: https://gitcode.com/GitHub_Trending/ap/aptos-core本文拆解 aptos-core 中 spec-inference 评测框架aptos-move/flow/evaluation/spec-inference所使用的评测沙箱它用外层 bubblewrap 命名空间加内层 Landlock 文件规则集把每个真实模型会话锁在严格的文件视图里并逐条说明它真正强制了什么、又明确不保证什么。读完本文你能掌握一套完整的在宿主机上运行不可信 Agent 会话的完整性隔离设计以及如何用 preflight 探针把隔离属性变成可审计、可回归的证据。沙箱要解决的问题三个实验完整性属性沙箱服务的对象是规格推断spec inference评测让模型 Agent 在看不见标准答案的前提下写出可通过验证的 Move 契约/规格。Agent 的输出是不可信的它读到的一切同样不可信。沙箱存在的目的是让以下三条属性无论模型做什么行为都成立隐藏材料保持隐藏。变异体mutants与参考规格绝不能进入会话——一份契约能通过验证只有当它在没看见答案的情况下写出来时才是有效证据。实验装置不能从内部被修改。评测框架harness、提示词、任务补丁task patch、初始基线包pristine baseline以及本轮自己的配置Agent 一律不可写会话无法改写给它打分的装置。一次运行无法伪造自己的记录。Agent 只能写自己的工作区遥测telemetry与产物artifacts归控制器controller所有。需要强调这三条是关于实验本身的完整性属性。它们不是在带机密的机器上安全运行敌意模型的保证——边界见 非目标 一节。实现分布在四个文件中文档见 sandbox/README.md文件职责harness/pilot_sandbox.py挂载、环境、每次启动生成的 wrappersandbox/landlock_exec.c内层 Landlock 规则集的执行器harness/boogie_proxy.py控制器侧的 Boogie 代理sandbox/boogie-proxy-client.pyAgent 侧的求解器代理客户端pilot_sandbox.py中的POLICY_VERSION每次策略变化都会递增当前为4见 pilot_sandbox.py#L34preflight 会把版本号记入preflight.json审计阶段再与之比对从而保证这轮运行实际执行的是哪个策略可追溯。两个相互独立的隔离层沙箱由两层构成外层是 bubblewrapbwrap命名空间内层是 Landlock 规则集——由一个 wrapper 施加后才exec真正的二进制。两者刻意分离因为沙箱挂载的是控制器所需的世界它要跑 Boogie、读任务补丁、写遥测而 Agent 被限制在这个世界的一个严格子集内bwrap 命名空间 ← 控制器的视图solver、patch、prompts、artifacts └── landlock-exec 规则集 ← Agent 的视图workspace、plugin、move-flow、Z3 └── claude关键点在于 wrapper 是每次启动时从同一个Launch值现生成的_write_agent_wrapper见 pilot_sandbox.py#L957-L978规则集与挂载集来自同一份数据因此规则集不可能漂移去描述一个与真实存在不同的世界。生成的 wrapper 本质是一段 shell 脚本——exec /opt/bin/landlock-exec 各路径的 --ro/--rw 规则 -- /opt/bin/claude-real——被挂载为命名空间里的/opt/bin/claudepilot_sandbox.py#L781而真实 Claude 二进制则挂在/opt/bin/claude-real。外层bubblewrap 命名空间外层命名空间使用的 bwrap 标志为见 build_bwrap_command--unshare-user --unshare-pid --unshare-ipc --unshare-uts注意没有--unshare-net原因见网络一节--cap-drop ALL、仅在命名空间内部映射 uid/gid 0--die-with-parent、--new-session--clearenv语义的显式最小化环境见下文实现注记/usr、/lib只读--ro-bind/bin为指向usr/bin的符号链接/tmp是 tmpfs/dev是--dev建立的最小设备树宿主存在时还会只读挂载/lib64、/etc/ssl与解析器输入文件/etc/hosts、/etc/nsswitch.conf、/etc/resolv.conf、/etc/gai.conf常量RESOLVER_INPUTS见 pilot_sandbox.py#L54-L59/proc是刻意的让步/proc以只读方式挂载进命名空间因为 Boogie 自带的自包含 CoreCLR 在启动时读取/proc/self拿不到就会以HRESULT: 0x8007000E中止。只有控制器进程跑 Boogie而 Agent 的 Landlock 规则集只允许它看见/proc的一小片下文——这是挂载面宽、规则面窄两层设计能成立的前提。实现注记从源码结构看当前版本没有把凭据类变量写进 bwrap 命令行--setenv而是通过subprocess直接传入一份最小化环境映射build_bwrap_environmentpilot_sandbox.py#L846-L897其效果等价于--clearenv 显式变量列表但避免了凭据出现在进程参数列表argv里被命令行检查暴露。内层Landlock 规则集内层规则集精确界定了 Agent 进程可读什么、可写什么与 agent_landlock_paths 一致Agent 可读Agent 可写/usr、/lib、/lib64、/opt它自己的工作区artifacts/run_id/workspace/proc/self、/proc/stat、/proc/sys/vm遥测文件artifacts/run_id/flow-events.jsonl渲染后的插件pluginartifacts/.sandbox-home初始基线pristine baseline、任务判据criteria、运行时 MCP 配置/tmp、/devmove-flow、Z3、Boogie 代理客户端TLS 根证书与解析器输入几个值得展开的细节截断truncation也是被治理的。从 Landlock ABI 3 起截断是独立的访问权如果不把它纳入handled_access_fs一个规则集标为只读的文件仍可能通过O_TRUNC或ftruncate被清空。landlock-exec把LANDLOCK_ACCESS_FS_TRUNCATEbit 14并入写权限集见 landlock_exec.c#L18-L35而 preflight 会专门探测只读文件不可被截断。运行目录的其余部分归控制器。run.json、judge 结果、事件日志都不在 Agent 的可写列表里——能写这些的 Agent 就能伪造自己运行的记录所以不允许。遥测文件之所以例外是因为写它的 Flow MCP 服务器作为 Agent 的子进程继承了 Agent 的 Landlock 域控制器会在启动前先创建该文件规则只需精确命名这一个文件。刻意缺席的路径harness 目录、prompts 目录、任务补丁、初始基线包、Boogie 可执行文件——这些控制器都挂载了但 Agent 的规则集里不存在agent_landlock_paths的可读列表里没有它们。/proc是最微妙的一项。Landlock 域内的/proc/self解析为wrapper 自己的 PID且任何子进程都不在可读范围内所以 Agent 读不到别的进程。preflight 正是这样断言的要求能读/proc/self/status、且读/proc/1/status必须失败pilot_sandbox.py#L166-L173。运行暂存与原子发布源码级补充从源码看控制器侧还有一个文档未展开的运行生命周期细节run_isolatedpilot_sandbox.py#L655-L693会把一个私有暂存目录artifacts/.sandbox-staging/run_id.*以可写方式挂进命名空间充当artifacts等子进程退出且出现终结性的judge.json后才把暂存目录原子地rename发布为artifacts/run_id——运行无法通过共享产物目录窥探兄弟运行的产物。若运行被中断preserve_interrupted_runpilot_sandbox.py#L696-L724会先移除符号链接、用redact_tree做凭据脱敏、写入interruption.json再归档到interrupted-runs/_cleanup_on_terminationpilot_sandbox.py#L727-L752则把 SIGTERM/SIGINT/SIGHUP 转成异常展开确保暂存目录原样持有 Agent 工作区、可能含它从自身/proc/self读到的凭据在信号终止时也被清理。为什么求解器必须走代理/proc/self被固定到 wrapper 的 PID于是 Agent 自己拉起的 Boogie 会解析到一个它自己的 Landlock 域读不到的 PIDCoreCLR 会在运行前中止。设计者的选择不是放宽规则集而是控制器通过一个 Unix socket/tmp/move-inference-boogie.sock提供真实的 BoogieAgent 的BOOGIE_EXE指向一个客户端脚本挂载为/opt/bin/boogie常量AGENT_BOOGIEpilot_sandbox.py#L48-L52。这不仅是权宜之计它意味着 Agent 从不持有求解器可执行文件且每次求解器调用都要经过控制器侧对工作目录的校验。客户端协议boogie-proxy-client.py#L13-L30很简单发送{arguments: argv, cwd: getcwd()}的 JSON收回 base64 编码的 stdout/stderr 与返回码按原样写回并退出。preflight 会端到端证明这条链作为 Agent 运行时真实身份那样的孙进程grandchild把一个单行 Move 包PROBE_MODULE0x42::probe::identity及其ensures result x规格pilot_sandbox.py#L216-L222跑过完整 Agent 侧链路——move-flow experiment prove→ 代理客户端 → 控制器的 Boogie → Z3——并要求报告里 obligation 确实被证明。文档还记录了一段历史教训早期版本只从 wrapper 直接 exec Boogie 来探测那能跑通所以什么都没证明导致若干轮运行在一个根本起不来的求解器上进行。工具面MCP 清单就是安全边界Agent 的能力面是内置工具与 MCP 服务器清单的并集。规范配置 config/default.json 中允许allowed_builtin_toolsRead、Glob、Grep、Edit、Write以及任务工具TaskCreate、TaskUpdate、TaskList、TaskGet拒绝denied_builtin_toolsBash、WebSearch、WebFetch、Agent、Task。拒绝Bash与WebFetch比表面看起来更重要它们没了MCP 工具就成了进程对外唯一的通道。这使得 MCP 工具清单成为一道安全边界而不仅仅是人体工学选择——任何接收 URL 的工具都是出站egress通道并按通道对待。因此move_replay_transaction不在评测会话中提供它会访问任意 REST 端点、把调用方提供的密钥作为 bearer token 发送而在为包做规格推断期间毫无用途。工具清单由测试断言而不是留给代码评审去保证。网络刻意不做网络隔离网络没有被隔离bwrap 命令中没有--unshare-net可在 build_bwrap_command 中核实。会话必须能到达模型端点否则这一轮就跑不起来。设计的其余部分都建立在这个前提上Agent 能读到的一切的机密性都押在Agent 没有把数据发出去的手段上——这正是上面工具清单之所以属于沙箱的一部分、而不是独立于沙箱的原因。凭据进程内可取出不了门凭据链路的处理sandbox/with-glm-env.shwith-glm-env.sh从环境变量ZAI_API_KEY/GLM_TOKEN/GML_TOKEN或密钥文件解析提供商密钥导出为ANTHROPIC_AUTH_TOKEN它从不打印该值、从不写入任何产物并且清掉来源变量with-glm-env.sh#L26-L34 中先 unset 各种 Foundry/ANTHROPIC_API_KEY/OAuth 设置再 export 凭据并 unset 源变量启动器在--clearenv语义之后把ANTHROPIC_AUTH_TOKEN、ANTHROPIC_API_KEY、ANTHROPIC_BASE_URL及 TLS 变量转发进命名空间代码实现中还包含CLAUDE_CODE_OAUTH_TOKEN、SSL_CERT_FILE、SSL_CERT_DIR见 pilot_sandbox.py#L887-L896。关键而诚实的推论Agent 进程需要这个 token它就是调 API 的那个进程所以 token 就在一个它能读/proc/self的进程环境里。一个想要自己凭据的 Agent 拿得到。沙箱不试图阻止这一点它阻止凭据离开——手段就是确保不存在任何出站通道见网络与工具面两节。控制器在运行结束后还会对产物做一次凭据精确字节的清扫byte sweep让仅仅回显了凭据的 Agent 不会把它带进日后被引用的转录本轮的launch-report.json位于每轮产物树之外且会引用控制器自己的输出——后者又可能引用 Agent 写的源码编译器诊断会回显被拒的那一行——所以调度器对记下的内容做脱敏。harness/credentials.py 是凭据变量与替换方式的唯一定义任何可能收到 Agent 影响字节写入的写者都必须经过它。文档明确承认这是构造性的 best-effort对值做编码或拆分的 Agent 能打败字节清扫没有任何清扫是完备的所以会话产物一律视为不可信数据。能闭合这个洞的设计是控制器侧的认证代理——让 Agent 从头到尾不持有凭据与 Boogie 代理同构。此外能力标记MOVE_INFERENCE_EVAL_SANDBOXED1由 wrapper 在--clearenv之后创建pilot_sandbox.py#L881-L885父启动器会剥掉任何宿主提供的同名变量——于是只有运行在策略之内的控制器才能通过真实运行守卫。反证变异体一个已知的泄漏风险一轮运行可以通过--refutation-mutants-root传入反证变异体控制器随后会返回能通过验证、但未能拒绝某个变异体的契约。反证需要这些变异体在命名空间内而 Agent 与该命名空间共享——所以它们只靠 Agent 的 Landlock 规则集被扣住与扣住 prompts、任务补丁、初始基线包的是同一机制。这比评分集scoring set的待遇弱评分集从不会被挂载。因此经由此处传入的集合绝不能是本轮打分的集合harness.controller在两个根相等时直接拒绝而score_round在这沙箱之外、对着它自己的集合在运行结束后执行。源码中对应位置带着明确的KNOWN LEAK RISK注释pilot_sandbox.py#L768-L773并且_require_confined_mountpilot_sandbox.py#L573-L607拒绝任何会遮蔽沙箱自身文件系统的挂载根位于/tmp、/opt或其上级以及任何嵌套在 Agent 可读目录插件、工作区之内的根。preflight 证明什么Landlock ABI 3 是硬门槛。wrapper 要求 ABI 3 及以上否则拒绝启动if (abi 3) { fail(Landlock ABI 3 or later is required to govern truncation, NULL); }landlock_exec.c#L84-L86截断是 ABI 3 之前内核无法治理的独立访问权在更老的内核上一个只读文件——初始基线或运行记录——可能在策略自报完好时被清空。轮次宁可不跑也不宣称一个它并不具备的保证。landlock-exec自身的工作流程也值得注意创建规则集截断权并入写权限、为每个--ro/--rw路径添加LANDLOCK_RULE_PATH_BENEATH规则、prctl(PR_SET_NO_NEW_PRIVS)后landlock_restrict_self最后execvp真正的命令landlock_exec.c#L99-L133。preflight 在轮次之前运行把以下事项记入preflight.jsonpreflight()pilot_sandbox.py#L97-L213策略版本号bwrap与landlock-exec二进制及各自的 SHA-256一个宿主专用哨兵路径在命名空间内不可见在 Agent 规则集下另一个进程不可读/proc/self/status可读、/proc/1/status必须失败只读文件不可被截断探测直接os.truncate(/usr/bin/env, 0)并要求OSError完整求解器管线能以 Agent 孙进程的身份跑通prover_pipeline探针。后一条被单独报告为prover_pipeline字段与覆盖其余各条的isolation探针分开passed仍是两者的合取轮次门禁不变但它们回答不同的问题——isolation是安全属性prover_pipeline问的是这台宿主上到底有没有可用的求解器链。一台BOOGIE_EXE配置过期的宿主否则会把沙箱策略失败上报得好像是真的从而诱导一次真实回归被当成环境问题挥手放过。配套地_required_solverpilot_sandbox.py#L617-L639对配置了但不在的路径直接报错而不回退到PATH——轮次要记录到底运行了哪些二进制偷换操作者没点名的求解器就是对实验装置的错误描述其错误消息会同时指出过期的变量名与PATH上实际存在的替代项使两种情况可区分。最后一条务实提醒CI 里没有任何东西跑这些测试。tests/test_pilot_sandbox.py是对真实landlock-exec二进制唯一的自动化演练它只在有人运行它时运行。那里的失败应当被当作发现finding处理而不是噪声。路径校验由 wrapper 决定什么可以挂载wrapper 而不是调用者决定什么能被挂载parse_launchpilot_sandbox.py#L394-L493子进程必须是 wrapper 同一个 Python 解释器启动的python -m harness.controller运行清单run manifest必须位于evaluation-artifacts/round/schedule/runs之下且是真实文件配置只能是规范配置config/default.json或本轮自己的config.json产物目录必须是本轮的runs/且该run_id的产物不得已存在生产沙箱拒绝开发选项--fake-script、--allow-unsandboxed一律报错--agent只允许claude_reject_development_optionspilot_sandbox.py#L503-L521。清单还另外命名三条会被挂载进会话的路径——shared_package、task_patch、plugin_dir。调度器把它们写成相对清单的路径于是相对路径可以爬出轮次目录。因此每条在挂载前都被检查解析后是否落在轮次目录内_require_inside_roundpilot_sandbox.py#L524-L538。没有这个检查一份精心构造的清单就能把任意本地目录树挂载进会话进而泄露给模型提供商。非目标把边界写明让发现可以被归类文档把这些限制说得很直白目的是让一个沙箱弱点声明能从这一页判断自己落在威胁模型之内还是之外而不是靠争辩不是对带出站通道的模型的防御。设计确保通道关闭。若往工具清单里加了一个能触网的工具上面的机密性论证即告失效——凭据与工作区都变得可达。加这样的工具是策略变更不是功能flow 里的清单测试正是让这种变更变得刻意为之的东西。不是多租户或敌意代码沙箱。它约束的是研究者自己机器上的一个协作进程不针对内核逃逸、侧信道或资源耗尽做加固会话可以烧掉 CPU。不是对语料的保证。沙箱假设语料内容由研究自身制作而非攻击者提供。恶意 Move 源码带来的提示注入prompt injection超出范围——在成为沙箱问题之前它先是语料完整性问题。不是遥测完整性的保证。Flow MCP 服务器作为 Agent 进程的 child 运行继承 Agent 的 Landlock 域只能写到 Agent 能写的地方这正是flow-events.jsonl放在运行目录里的原因。因此持有Write的 Agent 可以改写它包括控制器用来检测 MCP 监督者重启的session_start记录。文件系统规则无法把那个写者与 Agent 分开闭合它需要控制器侧的遥测通道沿用 Boogie 代理已有的模式。在那之前遥测是Agent 可能改动过的证据而不被当作对刻意敌意者的证明。不是审计的替代品。对隐藏材料的盲性由挂载强制执行被隐藏的是否是正确的那些材料由事后运行pilot_audit.py的--forbidden-path检查harness/pilot_audit.py。延伸阅读路径沙箱设计文档本体sandbox/README.md沙箱策略与挂载/环境/wrapper 生成harness/pilot_sandbox.pyLandlock 执行器C需在本机构建以匹配宿主机内核头文件sandbox/landlock_exec.c求解器代理两侧harness/boogie_proxy.py、sandbox/boogie-proxy-client.py凭据定义与脱敏harness/credentials.pyGLM 环境脚本sandbox/with-glm-env.sh轮次实验配置工具允许/拒绝清单等config/default.json对真实landlock-exec二进制的唯一自动化演练tests/test_pilot_sandbox.py需要说明的运行前提这套沙箱依赖 Linux 内核的 Landlock ABI 3内核 6.7 及以上提供、bubblewrap 二进制、可在本机编译landlock_exec.c的工具链以及一个预编译的landlock-exec产物缺失时启动直接失败并提示用cc -O2构建preflight 不通过的轮次不算一轮。【免费下载链接】aptos-coreAptos is a layer 1 blockchain built to support the widespread use of blockchain through better technology and user experience.项目地址: https://gitcode.com/GitHub_Trending/ap/aptos-core创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表