mattybellx/Ansede
GitHub: mattybellx/Ansede
一款零依赖的静态安全分析引擎,能在 AST 级别检测 IDOR、认证绕过、注入等 20 余类漏洞,覆盖 Python/JS/TS 等六种语言,填补了 Bandit 等传统工具在业务逻辑安全检测上的空白。
Stars: 4 | Forks: 0
# ansede-static
")
@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安全, 上游代理, 代码安全审计, 代码审查工具, 命令注入检测, 安全扫描器, 盲注攻击, 硬编码密码, 离线安全扫描, 网络安全, 越权漏洞检测, 身份验证绕过, 逆向工具, 隐私保护, 零依赖, 静态应用安全测试