Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
cve-2026-93355-lab — CVE-2026-93355 の無害なオフライン再現 — LiteLLM の未検証メール JWT アカウント乗っ取り(LiteLLM の実際のコードを実行) | Kitploit
ツール/GitHubGitHub/inertfluid/cve-2026-93355-lab
特権昇格脆弱性分析ウェブアプリケーション悪用アイデンティティ&アクセス管理 (IAM)認証論文と研究学習と教育ラボと実践
GitHubinertfluid/cve-2026-93355-lab

cve-2026-93355-lab

CVE-2026-93355 の無害なオフライン再現 — LiteLLM の未検証メール JWT アカウント乗っ取り(LiteLLM の実際のコードを実行)

リポジトリを見る
1ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-93355 — LiteLLM 未検証メール JWT アカウント乗っ取りラボ

CVE-2026-93355 を再現する、自己完結型の使い捨てラボです:LiteLLM の JWT 認証は、呼び出し元の身元を メール一致 へのフォールバックによって解決し、email_verified クレームを一切チェックしません。攻撃者が自身の ID プロバイダアカウントから、被害者のメールアドレス(未検証)を含む正当に署名されたトークンを発行させることができれば、被害者のロールを継承し、proxy_admin にまで昇格できます。さらに、この一致は被害者の保存済み SSO バインディングを攻撃者のサブジェクトへとサイレントに書き換えるため、乗っ取りが永続化します。

アドバイザリVulnCheck · OX Security
CVECVE-2026-93355
プロジェクトlitellm(プロキシ / JWT 認証)
影響範囲アドバイザリによれば 1.102.1 以下 — 未修正のまま:脆弱なコードは 1.104.0(最新安定版)および 2026-10-07 時点の main でも変更されていない
CVSS8.1 HIGH (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N)
弱点CWE-1390 — 弱い認証
根本原因email_verified を検証せずにメールベースのユーザー検索を信頼している
発見者Nir Zadok & Moshe Siman Tov Bustan (OX Security)

修正状況 (2026-10-07): 修正済みリリースはまだ存在しません。アドバイザリが 1.102.1 を挙げているのは、開示時点での最新バージョンだったからにすぎません。LiteLLM は その後 1.103.x と 1.104.0 をリリースしていますが、その両方 — そして main 上でも — _get_fuzzy_user_object には依然として email_verified チェックがありません。このラボは 再現性のために 1.102.1 を固定しています。scripts/verify_against_real_source.py は 修正が入った日を検出します。

⚠️ 倫理的な使用

これは教育および防御目的のために、公開開示された脆弱性を再現するものです。完全にローカルで動作し、実在のサービスには一切触れません:

  • ネットワーク外向き通信はありません。「ID プロバイダ」はインプロセスのモックであり、エフェメラルな鍵ペアから実際の RS256 署名付き JWT を発行します。「データベース」は Python のリストです。
  • エクスプロイトは無害です:このプロセス内にシードされた偽の [email protected] 管理者行を解決して表示するだけです。実在のアカウントも実在の鍵もなく、何もあなたのマシンから外に出ません。
  • この手法を、あなたが所有しておらず、テストの許可を得ていない IdP、テナント、LiteLLM デプロイに対して決して向けないでください。

一段落でわかるバグ

LiteLLM のプロキシでは、設定された ID プロバイダからの JWT で認証できます。そのトークンを LiteLLM ユーザーにマッピングするために get_user_object() を呼び出し、これはトークンのサブジェクト(sso_user_id)を試し、見つからない場合は _get_fuzzy_user_object() にフォールバックします — これは email クレームの大文字小文字を区別しない一致です。LiteLLM のテーブルでそのメールを所有している者が、あなたの身元になります。トークンの email_verified クレームは一切読まれません — クレーム抽出時(JWTHandler.get_user_email)にも、解決時にも。したがって、未検証のメールに対してトークンを発行する IdP(大半は設計上そうします — 検証は relying party の責務です)であれば、攻撃者は自身のプロフィールメールを被害者のものに設定し、トークンを提示して被害者のロールを継承できます。さらに悪いことに、メール一致時には LiteLLM がバックグラウンドタスクを起動し、被害者の sso_user_id を攻撃者のサブジェクトで上書きします — そのため以降のすべてのログインはメールを必要とせずに被害者のアカウントへ直接解決され、メールを変更しても役に立ちません。

攻撃フロー:脆弱版 vs. 修正版

このラボが証明すること — そして誠実さを保つ方法

テスト対象のすべてはLiteLLM 自身のコードであり、固定された litellm==1.102.1 パッケージからインポートされます。ラボが提供するのは、必要不可欠な 2 つだけです:インメモリの偽ユーザーテーブルと、モック IdP の鍵ペアです。脆弱なロジックを再実装することはありません。

  1. グラウンドトゥルース。 インストール済みの _get_fuzzy_user_object と JWTHandler.get_user_email に対して inspect.getsource() を実行し、メールフォールバックが存在すること、sso_user_id の再バインドが存在すること、そしてどちらの関数も email_verified を参照していないことを検証します。 → scripts/verify_against_real_source.py
  2. アカウント乗っ取り。 未検証の被害者メールアドレスを含む有効なトークンを、LiteLLM の実際のクレーム抽出と実際の _get_fuzzy_user_object に通します。その結果、被害者の proxy_admin 行に解決されます。 → poc/01_account_takeover.py
  3. 永続化。 メール一致によるバックグラウンド書き込みが、被害者の sso_user_id を攻撃者のサブジェクトに再バインドします。その後、メールアドレスを一切含まないログインが直接管理者に解決され、「重複メールを修正する」ことではそれが取り消されません。 → poc/02_persistent_rebind.py
  4. 修正。 メールフォールバックの前に email_verified を強制することで、検証済みの SSO ログインを機能させたまま攻撃をブロックします。 → poc/03_patched_path.py

実行方法

./run.sh

run.sh は使い捨ての .venv を構築し、litellm[proxy]==1.102.1 をインストールして、グラウンドトゥルースチェックを実行した後、3 つの PoC をすべて実行します。初回実行時は LiteLLM をダウンロードするため数分かかります。クリーンアップするには .venv を削除してください。既存のインタプリタを使用するには:PYTHON=python3.12 ./run.sh。

単一の PoC を直接実行するには(venv 内で):

.venv/bin/python poc/01_account_takeover.py

レイアウト

cve-2026-93355-lab/
├── mock_idp.py                        # ephemeral RS256 OIDC IdP (real signatures)
├── fake_litellm_db.py                 # in-memory stand-in for the Prisma user table
├── harness.py                         # configures & drives LiteLLM's real objects
├── poc/
│   ├── 01_account_takeover.py         # unverified email -> victim's proxy_admin
│   ├── 02_persistent_rebind.py        # sso_user_id overwrite -> persistent access
│   └── 03_patched_path.py             # the email_verified guard that closes it
├── scripts/
│   └── verify_against_real_source.py  # proves the PoCs run the real vulnerable code
├── assets/attack-flow.svg|.png        # the diagram above
├── blog-cve-2026-93355.md             # the guard0 write-up
└── run.sh

修復

  • LiteLLM が修正をリリースしたらアップグレードし、アドバイザリを追跡してください。
  • トークンが ID 解決に到達する前に、信頼境界で email_verified: true を強制し、未検証のメールを拒否または無視してください。
  • ID を変更可能なメールではなく、プロバイダーが発行する安定したサブジェクト(user_id_jwt_field)にバインドし、メールへのフォールバックによって暗黙的に再バインドされないようにしてください。
  • メールアドレスだけで特権ロールを事前プロビジョニングしないでください。 メールをキーにした proxy_admin 行は、常時有効なアカウント乗っ取りのプリミティブとなります。

参考資料

  1. CVE-2026-93355 (NVD) — https://nvd.nist.gov/vuln/detail/CVE-2026-93355
  2. VulnCheck アドバイザリ — https://www.vulncheck.com/advisories/litellm-weak-jwt-authentication-via-email-based-user-lookup
  3. OX Security の解説記事 — https://www.ox.security/blog/litellm-an-ordinary-login-token-can-become-someone-elses-admin-account/
  4. LiteLLM — https://github.com/BerriAI/litellm
ツールをダウンロード