这个是墨渊安全实验室的自动化代码审计文件,分析一下
作成日: 2026年5月28日
使用モデル GPT-5.5 Thinking by Chat01
作成日: 2026年5月28日
使用モデル GPT-5.5 Thinking by Chat01
这个是墨渊安全实验室的自动化代码审计文件,分析一下
下面是对压缩包 code-audit-assistant.zip 的静态分析结果。我没有运行 audit.py 或测试套件,只做了解包、源码阅读、语法编译检查和规则解析。
这是一个轻量级、多语言正则 + 少量 Python AST 的静态代码审计工具 Demo,结构完整,报告格式也比较齐全,但它离 README 里宣传的“上下文理解、污点追踪、OWASP Top 10 全覆盖、生产可用”还有明显差距。
我的判断是:
可以作为内部安全工具原型或教学项目使用,不建议直接作为生产级代码审计引擎接入 CI/CD。
主要原因是:检测逻辑以行级正则为主,数据流追踪较浅;报告存在 HTML 注入风险;打包和 CI 有明显 bug;README 声称支持的语言与实际扫描器支持不一致。
项目核心文件如下:
| 模块 | 作用 |
|---|---|
audit.py | CLI 入口,处理参数、调用扫描器、生成报告 |
scanner/file_scanner.py | 遍历文件、判断是否扫描、读取源码 |
scanner/language_detector.py | 根据扩展名和内容识别语言 |
core/engine.py | 规则引擎,加载 YAML 正则规则并生成问题 |
core/context_analyzer.py | Python AST + 部分 JS/Java/C 正则上下文分析 |
core/advanced_detector.py | 高级检测规则与复杂度分析 |
core/smart_filter.py | 误报过滤逻辑 |
report/*.py | HTML、增强 HTML、JSON、SARIF 报告生成 |
config/rules.yaml | 188 条正则检测模式 |
静态检查结果:
config/rules.yaml 可解析,188 条正则均能编译。test_ 函数,和 README 的“59 个测试”说法一致。.git、.pytest_cache、__pycache__、.reasonix 临时输出,不适合作为干净交付包。report/html_report.py 和 report/enhanced_html_report.py 使用:
pythonfrom jinja2 import Template template = Template(...)
Jinja2 直接使用 Template 时默认不开启 HTML autoescape。报告模板里大量字段直接输出:
html<div class="issue-code">{{ issue.code }}</div> <div class="issue-file">{{ issue.file }}:{{ issue.line }}</div> <div class="issue-description">{{ issue.description }}</div>
如果被扫描仓库里有人放入类似代码行:
html<script>alert(document.cookie)</script>
或者构造恶意文件名、恶意代码片段,生成的 HTML 报告被浏览器打开后可能执行脚本。
影响:高。 这个工具本身用于扫描“不可信代码仓库”,报告页面必须把源码内容当作不可信输入处理。
建议修复:
pythonfrom jinja2 import Environment, BaseLoader, select_autoescape env = Environment( loader=BaseLoader(), autoescape=select_autoescape(enabled_extensions=("html", "xml"), default=True) ) template = env.from_string(template_str)
模板里也应显式写:
html<pre>{{ issue.code | e }}</pre>
config/rules.yaml 里有 TypeScript、Go、Rust 规则,language_detector.py 也认识 .ts、.tsx、.go、.rs,但 scanner/file_scanner.py 的 SUPPORTED_EXTENSIONS 只包含:
python.py, .pyw, .js, .jsx, .java, .php, .c, .h, .cpp, .cc, .cxx, .hpp, .hxx
所以实际扫描目录时,.ts、.tsx、.go、.rs 文件会被直接跳过。
影响:高。 README 和实际能力不一致,CI 接入后会产生安全盲区。
建议修复:
pythonSUPPORTED_EXTENSIONS = { ".py", ".pyw", ".js", ".jsx", ".ts", ".tsx", ".java", ".go", ".rs", ".php", ".phtml", ".php3", ".php4", ".php5", ".c", ".h", ".cpp", ".cc", ".cxx", ".hpp", ".hxx", }
pyproject.toml 的 CLI 入口是坏的pyproject.toml 里写的是:
toml[project.scripts] code-audit = "audit:main"
但 audit.py 中没有 main() 函数,只有:
pythonif __name__ == '__main__': tool = AuditTool() tool.run()
所以通过包安装后运行 code-audit 会失败。
建议修复:
pythondef main(): tool = AuditTool() tool.run() if __name__ == "__main__": main()
GitHub Actions 和 GitLab CI 都调用了类似:
bashpython audit.py --dir . --report json --output audit_results/self_audit
但报告生成器里直接:
pythonwith open(output_path, 'w', encoding='utf-8') as f:
没有创建 audit_results/ 目录。因此 CI 中大概率会报 FileNotFoundError。
建议在所有报告生成器里加:
pythondir_name = os.path.dirname(output_path) if dir_name: os.makedirs(dir_name, exist_ok=True)
或者 CI 里先:
bashmkdir -p audit_results
README 宣传了“污点源 → 传播 → 汇聚点”,但实际 Python 污点分析主要只处理这种模式:
pythonuser_input = request.args.get("id") dangerous(user_input)
它不完整追踪中间变量传播。例如:
pythonuser_id = request.args.get("id") query = "SELECT * FROM users WHERE id = " + user_id cursor.execute(query)
这里 user_id 是污点,但 query 不会被标记为污点,因为 _extract_python_variables() 只在 RHS 是直接调用时才标记变量为污点。query = "..."+user_id 这种传播没有被建模。
这会导致典型 SQL 注入漏报。
test_sample.py 中有:
pythonDB_PASSWORD = "SuperSecret123!" API_SECRET = "sk-live-1234567890abcdef"
但 config/rules.yaml 的通用凭证规则多为小写,例如:
yaml- password\s*=\s*['"][^'"]{3,}['"]\s*$ - secret\s*=\s*['"][^'"]{3,}['"]\s*$ - db_password\s*=\s*['"][^'"]+['"]
core/engine.py 里使用:
pythonre.search(pattern, line)
没有 re.IGNORECASE。所以 DB_PASSWORD、API_SECRET 这种常见大写常量容易漏掉。
建议对规则统一加 re.IGNORECASE,或在 YAML 中使用 (?i):
regex(?i)\b\w*(password|passwd|pwd|secret|token|api[_-]?key)\w*\s*=\s*['"][^'"]{8,}['"]
config/rules.yaml 定义了:
yamlCRITICAL: 5 HIGH: 4 MEDIUM: 3 LOW: 2
但 CLI 参数只允许:
pythonchoices=['LOW', 'MEDIUM', 'HIGH']
控制台摘要也只打印:
pythonfor severity in ['HIGH', 'MEDIUM', 'LOW']:
增强 HTML 报告也只统计 HIGH / MEDIUM / LOW。
结果是:CRITICAL 问题可能被扫描出来,但在摘要和报告统计里被弱化或漏展示。
建议所有统计和 UI 中加入 CRITICAL,并允许:
pythonchoices=['LOW', 'MEDIUM', 'HIGH', 'CRITICAL']
例如配置里的 Python XSS 规则名是:
yamlname: XSS攻击-Python
但误报过滤里判断的是:
pythonelif rule_name == 'XSS攻击':
类似问题也出现在 SQL 注入、命令注入等规则上。带语言后缀的规则名不会命中过滤分支。
建议规则结构中新增稳定 ID,例如:
yamlid: xss name: XSS攻击-Python
代码里用 id 判断逻辑,不要用展示名称判断。
压缩包包含:
.git/.git/logs/HEAD.pytest_cache/__pycache__/.reasonix/truncated-results/.pyc 文件.git/config 中还能看到远程仓库地址:
texthttps://cdn.gh-proxy.org/https://github.com/EtherealXTHY/code-audit-assistant.git
.git/logs/HEAD 中出现了本地环境信息:
textroot <root@kali.(none)>
这些不一定是漏洞,但属于交付泄露和供应链卫生问题。
建议打包前清理:
bashrm -rf .git .pytest_cache __pycache__ */__pycache__ .reasonix find . -name "*.pyc" -delete
并用 .gitignore / .dockerignore / 打包白名单控制发布内容。
requirements.txt 混入开发依赖和标准库requirements.txt 包含:
textargparse pytest flake8 mypy
其中 argparse 是 Python 标准库,不需要安装;pytest、flake8、mypy 应该放到 dev 依赖,不应进入运行时依赖。
建议:
requirements.txt:
textpyyaml pygments jinja2
requirements-dev.txt:
textpytest flake8 mypy
默认排除:
python['.git', '__pycache__', 'node_modules', 'venv', 'env']
但没有排除:
text.pytest_cache .mypy_cache .ruff_cache dist build coverage vendor
而且只按目录名精确匹配,不支持 glob / 正则 / .gitignore 语义。
os.walk() 默认不跟随目录符号链接,但对文件符号链接,open(file_path) 会跟随。恶意仓库可以放一个指向系统敏感文件的 symlink,扫描器可能读取并把片段写入报告。
建议扫描时判断:
pythonif os.path.islink(file_path): return []
或者限制 realpath 必须仍在扫描根目录下。
这个项目不是完全没价值,作为原型有这些优点:
yaml.safe_load(),没有明显 YAML 反序列化风险。os.system、pickle.loads 是漏洞样例,不是工具自身运行路径。按优先级建议这样改:
main(),保证 code-audit 安装后可运行。os.makedirs()。CRITICAL。.ts、.tsx、.go、.rs。.git、缓存、pyc、临时分析日志。我会这样评估:
| 维度 | 评分 |
|---|---|
| 项目结构 | 7/10 |
| 可运行性 | 5/10 |
| 检测准确性 | 4/10 |
| 报告能力 | 6/10 |
| 安全性 | 4/10 |
| CI/CD 可用性 | 4/10 |
| 生产可用性 | 3/10 |
最终评价:适合作为代码审计工具原型,不适合直接用于生产安全门禁。