使用llm来辅助静态扫描的人工审计
字数 1297 2025-08-23 18:31:34
使用LLM辅助静态扫描的人工审计系统构建指南
1. 系统概述
本系统结合静态代码扫描工具(SAST)与大型语言模型(LLM),构建一个自动化的代码审计系统。核心思想是:
- 先用静态扫描工具进行初步代码审计
- 再利用LLM辅助确认审计结果
- 通过两者的结合提高审计效率和准确性
2. 技术选型
2.1 静态扫描工具
推荐工具:
- Semgrep:规则编写简单易学,适合快速扫描
- CodeQL:强大的污点追踪能力,适合深入分析
选择理由:
- 两者都支持SARIF格式输出
- 互补性强:Semgrep快速扫描,CodeQL深入分析
2.2 输出格式
SARIF格式:
- 静态分析结果交换标准(OASIS标准)
- JSON格式,兼容性强
- 目前版本2.1.0
- 主流静态扫描工具都支持
3. LLM选择与配置
3.1 模型选择
推荐选项:
- GPT-3.5 32k API
- 考虑因素:价格、token限制(100k+)、性能
替代方案:
- 微调专用代码审计模型(需高质量数据集)
3.2 系统架构
参考项目:
- 基于Choccy项目(CodeQL前端)进行改造
- 添加Semgrep扫描和LLM分析功能
实现效果:
- 统一界面展示Semgrep/CodeQL扫描结果
- LLM分析结果与扫描结果并列展示
4. Prompt工程
4.1 基本Prompt构建
Semgrep场景:
- 包含sink点周围代码
- Token允许时包含整个文件
- 添加规则描述作为上下文
CodeQL场景:
- 包含sink点附近代码
- 包含相关source代码(利用污点分析)
- 添加规则描述
4.2 Prompt优化策略
SAST规则描述优化:
- 添加漏洞修复方法说明
- 包含企业特有修复方案
- 示例:XXE防护的各种配置方法
输入代码优化:
- 包含相关包引入信息
- 包含配置检查(如fastjson的autotype配置)
- 包含框架特定信息
4.3 规则设计策略
负优化策略:
- 放宽sink判断规则
- 保留source污点分析
- 依赖LLM降低误报率
- 提高漏洞发现覆盖率
5. 扩展应用场景
5.1 非传统SAST应用
增量API提取:
- 识别不规范编写的API
- 替代复杂的手工规则
5.2 其他安全领域应用
适用场景:
- 任何需要理解能力的任务
- 流程化工作的自动化(通过agent实现)
6. 实现示例
6.1 系统界面
展示两种扫描结果与LLM分析的并列视图:
- Semgrep扫描+LLM分析页面
- CodeQL扫描+LLM分析页面
6.2 代码示例
XXE防护代码示例:
xmlReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
xmlReader.setFeature("http://xml.org/sax/features/external-general-entities", false);
xmlReader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
factory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
factory.setProperty("javax.xml.stream.isSupportingExternalEntities", false);
7. 最佳实践
- 分层审计:先用Semgrep快速扫描,再用CodeQL深入分析
- 上下文丰富:为LLM提供尽可能多的相关代码和规则描述
- 规则平衡:在规则精确性和覆盖率之间找到平衡
- 持续优化:根据LLM反馈调整SAST规则和prompt
- 领域适配:针对企业特定框架和习惯定制prompt
8. 未来方向
- 自动化agent:实现全流程自动化审计
- 专用模型:微调领域专用代码审计模型
- 多工具集成:整合更多SAST工具的输出
- 智能交互:实现审计过程中的智能问答功能