anubhavmohandas/SAGE

GitHub: anubhavmohandas/SAGE

SAGE 是一个自主式应用安全平台,通过将代码库转化为知识图谱并利用 AI 进行漏洞可达性分析、补丁生成及自动化提交 PR,实现端到端的自动化漏洞修复。

Stars: 0 | Forks: 0

Security_Analysis_and_Graph_Engine # SAGE — 安全分析与 Graph Engine SAGE 是一个自主的安全 pipeline,它可以扫描代码仓库,将其结构映射为交互式的知识图谱,查找影响技术栈的 CVE,通过 AI 确认可利用性,生成补丁,并提交 GitHub PR —— 所有这些只需一条命令即可完成。 ``` python3 main.py --repo /path/to/your/repo ``` ## 🌐 在线演示 [**→ Synapse 可视化**](./Media/Security_graph_diagram_animation_202606060821.mp4) ## SAGE 的独特之处 大多数安全工具的回答是:*"库 X 存在 CVE-Y。"* SAGE 的回答是:*"`cybertrace/modules/base.py` 中的 `fetch_json()` 函数调用了 `aiohttp`,而它存在 18 个 CVE —— 这是其影响范围(blast radius),这是修复补丁。"* 可达性分析会追踪从入口点到易受攻击库的调用路径(目前已支持同文件内的调用链解析;跨文件解析已列入路线图),并将这些路径作为可利用性上下文提供给分析器。 图谱就是代码库。CVE 是图谱中现有节点上的徽章。 ## 流水线 ``` Repo │ ├─ 1. STACK DETECT — reads requirements.txt / package.json / pyproject.toml / Pipfile ├─ 2. CVE FETCH — pulls analysed CVEs from NVD (lastModified window) ├─ 3. CVE FILTER — matches NVD CPE strings against your stack ├─ 4. SYNAPSE PARSE — tree-sitter AST → files + functions + imports graph ├─ 5. CVE OVERLAY — attaches CVE nodes to library nodes in the graph ├─ 6. GRAPH EXPORT — synapse_graph.json + index.html (self-contained viz) ├─ 7. SCANNER — semgrep on blast-radius files only (45 CWEs, 30 library packs) ├─ 8. ANALYZER — LLM confirms exploitability (CRITICAL→Opus, others→Sonnet) ├─ 9. PATCHER — dep bump + code patch generation ├─ 10. TESTS — runs existing test suite, detects pre-existing baseline failures ├─ 11. VERIFIER — final semgrep pass post-patch └─ 12. GITHUB PR — timestamped branch + PR with full CVE table ``` ## Synapse — 知识图谱 图谱从仓库根节点打开,并允许您逐层下钻: ``` repo (purple) └─ file: cybertrace/modules/base.py ├─ function: fetch_json() ──USES──► lib: aiohttp ├─ function: _create_session() └─► CVE-2026-34520 [CRITICAL] └─ lib: aiohttp ──────────────────────► CVE-2025-69223 [HIGH] ► CVE-2025-69224 [MEDIUM] ► ... 16 more ``` **节点类型:** | 颜色 | 类型 | 含义 | |---|---|---| | 🟣 紫色 | REPO | 仓库根节点 —— 入口点 | | 🔵 蓝色 | FILE | 源代码文件 | | 🟢 绿色 | FUNCTION | 函数/方法定义 | | 🟠 橙色 | LIBRARY | 第三方依赖 | | 🔴 红色 | CVE | 漏洞 —— 大小代表严重程度 | **交互方式:** - 点击任意节点进行深入查看 - 悬停在 CVE 上 → 攻击路径会以红色线条回溯到入口点 - 按 `ESC` / `←` 返回,按 `R` 重置,按 `S` 保存 PNG 图片,滚动鼠标滚轮进行缩放 - 支持明亮/暗黑模式切换,悬停时显示边的关系标签 ## 设置 ``` git clone https://github.com/anubhavmohandas/SAGE cd SAGE python3 -m venv venv && source venv/bin/activate pip install -r requirements.txt cp .env.example .env # add your API keys ``` **.env 配置项 (keys):** ``` NVD_API_KEY= # https://nvd.nist.gov/developers/request-an-api-key ANTHROPIC_API_KEY= # https://console.anthropic.com GEMINI_API_KEY= # optional — used as primary analyzer, Anthropic as fallback GITHUB_TOKEN= # repo:write scope (Contents + Pull requests) GITHUB_REPO= # owner/repo ``` ## 使用方法 运行 SAGE 最简单的方法是使用交互式启动器 —— 它会自动检测您的 GitHub 远程仓库,询问要扫描的仓库,并让您选择 CVE 的时间窗口: ``` bash sage_scan.sh # interactive — asks for repo path bash sage_scan.sh /path/to/repo # skip the path prompt bash sage_scan.sh /path/to/repo --days 30 # pass extra flags to main.py ``` 或者直接调用 `main.py` 进行脚本化执行: ``` # 完整 pipeline python3 main.py --repo /path/to/repo # 更宽的 CVE 窗口(默认为 1 天) python3 main.py --repo /path/to/repo --days 30 # 仅 Knowledge graph — 无 CVE 获取 python3 main.py --synapse /path/to/repo # 查找特定 CVE python3 main.py --cve CVE-2026-34520 # Pipeline 状态 python3 main.py --status ``` 图谱始终会写入到 `demos/_/index.html` 文件中。您可以在任何浏览器中打开它 —— 无需服务器。 ## 分析器 — 双模式 SAGE 支持在提供或不提供 API 密钥的情况下工作。 **API 模式** —— 使用 Gemini 2.0 Flash(免费层级,15 RPM)作为带有指数退避机制的主要分析器。如果 Gemini 配额耗尽,则回退到 Anthropic。 **手动模式** —— 无需 API 密钥,并且该选择适用于**整个流水线**(分析器、补丁生成器和安全测试生成器)。SAGE 会为每个步骤导出提示词文件 —— 分析(`data//prompts/`)、补丁(`data//patches/patch_prompt_*.txt`)和测试(`data//tests/test_prompt_*.txt`)。将每个文件内容粘贴到任何 LLM 中,并将回复保存在该文件旁边,流水线就会继续执行。手动模式永远不会调用 API,因此永远不会消耗额度或触及配额限制。 手动回复 schema: ``` { "vulnerable": true, "confidence": 0.85, "reason": "...", "affected_functions": ["fetch_data", "_create_session"], "attack_vector": "...", "recommendation": "..." } ``` ## 基于严重程度的模型选择 | 严重程度 | 模型 | 理由 | |---|---|---| | 严重 (CRITICAL) | `claude-opus-4-6` | 风险最高 —— 提供最佳分析 | | 高 (HIGH) | `claude-sonnet-4-6` | 能力强劲,成本低 5 倍 | | 中 (MEDIUM) | `claude-sonnet-4-6` | 快速分类筛选 | | 低 (LOW) | `claude-sonnet-4-6` | 最低成本 | ## 补丁策略 | 场景 | 操作 | |---|---| | 存在已知安全版本的 CVE,且无可确认的易受攻击代码 | 仅升级依赖 —— 将 `requirements.txt` 升级为 `>=safe_version` | | 被 LLM 确认可利用的 CVE | 代码补丁(API 模式下使用 Claude Sonnet,或手动模式下使用手动提示词)+ 依赖升级。补丁将写入 `data//patches/CVE-XXXX/` | | requirements 中包含 `pkg[extras]`(例如 `aiohttp[speedups]`) | 保留 extras —— 使用正则表达式分别提取基础名称和 extras | ## 测试、验证与 PR 门禁 应用补丁后,SAGE 会运行仓库现有的测试,并为每个确认的 CVE 生成一个**安全测试**。为了在不同的 Python 版本中保持可靠性,并避免产生幻觉的库 API,生成的安全测试会断言**已安装修补后的依赖版本**,而不是重构漏洞利用过程。(这证明了上游修复已生效 —— 这是针对依赖项 CVE 的恰当检查。它不会重现漏洞利用过程。) 除非*同时*满足以下两个条件,否则 PR 将以**草稿**形式开启:现有测试和安全测试均通过,**并且**每个确认的 CVE 都实际生成了补丁。如果补丁生成失败或测试未通过,SAGE 会强制将其设为草稿,并说明原因 —— 它绝不会将空的或未经验证的补丁作为可直接合并的 PR 提交。 ## ⚠️ 安全提示:SAGE 会执行被扫描仓库的代码 为了验证补丁,SAGE 会安装被扫描仓库的依赖项(`pip` 会运行构建钩子)并在主机上运行其测试。因此,恶意或被篡改的目标仓库可能会在您的机器上执行代码。SAGE 在启动这些子进程时会**从环境变量中清除**其自身的 API 密钥/token,因此被扫描的代码无法读取您的机密信息 —— 但这只是一道防线,而非沙盒。 - **您自己的 / 受信任的仓库** → 可以在您的正常机器上运行。 - **不受信任的 / 第三方仓库** → 请在一次性虚拟机或容器中运行 SAGE。(完整的沙盒隔离已在路线图中。) 请使用范围限定在目标仓库(Contents + Pull requests)的**细粒度** GitHub token,切勿使用经典的具有完整 `repo` 权限的 PAT。 ## 架构 ``` sage/ ├── fetcher/ │ ├── nvd.py NVD API client — paginated, rate-limited, lastModDate window │ ├── filter.py Stack detection + CPE matching + alias table (30+ packages) │ └── store.py SQLite CVE store — dedup, CWE storage, pipeline status ├── synapse/ │ ├── parser.py tree-sitter AST — files, functions, imports, calls + regex fallback │ ├── mapper.py CVE overlay — blast radius trace, AFFECTS edges │ └── export.py Graph serialisation + self-contained index.html generation ├── scanner/ │ └── semgrep.py 45 CWEs mapped, 30 library-specific rule packs ├── analyzer/ │ └── llm.py Exploitability confirmation — dual mode, severity-gated models ├── patcher/ │ └── llm.py Dep bump + code patch + diff + manifest ├── tests/ │ └── runner.py Existing test suite runner — baseline failure detection ├── verifier/ │ └── semgrep.py Post-patch semgrep pass + dep bump validation └── github/ └── pr.py Timestamped branch + PR creation, CVE table in body ``` ## Semgrep 覆盖范围 **涵盖 10 个类别的 45 种 CWE:** | 类别 | CWEs | |---|---| | 注入 | CWE-89, 79, 78, 77, 88, 94, 95, 96, 643 | | 路径 / 文件 | CWE-22, 23, 36, 434, 73 | | 加密 / 机密 | CWE-327, 326, 330, 331, 312, 319, 798, 259 | | 认证 / 访问控制 | CWE-284, 285, 287, 306, 307, 384, 613 | | 反序列化 | CWE-502, 119, 125, 787 | | 网络 / SSRF | CWE-918, 611, 601, 295 | | 拒绝服务 / 资源 | CWE-400, 770, 776, 835 | | 信息泄露 | CWE-200, 209, 532, 779 | | Header / 协议 | CWE-113, 444, 116 | | 输入验证 | CWE-20, 74, 409 | **30 个特定库的规则包**,涵盖:aiohttp、flask、django、fastapi、requests、httpx、sqlalchemy、pymongo、jwt、cryptography、pyyaml、pickle、jinja2、subprocess 等。 ## CVE 匹配 SAGE 使用 NVD 的 `lastModified` 时间窗口(而非 `publishedDate`),因此它能捕获最近被分析过的 CVE —— NVD 只在分析后才会添加 CPE 数据,这可能会在发布几天后才进行。未被分析的 CVE(`Received`、`Awaiting Analysis`)将被跳过。 包名规范化处理了 NVD 不一致的 CPE 命名: ``` "anthropic-sdk" → matches "anthropic" "python-requests" → matches "requests" "aio_libs_aiohttp" → matches "aiohttp" ``` ## 测试基线检测 许多仓库都存在与 SAGE 补丁无关的既有测试失败。天真的门禁机制会永久阻碍安全 PR 的提交。 SAGE 会在打补丁前检测基线失败,并将它们排除在门禁之外。只有*SAGE 引入的*失败才会阻止 PR。 | 场景 | SAGE 的操作 | |---|---| | 49 个通过,1 个既有失败 | 检测到基线 → 覆盖为 PASSED(通过) → 不阻止 PR | | 49 个通过,1 个由补丁引起的新失败 | 出现新失败 → 阻止 PR → 人工审查 | | 无测试套件 | 标记为 PASSED(无测试 ≠ 失败) → 提交 PR | ## 验证 — CyberTrace SAGE 已经扫描过自身以及 [CyberTrace](https://github.com/anubhavmohandas/CyberTrace)。端到端输出示例: ``` Stack detected: aiohttp, click, rich, dnspython, phonenumbers, python-dotenv, python-whois CVEs found: 33 total from NVD, 24 attached to graph CRITICAL×3 HIGH×9 MEDIUM×12 Semgrep: 0 findings (correct — client-only CLI, no server-side exposure) Confirmed: 0/24 exploitable (note: this run predates the reachability engine fix — analysis was based on Semgrep + code context only; re-validation with live reachability paths pending) Dep bump: aiohttp >=3.9.0 → >=3.13.3 (18 CVEs) click >=8.0.0 → >=8.3.3 (1 CVE) Tests: 49 passed, 1 pre-existing failure (baseline detected, PR not blocked) Verifier: PASSED GitHub PR: https://github.com/anubhavmohandas/CyberTrace/pull/1 ``` ## 路线图 **近期** - [ ] **每日早报** —— 定时每日扫描,终端结果摘要,可选的 Slack/电子邮件提醒。每天集中处理一次决策,而非实时的信息轰炸。 - [ ] **吃自己的狗粮** —— SAGE 扫描 SAGE。当依赖过时时会向自己的仓库提交 PR。使用自己开发的产品。 - [ ] **JS/TS 支持** —— `package.json` + `npm audit` CVE 映射。`filter.py` 中已有 `_parse_package_json` 作为存根。 - [ ] **CVE 差异比对** —— 仅对上次扫描以来新出现的 CVE 发出警报。消除重复运行时的重复噪音。 **中期** - [ ] **多仓库** —— 扫描整个 GitHub 组织(org),跨仓库的统一知识图谱,跨仓库的影响范围。 - [ ] **Go + Rust 支持** —— `go.mod` / `Cargo.toml` 技术栈检测,特定语言的 tree-sitter 语法。 - [ ] **仪表板 + 提醒** —— 每个仓库的可视化 CVE 状态,针对 CRITICAL 发现的基于严重程度的 Slack/电子邮件提醒,完整的审计日志。 - [ ] **Synapse 可视化优化** —— 可调的 `max_neighbours`,更深的下钻深度控制,节点固定,时间线视图。 **长期** - [ ] **NYX 集成** —— 在 NYX 的第三阶段将作为 `nyx/tools/osint/sage/` 发布。SAGE 将成为更广泛的自主安全流水线的静态分析和漏洞情报模块。 - [ ] **传递依赖遍历** —— 跟踪间接依赖,而不仅仅是直接需求。展现两层深度的 CVE。 - [ ] **导出 SBOM** —— 从 Synapse 图谱生成 CycloneDX / SPDX 软件物料清单(SBOM)。 - [ ] **IDE 插件** —— VS Code 扩展,可在编辑器中内联渲染 Synapse 图谱并高亮显示易受攻击的调用链。 ## 技术栈 - [tree-sitter](https://tree-sitter.github.io) — 跨语言的 AST 解析 - [NetworkX](https://networkx.org) — 图谱构建与遍历 - [Semgrep](https://semgrep.dev) — 静态分析,映射 CWE 的规则 - [NVD API](https://nvd.nist.gov/developers/vulnerabilities) — CVE 数据 - [Anthropic Claude](https://anthropic.com) — 可利用性分析和补丁生成 - [Google Gemini](https://ai.google.dev) — 主要分析器(免费层级) - Canvas API — Synapse 可视化使用纯原生 JS 实现,零依赖 *SAGE v2.0 — 全部 12 个流水线阶段已完成。首个真实 PR 已提交至 CyberTrace。🛡️*
标签:CISA项目, DLL 劫持, GPT, 后端开发, 大语言模型, 模块化设计, 漏洞管理, 自动化修复, 逆向工具, 错误基检测, 静态代码分析