| name | auditing-python-security |
| description | Audits Python libraries for security vulnerabilities using Bandit, pip-audit, Semgrep, and detect-secrets. Identifies SQL injection, command injection, hardcoded credentials, weak cryptography, and insecure deserialization. Use when reviewing library security, setting up security scanning in CI, or implementing secure coding patterns. |
Python Security Auditing
Quick Start
bandit -r src/ -ll
pip-audit
detect-secrets scan > .secrets.baseline
Tool Configuration
Bandit (.bandit):
exclude_dirs: [tests/, docs/, .venv/]
skips: [B101]
pip-audit:
pip-audit -r requirements.txt
pip-audit --fix
Common Vulnerabilities
| Issue | Bandit ID | Fix |
|---|
| SQL injection | B608 | Use parameterized queries |
| Command injection | B602 | subprocess without shell=True |
| Hardcoded secrets | B105, B106 | Environment variables |
| Weak crypto | B303 | Use SHA-256+, bcrypt for passwords |
| Pickle untrusted data | B301 | Use JSON instead |
| Path traversal | B108 | Validate with Path.resolve() |
Secure Patterns
conn.execute("SELECT * FROM users WHERE id = ?", (user_id,))
subprocess.run(["cat", filename], check=True)
API_KEY = os.environ.get("API_KEY")
base = Path("/data").resolve()
file_path = (base / filename).resolve()
if not file_path.is_relative_to(base):
raise ValueError("Invalid path")
CI Integration
- run: bandit -r src/ -ll
- run: pip-audit
- run: detect-secrets scan --all-files
For detailed patterns, see:
Audit Checklist
Code:
- [ ] No SQL injection (parameterized queries)
- [ ] No command injection (no shell=True)
- [ ] No hardcoded secrets
- [ ] No weak crypto (MD5/SHA1)
- [ ] Input validation on external data
- [ ] Path traversal prevention
Dependencies:
- [ ] pip-audit clean
- [ ] Minimal dependencies
- [ ] From trusted sources
CI:
- [ ] Security scan on every PR
- [ ] Weekly dependency scan
Learn More
This skill is based on the Security section of the Guide to Developing High-Quality Python Libraries by Will McGinnis. See these posts for deeper coverage: