隔离程序
模型编写的程序在一个 kernel 进程中运行,该进程只能看到策略可以看到的东西:只读的 Python 安装和 harness 源码;一个新的工作区;其选项中指定的服务。任务的文件、检查器、物体标注和模拟器的状态都无法访问。
kernel 得到什么
Section titled “kernel 得到什么”在 runtime.isolation = true(默认)时:
| 命名空间 | unshare --user --map-root-user --mount --pid --fork --mount-proc --kill-child:独立的 user、mount 和 PID 命名空间 |
| 文件 | home 目录以及用户拥有的每个最顶层目录(例如其中有 checkout 时的 /data/<user>)被隐藏在空的 tmpfs 之下;Python prefix、src/、skills/、benches/ 和 XPolicyLab 客户端包以只读方式重新挂载;/tmp 是新的 tmpfs,工作目录为 /tmp/workspace |
| 环境变量 | PATH、locale、PYTHONPATH、代理变量,以及其模型角色指定的 API key;HOME 为空,TMPDIR=/tmp |
| 网络 | 只能连接其选项中的服务(worker 端点、模型 URL、服务 URL)和代理;只能解析这些主机的名称 |
| 进程 | 不允许 subprocess、os.system、exec*、fork、posix_spawn、pty.spawn;不允许 ctypes 加载 |
网络和进程检查是 kernel 内部的一个 audit hook;它无法从内部移除,但它防范的是访问数据和服务,而不是有意从解释器中逃逸。
runtime.isolation |
|
|---|---|
true |
沙箱和 guard |
"auto" |
在 user 命名空间可用处使用沙箱,否则只用 guard(并给出提示) |
{hide = ["/data/secrets"]} |
沙箱,同时隐藏这些目录 |
false |
两者都不用:仅用于调试 |
"auto" 用于你无法控制的机器:容器常常禁止 user 命名空间。agent 使用它(configs/default.toml),因为评测方的机器不一定允许 user 命名空间。
unshare --user --map-root-user --mount --pid --fork --mount-proc true && echo namespaces workpython -m unittest discover -s tests -p test_isolation.py这些测试检查:用户文件被隐藏,源码只读而工作区可写,只有允许的服务可以访问,进程既不能启动也不能被看到,并且在沙箱无法运行的地方 guard 仍然生效。