luisassardo/disarm-tagger

GitHub: luisassardo/disarm-tagger

一款基于 DISARM 框架的虚假信息分析工具,让记者通过自然语言描述即可获取对应的战术、技术、反制措施及推荐资源。

Stars: 0 | Forks: 0

# DISARM Tagger — `disarm.j-lab.tools` 这是一款面向记者的工具,用于将虚假信息活动映射到 [DISARM 框架](https://github.com/DISARMFoundation)。记者无需在分析矩阵中勾选 复选框,只需**用自然语言描述活动**, AI 助手(基于 Claude 工具调用)会**建议观察到的 DISARM 技术**, 并将其限制在有效的框架 ID 内。记者确认/编辑后,即可导出 具有可操作性且支持双语的报告。 J-Lab 新闻工具包的一部分。作为 C-LAB 的配套桥梁:导出的 Navigator 层是一种互操作格式,C-LAB 可将其摄取到威胁情报 平台中。 ## 为什么选择此工具而不是 DISARM Navigator? 官方的 Navigator 是一款出色的分析师工具(MITRE ATT&CK Navigator 的一个分支),但它仅支持英语,且是围绕标记矩阵构建的。此工具 保持了 DISARM 分类法的准确性(阶段 → 战术 → 技术 → 反制措施, 规范的 ID),同时改变了*工作流*以适应新闻报道:输入叙述性文字, 输出接地气的技术,并导出双语报告和 Navigator 层。 ## 技术栈 Flask + `anthropic` SDK,可部署在 Render 上。镜像了 J-Lab 托管工具的 模式(服务端 API 密钥,优雅的本地回退,ES/EN)。 前端使用 **ARGUS / J-LAB 设计系统**(Space Grotesk + IBM Plex Mono,战术暗黑 OKLCH 配色,J-LAB 琥珀玫瑰色调),存放在 `static/argus/` 目录下(`desk.css` 应用外壳 + `node.js` i18n/时钟 + `icons.js`)。 i18n 基于 `data-en`/`data-es` 属性,通过 `window.ArgusLang` 实现。 ### 布局 - **第 1 行**:案件描述(附带可选链接) · 类似已记录案件 (真实的 DISARM 事件 + 每个事件都带有“阅读报告”搜索链接)。 - **第 2 行**:三列 — 技术 · 战术 · 反制措施。反制措施 进行了颜色编码(绿色 = 针对此案件建议的措施)。 - **第 3 行**:推荐工具与资源(J-LAB 工具 + 外部组织), 根据所涉及的战术进行排名。 每次点击都会展开项目以显示其完整的 DISARM 定义。 ## 设置 ``` python -m venv .venv && source .venv/bin/activate pip install -r requirements.txt # 1. 从上游 DISARM SQLite 构建数据集(运行一次 / 更新时运行): python scripts/build_dataset.py \ --sqlite ../../DISARMframeworks-17/generated_files/DISARM_database.sqlite # 2. (可选)通过 Claude 填充西班牙语翻译 — 需要 ANTHROPIC_API_KEY: python scripts/build_dataset.py --translate # 3. 运行: cp .env.example .env # add your ANTHROPIC_API_KEY (optional) flask run # or: gunicorn app:app ``` 如果没有 `ANTHROPIC_API_KEY`,该应用也能正常运行,并使用**本地关键词 引擎**来提供建议。 ## API | Endpoint | Method | 用途 | | --- | --- | --- | | `/` | GET | 应用 UI (`?lang=es|en`) | | `/api/health` | GET | `{ai_enabled, model, langs, disarm_version, ai_budget}` | | `/api/framework?lang=` | GET | 为浏览器提供的完整本地化数据集 | | `/api/suggest` | POST | `{description, links[], lang}` → 完整的数据包:`{techniques, tactics, counters, similar_cases, resources}` | | `/api/report` | POST | `{title, description, techniques[], lang}` → `{markdown, layer}` | ## 数据与许可 - 框架内容 (`data/disarm_en.json`) 派生自 **DISARM Frameworks v1.7, © DISARM Foundation, CC BY-SA 4.0**。 - 西班牙语翻译 (`data/disarm_es.json`) 是 J-Lab 的衍生作品,同样遵循 **CC BY-SA 4.0** 协议,并已声明出处。 - 应用程序代码遵循 **MIT** 协议。 请参阅 [`NOTICE`](NOTICE) 获取完整的归属声明。该数据集可通过 `scripts/build_dataset.py` 从上游重新生成,而无需触及应用代码。 ## 成本 旨在以低成本且可预测的方式运行(自我维护,目标约为 5 美元/月)。采用分层 策略,优先使用最便宜的方案: 1. **Anthropic 控制台支出限制(硬性后盾)。** 设置月度支出限制 (例如 5 美元)+ 在工作区/密钥上设置电子邮件提醒,网址为 [console.anthropic.com](https://console.anthropic.com)。这是真正的 上限:下面的任何配置都无法超过它。 2. **廉价模型 + 严格上限。** `claude-haiku-4-5`,`max_tokens=2000`, `AI_MAX_TOOL_TURNS=3`。 3. **Prompt 缓存。** 系统 Prompt 和工具 schema(繁重的静态输入) 已被缓存,因此重复调用的成本约为输入的 10%。 4. **每日预算。** `AI_DAILY_LIMIT`(默认 50)限制每个 UTC 日的分析次数;超过限制后, 应用会静默降级为免费的本地关键词引擎。`/api/health` 会报告 `ai_budget.remaining`。 5. **基于 IP 的速率限制。** `/api/suggest` 限制为 3 次/分钟和 10 次/小时(超出则返回 HTTP 429)。 6. **输入上限。** `MAX_CASE_CHARS`(默认 6000)限制了输入 token。 在 v0.1 版本中,故意未接入用于获取真实报告链接的 **Web 搜索**功能(因为它会增加 每次请求的成本);“类似案件”改用搜索链接代替。 ## 部署 (Railway) 包含 `railway.json` + `.python-version`;Railway 通过 Nixpacks 构建并 使用 gunicorn 运行 `Procfile`/`startCommand`。步骤: 1. 从代码库创建一个 Railway 项目。 2. 设置环境变量(仪表板):`ANTHROPIC_API_KEY` (密钥),`ANTHROPIC_MODEL`, `AI_MAX_TOOL_TURNS`,`AI_DAILY_LIMIT`,`MAX_CASE_CHARS`。 3. 部署;健康检查 endpoint 为 `/api/health`。 4. 将 `disarm.j-lab.tools` 添加为自定义域名,然后在 Cloudflare 中添加指向 Railway 提供的域名的 **CNAME** 记录。 `render.yaml` 保留作为备选主机。 ## 范围 (v0.1) 包含:AI 辅助标记 (ES/EN),框架浏览器,报告 + Navigator 层 导出,本地回退。不包含(后续推出):德语,持久化/账户,原生 STIX 导出(待 C-LAB 接入 OpenCTI 后推出),完整的蓝队框架缓解指南。
标签:DISARM框架, Flask, IPv6支持, 人工智能辅助, 信息作战防御, 威胁情报, 开发者工具, 新闻业工具, 虚假信息分析, 逆向工具