FALCON:反例归因、覆盖条件与安全奖励分账
FALCON:反例归因、覆盖条件与安全奖励分账
知识点轴:sandbox-security / benchmark-evaluation / harness-runtime。
为什么值得深挖
安全 coding 里最危险的反馈不是“没有运行测试”,而是代理指标越来越好、真实安全性没有变好。FALCON 把攻击探索、受测代码的真实轨迹、反例归因与 held-out 功能/安全判分分开,能直接改进私有仓库题池和 agent 修复 loop。
本轮读 v2 主文、实现/faithfulness/CWE oracle/局限附录,固定仓库 dcdf90795ffcfb7de9d5fef291f4699c7ce4d5e8 的 engine verifier/faithfulness 与实验 verifier/signal/models/RL reward。没有调用攻击模型、跑 Docker/PoC、训练、下载完整题包或复现作者模型结果。GitHub SafeCodeAgent/FALCON 当次 4 stars,仅作来源标识。
一阶机制:谁制造了反例,谁才被归责
1. Attacker 不自行指定“正确答案”
attacker 针对 patch 后 workspace 中改变的 executable symbols 生成确定性 PoC:输入/环境/调用脚本,不提供期望输出或安全 verdict。随后真正执行,verifier 只判断这次 trace 是否违反公开任务的安全要求。
这样减少了直接源码 judge 对所有潜在路径的推理负担;但并没有消灭 oracle 问题。任务要求仍须准确、runtime instrumentation 必须可信,trace judge 也可能误判。测试文件排除在 target selection 外,改配置/跨文件行为或没选中的入口可能漏覆盖。
2. Faithfulness 分静态准入和运行时归因
静态检查拒绝重定义/替换目标、重绑定模块路径、probe 自己读取敏感值后报告泄漏等伪反例;运行时核 target frame 和 evidence event 的归属。一个脚本确实运行过,不代表违规来自受测 target。论文 B.8 给 9 静态+3 运行时规则,非 Python 的词法规则也可能漏掉非常规写法。
被拒绝或无法归因的 probe 是 inconclusive/no admissible evidence,既不是安全反例,也不是清白证明。与 verifierbench-v4v-positive-coverage-and-all-reject 的判分器合法正例覆盖、Agent-Benchmarks 的 gradeable 分母互补:安全评测要同时审攻击是否有效、好解是否被误杀、所有计划运行有没有真的被覆盖。
3. 三层 verifier 与实现路径不能混为一谈
论文完整设计为 crash oracle → 21 个 deterministic CWE detectors → 仅 unresolved 进入 LLM trace judge;detectors 关联 33 个 CWE,轻量 benign heuristic 可提前清掉无可疑行为的 trace。这里的 secure 仍只是当前预算内没有发现违规。
固定仓库有不同执行面:顶层 engine/verifier.py 的 deterministic core 只有 crash oracle,其他路径留 uncertain/Stage 3;实验 experiments/test-time-repair/av_signal/verifier.py 才有更完整的规则分支。不能因为论文写 21 detectors,就声称每种安装入口默认启用同样 21 条。选 agent skill/CLI/实验 runner 时,要固定实际 entrypoint、mode、instrumentation 和调用路径。
论文 judge prompt 还明确:某些 process/network 调用被截获,payload 到达捕获的 sink 参数可以作为该实验的 observed event。这是定义好的 oracle,不等价于真实外网请求/命令副作用已经发生;将机制迁到网关安全验收时,仍须单独取真实 protected sink/effect 证据。
no-evidence、secure 标签和 RL reward 是三回事
| 情况 | 固定聚合/奖励语义 | 不能推出 |
| 无 admitted probe | signal=no-evidence | 程序经有效攻击后安全 |
| 有 admitted、无 insecure | signal=secure;顶层 aggregate 可仍保留 pending uncertain | 所有 trace 已终裁、全面安全或可直接生产放行 |
| 任一 admitted insecure | 聚合 insecure,保留 probe/trace/reason | 所有其他功能和路径均不安全 |
| RL 的 no-evidence / secure | rl_security_reward=1 | 这次运行提供了肯定安全证据 |
| RL 的 insecure | reward=0 | 攻击覆盖是完整的 |
RL 映射偏向精确负奖励,避免假阳性反复惩罚正确代码;这与部署准入风险偏好不同。论文训练预计算固定 probes 以节约成本,再用 reward 从未见过的功能/安全测试衡量 held-out 结果。固定 probes 也有过拟合风险;作者将定期再生成列为未来工作。
本轮对上述固定源码的纯函数做了 11 个合成单元检查,全部通过:空集/拒绝集 no-evidence、pending uncertain 的 secure 聚合标签及 uncertain 明细保留、Stage 3 insecure、target 内外 crash、三种 signal 的 RL reward。回执在 ~/.hermes/cache/scratch/ai-radar-20261031/deterministic-checks.json。这只证明这些分支语义可复现,不是 FALCON benchmark 或安全 PoC 成功。
作者实验如何读,如何迁到私有题池
- 修复 loop 比较四类 feedback,ground-truth 功能/安全 tests 对 signals 隐藏;最多五轮。作者报告 FALCON 的 proxy 改善能更多转移到 held-out Func-Sec@1。各组初始解独立生成,不是完全同 initial patch 的逐题配对;不能把这些均值当纯 verifier 因果量。
- repository 实验的 SusVibes
FuncPass/SecPass有 task-specific baseline allowance,不是每项 test 都通过;也不能用两个边际 pass 平均值反推出逐 run 的功能且安全联合成功。 - attacker 与 judge 和 coding agent 使用相同 model name 的不同调用,降低能力差距,但不是独立人工金标。训练多 seed、修复多轮、每 target 多 probe 是不同重复单位。
可执行迁移(未在生产启用):
- 每题固定 BASE/RED/GOLD、允许产物和 hidden verifier;probe/trace/judge 与 agent 可见域分开,旧合法解和新合法替代解都要验。
- 各版本并列 planned/generated/static-rejected/execution-error/runtime-rejected/admitted/pending/final-verdict,全零覆盖不得被 reward=1 漂白。
- 同 initial patch、同预算对照源码 judge/attacker-only/执行归因反馈,独立判最终功能且安全;记录含探针、恢复和 judge 的全链成本。
- 若作为发布 gate,把未终裁/no-evidence 的处置写成显式政策;不要直接复制训练 reward。断网/只读/资源上限只证明执行限制,不能代替沙箱逃逸或最终 sink 验收。
这些合同接到 Harness-Engineering 的控制与反馈 loop、MCP-Gateway-Runtime 的真实 effect 验收;不是建议在当前 Hermes 自动执行外部攻击脚本。
失败模式与未解问题
有限 target/probe 覆盖、静态/归因规则漏判、benign heuristic 清掉弱证据、Stage 3 误判、固定训练 probes 过拟合都可能让代理指标虚高。需要新攻击/合法正例/held-out 独立测试,而不是把轮数加大就宣称安全。
本轮未审完整 executor/容器隔离、所有 detector 与跨语言适配器,也没有作者逐 trial 数据/模型复现。顶层 engine 与实验实现不同按路径保留;不把实验 sink 截获当真实外发,也不把“未见反例”写成证明。
写入记录
- 2026-10-31 09:10 CST:新增 FALCON 反例归因、实际入口差异、覆盖/终裁/训练奖励分账及 held-out 迁移设计;记录 11 项纯函数合成检查,明确非作者实验复现。