RuleForge-SAST实践
基于Semgrep的SAST工具实践
RuleForge-SAST:基于 Semgrep 的轻量级 SAST 漏洞检测工具实践
一、项目背景
随着软件规模不断扩大,人工代码审计成本越来越高。
传统人工审计流程:
开发代码
|
↓
安全人员人工阅读
|
↓
发现漏洞
|
↓
修复验证
存在问题:
- 效率低
- 容易遗漏
- 难以持续检测
因此,希望实现一个简单的 SAST 工具,通过安全规则自动发现代码中的安全问题,并验证漏洞修复效果。
二、什么是 SAST?
SAST(Static Application Security Testing)
中文:
静态应用安全测试
SAST 的特点:
- 不运行程序
- 直接分析源码
- 根据安全规则发现漏洞
基本流程:
源码
|
↓
规则匹配
|
↓
漏洞报告
|
↓
修复验证
常见工具:
- Semgrep
- SonarQube
- CodeQL
三、项目介绍
项目名称
RuleForge-SAST
项目简介
一个基于 Semgrep 的轻量级静态代码安全检测工具。
实现:
- 漏洞规则检测
- 代码差异分析
- Patch 修复验证
当前实现功能
- ✅ 自定义漏洞检测规则
- ✅ Semgrep 扫描封装
- ✅ Git Diff 分析
- ✅ Patch 修复验证
四、项目整体架构
整体流程:
用户代码
|
↓
RuleForge-SAST
|
-----------------
| |
规则引擎 Diff分析
| |
↓ ↓
Semgrep Git Patch
|
↓
漏洞结果
五、核心功能实现
1. 自定义漏洞规则
例如 PHP 反序列化漏洞:
危险代码:
<?php
unserialize($_GET["cmd"]);
?>
Semgrep 规则:
rules:
- id: php-dangerous-unserialize
languages:
- php
message: Dangerous unserialize usage
severity: ERROR
执行检测:
semgrep scan \
--config rules/php-unserialize.yaml \
target
检测结果:
test.php
Dangerous unserialize usage
2. 规则优化
初始规则:
检测:
unserialize($x)
但是存在误报。
例如安全写法:
unserialize(
$data,
[
"allowed_classes"=>false
]
);
因此增加:
pattern-not
排除安全情况。
效果:
降低安全扫描误报。
3. Git Diff 分析
为什么需要 Diff?
真实开发环境中:
不是每天扫描整个项目。
通常流程:
提交代码
↓
查看修改部分
↓
检测新增风险
通过 GitPython 获取代码变化:
repo.git.diff(
old_commit,
new_commit
)
输出示例:
修改前:
- unserialize($_GET["cmd"]);
修改后:
+ unserialize(
+ $_GET["cmd"],
+ ["allowed_classes"=>false]
+ )
4. Patch 修复验证
目标:
判断漏洞是否真正修复。
流程:
漏洞版本
↓
Semgrep扫描
↓
修改代码
↓
再次扫描
↓
比较结果
示例:
修复前:
Finding: 1
修复后:
Finding: 0
输出:
FIXED
六、项目运行
环境
- Python
- Semgrep
- GitPython
安装依赖
pip install -r requirements.txt
执行扫描
semgrep scan \
--config rules/php-unserialize.yaml \
target
七、项目收获
通过该项目学习:
- SAST 工具设计
- Semgrep 规则编写
- PHP 漏洞检测
- Git Diff 机制
- 自动化安全验证
同时理解:
漏洞检测不仅是发现问题,更重要的是验证修复是否真正有效。
八、未来规划
增加更多漏洞规则
计划支持:
- SQL 注入
- 文件上传
- 命令执行
- SSRF
增加 Web 管理界面
实现:
- 在线代码扫描
- 漏洞结果展示
- 修复验证
增加 AI 辅助分析
结合大语言模型:
实现:
- 漏洞原因分析
- 修复建议生成
- 安全规则辅助生成
支持更多语言
未来支持:
- Java
- Python
- JavaScript 等语言