Python安全扫描器Skill sast-bandit

Python安全扫描器(基于Bandit)是一款专业的静态应用程序安全测试(SAST)工具,专门用于检测Python代码中的安全漏洞、编码反模式和潜在风险。它能自动识别硬编码密码、SQL注入、命令注入、弱加密算法、不安全的API使用等常见安全问题,并生成详细的扫描报告,映射到CWE和OWASP安全框架。该工具适用于开发人员、安全工程师和DevOps团队,可集成到CI/CD流水线、预提交钩子和代码审查流程中,帮助构建安全的Python应用程序,提升代码质量,满足合规要求。关键词:Python安全扫描,静态代码分析,SAST工具,Bandit,漏洞检测,CWE,OWASP,CI/CD安全,代码审计,安全开发。

安全审计 0 次安装 0 次浏览 更新于 2/28/2026

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:


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:确定发现问题的优先级

使用以下优先级矩阵集中进行修复工作:

  1. 关键:高严重性 + 高置信度
  2. :高严重性 或 中严重性 + 高置信度
  3. :中严重性 + 中置信度
  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问题,并提供修复指导。

故障排除

问题:误报过多

解决方案

  1. 使用置信度过滤:bandit -r . -i(仅高置信度)
  2. 排除测试文件:bandit -r . --exclude /tests/
  3. 自定义 .bandit.yaml 以跳过已知安全模式的特定测试
  4. 审查并使用带有理由的行内 # nosec 注释进行抑制

问题:大型代码库上的扫描性能

解决方案

  1. 排除依赖项:将 /venv//.venv//site-packages/ 添加到 .bandit.yaml 的exclude_dirs中
  2. 使用多进程:Bandit自动对目录进行并行处理
  3. 在CI/CD中仅扫描更改的文件:git diff --name-only origin/main | grep '.py$' | xargs bandit

问题:缺少特定的漏洞类型

解决方案

  1. 检查启用的测试:bandit -l(列出所有测试)
  2. 确保测试未在 .bandit.yaml 中被跳过
  3. 与Semgrep结合以获得额外的覆盖范围(例如,业务逻辑漏洞)
  4. 定期更新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

参考资料