mattybellx/Ansede

GitHub: mattybellx/Ansede

一款零依赖的静态安全分析引擎,能在 AST 级别检测 IDOR、认证绕过、注入等 20 余类漏洞,覆盖 Python/JS/TS 等六种语言,填补了 Bandit 等传统工具在业务逻辑安全检测上的空白。

Stars: 4 | Forks: 0

# ansede-static

Ansede banner

**能够发现 Bandit 遗漏漏洞的静态安全分析工具。** 在 AST 级别检测 **IDOR、未授权访问和身份验证绕过** —— 还包括 SQL 注入、 命令注入、硬编码机密等 20 多个其他类别。零依赖。无需 GPU。 适用于 Python 3.9+。 ``` python -m pip install ansede-static # 如果最新版本仍在 PyPI 上传播: # python -m pip install "ansede-static @ git+https://github.com/mattybellx/Ansede.git" ansede-static src/ ``` [![发布版本](https://img.shields.io/github/v/release/mattybellx/Ansede?display_name=tag&sort=semver&label=release)](https://github.com/mattybellx/Ansede/releases) [![PyPI 版本](https://img.shields.io/pypi/v/ansede-static?label=pypi)](https://pypi.org/project/ansede-static/) [![PyPI 下载量](https://img.shields.io/pypi/dm/ansede-static?label=downloads)](https://pypi.org/project/ansede-static/) [![Python 3.9+](https://img.shields.io/badge/python-3.9%2B-blue)](https://github.com/mattybellx/Ansede/blob/master/pyproject.toml) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/8dbbdbb34c075235.svg)](https://github.com/mattybellx/Ansede/actions/workflows/ci.yml) [![NVD CVE 66/66](https://img.shields.io/badge/NVD%20CVE-66%2F66-brightgreen)](BENCHMARKS.md) [![Web Wild F1 97.78%](https://img.shields.io/badge/Web%20Wild%20F1-97.78%25-brightgreen)](BENCHMARKS.md) [![许可证](https://img.shields.io/badge/license-MIT-yellow.svg)](LICENSE) [![GitHub 星标](https://img.shields.io/github/stars/mattybellx/Ansede?style=social)](https://github.com/mattybellx/Ansede/stargazers) [![讨论](https://img.shields.io/github/discussions/mattybellx/Ansede?label=Discussions)](https://github.com/mattybellx/Ansede/discussions) ## 快速导航 - [快速开始](#quick-start) - [权威的全球最佳验证](#definitive-world-best-validation) - [检测覆盖范围](#detection-coverage) - [模式召回基准](#pattern-recall-benchmark) - [质量与性能测试套件](#quality-and-performance-harnesses) - [基准测试与公开证明](BENCHMARKS.md) - [CI 集成](#ci-integration) - [贡献指南](#contributing) ## 最新验证快照 (v2.1.0 — 2026 年 5 月) | 基准测试 | 结果 | |---|---| | 完整回归套件 | **675 项通过** (0 次回归) | | NVD CVE 语料库 | **66/66 (100% 召回率)** — Python 35/35, JS 24/24, Go 3/3, Java 2/2, C# 2/2 | | Web-wild 500 文件压力测试 | **100% 召回率 · 95.65% 精确率 · 97.78% F1 · 4.35% 误报率** | | 质量检查 | **41/41 (100%)** | | 外部真实世界语料库 | **19/19 (100%)** | | 多语言支持 | Python · JavaScript · TypeScript · Go · Java · C# | 完整产物:[`web_wild_stress_may12.json`](web_wild_stress_may12.json) · [`BENCHMARKS.md`](BENCHMARKS.md) ## 权威的全球最佳验证 在 **2026-05-11**,`ansede-static` v2.1.0 通过了其迄今为止规模最大的公开验证运行: - 包含来自 5 个开源 Web 框架(Django, Flask, FastAPI, Express, NodeGoat)的 **500 个真实源代码文件** - 采用混合标注与精心策划的清单覆盖 (curated manifest overrides) - **仅限高严重性门槛** —— 仅包含严重和高危发现 - **结构化 JS 后端**,用于精确的 AST 分析 - 在所有 6 种受支持的语言中实现 **100% NVD CVE 召回率** ### 最终结果 | 门槛 | 结果 | 阈值 | 状态 | |---|---:|---:|---| | Web-wild 召回率 (500 文件) | **100.00%** | ≥ 85% | ✅ | | Web-wild 精确率 | **95.65%** | — | ✅ | | Web-wild F1 | **97.78%** | — | ✅ | | Web-wild 误报率 | **4.35%** | < 10% | ✅ | | NVD CVE 召回率 | **66/66 (100%)** | 100% | ✅ | | Pytest 回归 | **675/675 通过** | — | ✅ | **ansede-static 在此基准测试协议上毫无疑问是全球最佳的。** 机器可读产物:[`web_wild_stress_may12.json`](web_wild_stress_may12.json) · [`BENCHMARKS.md`](BENCHMARKS.md) ## 从这里开始 (2 分钟教程) 1. **安装并扫描单个文件夹** ``` pip install ansede-static ansede-static src/ --fail-on high ``` 2. **在 GitHub 代码扫描中查看发现** ``` ansede-static src/ --format sarif --output ansede.sarif ``` 3. **通过基线增量采纳** ``` ansede-static src/ --format json --output .ansede-baseline.json ansede-static src/ --baseline .ansede-baseline.json --fail-on high ``` ## 现有工具的问题 Bandit 可以检测到 `subprocess(shell=True)`。但它检测不到以下情况: ``` # CWE-639 — IDOR (Insecure Direct Object Reference) # Bandit:静默。ansede-static:CRITICAL @app.route("/invoice/") @login_required def get_invoice(invoice_id): # no WHERE user_id = current_user.id return db.execute("SELECT * FROM invoices WHERE id = ?", (invoice_id,)) ``` 或者这个: ``` # CWE-285 — Missing Ownership Check # Bandit:静默。ansede-static:HIGH @app.route("/post//delete", methods=["POST"]) @login_required def delete_post(post_id): # No: if post.author_id != current_user.id: abort(403) Post.query.filter_by(id=post_id).delete() ``` 还有这个: ``` # CWE-862 — Missing Authentication # Bandit:静默。ansede-static:HIGH @app.route("/admin/users") def list_users(): # no @login_required, no @admin_required return User.query.all() ``` 这些是出现在 CVE 数据库中的漏洞。这些是让公司损失数百万美元的漏洞。 `ansede-static` 是一款零依赖的 SAST 工具,能够在 AST 级别检测出这些漏洞。 ## 快速开始 ``` # 零依赖安装(纯文本输出) pip install ansede-static # 带彩色终端输出(推荐在本地使用) pip install "ansede-static[rich]" # 扫描目录(递归) ansede-static src/ # 在出现 HIGH/CRITICAL 发现时使 CI 失败 ansede-static src/ --fail-on high # 用于 GitHub Code Scanning 的 SARIF 输出 ansede-static src/ --format sarif --output results.sarif # 用于脚本编写的 JSON ansede-static src/ --format json | python -m json.tool # 从 stdin 扫描 cat app.py | ansede-static --stdin --lang python # 仅显示相对于已保存基线的 NEW 发现 ansede-static src/ --format json --output baseline.json # first run ansede-static src/ --baseline baseline.json # later runs ``` ## 内联抑制 在同一行添加注释即可消除个别发现: ``` @app.route("/public/feed") # ansede: ignore[CWE-862] def public_feed(): return get_posts() ``` ``` document.getElementById("out").innerHTML = safe; // ansede: ignore[CWE-79] ``` 使用 `# ansede: ignore`(不带括号)可抑制某一行上的**所有**发现。 ## 基线差异对比 (`--baseline`) 生成一个基线,随后仅在运行时查看新增的发现: ``` # 保存当前状态 ansede-static src/ --format json --output .ansede-baseline.json # CI — 仅在出现 NEW 发现时失败 ansede-static src/ --baseline .ansede-baseline.json --fail-on high ``` 这非常适合在大型代码库上增量采纳 ansede-static。 ## 其他 CLI 标志 | 标志 | 状态 | 描述 | |------|--------|-------------| | `--init` | 稳定版 | 将一个基础的 `ansede.json` 配置写入当前目录 | | `--incremental` | 稳定版 | 仅扫描 `git diff HEAD` 中修改过的文件;非常适合大型 monorepo 的 pre-commit 钩子 | | `--apply-fixes` | 稳定版 | 交互式应用**安全的内联**自动修复。多行或有歧义的修复将保留为手动审查的建议。 | | `--ai-triage` | 稳定版 | 离线启发式分类筛选,抑制 test/mock/fixture 上下文中的发现,并减少误报 | | `--js-backend` | 稳定版 | 选择 JS/TS 引擎:`auto`、`classic` 或 `structural` | | `--list-rules` | 稳定版 | 打印检测器目录并退出 | | `--describe-rule` | 稳定版 | 显示规则 ID 或 CWE 的详细信息 | | `--list-js-backends` | 稳定版 | 打印可用的 JS/TS 后端并退出 | | `--explain` | 稳定版 | 在受支持的输出格式中附带离线的 CWE 解释以丰富发现内容 | | `--export-rules` | 稳定版 | 将内置规则目录输出到所选的输出格式并退出 | | `--output-dir` | 稳定版 | 将具有默认名称的产物(如 `findings.json` 或 `rules.sarif`)写入一个目录中 | `--experimental-js-ast` 作为旧版别名保留;结构化 JS/TS 引擎目前已是生产默认选项 (`--js-backend auto`),并涵盖多行 sink 调用、拆分赋值、React / JSX `dangerouslySetInnerHTML` 流、对象字面量和基于装饰器/文件的路由/身份验证定义(包括 Fastify、Koa 风格的 ambient 中间件、Nest 装饰器和 Next 路由文件)、辅助调用 sink 解析、跨本地/导入 JS/TS 调用链的辅助函数返回值传播,以及用于 redirect/path/SSRF/route-access 模式的缓存相对导入 JS/TS 模块图流。 ## `ansede.json` 配置 运行 `ansede-static --init` 以生成初始配置,然后根据您的仓库进行自定义: ``` { "exclude_paths": ["tests/fixtures", "build", "dist", ".venv", "__pycache__"], "disable_rules": ["PY-020", "CWE-862"], "custom_sources": ["get_untrusted_user_input", "request.headers.get"], "custom_rules_file": "rules/community-rules.yml", "custom_sinks": { "my_vulnerable_db_execute": { "cwe": "CWE-89", "title": "Custom SQL Injection sink", "severity": "critical" } } } ``` ### 配置行为 - `disable_rules` 接受稳定的检测器 ID(如 `PY-020` / `JS-034`)**或** CWE(如 `CWE-862`) - 格式错误的 `custom_sinks` 条目将被跳过并发出警告,而不是被静默地部分应用 - `custom_sinks` 使用显式的对象 schema:`cwe`、`title` 以及可选的 `severity` - `custom_rules_file` 加载相对于工作区根目录的 YAML 或 JSON 社区规则包 - 旧版基线仍可读取;新的 JSON 基线还包含顶层的 `fingerprint_version` ### 社区自定义规则 对于轻量级的仓库本地策略规则,可以将 `custom_rules_file` 指向一个 YAML 或 JSON 规则包: ``` version: "1.0" rules: - id: "ORG-001" title: "Ban legacy shell helper" description: "legacy_exec() shells out with user-controlled input." severity: "high" cwe: "CWE-78" category: "security" languages: ["python", "javascript", "java", "csharp", "go"] pattern: "legacy_exec\s*\(" suggestion: "Replace legacy_exec() with the safe wrapper." ``` 这些规则仅基于模式匹配,并在内置分析器之后运行。有关感知 AST 或污点分析的规则,请参阅 `docs/writing-rules.md`。 ## GitHub Action (单行配置) ``` # .github/workflows/security.yml - uses: mattybellx/Ansede@v2.1.6 with: path: src/ fail-on: high # optional: critical/high/medium/low/never upload-sarif: true # uploads to GitHub Code Scanning automatically ``` ## VS Code 扩展 从 VS Code 市场安装:**Ansede Security Scanner** 波浪线会在打开/保存时内联显示,默认情况下也会在防抖输入时显示 (`ansede.scanOnType`)。 点击 CWE 代码将打开 MITRE 的定义。该扩展会在常见的虚拟环境路径(如 `.venv/`)中自动检测 `ansede-static`,如果未找到则回退到 `PATH`。 ### 推荐的扩展设置 - `ansede.scanOnType` — 启用输入时的防抖扫描 - `ansede.scanTimeoutMs` — 针对非常大的文件或较慢的环境增加超时时间 - `ansede.executable` — 如果您不希望自动发现,可固定一个自定义二进制文件路径 ## 规则目录与引擎选择 您可以直接检查内置的检测器目录和 JS/TS 后端选项: ``` ansede-static --list-rules ansede-static --describe-rule PY-020 ansede-static --describe-rule CWE-862 ansede-static --list-js-backends ansede-static --export-rules --format json --output-dir artifacts ansede-static src/ --js-backend structural ``` `auto` 目前解析为结构化 JS/TS 引擎,同时保留经典引擎可供比较或回归分类使用。 ## 检测覆盖范围 ### Bandit 无法检测的漏洞 (ansede-static 的新型类别) | CWE | 类别 | 示例模式 | |---------|--------------------------------|----------------------------------------------| | CWE-639 | IDOR | 缺少所有权 WHERE 条件的认证路由查询 | | CWE-285 | 访问控制破坏 / 所有权 | 变更操作缺少所有者守卫,或管理员路由仅要求身份验证 | | CWE-862 | 缺少身份验证 | 没有认证装饰器的 Flask/FastAPI 路由 | | CWE-287 | 通过存在性检查绕过身份验证 | `if token:` 但未验证 token | | CWE-117 | 日志注入 | 在 `log.*()` 调用中使用了不受信任的数据 (CRLF) | ### Python (基于 AST — 27 个规则类别) | CWE | 类别 | 备注 | |--------|----------------------------|----------------------------------------------| | CWE-89 | SQL 注入 | 污点分析: f-string, %-format, `.format()` | | CWE-78 | 命令注入 | `subprocess` + `shell=True` + 动态参数 | | CWE-95 | 代码注入 | `eval()`, `exec()`, `compile()` | | CWE-502 | 不安全的反序列化 | `pickle`, `marshal`, `yaml.load` | | CWE-22 | 路径遍历 | 使用了未净化变量的 `os.path.join` | | CWE-918 | SSRF | 使用了未经验证 URL 的 HTTP 客户端 | | CWE-798 | 硬编码机密 | API 密钥、token、密码、AWS 凭证 | | CWE-1188 | 危险的默认值 | `debug=True`, `verify=False`, CORS 通配符 | | CWE-327 | 弱加密 | 用于密码哈希的 MD5/SHA1 | | CWE-338 | 弱 PRNG | 用于安全 token 的 `random` 模块 | | CWE-617 | 静默异常吞噬 | `except Exception: pass` | | CWE-345 | 认证破坏 | JWT `verify=False` | | — | 过程间污点分析 | 跨函数调用追踪污点 | | — | 圈复杂度 | 标记 CC > 15 (高风险代码路径) | ### JavaScript / TypeScript (23+ 种模式类别) | CWE | 类别 | 示例 | |---------|------------------------|------------------------------------------------| | CWE-79 | XSS | `innerHTML`, `.write`, 不安全的模板 | | CWE-95 | 代码注入 | `eval()`, `new Function()`, `setTimeout(str)` | | CWE-78 | 命令注入 | 在 `exec()` 中使用模板字面量 | | CWE-89 | SQL 注入 | 在 `query()` 中使用模板字面量 | | CWE-798 | 硬编码机密 | API 密钥、JWT 密钥、AWS 凭证 | | CWE-22 | 路径遍历 | 在 `fs.readFile` 中使用了 `req.*` 输入 | | CWE-1321 | 原型链污染 | `Object.assign`, `__proto__`, 展开运算符 | | CWE-1333 | ReDoS | 灾难性回溯正则表达式 | | CWE-307 | 缺少频率限制 | 没有频率限制中间件的认证路由 | | CWE-352 | 缺少 CSRF | 没有 CSRF 中间件的 POST/PUT | | CWE-862 | 缺少身份验证 | 没有认证中间件的敏感/管理员路由 | | CWE-287 | 身份验证绕过 | 仅通过 `if (token)` 拦截但未进行验证 | | CWE-639 | 路由级 IDOR | 使用 `findByPk(req.params.id)` 但没有所有权范围 | | CWE-285 | 访问控制破坏 / 所有权 | ID 查找后执行 `post.destroy()`,没有所有者守卫;管理员路由仅要求认证 | JS/TS 路由发现现在也携带追踪证据,因此 SARIF 输出包含代码流,用于展示路由、资源参数、身份验证中间件(如果有)、缺少的守卫以及查找或变更 sink。 ### 当前范围与局限性 - **Python** 发现是基于常见 Flask/FastAPI/Django 模式的 AST/数据流启发式分析。它们在检测常见的认证、所有权、注入和反序列化漏洞方面表现出色,但并非完整的符号执行。 - **JavaScript / TypeScript** 发现目前在 Express/Router 风格的服务器代码上表现最为强劲。路由感知检查会推断常见的中间件、角色守卫、凭证存在性检查、资源查找和变更,但目前尚未实现解析器语义上的全程序分析。 - **信任元数据有助于分类筛选,而非提供确定性。** 发现现在包含稳定的 `rule_id`,以及 `analysis_kind` 和 `confidence`,因此您可以区分是由哪个检测器触发的,以及它来自直接模式、路由启发式、装饰器启发式还是污点流。但这仍然不能保证其可利用性。 - **合成基准测试是信号,而非证明。** 下面的 CVE 语料库测量的是对真实漏洞模式的策划复现的召回率,而不是大型的真实世界代码库。 ## 比较 | 能力 | ansede-static | Bandit | Semgrep OSS | |----------------------------------|:---:|:---:|:---:| | 零运行时依赖 | ✅ | ❌ | ❌ | | 完全离线工作 | ✅ | ✅ | ✅ | | Python 支持 | ✅ | ✅ | ✅ | | JavaScript / TypeScript 支持 | ✅ | ❌ | ✅ | | SARIF 输出 | ✅ | ❌ | ✅ | | GitHub Action (市场) | ✅ | ❌ | ✅ | | VS Code 扩展 | ✅ | ❌ | ✅ | | Pre-commit 钩子 | ✅ | ✅ | ✅ | | **IDOR / CWE-639** | ✅ | ❌ | ❌* | | **缺少认证 / CWE-862** | ✅ | ❌ | ❌* | | **所有权检查 / CWE-285** | ✅ | ❌ | ❌* | | 内联抑制注释 | ✅ | ✅ | ✅ | | 基线差异对比 (`--baseline`) | ✅ | ❌ | ❌ | | Python API | ✅ | ✅ | ✅ | | 免费 / 开源 | ✅ | ✅ | ✅ | *Semgrep 可以通过您自己编写的自定义规则检测这些内容;默认规则集中不包含。 ## 输出格式 ### 文本 (默认) ``` ──────────────────────────────────────────────────── ansede-static — 3 file(s) scanned ──────────────────────────────────────────────────── app.py (python) [CRITICAL] L47 CWE-78: Command injection in run_cmd() (shell=True + dynamic arg) [CRITICAL] L81 CWE-639: IDOR — query in get_invoice() missing ownership WHERE clause [HIGH ] L23 CWE-89: SQL Injection in get_user() via f-string [HIGH ] L103 CWE-862: Route /admin/users has no authentication decorator Total: 4 findings — 2 critical, 2 high ``` ### SARIF 2.1.0 SARIF 结果保留了特定于分析器的稳定规则 ID(例如 `PY-024`、`JS-034`)、每次发现的 `analysisKind`、`confidence` 以及有追踪证据的代码流,以便下游工具能够区分直接模式匹配与启发式路由发现,而无需将所有内容折叠到原始的 CWE 下。 ``` ansede-static src/ --format sarif --output results.sarif ``` ### JSON JSON 发现包含稳定的 `rule_id` 值以及 `cwe`、`analysis_kind` 和 `confidence`,这使得围绕特定检测器(而不是整个 CWE 类别)构建分类面板、基线过滤器或 CI 策略变得更加容易。 顶层的 JSON 包装器现在也包含 `fingerprint_version`,用于记录该报告使用的基线指纹格式。 ``` ansede-static src/ --format json \ | python -c " import sys, json for r in json.load(sys.stdin)['results']: for f in r['findings']: print(f[\"severity\"], f[\"cwe\"], f[\"title\"]) " ``` ## 模式召回基准 `benchmarks/` 目录包含 26 个手工制作的代码片段,它们重现了来自真实 CVE 条目的漏洞_模式_。 ``` git clone https://github.com/mattybellx/Ansede cd Ansede pip install -e . python -m benchmarks.nvd_benchmark ``` ``` ┌──────────────────────────────────────────────────────────────────┐ │ ansede-static Pattern Recall Benchmark │ │ (Synthetic CVE Pattern Reproductions — not real projects) │ └──────────────────────────────────────────────────────────────────┘ ✓ CVE-2022-24439 CWE-78 python [1 critical — command injection] ✓ CVE-2022-36087 CWE-918 python [1 high — SSRF] ✓ CVE-2019-14234 CWE-89 python [1 critical — SQL injection] ✓ CVE-2021-32556 CWE-502 python [1 critical — pickle deserialization] ✓ CVE-2019-10744 CWE-1321 js [1 high — prototype pollution] Python (13 patterns): 13/13 JS/TS (13 patterns): 13/13 All 26 synthetic patterns detected · ~43ms ``` ## 质量与性能测试套件 在开发期间使用这些工具来保护信任并尽早捕获高噪点回归: ``` python -m benchmarks.quality_benchmark --fail-under 100 python -m benchmarks.external_corpus --manifest benchmarks/external_manifest.json --fail-under 100 python -m benchmarks.external_corpus --manifest benchmarks/real_world_manifest.json --cache-dir .tmp/ansede-corpus --refresh python -m benchmarks.external_corpus --manifest benchmarks/real_world_manifest.example.json --cache-dir .tmp/ansede-corpus --refresh python -m benchmarks.perf_benchmark --iterations 10 ``` 有关范围、注意事项和扩展指南,请参阅 [`docs/QUALITY.md`](docs/QUALITY.md)。 外部语料库运行器也支持**固定的 git 支持清单**,适用于更大的仓库型测试夹具。 使用 `--cache-dir` 控制仓库的缓存位置,使用 `--refresh` 重新获取它们,使用 `--offline` 针对现有缓存重新运行而不接触网络。 该仓库现在附带一个可选的策划清单,位于 `benchmarks/real_world_manifest.json`, 其中固定了 NodeGoat 路由文件,旨在避免厂商噪音并保持预期稳定性。 ## 目标指标 | 指标 | 目标 | |---|---| | 误报率 | < 10 % (核心 Python/JS 规则) | | 召回率 (CVE 语料库) | > 85 % 针对注入、路径遍历、RCE | | 速度 | < 10 秒 / 10 万行代码 (在普通硬件上) | | SARIF 上传大小 | 典型仓库 < 2 MB | 这些是由 `benchmarks/` 中的 NVD 基准测试套件验证的预期目标。 ## 威胁模型与范围 **ansede-static 能检测到的漏洞:** - 由受污染的用户输入触达的注入 sink (SQLi, XSS, CMDi, SSRF) - 不安全的默认值 (硬编码凭证、弱加密、未关闭的调试模式) - 访问控制反模式 (缺少装饰器、IDOR、批量赋值) - 供应链指标 (pickle, eval, 不安全的反序列化) **非目标 (不在范围内):** - 符号执行 / 全程序形式化验证 - 动态分析 / DAST (黑盒测试) - 需要运行时上下文的业务逻辑漏洞 - 依赖漏洞扫描 (为此请使用 `pip-audit` / `npm audit`) ## 竞争力矩阵 | 特性 | ansede-static | Semgrep | CodeQL | Bandit | |---|---|---|---|---| | 零依赖安装 | ✅ | ❌ (Go 运行时) | ❌ (查询引擎) | ✅ | | 一个工具支持 Python + JS | ✅ | ✅ | ✅ | 仅限 Python | | 跨文件污点分析 (过程间) | ✅ (IFDS/IDE + 有限调用字符串) | ✅ | ✅ | ❌ | | SARIF 输出 | ✅ | ✅ | ✅ | ❌ | | SBOM 生成 | ✅ | ❌ | ❌ | ❌ | | 合规性标签 (OWASP/NIST) | ✅ | ❌ | 部分 | ❌ | | HTML 仪表板 | ✅ | ❌ | ❌ | ❌ | | 自定义 YAML 规则 | ✅ | ✅ (自定义规则) | ✅ (QL) | ❌ | | PR 行内评论 | ✅ (action) | ✅ | ✅ | ❌ | ## 运维注意事项 - **检测器组合保持分层。** 模式、AST 和 IFDS 信号按置信度组合;罕见的框架/元编程构造可能仍需人工审查。 - **当存在 Source Map 时,压缩/转译的 JS 会被映射。** 如果 Source Map 缺失或已过时,发现结果将降级到生成文件的坐标。 - **模板转译对于常见的 Jinja2/Handlebars 构造是一等公民支持。** 高度动态的运行时模板组合仍可能降低精确度。 - **单文件超时时间**默认为 30 秒;极大型生成文件可能会超时,应从 CI 范围中排除。 ## 采纳漏斗 ``` 1. CLI (one-shot scan) ansede-static src/ 2. Pre-commit hook ansede-static --incremental 3. CI pipeline GitHub Action / GitLab CI / any shell 4. VS Code Extension Real-time inline findings 5. CISO dashboard --format ciso / --format html ``` 每个步骤都会增加执行力度和可见性,而无需依赖前一个步骤。 ## 深度模式与核心模式 | 模式 | 触发条件 | 作用 | |---|---|---| | **核心** (默认) | `ansede-static src/` | 模式 + AST 污点分析,单次扫描,< 2 秒 / 文件 | | **深度** | `--ai-triage` | 增加离线启发式分类:抑制仅用于测试的发现、参数化查询模式 | | **增量** | `--incremental` | Git-diff 范围界定 —— 仅分析修改过的文件 | | **全局** | 扫描目录时自动启用 | 两次扫描:在第一遍构建符号图,在第二遍评估污点 | ## Python API ``` from ansede_static import AnsedeConfig, scan_file, scan_code # 扫描文件 result = scan_file("app.py") for finding in result.sorted_findings(): print(f"[{finding.severity.value}] L{finding.line} {finding.cwe}: {finding.title}") # 扫描内存中的代码(适用于测试套件) result = scan_code(source_code, language="python") assert result.critical_count == 0, f"{result.critical_count} critical findings" # 可选:以编程方式应用相同的 ansede.json 样式过滤器 config = AnsedeConfig(disable_rules=["CWE-862"]) filtered = scan_code(source_code, language="python", config=config) assert all(f.cwe != "CWE-862" for f in filtered.findings) # 在扫描 JavaScript / TypeScript 时显式选择 JS 引擎 js_result = scan_code(js_source, language="javascript", js_backend="structural") assert js_result.language == "javascript" # SARIF from ansede_static.reporters import format_sarif sarif_str = format_sarif([result]) ``` ## CI 集成 ### GitHub Actions (推荐) ``` steps: - uses: actions/checkout@v4 - uses: mattybellx/Ansede@v2.1.6 with: path: src/ fail-on: high upload-sarif: true ``` ### 手动步骤 ``` - name: Security scan run: | python -m pip install "ansede-static @ git+https://github.com/mattybellx/Ansede.git" ansede-static src/ --format sarif --output ansede.sarif --fail-on high - name: Upload SARIF if: always() uses: github/codeql-action/upload-sarif@v4 with: sarif_file: ansede.sarif ``` ### Pre-commit ``` repos: - repo: https://github.com/mattybellx/Ansede rev: v2.1.6 hooks: - id: ansede-static args: [--fail-on, high] ``` ## 开发 ``` git clone https://github.com/mattybellx/Ansede cd Ansede pip install -e ".[dev]" pytest tests/ -v python -m benchmarks.nvd_benchmark python -m benchmarks.quality_benchmark --fail-under 100 python -m benchmarks.perf_benchmark --iterations 10 # Self-scan:使用此功能来捕获规则、契约和报告器中的回归 ansede-static src/ --fail-on high ``` ### 添加检测规则 - **Python:** 在 [src/ansede_static/python_analyzer.py](src/ansede_static/python_analyzer.py) 中添加一个 `_rule_NN(ctx: _Ctx)` 函数,并在 `_detect()` 中注册它 - **JavaScript:** 在 [src/ansede_static/js_analyzer.py](src/ansede_static/js_analyzer.py) 中添加一个 `_Rule(...)` 条目或一个上下文相关的 `_check_*` 函数,然后在 `analyze_js()` 中注册它 - **基准测试:** 在 [benchmarks/cve_corpus.py](benchmarks/cve_corpus.py) 中添加一个 `CVEEntry(...)` - 完整清单请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) ## 源代码 完整实现位于此仓库的 [`src/ansede_static/`](src/ansede_static/) 目录下: | 文件 | 用途 | |------|---------| | [`python_analyzer.py`](src/ansede_static/python_analyzer.py) | 27 条 Python 检测规则 (AST/数据流) | | [`js_analyzer.py`](src/ansede_static/js_analyzer.py) | 23+ 条 JavaScript/TypeScript 检测规则 | | [`js_ast_analyzer.py`](src/ansede_static/js_ast_analyzer.py) | 生产级结构化 JS/TS 引擎,具备语法感知流和框架路由/认证建模 | | [`js_engine/`](src/ansede_static/js_engine/) | 共享的 JS 引擎模块,用于结构化解析、React/JSX 分析、感知 Koa/Nest/Next 的路由/认证启发式、辅助调用/辅助返回跨文件 JS 流、缓存工作区模块图以及规则编排 | | [`engine/triage.py`](src/ansede_static/engine/triage.py) | 离线启发式分类与置信度调整 | | [`engine/explain.py`](src/ansede_static/engine/explain.py) | 人类可读的发现解释 | | [`reporters.py`](src/ansede_static/reporters.py) | 文本、JSON 和 SARIF 输出格式化器 | | [`ir/global_graph.py`](src/ansede_static/ir/global_graph.py) | 过程间调用图 | | [`cache/sqlite_store.py`](src/ansede_static/cache/sqlite_store.py) | 零依赖结果缓存 | | [`cli.py`](src/ansede_static/cli.py) | CLI 入口点 | 基准语料库:[`benchmarks/cve_corpus.py`](benchmarks/cve_corpus.py) 公开记分卡和可重现的基准运行:[`BENCHMARKS.md`](BENCHMARKS.md) ## 贡献 非常欢迎贡献 —— 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 获取指南。 规划说明和里程碑工单位于 [ROADMAP.md](ROADMAP.md)。 最有影响力的贡献包括: - **新的检测规则** 如果您发现该工具遗漏了 Python 或 JavaScript 中的某类漏洞,请提交一个包含最小代码片段的 issue,或者提交一个包含新规则和测试的 PR。 - **误报报告** —— 如果该工具标记了安全的代码,请提交一个错误报告,以便我们改进启发式算法。 - **真实世界语料库测试** —— 基准测试套件使用的是合成模式;针对受真实 CVE 影响的开源项目进行测试的 PR 尤其有价值。 ### 快速贡献者设置 ``` git clone https://github.com/mattybellx/Ansede cd Ansede pip install -e ".[dev]" pytest tests/ -q # current validation target: full suite green ``` 当前发布版本:**`2.1.6`** ## 许可证 MIT —— 请参阅 [LICENSE](LICENSE)。 *使用 ansede-static 发现了真实的漏洞?请发起一个[讨论](https://github.com/mattybellx/Ansede/discussions)或在推特上分享 —— 社区反馈是帮助其他开发者发现此工具的最佳方式。*
标签:CISA项目, DevSecOps, DOE合作, GraphQL安全矩阵, IDOR检测, JavaScript安全, SAST, SQL注入检测, StruQ, TypeScript安全, 上游代理, 代码安全审计, 代码审查工具, 命令注入检测, 安全扫描器, 盲注攻击, 硬编码密码, 离线安全扫描, 网络安全, 越权漏洞检测, 身份验证绕过, 逆向工具, 隐私保护, 零依赖, 静态应用安全测试