一个高性能、多语言的静态代码分析工具,专注于安全漏洞和代码质量检测,使用 Rust 实现。
- 多语言支持: Java、JavaScript、Python、SQL、Bash、XML 完全支持
- 多方言 SQL 支持: GaussDB、OpenGauss、PolarDB-MySQL、标准 SQL —— 每种方言使用专用解析器
- GaussDB / OpenGauss:
ogsql-parser - PolarDB-MySQL:
sqlparser-rs - 标准 SQL:
tree-sitter-sequel
- GaussDB / OpenGauss:
- 嵌入式 SQL 预处理器: 从 Java 源码(注解/字符串)和 MyBatis XML 中抽取 SQL,用 SQL 语义规则匹配,无需编写复杂的宿主语言模式
- 安全导向: 检测注入漏洞、XSS、身份验证问题等安全问题
- 高性能: 使用 Rust 构建,速度快且内存安全
- 灵活的规则: 基于 YAML 的声明式规则定义,支持元变量、条件和数据流追踪
- 多种输出格式: JSON、SARIF、Text、HTML、Markdown、Semgrep 兼容格式
- 并行处理: 多线程分析,适用于大型代码库
- 可扩展: 模块化架构,易于添加新语言和规则
- 污点分析: 高级数据流和污点分析能力
- Web Playground: 通过
astgrep-web提供基于浏览器的交互式规则测试(REST API + Playground 界面) - 桌面 GUI: 使用 egui 构建的跨平台桌面应用,支持交互式分析
# 克隆仓库
git clone https://github.com/c2j/astgrep.git
cd astgrep
# 构建项目
cargo build --release
# 安装二进制文件
cargo install --path .# 分析当前目录
astgrep analyze
# 分析特定文件/目录
astgrep analyze src/ tests/
# 使用特定规则
astgrep analyze --rules security-rules.yml
# 指定语言
astgrep analyze --language java --language python
# 输出到 SARIF 格式文件
astgrep analyze --format sarif --output results.sarif
# 验证规则文件
astgrep validate rules/*.yml
# 列出支持的语言
astgrep languages
# GaussDB 兼容性扫描
astgrep analyze --dialect gaussdb --rules tests/categories/rules/sql_dialects/gaussdb/ *.sql
# OpenGauss 分析
astgrep analyze --dialect opengauss --rules tests/categories/rules/sql_dialects/gaussdb/ *.sql
# PolarDB-MySQL 分析
astgrep analyze --dialect polardb-mysql --rules tests/categories/rules/sql_dialects/polardb_mysql/ *.sql
# 列出可用规则
astgrep list --language java --detailed
# 初始化配置文件
astgrep init --template security --output astgrep.toml
# 查看支持的语言和扩展名
astgrep info --extensionsastgrep 提供了多个工具来满足不同的使用场景:
主要的命令行工具,提供完整的静态分析功能。
./target/release/astgrep --help专门的命令行界面,提供更多高级功能。
./target/release/astgrep-cli --versionREST API(默认端口 8080)+ 浏览器 Playground(/playground),用于交互式规则测试。
# 启动 Web 服务(默认端口 8080)
./target/release/astgrep-web
# 使用自定义配置
./target/release/astgrep-web --config astgrep-web.toml交互式规则编辑器,内置文档页。
./target/release/astgrep-gui项目组织为 Cargo Workspace,包含 10 个 crate:
astgrep-core: 核心类型、Language枚举、错误处理和配置astgrep-ast: 通用 AST 定义(UniversalNode)、visitor、builderastgrep-parser: 语言解析器和适配器,以及 SQL 方言分发器astgrep-matcher: 模式匹配引擎(字面量、元变量、结构匹配)astgrep-dataflow: 数据流、污点分析、调用图和常量传播astgrep-rules: YAML 规则解析、验证和执行引擎astgrep-cli: 命令行界面,包含 14 个命令astgrep-web: Axum REST API 服务器和 Web Playgroundastgrep-gui: egui 桌面 Playgroundtest-utils: 测试工具(MockAstNode、MockParser 等)
astgrep 支持四种 SQL 方言,通过 --dialect 标志选择:
| 方言 | --dialect 值 |
解析器 | 覆盖范围 |
|---|---|---|---|
| 标准 SQL | standard(默认) |
tree-sitter-sequel 0.3.11 | 通用 SQL(ANSI) |
| GaussDB | gaussdb |
ogsql-parser v0.6.20 | 完整 DML/DDL + PREDICT BY / TIMECAPSULE / SHRINK / Plan Hints |
| OpenGauss | opengauss |
ogsql-parser v0.6.20 | 与 GaussDB 共享实现 |
| PolarDB-MySQL | polardb-mysql |
sqlparser-rs v0.62(MySqlDialect) | MySQL DML/DDL + PolarDB 关键字检测 |
# GaussDB 兼容性扫描
astgrep analyze --dialect gaussdb --rules tests/categories/rules/sql_dialects/gaussdb/ *.sql
# OpenGauss
astgrep analyze --dialect opengauss --rules tests/categories/rules/sql_dialects/gaussdb/ *.sql
# PolarDB-MySQL
astgrep analyze --dialect polardb-mysql --rules tests/categories/rules/sql_dialects/polardb_mysql/ *.sql
# 标准 SQL(默认,向后兼容)
astgrep analyze *.sql规则可以通过 dialects: 字段声明适用的方言。未声明 dialects: 的规则适用于所有方言(向后兼容)。
rules:
- id: gaussdb-no-on-conflict
name: "GaussDB 不支持 ON CONFLICT"
languages: [sql]
dialects: [gaussdb, opengauss]
patterns:
- pattern: "ON CONFLICT"
message: "请使用 MERGE INTO 替代"
severity: ERROR- GaussDB / OpenGauss: 14 条专用规则(11 条 YAML 规则 + 3 条内置 MERGE 语义校验器),覆盖类型兼容、存储、AI 特性、安全、性能等场景
- PolarDB-MySQL: 6 条专用规则,覆盖兼容性和安全场景
- GaussDB 专有特性: PREDICT BY、TIMECAPSULE、SHRINK、Plan Hints
更多细节请参考 docs/sql-dialects.md。
- Rust 1.70+
- Cargo
克隆后安装 pre-commit 钩子:
lefthook install# 构建所有 crate
cargo build
# 构建 release 版本
cargo build --release
# 构建特定的二进制文件
cargo build --release -p astgrep-cli
cargo build --release -p astgrep-web
cargo build --release -p astgrep-gui
# 运行测试
cargo test
# 带日志运行
RUST_LOG=debug cargo run -- analyze
# 运行基准测试
cargo bench每个 crate 都有完整的单元测试。运行测试:
# 运行所有测试
cargo test
# 运行特定 crate 的测试
cargo test -p astgrep-core
# 运行测试并显示输出
cargo test -- --nocapture
# 运行库测试
cargo test --lib
# 运行所有目标的测试
cargo test --all-targets
# 验证测试注解
python3 tests/scripts/validate_annotations.py规则使用 YAML 格式定义。astgrep 支持类似 Semgrep 的规则语法,同时也有自己的扩展。
rules:
- id: java-sql-injection
name: "SQL 注入检测"
description: "检测潜在的 SQL 注入漏洞"
severity: ERROR
confidence: HIGH
languages: [java]
patterns:
- pattern: "$STMT.execute($QUERY)"
- metavariable_pattern:
metavariable: "$QUERY"
patterns:
- pattern: "$STR + $INPUT"
fix: "使用 PreparedStatement 和参数化查询"
metadata:
cwe: "CWE-89"
owasp: "A03:2021 - 注入"rules:
- id: user-input-to-sql
name: "用户输入流向 SQL 查询"
languages: [java]
mode: taint
pattern-sources:
- pattern: "request.getParameter($PARAM)"
pattern-sinks:
- pattern: "Statement.execute($QUERY)"
pattern-sanitizers:
- pattern: "sanitize($INPUT)"
severity: ERROR
message: "用户输入未经验证直接用于 SQL 查询"astgrep 还支持更简洁的新语法:
rules:
- id: taint-example
languages: [python]
message: "发现不安全的数据流"
taint:
sources:
- "user_input()"
sinks:
- "eval(...)"
sanitizers:
- "sanitize(...)"
severity: ERROR详细的规则编写指南请参考 astgrep 规则编写指南。
astgrep 使用 TOML 格式的配置文件:
# astgrep.toml
[general]
verbose = false
threads = 0 # 0 表示自动检测
profile = false
[analysis]
languages = ["java", "javascript", "python", "sql", "bash"]
output_format = "json"
include_metrics = true
enable_dataflow = true
max_findings = 0 # 0 表示无限制
fail_on_findings = false
[filtering]
min_severity = "info"
min_confidence = "low"
exclude_patterns = [
"*.test.java",
"*.spec.js",
"**/test/**",
"**/tests/**",
"**/node_modules/**",
"**/target/**",
"**/build/**",
"**/.git/**"
]
[rules]
rules_directory = "rules"
rule_files = []
enabled_categories = ["security", "best-practice", "performance"]
disabled_categories = ["style", "experimental"]使用 astgrep init 命令可以生成配置文件模板。
| 语言 | 扩展名 | AST 支持 | 污点分析 |
|---|---|---|---|
| Java | .java | 完全支持 | 完全支持 |
| JavaScript | .js, .jsx | 完全支持 | 完全支持 |
| Python | .py | 完全支持 | 完全支持 |
| SQL | .sql | 完全支持 | 完全支持 |
| Bash | .sh, .bash | 完全支持 | 完全支持 |
| XML | .xml, .xsd, .xsl | 完全支持 | — |
此外,PHP、C、C#、Ruby、Kotlin、Swift 的解析器适配器已经存在,但这些语言尚未完全集成到 Language 枚举中。
astgrep 支持多种输出格式:
- JSON: 结构化的 JSON 输出
- SARIF: 静态分析结果交换格式(SARIF 2.1.0)
- Text: 简洁的文本格式
- HTML: HTML 格式报告
- Markdown: Markdown 格式报告
- Semgrep 兼容格式: 与 Semgrep 兼容的输出
详细贡献指南请参考 docs/CONTRIBUTING.md。
本项目采用 MIT 许可证 - 详见 LICENSE 文件。
详细路线图请参考 docs/ROADMAP.md。
- 代码库健康 — 修复编译错误,减少警告,添加 CI/CD
- 架构重构 — 拆分过大的文件
- Semgrep 兼容性 — 完成剩余兼容性修复
- 测试基础设施 — 完成测试目录重组
- 多语言 AST 实现
- 基础模式匹配
- 数据流和污点分析
- GUI 界面
- Web 服务接口
- 多方言 SQL 支持(GaussDB/OpenGauss/PolarDB-MySQL)
- 嵌入式 SQL 预处理器
- 高级模式匹配(元变量)
- IDE 集成(VS Code、IntelliJ)
- CI/CD 流水线集成
- 自定义规则开发工具
- 性能优化和缓存
如有问题、建议或想要贡献,请访问我们的 GitHub 仓库。