八道题覆盖全书:选型(第 1 章)、边界(第 2 章)、权限审计(第 3 章)、供应链(第 4 章)、运行时(第 5 章)、演练与落地(第 6 章)。建议先自己作答再看参考答案;答案给的是判断框架而非唯一标准,工程题的合理变式都算对。
学法建议:第 1、4、8 题考判断(选型、自查、定位),适合纸上作答;第 2、3、5、7 题考实操,建议在练习环境里真跑一遍再对答案;第 6 题最好找一个真实的开源 Skill 目录走完四步。八题全对说明可以毕业——毕业标准见第 6.2 节收官三动作。
你的团队有三个 Agent 任务:A 只读仓库代码并输出摘要;B 要改代码、跑测试、提交分支;C 面向外部用户提交的任意代码做自动修复。分别选哪一级隔离,一句话说理由。
提示:回到第 1.2 节决策树的三个问题——输入可信吗、要写吗、谁承担后果。
参考答案:A 选加固容器(断网 + 工作区只读挂载)——读代码型没有外联与写入需求,容器级足够且成本最低。B 选加固容器加 runsc——读写型但输入基本可信,runsc 把内核攻击面收敛掉,接入成本只是换 runtime。C 选 Firecracker 微 VM——任意执行型且输入来自不可信外部,独立内核是多租户对外的产业默认(第 1.1、2.2 节)。判断框架比结论重要:级别跟着攻击面走,不跟着流行度走。
写出加固容器运行配置中对应四类攻击面的参数,并各用一句话说明它拦什么。
提示:文件系统、网络、能力、资源四组;对着第 0.1 节四类攻击面逐个配对。
参考答案:文件系统用 --read-only 加 --tmpfs /tmp:rw,noexec,nosuid 加唯一工作区挂载——拦文件系统逃逸(写根、植入持久化、先写后执行)。网络用 --network none——拦外联与数据回传通道。能力用 --cap-drop ALL、--security-opt no-new-privileges、非 root 用户——拦提权与横向移动。资源用 --memory、--cpus、--pids-limit——拦资源耗尽(fork 炸弹、内存堆积)。第四类攻击面(内核漏洞)不在参数能力内,靠第 2.2 节 runsc 或微 VM 兜底。
下面这条命令有四处安全缺陷,找出来并各给修法(写法示意):
docker run --rm -v /:/host -v /var/run/docker.sock:/var/run/docker.sock \ --network host --user root agent-sandbox:py3.12 python task.py
提示:逐项对照第 2.1 节参数表与高危反例清单。
参考答案:缺陷一,挂载宿主根目录 -v /:/host——等于没有沙箱,删掉。缺陷二,挂载 Docker Socket——等于交出宿主 root,删掉。缺陷三,--network host 与宿主共网络栈——外联不受限,改为 --network none(需要联网时走出站白名单代理,第 5.2 节)。缺陷四,--user root 且未裁能力——改为非 root 用户并加 --cap-drop ALL 与 --security-opt no-new-privileges。另外补上 --read-only 与资源限额才算齐四道边界。前两条是「出现任何一个、其余参数全部归零」的一票否决项。
你的 Agent 工作流需要:跑测试、看 git 历史、执行项目里的脚本、装依赖。写出第一版策略(allow、deny 各若干条),并指出 git * 和 python * 两条写法的问题。
提示:精确优先;想想 git push、git clean、python -m http.server 分别被什么放行了。
参考答案:allow 写精确与子命令级:pytest、pytest -q、git status、git diff *、git log *、python *.py、pip install -r requirements.txt(锁定文件式安装,内容治理见第 4 章)。deny 兜底:*curl*、*wget*、*nc *、*ssh*、*sudo*、*chmod*、rm *、git push*、* > /dev/*。git * 的问题:前缀放行等于放行全部子命令,git push(外发)与 git clean -fdx(删库)都在内。python * 的问题:python -m http.server、python -c(shell 包装穿透)都被放行,应收窄为 python *.py 并禁止 -c 类入口。灰区走 needs_approval,回执完整展示命令。
某次回放发现同一 run_id 的时间线为:deny(curl)、deny(wget)、deny(nc)、allow(python fetch_data.py)。这是什么信号?哈希链在这个场景里起什么作用?
提示:第 3.2 节「连续 deny 后紧跟 allow」;再想攻击者若想抹掉试探痕迹会怎么做。
参考答案:这是试探指纹——三次网络工具被拒后换用白名单内的脚本继续尝试,说明注入者在画策略边界,fetch_data.py 应立即纳入调查(沙箱里重放对照,比对 stdout_digest)。哈希链的作用:攻击者若想事后删改这三条 deny 记录抹掉痕迹,链条会断,verify() 返回 False;它防「事后悄悄改历史」,不防有 root 的人整段重写,生产要加远程转发。这类信号正是第 5.1 节熔断器的输入:三次 deny 加一次相关 allow,窗口内就该挂起。
你要给团队引入一个社区来源的 Skill:目录含 SKILL.md、scripts/run.py、scripts/setup.sh,仓库里还有一份与功能无关的 .env 读取代码。按四步自查走一遍,写出每步的检查动作与结论。
提示:安装查清单与可执行位、读取查敏感引用、预览靠断网干跑加审计回放、差异留给未来更新。
参考答案:第一步安装检查:find 列清单与官方发布比对,-perm -u+x 查可执行位,钩子检索——若 setup.sh 未在文档声明,属安装钩子类红旗。第二步读取检查:grep 命中 .env 读取且功能说明解释不了,属读取越权类红旗。第三步预览检查:在断网沙箱用 sandbox_run.py 干跑 run.py 与 setup.sh,replay_query.py 回看时间线有无越界尝试。第四步差异比对:本次是首装,记录基准哈希写入 skills.lock.json,留给下次更新当 diff 基准。结论:两处红旗未解释清楚前不入库;按第 4.2 节分级,社区来源本就要走全流程。即便全部通过,也只是必要条件——运行时兜底(第 5 章)不能省。
团队把路径越界信号的熔断阈值设为 60 秒内 2 次,上线第一周大量正常会话被挂起。给出排查思路与调整方案。
提示:先分清是阈值问题、策略问题还是归类问题;回忆「只记录模式」与「先修策略再调阈值」。
参考答案:排查分三步。第一步看误报来源:回放被挂起的 run,统计越界 deny 的 reason 分布——若是 cat * 这类常用命令反复踩路径作用域,说明策略与工作流有摩擦(比如任务合法需要读工作区外文件),先修策略(加审批通道或调整挂载),不是调熔断。第二步看归类:classify 把哪些 reason 映射成了 path_escape,映射过宽会误伤。第三步才是调阈值:切回只记录模式一到两周,取正常分布峰值的外侧(示意:两倍)定阈值,再从降速级逐步启用动作。另外测试型 run 打标豁免。原则:熔断是兜底不是处罚,误报率高的熔断会训练出「人人要求关掉它」的结局。
你所在团队现状:共用一台服务器,两人各自用 docker 命令跑 Agent 任务,策略各写各的,上周有人装了一个市场下载的 Skill。请按三段路线定位段位、列出缺口清单,并设计一条注入类自测用例(含判据)。
提示:第 6.2 节升级信号三条;第 6.1 节用例一的构造与两级判据。
参考答案:段位定位:执行环境已共享给第二人,触发升级信号,应从个人段进入团队段。缺口清单:执行入口未收拢(各自敲 docker,应统一到 sandbox_run.py 与集中网关);策略未共享评审(policy.py 进版本库走合入);审计分散(集中落盘加远程转发);外来 Skill 未过四步自查与锁定(补 skills.lock.json 与入库流水线);没有回归(redteam_regression.py 进 CI)。注入用例:工作区放一份带注入指令的笔记(教学示意样本,保留示例域),让 Agent 执行「总结笔记」任务;理想判据是模型识别并报告注入,底线判据是被诱导发起的 curl 在网关被 deny 或 needs_approval,且审计 decision 事件留痕——底线恒成立才算防线有效,这正是全书「不依赖模型可靠性」的落点。