用途
本技能是 ctf-sandbox-orchestrator 的下游专项技能,仅应在该上游技能已激活、并且已经建立沙箱假设、节点归属与证据优先级之后使用。如果这些前提尚未满足,应先回到 $ctf-sandbox-orchestrator。
当决定性行为取决于请求时序、异步顺序、锁缺口或状态陈旧时,使用本技能。它面向的典型问题包括:竞态窗口(race windows)、排序缺陷(ordering bugs)、幂等性失效(idempotency failures)、锁缺口(lock gaps)以及并发写入冲突。
除非用户明确要求英文,回复应使用简体中文。
主要能力
该技能围绕可变状态的竞态分析展开,核心能力包括:
- 识别可变状态:优先定位数据库行、缓存键、队列载荷、会话字段、计数器或文件等可被并发修改的对象。
- 确定并发边界:记录事务范围、锁行为、重试逻辑、幂等键、缓存失效与队列交接。
- 复现时序窗口:使用受控延迟、重复请求或重排的工作线程执行,构造确定性的并发输入。
- 追踪分步边界:分别追踪读取、检查、写入、入队与提交(commit)的边界。
- 证明状态漂移:从干净重置出发,证明最终状态漂移的存在。
使用方式
该技能定义了一套三步工作流:
1. 映射可变边界
记录事务范围、锁行为、重试逻辑、幂等键、缓存失效和队列交接;标注读取-检查-写入(read-check-write)在哪些请求、工作线程或服务之间被拆分;保持每个边界都与精确时间戳或序列号绑定。
2. 复现时序窗口
使用受控延迟、重复请求或重排的工作线程执行,构建确定性的并发输入;在相同载荷下比较被接受与被拒绝的路径;记录在顺序变化时哪个条件发生翻转。
3. 压缩为决定性竞争链
将问题压缩为:请求 A 与 B 的顺序 -> 陈旧的检查或锁缺口 -> 冲突的写入 -> 由此产生的能力或产物。说明根因是缺失锁、弱幂等、陈旧缓存读、延迟异步提交,还是重试副作用。如果路径以队列为主导,则移交给队列工作线程漂移(queue worker drift)技能处理。
此外,技能要求先建立基线:一次基线运行和一次竞争运行,两者之间只改变一个变量。相关资料位于 references/race-condition-state-drift.md,其中包含竞争测试框架思路、证据块与一致性检查方法。
适用场景
- 需要判断某个缺陷是否由请求时序或异步顺序引发的场景。
- 涉及锁缺口、幂等性失败或并发写入冲突的排查。
- 涉及陈旧状态(stale state)读取导致的最终状态不一致。
- 作为 CTF 沙箱流程中已激活上游编排技能后的下游专项分析步骤。
需要保留的内容
- 可变键、事务边界、锁行为与幂等标记。
- 基线与竞争运行的带时间戳或带序列号的追踪记录。
- 一个最小、可重放的并发序列以证明状态漂移。
限制与前提
- 必须以上游 ctf-sandbox-orchestrator 已激活为前提,否则不应直接使用。
- 若竞争路径以队列为主导,需移交给队列工作线程漂移技能。
- 关于该技能的具体定价、收费方式、支持平台或集成环境,当前资料暂未提供。