nguiaSoren/ROGUE
GitHub: nguiaSoren/ROGUE
ROGUE是一款自动化红队测试工具,通过LLM和Bright Data技术实时收集和模拟攻击,帮助团队发现安全漏洞。
Stars: 0 | Forks: 1

# ROGUE — 开放网页 LLM 威胁情报代理
### _永不睡眠的红队._
实时 Open-web 生成越狱更新 & 评估 — Bright Data × LLM 威胁情报黑客松提交。
### 暴露的工具
| 工具 | 目的 |
|---|---|
| `query_attacks(family?, vector?, since_days?, limit?)` | 通过家族/向量/时间过滤攻击原始语料库。返回带有来源的完整原始记录。 |
| `query_diff(date_str?)` | 今日与昨日泄露差异 — 新增内容、新防御内容,按层级计数。 |
| `query_threat_brief(date_str?, format?)` | 每日完整威胁简报(Markdown 或 JSON 格式)。从 `data/threat_briefs/` 读取,然后回退到实时数据库渲染。 |
| `query_breaches_for_config(deployment_config_id, since_days?, limit?)` | 一个客户部署的按试验的泄露结果,包括裁判理由 + 模型响应摘录。 |
| `query_attack_detail(primitive_id)` | 一个攻击的完整记录 + 其按配置的泄露聚合(n_full / n_partial / n_refused / n_evaded)。 |
| `query_worst_attacks(model_family?, limit?)` | 所有时间以来最高泄露率的攻击 —可选地缩小到与您最接近的模型。快速“我是否暴露了?”答案;助手传递自己的模型身份以查看类似模型会受到什么攻击。 |
### 尝试一下
连接后,问 Claude:
Claude 将调用 `query_diff` + `query_breaches_for_config` 并总结。
### 传输
默认为 **Stdio**(Claude 桌面路径) — 服务器作为 Claude 桌面生成的子进程运行,将日志记录到 stderr,以便 stdout 上的 JSON-RPC 通道保持干净。
对于 **远程**客户端(Cursor / Windsurf / 托管客户端),在专用端口(8001,与 8000 上的 FastAPI 仪表板并列)上通过 HTTP 提供相同的六个工具:
```
ROGUE_MCP_TRANSPORT=streamable-http uv run python -m rogue.mcp_server.server
# 提供 http://127.0.0.1:8001/mcp (将 ROGUE_MCP_HOST 设置为 0.0.0.0 以暴露外部访问)
```
`ROGUE_MCP_TRANSPORT` 接受 `stdio` | `sse` | `streamable-http`;`ROGUE_MCP_PORT` / `ROGUE_MCP_HOST` 覆盖绑定地址。
## 快速开始(本地)
```
git clone https://github.com/nguiaSoren/ROGUE
cd ROGUE
cp .env.example .env # fill in your keys
docker compose up -d
uv sync --extra dev # or: pip install -e ".[dev]"
alembic upgrade head
python scripts/seed_demo_data.py
uvicorn rogue.api.main:app --reload
```
## Pipeline CLI 参考
两个带 `$` 的驱动脚本(故意运行 — 它们花费 Bright Data + LLM 信用并写入实时数据库)。所有标志都是可选的。
### `scripts/harvest_once.py` — 收集 → 提取 → 去重 → 持久化
```
uv run python scripts/harvest_once.py --since 1d
```
| 标志 | 默认 | 功能 |
|---|---|---|
| `--since` | `1d` | 收集窗口(`1d`、`14d`、`6h`)。 |
| `--x-handles` | off | 以逗号分隔的 X 处理器以抓取此运行(例如 `elder_plinius`)。X 默认为 **关闭**(`default_plugins()` 省略它);按运行选择。拉取每个处理器的最近帖子 `--since` 内;附带的图像被摄取并跟踪外链。需要 `BRIGHTDATA_X_POSTS_DATASET_ID`。 |
| `--database-url` | `$DATABASE_URL` 或本地 | 目标 SQLAlchemy URL。 |
| `--extraction-model` | `$EXTRACTION_MODEL` / `anthropic/claude-haiku-4-5` | 提供商前缀提取模型(系统提示是提示缓存的)。 |
| `--embedding-model` | `text-embedding-3-small` | OpenAI 提取模型用于去重。 |
Env 开关:`EXTRACTION_CONCURRENCY`(TPM 感知扇出)· `HARVEST_INGEST_IMAGES=0`(禁用多模态图像摄取)· `MEDIA_INGEST_MAX_PER_DOC`(4) / `MEDIA_INGEST_MAX_TOTAL`(60)· `HARVEST_FOLLOW_LINKS=0`(禁用帖子→链接跟踪)。
#### 按需抓取特定的 X 账户(`--x-handles`)
X 是最难抓取的来源(残酷的反机器人),因此默认为 **关闭**(`default_plugins()` 省略它) — 其他所有来源仍然运行。通过 `--x-handles` 选择运行:
```
# 抓取 elder_plinius 的最新帖子(然后提取/导入图像/去重/持久化)
uv run python scripts/harvest_once.py --since 21d --x-handles elder_plinius
# 多个处理程序:
uv run python scripts/harvest_once.py --since 14d --x-handles elder_plinius,wunderwuzzi23
```
**工作原理(可靠路径):** BD 的 *结构化* X 抓取器(通过配置文件 URL 发现)对于这些账户超时/返回空值,因此 `--x-handles` 使用 **`XViaUnlockerPlugin`**:它 **SERP 发现** `site:x.com/ after:` 以找到最近的状态 URL,然后 **Web 解锁**每个一个并解析推文文本 + `pbs.twimg` 截图。那些通过相同的管道流过 — 截图是 **视觉读取/摄取**(多模态),外链 **跟踪 1 跳**。SERP + Web 解锁都很快(没有异步快照轮询),因此没有超时需要调整。
- `--x-only` — 仅收集 **X 处理器**,跳过其他 9 个来源 + SERP 发现阶段(快速,专注的重跑;链接跟踪保持开启)。
**对于已知的 URL(最可靠的路径 — 用于视频新鲜发布):** 通过 URL 捕获确切的推文。Web 解锁即使发现返回空值也会获取单个 X 状态页面(文本 + 截图):
```
uv run python scripts/harvest_url.py --url "https://x.com/elder_plinius/status/"
```
(`BRIGHTDATA_POLL_TIMEOUT_SECONDS` 仍然适用于 Reddit 的异步快照,它确实轮询 — 查看 `.env.example`。)
`harvest_url.py` 解锁一个 URL,摄取其图像(越狱截图 → 视觉读取),提取 + 去重 + 持久化原始数据,然后同步到 Neon — 然后打印一个 `--primitive-ids ` 命令以重现针对面板的该攻击。(这就是新鲜发布的 X 越狱如何从推文 → 泄露矩阵单元格。)
### `scripts/reproduce_once.py` — 渲染 → 目标面板 → 裁判 → 持久化
```
uv run python scripts/reproduce_once.py --primitive-limit 50 --judge-batch
```
| 标志 | 默认 | 功能 |
|---|---|---|
| `--primitive-limit N` | all | 限制复制的原始数据数量 — 按照按 `reproducibility_score`(成本上限,**不是**“最新的”)排序的前 N 个。 |
| `--only-unreproduced` | off | 增量扫描:仅复制尚未 `breach_results` 的原始数据(真正的新攻击),跳过所有已完成的内容。默认关闭,因此重新评分/重新测试运行仍然重新触发语料库。 |
| `--primitive-ids A,B,…` | — | 精确复制 **命名** 的原始数据 id(规范或不规范) — 覆盖所有其他选择过滤器。用于针对面板的特定攻击的专注演示。 |
| `--n-trials N` | 5 | 每个(原始数据 × 配置)的试验次数 — 为引导 CI 提供动力。 |
| `--temperature T` | 0.7 | 目标模型采样温度。 |
| `--concurrency N` | — | 并行目标调用。 |
| `--multimodal-only` | off | 仅 `multimodal_image` / `multimodal_audio` 原始数据,渲染为真实图像/音频(仅视觉/音频配置)。 |
| `--no-fetch-media` | off | 跳过真实载体的获取;渲染合成画布。 |
| `--persona NAME` | off | PAP 角色包装(`'Expert Endorsement'`、…、或 `random`) — A/B 的 B 方。 |
| `--synthesized-only` | off | 仅 `synthesized=True` 行(升级/变异子代)。 |
| `--pair-max-iters N` | 0 | PAIR:每个规避/拒绝试验的迭代攻击者改进次数,最多 N 次。 |
| `--no-iterative` | off | 强制 `--pair-max-iters=0`。 |
| `--escalate` | off | 面板范围内拒绝的自动梯子(昂贵;与 `--escalate-max-spend` 绑定)。 |
| `--escalate-max-spend USD` | none | 限制累积升级支出(硬电路断路器)。 |
| `--escalate-n-trials N` | 1 | 梯子变体 × 配置的试验次数。 |
| `--escalate-planner-model` | Claude+fallback | 覆盖 Tier-5 升级规划器骨干。 |
| `--dry-run` | off | §10.9 升级 **预览**:从实时数据库(真实查询)构建候选轮换 + 成本计划,打印它,退出 **在**任何付费调用或生命周期写入之前。需要 `--escalate`。 |
| `--candidate-quota N` | 0 | §10.9 候选人配额 A/B。`run` 执行两个臂(配额=0 vs 1,相同的父代)然后从 `ladder_attempts` 打印比较;`analyze` 重新打印它(免费,只读)。§10.10 断带实验的经验基线。 |
| `--candidate-probe` | off | `--candidate-quota = ALL` 轮换候选人的糖(完整的仪器评估“探测”)。 |
| `--judge-batch` | off | 通过 Anthropic **Batch API**(50% 折扣 + 缓存,容错;仅基线 — **禁用**升级)。 |
| `--database-url` | `$DATABASE_URL` 或本地 | 目标 SQLAlchemy URL。 |
**`scripts/candidate_quota_ab.py`** — §10.9 候选人配额 A/B。`run` 执行两个臂(配额=0 vs 1,相同的父代)然后从 `ladder_attempts` 打印比较;`analyze` 重新打印它(免费,只读)。§10.10 断带实验的经验基线。
## 仓库布局
```
src/rogue/ # Python package (schemas/, harvest/, extract/, dedupe/, reproduce/, diff/, mcp_server/, db/, api/)
docs/ # architecture, schemas, taxonomy, sources, budget
tests/ # schema round-trip tests + golden fixtures
scripts/ # harvest_once.py, reproduce_once.py, seed_demo_data.py
frontend/ # Next.js dashboard
```
## 构建
Soren Obounou Nguia — AI 系统工程师;之前是延世大学 LLM 安全工具(GPTFuzz 优化)的 Grand-Prize 获奖者,AIM Intelligence 的对抗-ML 研究(HWARANG 红队系列)。
## 许可证
MIT。查看 `LICENSE`。
标签:一键部署, 请求拦截, 逆向工具