バイブコーディング実践編 — Claude Code を中心に AIで安全に作る力生成コード読解とレビュー — 5層チェックリスト

SAST/dependency監査 — Semgrep + pip-audit

読了目安 8

学習のねらい

AI生成コードのレビューは、人間の目とLLM-as-Judgeだけでは限界があります。 特にセキュリティ脆弱性や依存ライブラリの問題は、専門的なツールを使うことで効率的かつ網羅的に検出できます。 このレッスンでは、SAST (Static Application Security Testing、静的アプリケーションセキュリティテスト) ツールの Semgrep と、Pythonの依存ライブラリ監査ツール pip-audit を導入し、CI (継続的インテグレーション) に組み込む方法を学びます。

SASTツール Semgrep

Semgrep は、コードを静的に解析し、バグ、脆弱性、アンチパターン(悪い設計パターン)などを検出するツールです。 特定のパターンにマッチするコードを検出するためのルールをYAML形式で記述でき、既存のルールセットも豊富に提供されています。

最小ルールセットの導入

まずは最小限のルールセットから始めましょう。 Semgrep の公式リポジトリには、様々な言語に対応したセキュリティルールが用意されています。

# .semgrep/config.yaml
rules:
  - id: python.lang.security.audit.dangerous-eval.dangerous-eval
    languages: [python]
    message: "eval() is a dangerous function. Do not use with untrusted input."
    severity: ERROR
    pattern: eval($EXPR)

これは eval() 関数が使われている箇所を検出するシンプルなルールです。 CIに組み込む際は、よく使われる公式ルールセット (p/security, p/r/best-practice) を指定するのが効率的です。

False Positive (誤検知) への対応

Semgrep もLLMと同様にFalse Positiveを出すことがあります。

  • ルール除外: 特定のファイルやディレクトリをスキャン対象から除外する (--exclude オプション)。
  • # nosemgrep コメント: コード行の直前に # nosemgrep コメントを挿入することで、その行に対する特定のルールを無効化できます。これは、意図的に安全な方法で危険な関数を使っている場合などに有効です。
  • カスタムルールの調整: 独自のルールを作成している場合は、より具体的なパターンを記述して誤検知を減らします。

CIへの統合

GitHub Actionsに Semgrep を統合することで、PRごとに自動でスキャンを実行できます。

# .github/workflows/ci.yml (既存のCI設定に追記)
jobs:
  semgrep:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: returntocorp/semgrep-action@v1
        with:
          config: |
            p/python
            p/r/python-best-practices
          # --suppress-errors: エラーがあってもスキャンを継続
          # --json: JSON形式で結果を出力 (解析ツール向け)
          # --no-git-ignore: .gitignoreを無視しない
          # --max-memory: メモリ上限を設定
          arguments: --suppress-errors --no-git-ignore

semgrep-action は、検出された問題があればCIを赤(失敗)にするため、PRの安全性を確保できます。

依存ライブラリ監査ツール pip-audit

AI生成コードだけでなく、そのコードが依存する外部ライブラリにも脆弱性が潜んでいる可能性があります。 pip-audit は、Pythonプロジェクトの requirements.txt や仮想環境をスキャンし、既知の脆弱性を持つパッケージを検出するツールです。

導入と実行

pip install pip-audit
pip-audit -r requirements.txt # requirements.txt をスキャン
pip-audit # 仮想環境全体をスキャン

False Positive (誤検知) への対応

  • 無視リスト: pip-audit には特定の脆弱性を無視する機能はありませんが、pip-audit --ignore-vuln <VULN_ID> のように、特定の脆弱性IDを無視するオプションがあります。
  • バージョン固定: 脆弱性が報告されているライブラリは、安全なバージョンにアップデートするか、代替ライブラリへの移行を検討します。

CIへの統合

pip-audit もGitHub Actionsに組み込むことで、依存ライブラリのセキュリティリスクを継続的にチェックできます。

# .github/workflows/ci.yml (既存のCI設定に追記)
jobs:
  pip-audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: { python-version: "3.12" }
      - run: pip install pip-audit -r requirements.txt
      - run: pip-audit --exit-code 1 # 脆弱性があればCIを失敗させる

--exit-code 1 オプションを指定することで、脆弱性が検出された場合にCIジョブを失敗させ、PRのmergeをブロックできます。

まとめ

Semgreppip-audit は、AI生成コードのセキュリティと依存関係の健全性を自動でチェックするための強力なツールです。 これらをCIに統合し、「赤になったら必ず直す」という運用を徹底することで、人間のレビューやLLM-as-Judgeでは見落としがちな深いセキュリティ問題を早期に発見し、開発プロセス全体の安全性を高めることができます。 False Positiveへの適切な対応も忘れずに行いましょう。

参考リンク


SAST/dependency監査 — Semgrep + pip-audit | バイブコーディング実践編 - AI研修