关于 red-team
red-team 是用于获授权测试防护规则、分类器、过滤器、提示词和 API 的技能。它通过目标与判定基准的对比,整理不同且可复现的故障,不会修改目标。
主要功能
- 01生成对抗性输入
- 02对比目标与判定基准
- 03按技术类别去重故障
- 04检测绕过与过度拦截
- 05逐轮查找新故障类别
适用场景
- 01查找自有内容过滤器的绕过问题
- 02识别分类器的误报
- 03为提示词建立可复现的故障目录
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ gaasher/ agent-loop-skills --skill red-team安装后在 Claude Code 中输入/red-team确认已加载。
附带文件examples/run.example.yamltools/harness.py
详细介绍
红队测试
一个反复循环直至无新发现的对抗流程。目标系统是待测试对象;反馈信号是你能发现的不同失败类别数量。每一轮,你都会构造针对新弱点的对抗输入,并通过 tools/harness.py 将它们送入目标系统和真实结果oracle。该工具会将每个结果不一致的情况记录为失败,并按你为每个输入标注的 class(技术手法)去重。不断循环,直到新一轮再也找不到新问题。这只是“发现→修复”流程中的发现环节:它会整理失败案例,但绝不会修补目标系统(见 配套使用)。
适用场景
用于加固用户拥有或明确获准测试的防护机制、分类器、内容过滤器、提示词或 API——目标是整理出不同且可复现的失败案例,每个案例都是客观的目标系统与 oracle 结果不一致。失败分为绕过(目标系统放行 oracle 会拦截的内容)或过度拦截(目标系统拦截 oracle 会放行的内容)。
默认情况下,使用可运行的 oracle 驱动循环,以获得客观信号。例外情况:如果用户没有可运行的 oracle,则以你的判断作为 oracle,并依据书面策略执行——始终保持标准一致,并记录每个输入的预期判定。此流程不用于修复目标系统,也不得用于测试用户未获授权的系统。
设置
以交互方式确定绑定值。如果存在 loop.run.yaml,加载它,用一行确认各项值,然后跳转到循环步骤。否则:在 Claude Code 中(可使用 AskUserQuestion 工具),推断每个绑定值的可能取值并给出建议;在其他环境中,将每项作为带引号的提示逐一询问。然后编写 loop.run.yaml(格式参见 examples/run.example.yaml),并在创建任何其他文件前进行确认。
| 绑定项 | 含义 | 默认值 | 推断方式 |
|---|---|---|---|
<target_cmd> | 被测系统:从 stdin 读取一个输入,并输出判定结果(BLOCK/ALLOW、标签或分数)。绝不编辑。 | — | 用户指定的防护机制/分类器/API 入口 |
<oracle_cmd> | 对同一输入给出真实判定结果。失败即 target != oracle。 | — | 参考检查器/策略实现;否则依据书面策略给出你的判断 |
<candidates_file> | 每轮候选输入文件,格式为 JSONL:{id, text, class};harness 根据 class(技术手法)去重 | <sandbox_root>/candidates.jsonl | — |
<failures_log> | 仅追加写入已确认失败案例的日志 | <sandbox_root>/failures.jsonl | — |
<sandbox_root> | 候选输入、失败案例和台账的存放位置 | ./sandbox | — |
<budget> | 最大轮数 | 8 | — |
<patience> | 连续 N 轮未发现新失败类别后停止 | 2 | — |
信号来自 tools/harness.py。每轮都运行:
python3 <skill_dir>/tools/harness.py --target "<target_cmd>" --oracle "<oracle_cmd>" \
--inputs <candidates_file> --log <failures_log>
该工具会对每个候选输入分别运行两条命令,并输出一个 JSON 对象:
{tested, failures_this_run, new_classes, total_classes, examples}。
循环
复制此清单,并在每轮完成后勾选:
- 第 0 轮 — 探测:阅读目标的预期契约,通过测试框架运行一小批混合样例以确认连接正常,并记下已暴露的任何故障。
- 选择一个新角度 — 尚未暴露的故障模式(参见下方的攻击工具包)。
- 针对该角度生成一批候选项,并为每项标注根因
class;写入<candidates_file>。 - 运行
tools/harness.py;查看new_classes和失败示例。 - 记录:注明本轮新增了哪些类别(测试框架已追加失败项并去重)。追加一行记录。
- 连续
<patience>轮未新增类别,或达到<budget>时停止。否则,下一轮转向尚未尝试的角度。
攻击工具包(从中选用,也可以自行构思):
- 混淆 — 更改大小写、空格/标点、leet 文字、Unicode 同形字、编码。
- 改述/同义词 — 用其他说法表达被禁止的内容;展开缩写。
- 边界与上下文 — 将负载嵌入无害文本;使用多步或间接表达。
- 过度拦截探测 — 在无害输入中包含触发子串,以发现误报。
类别标注。 class 指根因技术 — 即单一且可修复的弱点 — 而不是每个负载对应一个标签。将 password、apikey 和 ssn 改为大写都属于同一个类别(case-bypass),因为一项修复就能解决所有这些问题;不要将它们拆分为 case-password、case-apikey……这样会虚增数量,让循环永远无法结束。目标是少量根因类别(例如 case-bypass、leetspeak、spacing、missing-synonym、overblock),每个类别都由多个负载验证。只有确实发现新的根因时才使用新的 class;若要为已发现的类别补充证据,请复用该类别。
停止时,报告:不同失败类别的目录,每类附一个可复现示例;绕过/过度拦截的分类;以及 — 由于目标是提升目标的健壮性 — 每类一条简短的修复建议。
记录表
<sandbox_root>/ledger.tsv,使用制表符分隔,文本中不得包含逗号。表头为 round angle tested new_classes total_classes:
round angle tested new_classes total_classes
0 probe mixed batch 6 case,spacing 2
1 leetspeak + unicode 8 leetspeak 3
2 synonyms + expansions 8 synonym,expansion 5
3 benign trigger substrings 6 overblock 6
4 multi-step phrasing 8 (none) 6
报告不同类别数量最多那一轮的目录(即累计的 total_classes),而不是最后运行的那一轮。
约束
- 绝不修改目标、预言机或
tools/harness.py。 它们定义了系统和真实标准;修改它们会凭空制造或掩盖故障。 - 故障必须是目标与预言机之间的客观分歧,而非猜测 — 每条记录的故障都必须能从其输入复现。
- 如实标注类别并探索新角度 — 有效信号是不同的故障模式,因此不要通过给同一技术重新贴标签来凑数,也不要在仍有其他绕过方式时遇到第一个绕过就停止。
- 让发现结果始终以修复目标为导向;这是对授权系统进行的健壮性测试,目录将交给修复人员使用。
- 留在
<sandbox_root>内;不得使用越出其范围的路径。 - 不要停下来询问是否继续;持续运行,直到目标不再出现新问题或达到
<budget>。
配对
此技能是攻击者——“发现→修复”循环的一半。单独使用时,它会告诉你系统如何失效,但不会修复问题。预期的完整循环是将它与一个独立的编码 Agent 配对,并严格分为三个阶段:
- 发现(此循环)——针对冻结的目标运行 → 得到一份不同失效类别的目录,每类都附有可复现示例和建议的修复方案。
- 修复(独立的编码 Agent)——在运行之间对目标应用补丁以消除这些类别,绝不在一次运行中进行:一次运行期间,目标是只读的事实依据,因此在循环中途修改目标会破坏可复现性和类别统计。
- 重新验证(新一轮发现运行)——针对打过补丁的目标开始新一轮运行。确认之前的每个类别都已消除,并留意回归问题——尤其是过于激进的修复可能引入的新过度拦截(此循环已经会针对这一方向进行排查)。
重复“发现 → 修复 → 重新验证”,直到新一轮运行未发现问题。让两个 Agent 保持独立:编写问题目录的攻击者不应同时评判自己的补丁。此技能刻意在第 1 阶段结束;修复和重新验证的协调工作由外部负责。