AIインフラを揺るがす脆弱性:GitLab AI Gatewayの認証バイパスとvLLMのコード実行(RCE)の脅威と対策

Tech

本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。

AIインフラを揺るがす脆弱性:GitLab AI Gatewayの認証バイパスとvLLMのコード実行(RCE)の脅威と対策

【脅威の概要と背景】

2024年後半、AIシステム連携を担う「GitLab AI Gateway」(CVE-2024-8254等)およびLLM推論高速化エンジン「vLLM」(CVE-2024-37032等)において、任意のシステムコマンドが実行可能となる深刻な脆弱性が相次いで報告されました。これらは、機密性の高い社内AIモデルやインフラの完全な乗っ取りにつながる極めて高いリスクを孕んでいます。

【攻撃シナリオの可視化】

以下は、攻撃者がこれらの脆弱性を悪用して内部インフラへ侵入する代表的なキルチェーンを示したものです。

graph TD
    attacker["外部の攻撃者"] -->|1. 偽装トークンによるリクエスト| ai_gateway["GitLab AI Gateway"]
    ai_gateway -->|2. 認証バイパス・境界突破| internal_network["内部セグメント"]
    attacker -->|3. 悪意あるChat Templateを送信| vllm["vLLM APIサーバー"]
    vllm -->|4. Jinja2テンプレートエンジンの脆弱性悪用| rce["ホストOSでの任意コード実行/コンテナ脱出"]

このシナリオでは、AI Gatewayの認証不備を突いて境界を突破した攻撃者が、推論サーバー(vLLM)に対して任意のPythonコードを埋め込んだチャットテンプレートを送信し、最終的にホストシステム上でのリモートコード実行(RCE)を達成します。

【安全な実装と設定】

1. vLLMにおける安全な起動とテンプレート制限

vLLMのChat Template機能におけるJinja2テンプレートインジェクションを防ぐため、信頼できないコード実行(--trust-remote-code)を排除し、アクセス制限を厳格化します。

❌ 誤用例(脆弱な設定)

外部からのあらゆるアクセスを許可し、未検証のリモートコード実行を許容する設定。

# 外部公開されたポートで、信頼できないカスタムモデルの動的ロードを許可している

python3 -m vllm.entrypoints.openai.api_server \
    --model lmsys/vicuna-7b-v1.5 \
    --host 0.0.0.0 \
    --port 8000 \
    --trust-remote-code # ⚠️脆弱性:信頼できないカスタムコードの実行を許可

安全な代替案(セキュアな設定)

動的コード実行を無効化し、リクエスト元を限定(リバースプロキシ経由など)した構成。

# 信頼できないコード実行を明示的に制限し、リバプロ(Nginx等)経由の接続のみに限定

python3 -m vllm.entrypoints.openai.api_server \
    --model lmsys/vicuna-7b-v1.5 \
    --host 127.0.0.1 \ # 外部直入力を禁止しローカルにバインド
    --port 8000 \

    # --trust-remote-code を付与しない(デフォルトはFalse)

    --disable-frontend-multiprocessing

2. シークレットと権限の管理

  • 最小権限の原則: vLLMおよびAI Gatewayのコンテナプロセスは、絶対に root ユーザーで実行せず、特定のユーザー(例: nobody や専用の vllm ユーザー)で実行してください。

  • 鍵管理の自動化: GitLab AI Gatewayなどで利用する認証トークンや署名鍵は、環境変数に直接ハードコードせず、AWS Secrets ManagerやHashiCorp Vault等のシークレット管理サービスから動的に注入し、定期的に自動ローテーションを行います。

【検出と緩和策】

EDR/SIEMでの検知ポイント

  • 不審なシステムコール検知: vllm 実行プロセス(Python)を親プロセスとする、sh, bash, whoami, curl などの子プロセスの異常な起動を監視します。

  • ペイロード監視: WAFやAPIゲートウェイのログにおいて、チャットAPI(/v1/chat/completions)へのリクエスト内に __import__, subprocess, os.system などのJinja2サンドボックス回避コードが注入されていないかをルール検知(シグネチャ)します。

応急的な緩和策(Workaround)

  1. パッチ未適用の暫定措置: 該当システムへのパブリックインターネットからのアクセスを即座に遮断し、社内VPNまたはIP制限(ACL)を強制します。

  2. テンプレートの静的固定: カスタムテンプレートの使用を一時的に禁止し、vLLMがデフォルトで提供する定義済みの安全なテンプレートに限定します。

【実務上の落とし穴】

  • 可用性とセキュリティのトレードオフ: --trust-remote-code を無効化すると、一部の独自カスタムモデル(Hugging Face上の特殊なレイヤー構造を持つモデルなど)がロードできなくなり、AI機能が停止する業務影響が発生します。事前に代替可能な標準アーキテクチャ(Llama, Mistral等)への移行検証が必要です。

  • WAFの誤検知(False Positive): プログラミング支援用途のLLMを運用している場合、一般ユーザーが「Pythonのコード生成」を依頼するプロンプト自体が、WAFの攻撃シグネチャ(コードインジェクション検知)に誤って引っかかり、正常な利用が遮断されるリスクがあります。検知ルールは「入力プロンプト」ではなく「システム適用されるテンプレート処理」に絞るチューニングが求められます。

【まとめ】

組織のCSIRTおよびインフラ担当者が「今すぐ」実施すべき3つの優先事項:

  1. 対象アセットの特定とアップデート: 組織内で稼働しているGitLab AI GatewayおよびvLLMの全インスタンスを洗い出し、セキュリティパッチが適用された最新バージョン(GitLab、vLLMそれぞれ公式の推奨バージョン以上)へ即時アップデートする。

  2. ネットワークセグメンテーションの強制: vLLMなどの推論エンドポイントをインターネットから隔離し、必ず信頼されたゲートウェイ/認証プロキシ経由でのみアクセス可能な構成に変更する。

  3. 起動オプションの監査: 開発環境も含め、推論コンテナの起動パラメータに --trust-remote-code が含まれていないか設定ファイルを総点検する。


参考文献:

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました