用途
本技能用于通过静态分析在源代码中识别安全漏洞。适用于以下场景:
- 实施安全的 SDLC(软件开发生命周期)实践
- 向 CI/CD 中添加安全门禁
- 自动化代码安全审查
- 在部署前发现漏洞
- 满足合规要求
前置条件
- 源代码访问权限
- CI/CD 流水线
- 安装 SAST 工具
主要能力
该技能涵盖多种静态应用程序安全测试工具的使用方法,并提供工具对比:
| 工具 | 许可证 | 语言支持 | 最佳用途 |
|---|---|---|---|
| Semgrep | OSS/商业 | 30+ | 自定义规则、速度 |
| CodeQL | 免费(GitHub) | 10+ | 深度分析 |
| SonarQube | OSS/商业 | 25+ | 质量 + 安全 |
| Bandit | OSS | Python | Python 项目 |
| Brakeman | OSS | Ruby | Rails 应用 |
Semgrep
安装方式:
# 通过 pip 安装
pip install semgrep
# 或通过 Homebrew
brew install semgrep
基础用法:
# 使用默认规则运行
semgrep --config auto .
# 运行指定规则集
semgrep --config p/security-audit .
semgrep --config p/owasp-top-ten .
semgrep --config p/ci .
# 扫描指定语言
semgrep --config p/python .
semgrep --config p/javascript .
# 输出格式
semgrep --config auto --json -o results.json .
semgrep --config auto --sarif -o results.sarif .
支持自定义规则,示例包括硬编码密码检测、SQL 注入检测和不安全随机数检测,规则中可关联 CWE 和 OWASP 元数据,并支持自动修复建议(fix 字段)。
CI 配置示例(GitHub Actions)使用 returntocorp/semgrep 容器并执行 semgrep ci。
CodeQL
提供完整的 GitHub Actions 工作流配置,包含初始化 CodeQL、自动构建和执行分析步骤,支持多语言矩阵策略,可添加 security-and-quality 查询集。
支持自定义查询,示例为使用数据流和污点跟踪进行 Python SQL 注入检测的 .ql 查询文件。
SonarQube
提供 Docker Compose 配置,包含 SonarQube 服务和 PostgreSQL 数据库服务。
扫描器配置示例(sonar-project.properties)涵盖项目键、名称、版本、源码目录、测试目录、排除项、语言设置、覆盖率报告路径以及质量门禁等待选项。
CI 集成示例使用 sonarsource/sonarqube-scan-action 和 sonarsource/sonarqube-quality-gate-action。
特定语言工具
Python (Bandit):
# 安装
pip install bandit
# 运行扫描
bandit -r src/ -f json -o bandit-report.json
# 使用配置
bandit -r src/ -c bandit.yaml
支持配置文件(如跳过指定检查编号、排除目录、对 assert 使用的跳过设置)。
JavaScript (ESLint Security):
npm install eslint eslint-plugin-security --save-dev
提供 .eslintrc.js 配置示例,启用 plugin:security/recommended 并配置多项安全规则(如对象注入检测、非字面量正则检测、不安全正则检测、缓冲区无断言检测、带表达式 eval 检测、方法覆盖前无 CSRF 检测、可能的时序攻击检测等)。
Ruby (Brakeman):
# 安装
gem install brakeman
# 运行扫描
brakeman -o brakeman-report.json -f json
# CI 配置
brakeman --no-exit-on-warn --no-exit-on-error -o report.html
质量门禁
提供 SonarQube 质量门禁的 JSON 定义示例,涵盖新代码安全评级、新漏洞数、新安全热点审查率等条件。
提供自定义门禁脚本(bash)示例,使用 jq 统计结果中 critical 和 high 级别漏洞数量,并根据阈值决定通过或失败。
使用方式
- 根据项目语言和需求选择合适的 SAST 工具
- 安装工具并配置扫描规则(可使用内置规则集或自定义规则)
- 在本地或 CI/CD 中执行扫描
- 设置质量门禁,根据漏洞严重程度决定是否阻断流水线
- 定期运行并跟踪趋势
常见问题与解决方案
- 误报过多:调整规则、添加抑制、使用基线
- 扫描缓慢:增量扫描、并行执行、排除测试文件
- 覆盖不全:添加自定义规则、组合多个工具
最佳实践
- 在每个 PR/提交上运行
- 为现有代码建立基线
- 按严重程度和可利用性排序
- 为代码库维护自定义规则
- 与 IDE 集成以获得早期反馈
- 跟踪长期趋势
- 记录误报抑制
- 与 DAST 结合实现全面覆盖
相关技能
- dast-scanning:动态测试
- dependency-scanning:依赖漏洞
- github-actions:CI 集成