REllm-driven-re

PILLAR 03 · ENFORCEMENT

约束机制化:纪律不靠自觉,靠机制兜底

写进 prompt 的纪律有四个失效面:agent 忘了就没了、跑起来后失控、管不住并行会话、没有可查询的占用视图。 这里把纪律做成三层代码:协议层可读、工具层绕不过、会话层直接拦截。

一句话模型

动态分析是「写操作」:独占资源、改变进程行为、可能污染设备状态。静态分析是「读操作」:可并行、无副作用。给动态操作建立事务控制——租约(互斥)+ 网关(收口)+ 审计与污染登记牌(可回溯)。

静态读不加锁自由并行;动态写持租约串行 + 留审计 + TTL 自动回收。
最隐蔽

Hook 语义投毒

frida 技术上允许多 session 注入同一进程。A 的反调试绕过 hook 改变了进程行为,B 观察到被篡改后的返回值,把错误结论写成 [已验证推断] 证据入库—— 无声的数据污染,Reviewer 事后难以发现。
解药:改行为的 hook 持进程级排他租约
相互覆盖

IDB 并发写

A 建模到一半,B 读到的是半成品结构;两个会话的 rename / patch 相互覆盖,谁也不知道最终留下的是哪一版。读的人拿到失真的数据库,写的人白干一轮。
解药:IDB 写操作持写锁
永久损失

风控不可逆

多 agent 并发向真实服务端发请求 = 请求量放大 + 行为异常。指纹被服务端拉黑后,所有 ground truth 采集永久失真——这不是「打架」,是把设备烧了。
锁管不住,靠分级 + Coordinator 批准 + 频控

DEFENSE IN DEPTH

三层门禁:协议可读 → 工具绕不过 → 会话直接拦

租约协议此前主要靠提示词自觉,现在有三层机制兜底。协议仍然要读(分级、命名、纪律),但违规动作会在工具层与会话层被物理拦截。

图表加载中…
点击放大 · 滚轮缩放 · 拖拽
图 1 · 三层门禁:协议层定义规则,工具层强制执行,会话层兜底拦截
文件锁(原子 mkdir)跨会话天然生效:同一台机器上的多个 Claude 会话、多个终端、人工手动操作共享同一文件系统视图,全部被约束——这是 prompt 级约束做不到的。

SESSION HOOKS

四类拦截点,一条命令部署

hooks 挂进项目 .claude/settings.json,在工具调用前后与回合结束时逐条检查。拦截返回 exit 2(block),解析异常一律 fail-open 放行,不因守护脚本自身故障卡死会话。

deploy
bash install.sh --hooks --project /path/to/analysis-project
# 幂等部署进 .claude/settings.json,卸载 = 删除含 guard.sh hook- 的条目
exit 2 · blockfrida 直连 / ssh kill

PreToolUse · Bash

拦截 frida / frida-trace / frida-ps / frida-kill / frida-inject CLI 直连(-U / -H 等场景)——绕过 frida_runner.py 的租约与审计门禁; 同时拦截 ssh 远程杀进程(须持排他租约经 runner 执行)。豁免frida_runner.py 与安装场景(pip install frida、frida-compile)。 拦截消息附正确入口指引。
guard_lib/hook_pre_bash.sh
exit 2 · blockIDA 写操作

PreToolUse · MCP

IDA 写类工具(rename / set_comments / patch / patch_asm / put_int / declare_type / set_type / type_apply_batch / enum_upsert / infer_types / declare_stack / delete_stack / define_code / define_func,及 py_eval 类任意代码执行)无有效idb-* 排他租约 → 拦截并打印 acquire 指引。decompile / xref 等读类直通不加锁,保证速度。
guard_lib/hook_pre_mcp.sh
写后即验schema / 硬编码地址

PostToolUse · Write/Edit

evidence.md 后立即校验 schema:编号连续、必填字段齐全、枚举值合法。 写 analysis/ 下报告后即查硬编码地址:非围栏内 0x ≥ 6 位的十六进制地址 直接报出(围栏与注释内豁免)——地址会随版本漂移,报告必须引用符号而非裸地址。
guard_lib/check_evidence.sh
回合末兜底组合扫描

Stop · sweep

回合结束时跑 sweep 组合扫描:INDEX.md 登记 / 临时文件 / 硬编码地址 / 证据 schema。发现违规 → exit 2 拦截回合结束,迫使 agent 修复后再收尾—— 不给「写完就跑」留口子。
guard_lib/sweep.sh
图表加载中…
点击放大 · 滚轮缩放 · 拖拽
图 2 · 一次被拦截的 frida 直连:hook 拦下并指回正确入口,工具层完成校验与审计

LEASE & LOCKS

S/X 分锁:保并行度,只串行化写行为

锁粒度按「动作改不改状态」分层。单设备上「若干静态分支 + 一个观察分支 + 若干 IDB 读分支」仍然并行,只有写行为串行——动态受控不以牺牲吞吐为代价。

粒度资源命名模式覆盖操作
设备级device-<Name>X 排他重启设备、装卸 App、动 frida-server、改系统配置(代理/时间/hosts)、跨 App 操作
进程级device-<Name>.proc-<bundle 或 pid>X 排他spawn / kill / 注入会改进程行为的 hook(反调试绕过、返回值篡改、方法 swizzle)
观察级device-<Name>S 共享frida-ps、读日志/crash 报告、纯 onEnter 读参数不改返回值的 hook、mitmproxy 被动抓包
IDBidb-<项目名>X(写锁)rename / set_type / patch / define_* / 批量 IDAPython 写操作;decompile / xref 等读操作不加锁
S/X 互斥:同一资源上有共享持有者时不可排他获取,被排他持有时不可共享获取(读写锁惯例)。
层级互斥:他人持 device-X 排他时不能拿 device-X.proc-* 排他(防细粒度锁绕过设备级占用),反之亦然;同一 owner 不与自己冲突,观察级共享不触发层级冲突。
图表加载中…
点击放大 · 滚轮缩放 · 拖拽
图 3 · 租约生命周期:原子 mkdir 获取,renew 心跳续租,release 主动释放或 TTL 过期自动回收,不留 ghost 占用
lease.sh 常用命令速查
LEASE=scripts/orchestration/lease.sh

bash $LEASE acquire device-ChenLingHai --ttl 30m --purpose "H1 采集 ground truth"
bash $LEASE acquire device-ChenLingHai.proc-com.x.y --ttl 10m --purpose "spawn 注入 hook"
bash $LEASE renew   device-ChenLingHai --ttl 15m      # 长任务心跳续租
bash $LEASE release device-ChenLingHai
bash $LEASE check   device-ChenLingHai --mode exclusive   # 门禁原语:有效 exit 0 / 无效 exit 2
bash $LEASE list                                        # 占用看板(+ 未恢复污染提示)
bash $LEASE steal   device-X --reason "持有者已停止且 TTL 误设过长"

租约目录 <项目>/analysis/leases/(加入 gitignore)。TTL 默认 30m,惰性回收: 任何 list / acquire 扫描前先清理过期项。steal 是逃生门不是常规操作,必须 --reason 登记到审计日志。

STATE HYGIENE

采样前必做 assert-clean

分支 1 测登录留下半登录态,分支 2 采集「未登录指纹」拿到失真样本,污染经共享 ground-truth/ 传染所有分支。device.sh assert-clean 在采样前把这道关变成脚本门槛,不干净 exit 4。

FAIL = 拒绝采样

污染登记牌(权威)

BOARD.md 中该设备有未恢复 POLLUTE 条目 → FAIL。机械检查有盲区 (代理扫描只是启发式),登记牌是唯一权威: 动了设备状态没恢复的立即登记,恢复后标记关闭,所有后续持有者可见。
lease.sh pollute / board / recover
FAIL / WARN

时间偏差

设备时间与本机相差 > 120s → FAIL:签名与风控分析对时间敏感,时间线错乱会让 配对样本全部作废。代理 / VPN 残留做常见代理进程启发式扫描 → WARN(尽力而为)。
device.sh assert-clean
irrevocable

不可逆操作分级

会向真实服务端发请求的操作(注册/登录/下发、高频触发签名接口)标记 irrevocable:单 agent 模式自问「样本够了吗」;swarm 模式须 Coordinator 显式批准 + 全局频控,事后审计登记。
lease.sh audit irrevocable --target device-X --detail "…"
宁可慢,不可滥。指纹被服务端拉黑后,设备上所有后续采样永久失真——这是唯一无法靠锁解决的风险类别。

ESCAPE HATCH

机制可调试、可退出

守护机制本身不能成为不可调试的黑盒:hook 解析异常一律 fail-open(exit 0 放行);调试期有环境变量逃生阀;部署与卸载都是幂等的文件级操作。

调试用

GUARD_ALLOW_DIRECT_FRIDA=1

放行本会话的 frida CLI 直连,用于排查 runner 本身的问题。仅当前环境生效,不影响其他会话。
调试用

GUARD_ALLOW_IDB_WRITE=1

放行无 idb-* 排他租约的 IDA 写操作(含 py_eval)。用于验证 hook 拦截行为本身,或单人独占 IDB 的场景。
幂等

卸载与部署

卸载 = 删除 settings.json 中 command 含 guard.sh hook- 的条目; 重复执行 install.sh --hooks 不叠加。hooks 只管挂了配置的会话,是第三层兜底,协议 + 工具层门禁仍是主体。
cli · 手动 / CI 审计
bash scripts/orchestration/guard.sh sweep          # INDEX.md 登记 / 临时文件 / 硬编码地址 / 证据 schema
# 退出码 0 = 干净,2 = 有违规,供 CI 或 Coordinator 统一审计