这个是墨渊安全实验室的自动化代码审计文件,分析一下

作成日: 2026年5月28日

使用モデル GPT-5.5 Thinking by Chat01

質問

code-audit-assistant.zip

这个是墨渊安全实验室的自动化代码审计文件,分析一下

思考

Generating report and inspecting CI details

I’m considering generating a detailed report, maybe in markdown? The user didn't request an artifact, so it might be unnecessary. But it could still be helpful. I also need to check if CI processes like mkdir are handled properly, especially with GitHub. The paths and exclusions for files are another area to inspect. Lastly, I’ll need to double-check dependencies and static testing setups as well.

Thought for 3m 8s

回答

下面是对压缩包 code-audit-assistant.zip 的静态分析结果。我没有运行 audit.py 或测试套件,只做了解包、源码阅读、语法编译检查和规则解析。

总体结论

这是一个轻量级、多语言正则 + 少量 Python AST 的静态代码审计工具 Demo,结构完整,报告格式也比较齐全,但它离 README 里宣传的“上下文理解、污点追踪、OWASP Top 10 全覆盖、生产可用”还有明显差距。

我的判断是:

可以作为内部安全工具原型或教学项目使用,不建议直接作为生产级代码审计引擎接入 CI/CD。

主要原因是:检测逻辑以行级正则为主,数据流追踪较浅;报告存在 HTML 注入风险;打包和 CI 有明显 bug;README 声称支持的语言与实际扫描器支持不一致。


项目结构与能力概览

项目核心文件如下:

模块作用
audit.pyCLI 入口,处理参数、调用扫描器、生成报告
scanner/file_scanner.py遍历文件、判断是否扫描、读取源码
scanner/language_detector.py根据扩展名和内容识别语言
core/engine.py规则引擎,加载 YAML 正则规则并生成问题
core/context_analyzer.pyPython AST + 部分 JS/Java/C 正则上下文分析
core/advanced_detector.py高级检测规则与复杂度分析
core/smart_filter.py误报过滤逻辑
report/*.pyHTML、增强 HTML、JSON、SARIF 报告生成
config/rules.yaml188 条正则检测模式

静态检查结果:

  • Python 源码语法编译通过。
  • config/rules.yaml 可解析,188 条正则均能编译。
  • 测试文件中共有 59 个 test_ 函数,和 README 的“59 个测试”说法一致。
  • 压缩包包含 .git.pytest_cache__pycache__.reasonix 临时输出,不适合作为干净交付包。

高风险问题

1. HTML 报告存在存储型 XSS 风险

report/html_report.pyreport/enhanced_html_report.py 使用:

python
from 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 报告被浏览器打开后可能执行脚本。

影响:高。 这个工具本身用于扫描“不可信代码仓库”,报告页面必须把源码内容当作不可信输入处理。

建议修复:

python
from 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>

2. README 声称支持 TypeScript / Go / Rust,但扫描器实际不会扫描这些文件

config/rules.yaml 里有 TypeScript、Go、Rust 规则,language_detector.py 也认识 .ts.tsx.go.rs,但 scanner/file_scanner.pySUPPORTED_EXTENSIONS 只包含:

python
.py, .pyw, .js, .jsx, .java, .php, .c, .h, .cpp, .cc, .cxx, .hpp, .hxx

所以实际扫描目录时,.ts.tsx.go.rs 文件会被直接跳过。

影响:高。 README 和实际能力不一致,CI 接入后会产生安全盲区。

建议修复:

python
SUPPORTED_EXTENSIONS = { ".py", ".pyw", ".js", ".jsx", ".ts", ".tsx", ".java", ".go", ".rs", ".php", ".phtml", ".php3", ".php4", ".php5", ".c", ".h", ".cpp", ".cc", ".cxx", ".hpp", ".hxx", }

3. pyproject.toml 的 CLI 入口是坏的

pyproject.toml 里写的是:

toml
[project.scripts] code-audit = "audit:main"

audit.py 中没有 main() 函数,只有:

python
if __name__ == '__main__': tool = AuditTool() tool.run()

所以通过包安装后运行 code-audit 会失败。

建议修复:

python
def main(): tool = AuditTool() tool.run() if __name__ == "__main__": main()

4. CI 配置会因为输出目录不存在而失败

GitHub Actions 和 GitLab CI 都调用了类似:

bash
python audit.py --dir . --report json --output audit_results/self_audit

但报告生成器里直接:

python
with open(output_path, 'w', encoding='utf-8') as f:

没有创建 audit_results/ 目录。因此 CI 中大概率会报 FileNotFoundError

建议在所有报告生成器里加:

python
dir_name = os.path.dirname(output_path) if dir_name: os.makedirs(dir_name, exist_ok=True)

或者 CI 里先:

bash
mkdir -p audit_results

检测准确性问题

1. 污点追踪非常浅,容易漏报

README 宣传了“污点源 → 传播 → 汇聚点”,但实际 Python 污点分析主要只处理这种模式:

python
user_input = request.args.get("id") dangerous(user_input)

它不完整追踪中间变量传播。例如:

python
user_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 注入漏报。


2. 正则规则区分大小写,硬编码凭证容易漏报

test_sample.py 中有:

python
DB_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 里使用:

python
re.search(pattern, line)

没有 re.IGNORECASE。所以 DB_PASSWORDAPI_SECRET 这种常见大写常量容易漏掉。

建议对规则统一加 re.IGNORECASE,或在 YAML 中使用 (?i)

regex
(?i)\b\w*(password|passwd|pwd|secret|token|api[_-]?key)\w*\s*=\s*['"][^'"]{8,}['"]

3. CRITICAL 严重级别处理不完整

config/rules.yaml 定义了:

yaml
CRITICAL: 5 HIGH: 4 MEDIUM: 3 LOW: 2

但 CLI 参数只允许:

python
choices=['LOW', 'MEDIUM', 'HIGH']

控制台摘要也只打印:

python
for severity in ['HIGH', 'MEDIUM', 'LOW']:

增强 HTML 报告也只统计 HIGH / MEDIUM / LOW。

结果是:CRITICAL 问题可能被扫描出来,但在摘要和报告统计里被弱化或漏展示。

建议所有统计和 UI 中加入 CRITICAL,并允许:

python
choices=['LOW', 'MEDIUM', 'HIGH', 'CRITICAL']

4. 规则名不一致导致误报过滤失效

例如配置里的 Python XSS 规则名是:

yaml
name: XSS攻击-Python

但误报过滤里判断的是:

python
elif rule_name == 'XSS攻击':

类似问题也出现在 SQL 注入、命令注入等规则上。带语言后缀的规则名不会命中过滤分支。

建议规则结构中新增稳定 ID,例如:

yaml
id: xss name: XSS攻击-Python

代码里用 id 判断逻辑,不要用展示名称判断。


工程质量问题

1. 发布包不干净

压缩包包含:

  • .git/
  • .git/logs/HEAD
  • .pytest_cache/
  • __pycache__/
  • .reasonix/truncated-results/
  • .pyc 文件

.git/config 中还能看到远程仓库地址:

text
https://cdn.gh-proxy.org/https://github.com/EtherealXTHY/code-audit-assistant.git

.git/logs/HEAD 中出现了本地环境信息:

text
root <root@kali.(none)>

这些不一定是漏洞,但属于交付泄露和供应链卫生问题。

建议打包前清理:

bash
rm -rf .git .pytest_cache __pycache__ */__pycache__ .reasonix find . -name "*.pyc" -delete

并用 .gitignore / .dockerignore / 打包白名单控制发布内容。


2. requirements.txt 混入开发依赖和标准库

requirements.txt 包含:

text
argparse pytest flake8 mypy

其中 argparse 是 Python 标准库,不需要安装;pytestflake8mypy 应该放到 dev 依赖,不应进入运行时依赖。

建议:

requirements.txt

text
pyyaml pygments jinja2

requirements-dev.txt

text
pytest flake8 mypy

3. 目录排除逻辑太简单

默认排除:

python
['.git', '__pycache__', 'node_modules', 'venv', 'env']

但没有排除:

text
.pytest_cache .mypy_cache .ruff_cache dist build coverage vendor

而且只按目录名精确匹配,不支持 glob / 正则 / .gitignore 语义。


4. 扫描不可信仓库时可能读取符号链接文件

os.walk() 默认不跟随目录符号链接,但对文件符号链接,open(file_path) 会跟随。恶意仓库可以放一个指向系统敏感文件的 symlink,扫描器可能读取并把片段写入报告。

建议扫描时判断:

python
if os.path.islink(file_path): return []

或者限制 realpath 必须仍在扫描根目录下。


值得保留的优点

这个项目不是完全没价值,作为原型有这些优点:

  • 结构清晰,模块分层比较明确。
  • YAML 规则集中管理,便于扩展。
  • 报告格式覆盖 HTML / JSON / SARIF,方向正确。
  • 有单元测试和集成测试意识。
  • Python AST 分析、误报过滤、复杂度评分都有雏形。
  • 使用 yaml.safe_load(),没有明显 YAML 反序列化风险。
  • 我没有看到明显的后门、自动联网、主动命令执行逻辑;测试样本里的 os.systempickle.loads 是漏洞样例,不是工具自身运行路径。

优先修复清单

按优先级建议这样改:

  1. 修复 HTML 报告 XSS:开启 Jinja2 autoescape,所有源码、文件名、描述字段做转义。
  2. 修复 CLI 入口:补 main(),保证 code-audit 安装后可运行。
  3. 修复 CI 输出目录问题:报告生成前自动 os.makedirs()
  4. 统一严重级别:全链路支持 CRITICAL
  5. 补齐扫描扩展名.ts.tsx.go.rs
  6. 规则使用稳定 ID:不要用中文展示名做逻辑判断。
  7. 增强污点传播:支持变量间传播、字符串拼接、f-string、format、函数返回值。
  8. 清理发布包:删除 .git、缓存、pyc、临时分析日志。
  9. 依赖分层和版本锁定:运行依赖和开发依赖分开。
  10. 加入 symlink 防护和扫描超时/大小限制

评分

我会这样评估:

维度评分
项目结构7/10
可运行性5/10
检测准确性4/10
报告能力6/10
安全性4/10
CI/CD 可用性4/10
生产可用性3/10

最终评价:适合作为代码审计工具原型,不适合直接用于生产安全门禁。

このQ&Aを共有