Shell 隔离(shell isolation) 安全与工程
别名:
Shell 隔离 · Shell 隔离执行
让 Agent 执行命令时也受约束的机制:命令白名单(fail-closed,只放行只读命令)+ `execFile` 参数数组执行(不经 `/bin/sh`,没有 shell 元字符注入通道)。诚实局限:白名单拦命令名不拦参数,彻底隔离需要容器/虚拟机级。
它是什么
Shell 隔离(shell isolation)让 Agent 执行命令时也受约束:run_shell 标记 risk: 'approve'(先过 ch18 的审批门),impl 内部再过命令白名单——fail-closed,默认答案是「不」,只有名单上的只读命令(ls/cat/pwd/echo/wc/date)才放行。能写、能删、能联网的一律不在名单里。
为什么必须无 shell 解析
白名单检查的对象是解析后的命令名,这要求执行时不经过 shell:execFile(checked.command, checked.args) 直接以指定程序 + 参数启动。设想用 sh -c "${line}" 执行——模型给的 ls demo-notes; rm -rf ~ 会被 shell 展开成两条命令:白名单检查看到的是 ls,shell 实际执行了 rm。参数数组形式下 ; 只是 ls 的普通参数,shell 元字符注入这个通道根本不存在,白名单拦的才是「真正会执行的程序名」。
诚实局限
白名单拦命令名、不拦参数:cat /etc/passwd 能过白名单(cat 在名单里)。所以 run_shell 的组合拳是「approve 档 + 只读命令 + cwd 限定工作目录」——把「任意命令执行」降级为「有限只读命令」,把 RCE 面缩到最小;彻底封死留给容器/虚拟机级。smolagents 官方对本地执行的态度同样是「不是安全边界」。
在本教程的位置
第 19 章「Shell 隔离」一节:parseCommandLine/isCommandAllowed/checkShellCommand 是纯函数、浏览器判题可跑;输出走 markUntrusted 回填。相关词条:沙箱、最小权限。