「いや、セキュリティ? ウチの案件にはそんな高度な攻撃とか来ないから大丈夫っすよ」
そう思ってる人、まだまだ多いですよね。
でも現実はどうでしょう。
普段書いているPythonコードに、うっかりセキュリティ事故が埋め込まれていることは珍しくありません。
eval() や os.system() のような関数、レビューで気づける自信はありますか? 人間は忘れるし、見落とすこともあります。
そこで登場するのが Bandit です。
Banditとは?
- OpenStack セキュリティチームが開発した Python用静的解析セキュリティツール
- ソースコードを実行せずに解析し、「ここ危ないよ」と指摘してくれる
- Linterのように見えるが、ターゲットは完全に「セキュリティ」
要するに セキュリティ専用のFlake8 みたいな存在です。
Banditが見つける脆弱性例
-
危険な関数の利用
-
eval(),exec() -
pickle.load()で任意コード実行される可能性
-
-
弱い暗号・ハッシュ
-
md5,sha1の使用
-
-
ハードコードされた秘密情報
- パスワードや鍵をコードに直書き
-
OSコマンド実行
-
os.system()やsubprocessの危険な呼び出し
-
-
Webアプリ関連
- Flask/Djangoでデバッグ設定がオン
- 安全でないテンプレート呼び出し
使い方
インストール
pip install bandit
単一ファイルをチェック
bandit app.py
プロジェクト全体を再帰的にチェック
bandit -r .
JSON形式で出力(CI/CD用)
bandit -r . -f json -o result.json
出力例
>> Issue: [B303:blacklist] Use of insecure MD5 hash function.
Severity: Medium Confidence: High
Location: app.py:42
app.py の42行目で「MD5使うな」と怒られています。
なぜBanditを使うべきか?
人間のレビューだけに頼ると、どうしても見落としが発生します。
Banditを使えば、危険な書き方を自動で検出し、CIが赤くなることで「レビュー前に気づく」仕組みが作れます。
pip-auditとの違い
-
pip-audit→ 依存ライブラリの脆弱性をチェック -
bandit→ 自作コードの危険な書き方をチェック
つまり 外はpip-audit、内はBandit で守る構図です。
CI/CDへの組み込み例(GitHub Actions)
name: Security Scan
on: [push, pull_request]
jobs:
bandit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install bandit
run: pip install bandit
- name: Run bandit
run: bandit -r . -f json -o bandit-report.json
プルリクを出すたびにBanditが走り、「危険なコード混入」を自動監視できます。
まとめ
- Bandit = Pythonコードの静的解析で脆弱性検知
-
eval,md5,os.systemなどを指摘 - pip-auditと組み合わせると「外も内も守れる」
- CIに組み込むとレビュー効率が大幅アップ
- セキュリティは「気合い」ではなく「自動化」で守る
「Banditなんかいらない。俺のレビューで十分」
そう言う人ほど、次の障害の震源地です。
セキュリティは 思い込みを信用せず、仕組みで守る のが基本。
Banditを導入して、まずは自作コードの安全性を可視化しましょう。