mcpField
R
red-team

red-team

github.com/gaasher安全17839 次安装17 周前更新
代码仓库

关于 red-team

red-team 是用于获授权测试防护规则、分类器、过滤器、提示词和 API 的技能。它通过目标与判定基准的对比,整理不同且可复现的故障,不会修改目标。

主要功能

  1. 01生成对抗性输入
  2. 02对比目标与判定基准
  3. 03按技术类别去重故障
  4. 04检测绕过与过度拦截
  5. 05逐轮查找新故障类别

适用场景

  1. 01查找自有内容过滤器的绕过问题
  2. 02识别分类器的误报
  3. 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 配对,并严格分为三个阶段:

  1. 发现(此循环)——针对冻结的目标运行 → 得到一份不同失效类别的目录,每类都附有可复现示例和建议的修复方案。
  2. 修复(独立的编码 Agent)——在运行之间对目标应用补丁以消除这些类别,绝不在一次运行中进行:一次运行期间,目标是只读的事实依据,因此在循环中途修改目标会破坏可复现性和类别统计。
  3. 重新验证(新一轮发现运行)——针对打过补丁的目标开始新一轮运行。确认之前的每个类别都已消除,并留意回归问题——尤其是过于激进的修复可能引入的新过度拦截(此循环已经会针对这一方向进行排查)。

重复“发现 → 修复 → 重新验证”,直到新一轮运行未发现问题。让两个 Agent 保持独立:编写问题目录的攻击者不应同时评判自己的补丁。此技能刻意在第 1 阶段结束;修复和重新验证的协调工作由外部负责。

评论

支持 Markdown