三环并行架构(Tri-Ring)
TL;DR
- 目的:三环并行渗透编排:广度发现环(N实例并行) + 深度攻击环(信号驱动三层递进) + 创造探索环(反思唤醒) + 仲裁层(质量门控),靠共享图状态层协同
- 适用:通用
- 输入:目标信息
- 输出:执行结果 + 证据
- 红线:仅限授权范围内使用;动作留痕可审计
- 关联:见
00-INDEX.md同分类相邻 skill
用并行、持久化、门控和经验沉淀重构架构——不是继续调提示词。
一、架构总览
┌─────────────────────────────┐
│ 仲裁层(Arbitration) │
│ 质量门控 · 停滞检测 · 反思唤醒 │
└──────────┬──────────────────┘
│ 读写
┌───────────────┐ ┌──────┴────────┐ ┌───────────────┐
│ 广度发现环 ×N │ │ 深度攻击环 │ │ 创造探索环 │
│ 并行覆盖模块 │──▶│ 常驻消费发现 │◀──│ 读失败与反思 │
│ 轻量验证 │ │ 三层递进验证 │ │ 推理新攻击面 │
└───────┬───────┘ └──────┬────────┘ └───────┬───────┘
└──────────────────┼────────────────────┘
┌─────────▼─────────┐
│ 共享状态层(图) │
│ 发现·反思·检测点·经验权重│
└───────────────────┘
核心原则:
- 每一个发现实例负责一个完整的业务链路,不追求一次性打穿
- 算力只花在值得深入的方向(权重闸门降噪)
- agent 停滞常因视角锁定,不是能力不足——先质疑方向再跑下一轮
- 系统最大工程风险是永久停转,不是做错
二、斜杠命令与启动协议
三个确定性入口(安装后直接可用,见 install.sh):
| 命令 | 职责 | 本质 |
|---|---|---|
/goal <目标> |
三要素+成功判据写入状态层 | 意图持久化——长任务跨上下文窗口,使命必须活在图里而非某个 agent 记忆里 |
/plan |
读态势→拆业务链路→实例分配表 | 纯函数 f(图状态)→计划,可随时重跑 |
/loop |
主控循环直到 done() | 把"继续吗"的决策从人转移到终止条件谓词 |
手动等价流程(无命令环境时):确认三要素 → 写 goal/surface 节点 → 拆链路 → 进入主控循环。
用户输入三要素(缺失则追问一次)——写入格式以 commands/goal.md 实际行为为准:
| 要素 | 说明 | 写入 |
|---|---|---|
| 目标范围 | 域名/模块清单 | add-node --type surface |
| 授权约束 | 平台规则/排除项/限速红线 | 与范围同写一个 goal 节点:--type checkpoint --status goal --content '{"kind":"goal","scope":...,"auth":...,"done_when":...}' |
| 初始入口 | 已知 URL/账号/入口点 | add-node --type discovery;派发模板第 0 步消费它(见 §4.1) |
初始化后按"实例分配表"拆分业务链路(登录流/查询流/支付流/文件流/管理面…), 每个链路一个发现实例。
三、共享状态层操作约定
所有实例通过 core/state_graph.py 读写,禁止各自记私账:
TRI="$HOME/.claude/skills/tri-ring"
S="$TRI/core/state_graph.py"
python3 $S add-node --type signal --content "..." --weight 0.7 # 写发现/信号
python3 $S add-edge --src <idA> --dst <idB> --rel leads-to # 关联
python3 $S update --id <id> --status disproven # 标记证伪
python3 $S query --type signal --min-w 0.6 --status open --limit 10 # 攻击环取任务(必带open防重复消费)
python3 $S disproven-paths # 分配任务前必查
python3 $S idle-check # 停滞检测
python3 $S query --coalition sso-chain # 跨链联动组查询(§4.2 L3)
python3 $S merge --from seeds/common-cn-src.jsonl # 冷启动:注入经验种子包(仅空库时)
python3 $S priors --tag waf-bypass # 读某类成功经验先验(调权参考)
权重语义:0-1,≥0.6 进入深度攻击环队列,<0.3 且无异常特征直接剪枝。
注意:query 默认 --limit 20,全量清点时显式加 --limit 100;取任务必带 --status open。
权重写入规则(两句话分清边界):
- 发现实例只写两类节点:模糊观察 → 低权重
surface(0.2-0.5);值得深入 →signal(≥0.6)。 不写 0.3-0.59 区间的 signal——那是攻击环 L1/L2 判别后升格或降级的区间 <0.3 剪枝规则作用于已存在的 open 节点:由攻击环 L2 特征判别执行(update --status pruned), 发现实例不做剪枝,只做记录
单机语义声明(跨机器必读):状态层的 flock 互斥保证以单机多进程为边界。
状态目录落在 NFS/CIFS 上时跨机锁不保证可靠(取决于版本与服务端配置),启动时脚本会自动检测并告警。
跨机器协作的唯一正确姿势:各机独立 TRI_STATE_DIR 各自跑实例 → 定期导出 nodes.jsonl →
merge --from <对方文件> 汇聚(按 id 归并、同 id 整节点 latest-wins)。禁止多机直写同一网络目录。
四、三环职责与契约
4.1 广度发现环(N 实例并行)
用 Task 工具并发派发子代理,每个实例一个完整业务链路:
- 输入:链路范围 + 授权约束 + 初始入口
- 动作:走完整业务链路 → 缝隙检测 + 轻量验证(证明"值得看",不追求利用成功)
- 输出(全部写入状态层):候选攻击面(
surface) / 已排除方向(status=disproven) / 待深入信号(signal) / 跨链线索——疑似 SSO/跨域/统一认证等横跨多条链路的线索,不自行深追,打标签上报:add-node --type signal --content "..." --meta '{"coalition":"sso-chain"}' - 纪律:单实例不深追;发现即写库立即转下一点;重复命中已有节点标
dup-of
派发模板(Task 子代理 prompt 全文,<链路> 换成分配表对应项;子代理上下文全新,
prompt 必须自包含——这是并行真正可执行的必要件):
【Tri-Ring · 发现实例】业务链路: <链路>
你是渗透测试发现实例,只做轻量验证,不做深度利用。
TRI="$HOME/.claude/skills/tri-ring"
范围与授权约束(必须遵守): <从 goal 节点复述 SCOPE 与 AUTH>
执行:
0. python3 "$TRI/core/state_graph.py" query --type discovery # 读已知初始入口,纳入本链路
若 <工作区>/domain/<领域>.md 存在且与本链路相关 → 读入作为业务逻辑判据
1. python3 "$TRI/core/state_graph.py" disproven-paths # 先查已证伪(返回id+内容摘要),别踩坑
1b. python3 "$TRI/core/state_graph.py" priors --tag <漏洞类> # 读成功先验:
命中高 prior 同架构经验 → 该方向 signal 权重上调;无匹配按基准判断
2. 完整走这条业务链路: <登录/查询/支付…的具体入口提示>
3. 每个观察点做缝隙检测+轻量验证(证明"值得看"即可,不追求打穿)
4. 结果全部写入状态层(发现即写库,不攒批):
候选攻击面: add-node --type surface --content "..." --weight <0~1> --agent <实例名>
待深入信号: add-node --type signal --content "..." --weight <≥0.6 才写> --agent <实例名>
已排除方向: 先 add-node 再 update --id <id> --status disproven
5. 返回前输出: 写入的节点 id 清单 + 一句话结论
纪律: 单点不深追;疑似重复先 query 再决定 dup-of;全程限速遵守授权红线。
联动红线: 遇 SSO/跨域/统一认证等跨链路线索只打 coalition 标签写库,绝不自行深追。
4.2 深度攻击环(常驻,信号驱动三层递进)
主会话担任,循环消费 query --type signal --min-w 0.6 --status open:
| 层 | 动作 | 通过条件 |
|---|---|---|
| L1 广撒网 | 该方向所有参数基础测试,收集响应特征 | 有响应特征记录 |
| L2 特征判别 | 异常报错/行为差异/时序特征分析 | 权重不足 → update --status pruned,直接剪枝 |
| L3 组合构造 | 跨端点联动多个发现,构造完整攻击链 | 可复现利用 |
权重闸门是降噪核心:不是每个点都深入,凭信号判断哪几个值得花时间。 L3 产出的攻击链必须过仲裁层门禁才进报告。
跨链联动(强耦合模块解法):每周期开头主控执行 query --coalition <tag>——
同一标签下关联信号 ≥2 条(保守默认,防误报)即派生「联动实例」;
高危单线索(如确认 CAS 存在已知 CVE 指纹)主控可豁免阈值立即联动——数量门槛让位于信号质量判断:其输入是多个链路的信号合集,
专门构造 SSO 跨域/统一认证绕过等组合链。联动实例不受单链路边界约束,但受同一套授权与门禁。
4.3 创造探索环(停滞触发)
触发条件:连续 N=3 轮无新发现,或 idle-check 返回 idle=true。
执行顺序(由浅入深的换视角):
- 反转假设:把默认前提反过来重新验证——有WAF↔无WAF、前端排序↔后端排序、 参数在Body↔参数在Path/Header、网关鉴权↔服务内鉴权
- 架构重验证:重新指纹识别框架/中间件/鉴权链路,确认是否漏掉关键技术栈信息
- 独立重构(清空记忆):不带历史反思,以「如果我是开发者会怎么设计」的视角重新推理攻击面
产出写入 --type reflection,并生成新信号注入发现环队列。
核心洞察:带着旧失败继续探索容易沿同一思路打转;主动反转假设、清空记忆能恢复方向新鲜度。
4.4 仲裁层(质量门控 + 停滞检测 + 反思唤醒)
每个候选结论必须过 "$TRI/core/gates.py" 四道门:
| 门 | 规则 |
|---|---|
| G1 可能≠证明 | 危害需额外假设才能解释 → 不进报告,降级 signal |
| G2 现象≠结果 | 异常响应只是线索;稳定复现利用才算结果 |
| G3 自看自数据 | 管理员看到管理页面是正常功能,不判越权 |
| G4 配置类单列 | CORS/安全头/Cookie属性/版本泄露 → config-advice 归档 |
输出标准收紧后,报告从"线索清单"变成可直接排期处置的漏洞单。 停滞检测与唤醒见第五节。
五、防卡死协议
- 停转检测:每轮循环开头
idle-check——无 open 信号 + 无 running 任务 = 系统空闲 - 反思唤醒:主控负责轮次计数(连续 3 轮无新发现即触发);
"$TRI/core/rings.py" awaken被调用后按已证伪数量分级注入:<3 条只生成反转假设任务,≥3 条追加架构重验证+清空记忆重构。 分工:主控管"何时唤醒",awaken 管"带什么经验唤醒"(avoid=已证伪路径,不是简单重启) - 上下文耗尽保护:每个实例每完成一个动作就写检查点:
上下文被压缩或清空后:# 发现实例视角:记录链路进度 echo '{"chain":"登录流","step":"找回密码页","queue":["改密接口"],"done":["登录","注册"]}' | \ python3 "$TRI/core/rings.py" checkpoint --agent discover-3 # 攻击环视角:记录信号消费进度 echo '{"phase":"L2-hunt-idor","queue":[...],"done":[...]}' | \ python3 "$TRI/core/rings.py" checkpoint --agent orchestratorcheckpoint --load --agent <名>从最新检测点恢复 - 工程结果:单个 agent 失忆不丢全系统进度;长任务跨上下文窗口延续; 恢复推进自动避开已证伪路径
- 终止条件 done()(与 /loop 命令一致):全部 surface 均 proven/disproven 且 signal 队列空, 或用户中断,或达到 --max-cycles 预算
六、经验沉淀
任务结束(或每轮收尾)执行结构化提取:
{
"type": "success | failure",
"target_arch": {"stack": ["nginx","thinkphp"], "auth": "session", "waf": "宝塔"},
"trigger_params": ["id"], "bypass": "分块传输", "payloads": ["..."],
"preconditions": ["登录态"], "transfer_tags": ["auth-bypass","edu"],
"prior": 0.8
}
- 成功路径提取到「别人看到就能复用」的粒度:架构特征/触发参数/绕过方式/关键 payload
- 失败路径同样入库——「这条路走不通」和「走得通」一样有价值
- 入库命令:
add-node --type experience --content '<上方 schema JSON>' --agent <实例名>(成功条目 weight=prior,失败条目 weight=1.0 且 status=disproven,供 disproven-paths 避让) - 后续任务消费(半自动):实例测方向前
priors --tag <漏洞类>读成功先验, 据此人工上调 signal 权重判断;失败方向经disproven-paths(返回 id+内容摘要)直接跳过。 自动学习型权重(按 proven/disproven 比率回写 prior)仍是下一步 - 经验跨目标类型共享(Web 的认证绕过经验可迁移到小程序目标)
七、多目标适配(只换交互层)
| 目标 | 交互接口 | 要点 |
|---|---|---|
| Web/SPA | 浏览器调试协议(CDP)/Burp MCP | source map 还原、隐藏路由提取、接口依赖分析 |
| 小程序 | 解包工具 + 抓包桥接 | wxapkg 解包、调试桥接协议抓网络请求 |
| APP | 安装包逆向(apktool/jadx) | 提取接口、签名与加密逻辑 |
| API | schema 枚举 | OpenAPI/gRPC 反射、认证缺陷专项 |
不变的部分:三环并行、共享状态、质量门控、经验沉淀。 变化的部分:只有交互层接口。
八、生效条件与局限
效果更好的条件:模块边界清晰可独立覆盖;重复架构目标多(经验库形成先验权重); 需要跨端点组合的深度攻击链。
三大局限的工程解(v1.1 已内置)
| 原局限 | 解法 | 用法 |
|---|---|---|
| 冷启动:经验库为空依赖广度覆盖 | 先验假设包 seeds/common-cn-src.jsonl(7条国内SRC常见栈未验证假设,confidence=folklore-unverified) |
空库时 merge --from 注入;性质是待验证先验而非事实——首次实测命中即转为正式经验,证伪即删 |
| 强耦合模块:SSO 跨域需跨模块联动 | coalition 标签机制:发现实例遇横链线索打标上报,主控每周期聚合,≥2 关联即派生联动实例 | query --coalition <tag>;联动实例不受单链边界但受同一授权与门禁 |
| 领域逻辑上限:专业规则缺失 | domain/<领域>.md 知识包协议:业务流不变量+高价值资产+敏感级判据 |
/plan 按目标类型挂载(已带 edu.md 示例);新领域照格式自建 |
剩余真实边界(诚实声明)
- 种子包与领域包质量决定先验价值——它们是起点不是真理,证伪后应更新或删除
- 学习型权重(自动调 prior)仍是下一步;当前 prior 为人工设定值
- 联动实例的派发判断依赖主控周期检查,非事件驱动——极端高频场景有延迟
防装忙纪律与破闸权(MERGE-2026-09)
来源:社区 SRC 实战经验包整理。治的不是"视角锁定"(创造环已管),是假装忙碌与囤积式扩面。
一种子闭环:每个发现实例一次只持一个种子(域名/关键词/入口)。搜一个种子 → 去重、去废、去非存活 → 把剩余活面挖完 → 才许取下一个种子。禁止同时囤多个种子池。
回扫合格闸:对同一资源连续 2 轮"0 新增"→ 该实例必须换随机新词/新面,禁止在同一批已知面上无限回扫充进度。
进度三硬件(心跳自检):每 15–20 分钟核对三件事——①JS/清单有实质推进;②发出过真 payload(不是纯浏览);③有新报告段落或明确收口动作。三者全无 → 强制回深挖当前活面,禁止"再多看几个站点"。
同闸停:某类入口全部返回同一登录码、且未登录例外点已探过 → 该面收口(记录 sibling 差分结论),不再逐个磨。空列表 ≠ 请登录(先看回包语义判定表)。
该硬 / 不该硬(破闸权):交付纪律该硬——假洞不堆、报告格式、范围红线、证据闸;能力上限不该硬——规则没写 ≠ 不能测。现场证据与规则冲突时,允许以现场为准破闸,但 MUST 在状态层记一笔(何时/为何/结果),供复盘回灌。
禁问继续:主控循环中"要不要继续?"是 bug——继续与否由 done() 谓词与上述闸门决定,不问人。