AI生成コードの安全性を担保する:SnykとSemgrepを使った静的解析の実践戦略
出典: hanav1ye

LLMが生成したコードには脆弱性やアンチパターンが潜んでいる可能性があります。本記事では、SnykとSemgrepを組み合わせた静的解析(SAST)によって、既知の脆弱性から「AI特有の古いパターン」まで包括的に検証する方法を解説します。
AIが書いたコードは本当に安全か?
note2Zennという開発プロジェクトにおいて、LLMを活用したコード生成が進む中、重要な課題が浮上しています。それは「AIが出力したコードの品質と安全性をどう担保するか」という問題です。
AIコーディングツールは確かに開発速度を飛躍的に向上させますが、生成されたコードがセキュリティ基準を満たしているか、ベストプラクティスに沿っているかは別問題です。特にプロダクション環境に投入する場合、この検証プロセスは省略できません。
今回は、SnykとSemgrepという2つの静的解析ツールを組み合わせた、実践的なAI生成コード検証戦略を紹介します。
静的解析(SAST)による多層防御アプローチ
役割分担が明確な2つのツール
元投稿では、以下のような明確な役割分担でツールを使い分けています:
**Snyk:既知の脆弱性とコードの凡ミスを検出**
**Semgrep:コードの凡ミスとAI特有のアンチパターンを検出**
この組み合わせが優れているのは、**既知の脆弱性データベース(Snyk)**と**カスタマイズ可能なパターンマッチング(Semgrep)**という異なるアプローチを組み合わせることで、検出漏れを最小化できる点です。
なぜ複数ツールが必要なのか
単一のツールに依存しない理由は明確です。Snykは商用データベースを持ち、既知の脆弱性に対して高い検出精度を誇りますが、プロジェクト固有のルールやAI特有の問題には対応しきれません。一方、Semgrepはカスタムルールを柔軟に記述できるため、「このプロジェクトでは使わない」という独自の制約を実装できます。
編集部の視点
他のアプローチとの比較
AI生成コードの検証手法には、いくつかの選択肢があります:
**1. コードレビューのみに頼る方法**
人間によるレビューは不可欠ですが、AIが大量のコードを生成する環境では現実的ではありません。特にXSSやSQLインジェクションのような典型的な脆弱性は、自動検出の方が確実で効率的です。
**2. 動的解析(DAST)との組み合わせ**
実行時の挙動をテストする動的解析も重要ですが、開発サイクルの早い段階で問題を発見できる静的解析の方がコスト効率に優れています。理想的には両方を組み合わせるべきですが、まずSASTから始めるのが現実的です。
**3. SonarQubeなどの統合ツール**
SonarQubeのような統合プラットフォームも選択肢ですが、Snyk + Semgrepの組み合わせは以下の点で優位性があります:
AI生成コード特有のリスク
AIが生成するコードには、人間が書くコードとは異なる独特のリスクパターンが存在します:
**1. 学習データの古さ**
LLMの学習データには時間的なカットオフがあるため、最新のセキュリティベストプラクティスが反映されていない可能性があります。例えば、非推奨になったAPIや、既知の脆弱性を持つライブラリバージョンを平気で提案することがあります。
**2. コンテキストの欠如**
AIはプロジェクト全体のアーキテクチャやセキュリティポリシーを完全には理解していません。そのため、「このプロジェクトでは使ってはいけない」という制約を無視したコードを生成することがあります。
**3. 過信のリスク**
AIが生成したコードは一見完璧に見えることが多く、レビュアーが「AIが書いたから大丈夫だろう」と過信してしまうリスクがあります。これは従来のコピペコードよりも危険です。
この手法が向いている場面
Snyk + Semgrepの組み合わせは、以下のような状況で特に効果を発揮します:
逆に、以下の場合は他の手法も検討すべきです:
今日から試せるアクション
1. Semgrepでカスタムルールを作成する
まず、あなたのプロジェクトで「AIがよく提案する問題パターン」を1つ特定しましょう。例えば:
rules:
- id: detect-deprecated-react-lifecycle
pattern: |
componentWillMount(...) { ... }
message: "componentWillMountは非推奨です。useEffectまたはコンストラクタを使用してください"
languages: [javascript, typescript]
severity: WARNINGこのルールを`.semgrep/rules.yml`に保存し、`semgrep --config=.semgrep/rules.yml`で実行するだけです。
2. SnykをCI/CDパイプラインに統合する
GitHub Actionsを使っている場合、以下のワークフローを追加するだけで、プルリクエストごとに自動チェックが走ります:
name: Snyk Security Scan
on: [pull_request]
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}無料プランでも十分な機能が使えるため、まずは試してみることをお勧めします。
3. 「AI生成コードチェックリスト」を作る
ツールだけに頼らず、レビュー時の人間の目線も重要です。以下のような簡単なチェックリストをチームで共有しましょう:
このチェックリストを週次で見直し、ツールで検出できるものは自動化していくサイクルを回すと、継続的に品質が向上します。
まとめ
AI生成コードの品質担保は、これからの開発において避けて通れないテーマです。SnykとSemgrepを組み合わせた静的解析は、既知の脆弱性から「AI特有の癖」まで幅広くカバーできる実践的なアプローチです。
重要なのは、完璧を目指すのではなく、継続的に改善するサイクルを回すことです。まずは小さく始めて、チームの状況に合わせてカスタマイズしていきましょう。
この情報は @hanav1ye さんの投稿を参考にしています。
出典: hanav1ye


