name: sast-semgrep description: > 使用Semgrep进行静态应用程序安全测试(SAST),用于漏洞检测、安全代码审查和基于OWASP及CWE框架的安全编码指导。 使用场景:(1)跨多种语言扫描代码中的安全漏洞,(2)使用基于模式的检测进行安全代码审查,(3)将SAST检查集成到CI/CD流水线中,(4)提供映射到OWASP Top 10和CWE的修复指导,(5)为组织特定模式创建自定义安全规则,(6)分析依赖项中的已知漏洞。 version: 0.1.0 maintainer: SirAppSec category: appsec tags: [sast, semgrep, 漏洞扫描, 代码安全, owasp, cwe, 安全审查] frameworks: [OWASP, CWE, SANS-25] dependencies: python: “>=3.8” packages: [semgrep] tools: [git] references:
使用Semgrep进行SAST
概述
使用Semgrep(一个快速、开源的静态分析工具)执行全面的静态应用程序安全测试。此技能提供自动化的漏洞检测、安全代码审查工作流以及映射到OWASP Top 10和CWE标准的修复指导。
快速开始
扫描代码库以查找安全漏洞:
semgrep --config=auto --severity=ERROR --severity=WARNING /path/to/code
使用OWASP Top 10规则集运行:
semgrep --config="p/owasp-top-ten" /path/to/code
核心工作流
工作流1:初始安全扫描
- 识别代码库中的主要语言
- 使用适当的规则集运行
scripts/semgrep_scan.py - 解析发现项并按严重性(CRITICAL, HIGH, MEDIUM, LOW)分类
- 将发现项映射到OWASP Top 10和CWE类别
- 生成优先修复报告
工作流2:安全代码审查
- 对于拉取请求或提交,在更改的文件上运行针对性扫描
- 使用
semgrep --diff仅扫描修改的代码 - 将高严重性发现项标记为阻塞性问题
- 从
references/remediation_guide.md提供内联修复指导 - 将发现项链接到安全编码模式
工作流3:自定义规则开发
- 识别要检测的组织特定安全模式
- 使用
assets/rule_template.yaml以YAML格式创建自定义Semgrep规则 - 针对已知易受攻击的代码样本测试规则
- 将自定义规则集成到CI/CD流水线中
- 在
references/custom_rules.md中记录规则
工作流4:CI/CD集成
- 使用
assets/ci_config_examples/将Semgrep添加到CI/CD流水线 - 为拉取请求配置基线扫描
- 设置严重性阈值(在CRITICAL/HIGH时失败)
- 为安全仪表板生成SARIF输出
- 跟踪指标:发现的漏洞、修复率、误报
安全注意事项
- 敏感数据处理:Semgrep在本地扫描代码;确保扫描结果不会泄露机密或专有代码模式。使用
--max-lines-per-finding限制输出。 - 访问控制:Semgrep扫描需要源代码的读取权限。将扫描结果访问权限限制在授权的安全和开发团队。
- 审计日志:记录所有扫描执行的时间戳、用户、提交哈希和发现项计数,以便合规审计。
- 合规性:SAST扫描支持SOC2、PCI-DSS和GDPR合规要求。维护扫描历史和修复跟踪。
- 安全默认值:使用
--config=auto进行平衡检测。对于安全关键应用程序,使用--config="p/security-audit"以获得全面覆盖。
语言支持
Semgrep支持30多种语言,包括:
- Web:JavaScript, TypeScript, Python, Ruby, PHP, Java, C#, Go
- 移动端:Swift, Kotlin, Java (Android)
- 基础设施:Terraform, Dockerfile, YAML, JSON
- 其他:C, C++, Rust, Scala, Solidity
捆绑资源
脚本
scripts/semgrep_scan.py- 具有OWASP/CWE映射和报告功能的全功能扫描scripts/baseline_scan.sh- 用于CI/CD的快速基线扫描scripts/diff_scan.sh- 仅扫描更改的文件(用于PR)
参考资料
references/owasp_cwe_mapping.md- 带有Semgrep规则的OWASP Top 10到CWE映射references/remediation_guide.md- 按类别划分的漏洞修复模式references/rule_library.md- 精选的有用Semgrep规则集列表
资产
assets/rule_template.yaml- 用于创建自定义Semgrep规则的模板assets/ci_config_examples/- CI/CD集成示例(GitHub Actions, GitLab CI)assets/semgrep_config.yaml- 推荐的Semgrep配置
常见模式
模式1:每日安全基线扫描
# 运行全面扫描并生成报告
scripts/semgrep_scan.py --config security-audit \
--output results.json \
--format json \
--severity HIGH CRITICAL
模式2:拉取请求安全门
# 仅扫描更改的文件,在HIGH/CRITICAL时失败
scripts/diff_scan.sh --fail-on high \
--base-branch main \
--output sarif
模式3:漏洞研究
# 搜索特定的漏洞模式
semgrep --config "r/javascript.lang.security.audit.xss" \
--json /path/to/code | jq '.results'
模式4:自定义规则验证
# 针对易受攻击的样本测试自定义规则
semgrep --config assets/custom_rules.yaml \
--test tests/vulnerable_samples/
集成点
CI/CD集成
- GitHub Actions:使用
semgrep/semgrep-action@v1并上传SARIF - GitLab CI:作为安全扫描作业运行,并生成工件报告
- Jenkins:作为构建步骤执行,并与质量门集成
- pre-commit hooks:在暂存文件上运行轻量级扫描
请参阅 assets/ci_config_examples/ 获取即用型配置。
安全工具集成
- SIEM/SOAR:以JSON/SARIF格式导出发现项以供摄取
- 漏洞管理:与Jira、DefectDojo或ThreadFix集成
- IDE集成:使用Semgrep IDE插件进行实时检测
- 机密扫描:与trufflehog、gitleaks等工具结合使用
SDLC集成
- 需求阶段:定义安全需求和自定义规则
- 开发:IDE插件提供实时反馈
- 代码审查:在PR工作流中进行自动化安全审查
- 测试:与安全测试框架集成
- 部署:生产前的最终安全门
严重性分类
Semgrep发现项按严重性分类:
- CRITICAL:可利用的漏洞(SQLi, RCE, 身份验证绕过)
- HIGH:重大安全风险(XSS, CSRF, 敏感数据暴露)
- MEDIUM:安全弱点(弱加密、缺少验证)
- LOW:具有安全隐患的代码质量问题
- INFO:安全最佳实践建议
性能优化
对于大型代码库:
# 使用 --jobs 进行并行扫描
semgrep --config auto --jobs 4
# 排除供应商/测试代码
semgrep --config auto --exclude "vendor/" --exclude "test/"
# 使用轻量级规则集以获得更快的反馈
semgrep --config "p/owasp-top-ten" --exclude-rule "generic.*"
故障排除
问题:误报过多
解决方案:
- 使用
--exclude-rule禁用嘈杂的规则 - 创建
.semgrepignore文件以排除误报模式 - 使用
--severity过滤调整规则 - 为确认的误报添加
# nosemgrep注释(需提供理由)
问题:扫描时间过长
解决方案:
- 对供应商/生成的代码使用
--exclude - 增加
--jobs以进行并行处理 - 使用针对性规则集而非
--config=auto - 使用
--diff运行增量扫描
问题:遗漏漏洞
解决方案:
- 使用全面的规则集:
p/security-audit或p/owasp-top-ten - 查阅
references/rule_library.md获取专业规则 - 为组织特定模式创建自定义规则
- 与动态分析(DAST)和依赖项扫描结合使用
高级用法
创建自定义规则
有关编写有效Semgrep规则的指导,请参阅 references/rule_library.md。
使用 assets/rule_template.yaml 作为起点。
示例规则结构:
rules:
- id: custom-sql-injection
patterns:
- pattern: execute($QUERY)
- pattern-inside: |
$QUERY = $USER_INPUT + ...
message: 来自用户输入拼接的潜在SQL注入
severity: ERROR
languages: [python]
metadata:
cwe: "CWE-89"
owasp: "A03:2021-注入"
OWASP Top 10覆盖范围
此技能提供对所有OWASP Top 10 2021类别的检测。
有关完整的覆盖矩阵,请参阅 references/owasp_cwe_mapping.md。
最佳实践
- 先建立基线:在强制执行门控之前建立安全基线
- 渐进式推出:从HIGH/CRITICAL开始,随时间推移扩展到MEDIUM
- 开发人员培训:教育团队了解常见漏洞和修复方法
- 规则维护:定期更新规则集并根据您的技术栈进行调整
- 指标跟踪:监控漏洞趋势、平均修复时间和误报率
- 深度防御:与DAST、SCA和手动代码审查相结合