name: sast-bandit description: > 使用Bandit SAST进行Python安全漏洞检测,支持CWE和OWASP映射。 适用场景:(1) 扫描Python代码中的安全漏洞和反模式, (2) 识别硬编码密钥、SQL注入、命令注入和不安全的API, (3) 为CI/CD流水线生成带有严重性分类的安全报告, (4) 提供带有安全框架参考的修复指导, (5) 在开发工作流程中强制执行Python安全最佳实践。 version: 0.1.0 maintainer: SirAppSec category: appsec tags: [sast, bandit, python, 漏洞扫描, owasp, cwe, 安全代码检查] frameworks: [OWASP, CWE] dependencies: python: “>=3.8” packages: [bandit] references:
- https://github.com/PyCQA/bandit
- https://bandit.readthedocs.io/
- https://owasp.org/www-project-top-ten/
Bandit Python SAST
概述
Bandit是一款专注于安全的Python静态分析工具,用于识别常见的安全漏洞和编码反模式。它将Python代码解析为抽象语法树(AST),并执行安全插件来检测诸如硬编码凭证、SQL注入、命令注入、弱加密和不安全的API使用等问题。Bandit提供可操作的报告,其严重性分类与行业安全标准保持一致。
快速开始
扫描Python文件或目录以查找安全漏洞:
# 安装Bandit
pip install bandit
# 扫描单个文件
bandit suspicious_file.py
# 递归扫描整个目录
bandit -r /path/to/python/project
# 生成JSON报告
bandit -r project/ -f json -o bandit_report.json
# 使用自定义配置扫描
bandit -r project/ -c .bandit.yaml
核心工作流程
步骤1:安装和配置Bandit
通过pip安装Bandit:
pip install bandit
创建配置文件 .bandit 或 .bandit.yaml 以自定义扫描:
# .bandit.yaml
exclude_dirs:
- /tests/
- /venv/
- /.venv/
- /node_modules/
skips:
- B101 # 在测试文件中跳过assert_used检查
tests:
- B201 # Flask应用以debug=True运行
- B301 # Pickle使用
- B601 # Shell注入
- B602 # subprocess中的Shell=True
步骤2:执行安全扫描
对Python代码库运行Bandit:
# 基本扫描,设置严重性阈值
bandit -r . -ll # 仅报告中/高严重性问题
# 全面扫描,输出详细信息
bandit -r . -f json -o report.json -v
# 使用置信度过滤扫描
bandit -r . -i # 仅显示高置信度发现
# 排除特定测试
bandit -r . -s B101,B601
步骤3:分析结果
Bandit报告发现的问题包含:
- 问题类型:漏洞类别(例如,hardcoded_password, sql_injection)
- 严重性:低、中、高
- 置信度:低、中、高
- CWE:通用缺陷枚举参考
- 位置:文件路径和行号
示例输出:
>> 问题: [B105:hardcoded_password_string] 可能的硬编码密码: 'admin123'
严重性: 中等 置信度: 中等
CWE: CWE-259 (使用硬编码密码)
位置: app/config.py:12
步骤4:确定发现问题的优先级
使用以下优先级矩阵集中进行修复工作:
- 关键:高严重性 + 高置信度
- 高:高严重性 或 中严重性 + 高置信度
- 中:中严重性 + 中置信度
- 低:低严重性 或 低置信度
步骤5:修复漏洞
对于每个发现的问题,请查阅捆绑的 references/remediation_guide.md 以获取安全的编码模式。常见的修复策略包括:
- 硬编码密钥(B105, B106):使用环境变量或密钥管理服务
- SQL注入(B608):使用SQLAlchemy或psycopg2的参数化查询
- 命令注入(B602, B605):避免使用
shell=True,使用shlex.split()进行参数解析 - 弱加密(B303, B304):将MD5/SHA1替换为SHA256/SHA512或用于密码的bcrypt
- 不安全的反序列化(B301):避免使用pickle,使用带有模式验证的JSON或MessagePack
步骤6:集成到CI/CD中
将Bandit添加到CI/CD流水线中以强制执行安全门控:
# .github/workflows/security-scan.yml
name: 安全扫描
on: [push, pull_request]
jobs:
bandit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: 安装Bandit
run: pip install bandit
- name: 运行Bandit
run: bandit -r . -f json -o bandit-report.json
- name: 检查高严重性问题
run: bandit -r . -ll -f txt || exit 1
使用捆绑的脚本 scripts/bandit_analyzer.py 进行带有OWASP映射的增强报告。
安全注意事项
-
敏感数据处理:Bandit报告可能包含带有硬编码凭证的代码片段。确保报告安全存储并限制访问。使用
--no-code标志从报告中排除代码片段。 -
访问控制:在具有对源代码只读访问权限的沙盒CI/CD环境中运行Bandit。限制写入权限以防止篡改安全配置。
-
审计日志:记录所有Bandit执行的时间戳、扫描范围、发现数量和操作员身份,用于安全审计和合规目的。
-
合规性:Bandit通过识别安全弱点来支持SOC2、PCI-DSS和GDPR合规性。记录扫描频率、修复时间表和例外批准,以供审计追踪。
-
误报:手动审查低置信度发现。谨慎使用行内
# nosec注释,并在代码审查过程中记录理由。
捆绑资源
脚本 (scripts/)
bandit_analyzer.py- 增强的Bandit包装器,可解析JSON输出,将发现映射到OWASP Top 10,生成HTML报告,并与工单系统集成。用于全面的安全报告。
参考资料 (references/)
-
remediation_guide.md- 针对常见Bandit发现的详细安全编码模式,包括SQLAlchemy参数化、安全subprocess使用和加密最佳实践的代码示例。在修复特定漏洞类型时查阅。 -
cwe_owasp_mapping.md- Bandit问题代码、CWE标识符和OWASP Top 10类别之间的完整映射。用于安全框架对齐和合规性报告。
资源文件 (assets/)
-
bandit_config.yaml- 生产就绪的Bandit配置,包含优化的测试选择、常见误报的排除模式以及严重性阈值。用作项目的基线配置。 -
pre-commit-config.yaml- 用于Bandit集成的预提交钩子配置。防止提交带有高严重性发现的问题。
常见模式
模式1:基线安全扫描
为遗留代码库建立安全基线:
# 生成基线报告
bandit -r . -f json -o baseline.json
# 将未来扫描与基线进行比较
bandit -r . -f json -o current.json
diff <(jq -S . baseline.json) <(jq -S . current.json)
模式2:拉取请求中的安全门控
阻止合并存在高严重性发现的问题:
# 如果发现高严重性问题,则退出并报错
bandit -r . -lll -f txt
if [ $? -ne 0 ]; then
echo "检测到高严重性安全问题 - 阻止合并"
exit 1
fi
模式3:渐进式安全加固
逐步提高安全标准:
# 阶段1:仅阻止关键问题(高严重性 + 高置信度)
bandit -r . -ll -i
# 阶段2:阻止高严重性问题
bandit -r . -ll
# 阶段3:阻止中等级别及以上的问题
bandit -r . -l
模式4:抑制误报
在代码中记录带有理由的例外情况:
# 示例:为内部序列化抑制pickle警告
import pickle # nosec B301 - 内部缓存,非用户输入
def load_cache(file_path):
with open(file_path, 'rb') as f:
return pickle.load(f) # nosec B301
集成点
-
CI/CD:作为GitHub Actions、GitLab CI、Jenkins流水线阶段或预提交钩子集成。使用
scripts/bandit_analyzer.py进行增强报告。 -
安全工具:与Semgrep结合以获得额外的SAST覆盖,与Safety结合进行依赖项扫描,与SonarQube结合进行代码质量指标分析。
-
SDLC:在开发期间(预提交)、代码审查(PR检查)和发布门控(流水线阶段)执行。为遗留代码建立基线扫描,并为新代码强制执行严格检查。
-
工单集成:使用
scripts/bandit_analyzer.py自动为高严重性发现创建Jira/GitHub问题,并提供修复指导。
故障排除
问题:误报过多
解决方案:
- 使用置信度过滤:
bandit -r . -i(仅高置信度) - 排除测试文件:
bandit -r . --exclude /tests/ - 自定义
.bandit.yaml以跳过已知安全模式的特定测试 - 审查并使用带有理由的行内
# nosec注释进行抑制
问题:大型代码库上的扫描性能
解决方案:
- 排除依赖项:将
/venv/、/.venv/、/site-packages/添加到.bandit.yaml的exclude_dirs中 - 使用多进程:Bandit自动对目录进行并行处理
- 在CI/CD中仅扫描更改的文件:
git diff --name-only origin/main | grep '.py$' | xargs bandit
问题:缺少特定的漏洞类型
解决方案:
- 检查启用的测试:
bandit -l(列出所有测试) - 确保测试未在
.bandit.yaml中被跳过 - 与Semgrep结合以获得额外的覆盖范围(例如,业务逻辑漏洞)
- 定期更新Bandit:
pip install --upgrade bandit
问题:与预提交钩子集成
解决方案:
使用捆绑的 assets/pre-commit-config.yaml:
- repo: https://github.com/PyCQA/bandit
rev: '1.7.5'
hooks:
- id: bandit
args: ['-ll', '--recursive', '--configfile', '.bandit.yaml']
安装钩子:pre-commit install