Bandit 是什么
Bandit 是 Python 的安全静态检查工具(SAST):按编号匹配常见危险写法,比如在安全校验中使用 assert、反序列化不可信数据、以 shell 方式执行子进程。它不做动态测试,也不判断业务逻辑是否成立,只把可疑位置按严重级别与置信度列出来,交给人确认。
基本信息
| 定位 | Python 安全静态检查(SAST) |
|---|---|
| 典型判定 | assert 用于校验、pickle 反序列化、shell 方式执行命令 |
| 输出维度 | 严重级别与置信度 |
| 接入方式 | 命令行、提交钩子、CI 步骤 |
典型使用场景
- 上线前安全自查:快速定位高危写法
- 评审辅助:把扫描结果贴进改动里作为参考
- CI 门禁:按严重级别设定阻断条件
- 老代码梳理:按模块分批处理历史告警
- 与依赖漏洞扫描配合:一个看代码写法,一个看依赖版本
结果怎么排序处理
- 先看高严重且高置信度的条目
- 确认可达性:这段代码是否真的会被调用
- 能修的直接换写法,例如用显式判断替代 assert
- 确实无法修的,记录理由并在配置里豁免
常用命令
常用命令
bandit -r src/ # 递归扫描目录
bandit -r src/ -ll # 只看高危或高置信度
bandit -r src/ -f json -o bandit.json
bandit -r src/ --skip B101 # 按编号跳过确认为误报的检查典型判定与含义
| 编号 | 问题 | 风险 |
|---|---|---|
| B101 | 用 assert 做校验 | 优化模式下断言会被整段移除 |
| B301 | 反序列化不可信数据 | 可能构造任意对象 |
| B602 | 以 shell 方式执行子进程 | 命令注入 |
| B105 | 硬编码口令字符串 | 凭据随代码一起扩散 |
assert 在优化模式下会被移除:用它做参数校验或权限检查,运行环境一变就会静默失效。
在评审中的用法:把扫描结果当成参考而不是结论,先判断代码路径是否真的可达,再决定修复还是豁免。
误报的判断标准是可利用性:同一条规则在不同上下文里风险差别很大,先看数据来源是否可信,再决定修复优先级。
接入 CI 时按严重级别设门槛:低级别只做提示,高级别直接阻断,避免把团队推向整体豁免。
用豁免注释抹掉告警:扫描失去意义,真实问题也一起被掩盖。