关于 auditing-python-security
Python Security Auditing 是一项用于通过安全扫描器和安全编码检查审计 Python 项目的技能,包含 CI 指引、常见漏洞防护实践,以及避免回溯信息泄露机密的检查方法。
主要功能
- 01运行四种安全扫描器
- 02按发现项或扫描失败返回 CI 状态
- 03Bandit 与 pip-audit 配置指引
- 04常见漏洞修复与安全编码模式
- 05检查回溯输出是否泄露局部变量
适用场景
- 01发布前扫描 Python 项目
- 02依据安全发现控制 CI
- 03检查依赖项漏洞
- 04确认回溯信息不会暴露机密
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ wdm0006/ python-skills --skill auditing-python-security安装后在 Claude Code 中输入/auditing-python-security确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
CI_SECURITY.mdVULNERABILITIES.mdscripts/security_scan.py详细介绍
Python 安全审计
快速开始
# Run all four scanners (gates CI): exit 1 on a blocking finding, exit 2 when a
# requested scanner could not run, exit 0 only when every scanner ran clean:
uv run python scripts/security_scan.py .
# Tolerate scanners that are missing or hung (restores exit 0 in that case):
uv run python scripts/security_scan.py . --allow-scanner-failure
# Or individually:
uvx bandit -r src/ -ll # High-severity static analysis
uvx pip-audit . # This project's dependencies
uvx semgrep --config auto src/ # Pattern-based SAST
uvx detect-secrets scan > .secrets.baseline # Secrets detection
工具配置
Bandit (.bandit):
exclude_dirs: [tests/, docs/, .venv/]
skips: [B101] # assert_used - OK in tests
pip-audit:
uvx pip-audit -r requirements.txt # Scan requirements
uvx pip-audit --fix # Auto-fix vulnerabilities
常见漏洞
| 问题 | Bandit ID | 修复方法 |
|---|---|---|
| SQL 注入 | B608 | 使用参数化查询 |
| 命令注入 | B602 | 使用不带 shell=True 的 subprocess |
| 硬编码机密 | B105, B106 | 使用环境变量 |
| 弱加密 | B303 | 使用 SHA-256 或更强算法;密码使用 bcrypt |
| 反序列化不可信数据 | B301 | 改用 JSON |
| 路径遍历 | B108 | 使用 Path.resolve() 验证 |
安全模式
# SQL - Parameterized query
conn.execute("SELECT * FROM users WHERE id = ?", (user_id,))
# Commands - No shell
subprocess.run(["cat", filename], check=True)
# Secrets - Environment
API_KEY = os.environ.get("API_KEY")
# Paths - Validate
base = Path("/data").resolve()
file_path = (base / filename).resolve()
if not file_path.is_relative_to(base):
raise ValueError("Invalid path")
回溯不得转储帧局部变量
丰富的异常渲染器可能会打印每个堆栈帧中的所有局部变量。 这会将普通的未处理异常变成凭据泄漏:在终端或 CI 日志中渲染回溯时,API 令牌、 授权标头、请求正文和解密后的配置通常都保存在局部变量中。
在日志可能离开开发者设备的任何地方,都应禁用局部变量渲染:
from rich.traceback import install
install(show_locals=False)
不要只断言配置调用。使用哨兵机密测试已安装的异常钩子,并检查渲染后的输出。这样可以捕获后续重构替换钩子或在其他位置重新启用局部变量的情况:
import sys
def test_unhandled_traceback_does_not_expose_locals(capsys):
sentinel = "sentinel-secret-that-must-not-appear"
try:
raise RuntimeError("boom")
except RuntimeError:
exc_type, exc, traceback = sys.exc_info()
sys.excepthook(exc_type, exc, traceback)
output = capsys.readouterr()
rendered = output.out + output.err
assert "RuntimeError: boom" in rendered # proves the hook rendered
assert sentinel not in rendered
使用唯一的哨兵值,切勿使用真实凭据。断言异常已渲染,且哨兵值未出现在输出中;输出为空或绕过了渲染路径,都不应使安全测试无效通过。
CI 集成
# .github/workflows/security.yml — full workflow in CI_SECURITY.md
- uses: astral-sh/setup-uv@v5
- run: uv run python scripts/security_scan.py . --output security-report.json
如需了解详细模式,请参阅:
- scripts/security_scan.py — 运行全部四个扫描器;发现阻断性问题时以非零状态退出(退出码 1),或在请求的扫描器无法运行时退出(退出码 2;使用
--allow-scanner-failure可选择忽略)(uv run python scripts/security_scan.py .) - VULNERABILITIES.md - 漏洞类别及易受攻击→修复后的代码对
- CI_SECURITY.md - 完整的 CI 工作流、pre-commit、Dependabot 和问题分类处理
审计清单
Code:
- [ ] No SQL injection (parameterized queries)
- [ ] No command injection (no shell=True)
- [ ] No hardcoded secrets
- [ ] Exception and logging configuration cannot render frame locals containing secrets
- [ ] No weak crypto (MD5/SHA1)
- [ ] Input validation on external data
- [ ] Path traversal prevention
- [ ] SSRF fetches connect to the validated IP on every redirect hop (DNS rebinding safe)
- [ ] SSRF deny policy covers IPv4/IPv6 and CGNAT (`100.64.0.0/10`)
Dependencies:
- [ ] pip-audit clean
- [ ] Minimal dependencies
- [ ] From trusted sources
CI:
- [ ] Security scan on every PR
- [ ] Weekly dependency scan
了解更多
本技能基于 Will McGinnis 编写的 《高质量 Python 库开发指南》中的安全部分。以下文章提供了更深入的介绍:
评论
支持 Markdown