
Sony WH-1000XM4の暗号化された音声パックから音声ガイドMP3プロンプトを復号化および抽出します。AESキーはAiroha MT2811 SoCのBluetoothファームウェアダンプを介して抽出されました。
Sony WH-1000XM4 の暗号化されたファームウェアファイルから、音声ガイダンスのMP3プロンプトを復号・抽出します。
AES-128-CBC 鍵は、ヘッドホンのAiroha MT2811ファームウェアをBluetooth Low Energy経由で RACEプロトコル を使ってダンプし、ARM Cortex-M4 FOTA復号ルーチンを逆アセンブルすることで抽出しました。詳細な技術解説: docs/WRITEUP.md
# Bun のインストール(未インストールの場合)
curl -fsSL https://bun.sh/install | bash
git clone https://github.com/HelgeSverre/sony-vp-extract.git
cd sony-vp-extract
bun install
# Sony CDNから自動ダウンロード後、抽出
bun run cli/extract.ts --all
# すべて抽出 — voice-packs/ が空の場合、Sony CDNから自動ダウンロード
bun run cli/extract.ts --all [input-dir] [output-dir]
# 単一のボイスパックを抽出
bun run cli/extract.ts voice-packs/VP_english_UPG_03.bin extracted/
# ボイスパック情報を表示
bun run cli/extract.ts --info voice-packs/VP_english_UPG_03.bin
# ダウンロードのみ(抽出なし)
bun run cli/extract.ts --download [output-dir]
uv run extract_all.py
1コマンドで Sony CDN からのダウンロード、復号、抽出までを実行します。依存関係はインラインで宣言されています(PEP 723) — uv run が自動的に全て処理します。
| 言語 | ファイル | プロンプト数 | CDN |
|---|---|---|---|
| 🇬🇧 英語 | VP_english_UPG_03.bin | 54 | ダウンロード |
| 🇫🇷 フランス語 | VP_french_UPG_03.bin | 54 | ダウンロード |
| 🇩🇪 ドイツ語 | VP_german_UPG_03.bin | 54 | ダウンロード |
| 🇪🇸 スペイン語 | VP_spanish_UPG_03.bin | 54 | ダウンロード |
| 🇮🇹 イタリア語 | VP_italian_UPG_03.bin | 54 | ダウンロード |
| 🇵🇹 ポルトガル語 | VP_portuguese_UPG_03.bin | 54 | ダウンロード |
| 🇳🇱 オランダ語 | VP_dutch_UPG_03.bin | 54 | ダウンロード |
| 🇸🇪 スウェーデン語 | VP_swedish_UPG_03.bin | 54 | ダウンロード |
| 🇫🇮 フィンランド語 | VP_finnish_UPG_03.bin | 54 | ダウンロード |
| 🇹🇷 トルコ語 | VP_turkish_UPG_03.bin | 54 | ダウンロード |
┌───────────────────────────────────────┐
│ Header (4096 bytes) │
│ ├── 0x000 Random nonce (32 bytes) │
│ └── 0x100 TLV metadata │
│ ├── compression_type = 2 │
│ ├── body_size │
│ ├── decompressed_size (1 MB) │
│ └── SHA-256 of decompressed │
├───────────────────────────────────────┤
│ Body (offset 0x1000+) │
│ AES-128-CBC encrypted │
│ └── LZMA1 compressed │
│ └── Voice guidance image (1MB) │
│ ├── Header (version+count) │
│ ├── Entry table (54 × 8B) │
│ │ (size, abs_offset) │
│ └── MP3 files (48kHz mono) │
└───────────────────────────────────────┘
AES-128-CBC Key: eibohjeCh6uegahf
AES-128-CBC IV: miefeinuShu9eilo
MT2811 CM4 ファームウェアの .rodata セクション内、フラッシュオフセット 0xD53A(鍵)と 0xD529(IV)にASCII文字列としてハードコードされているのを発見しました。この鍵は、全てのWH-1000XM4ユニットおよび全ての言語パックで共通です。
RACE_STORAGE_PAGE_READ(コマンド 0x0403)を使用して、フラッシュからCM4ファームウェア59KBを ダンプ0x81F4 でAES S-box を 特定0x04200000 を 特定詳細な技術解説: docs/WRITEUP.md
鍵を独立して検証したい場合は、自分のペアリング済みWH-1000XM4ヘッドホンからファームウェアをダンプし、鍵を抽出できます。
# BLE経由でファームウェアをダンプし、鍵を抽出
uv run cli/extract_key.py
# 既にファームウェアダンプを持っている場合:
uv run cli/extract_key.py --firmware your_dump.bin
# Bun版(ファームウェアダンプが必要):
bun run cli/extract.ts --extract-key your_dump.bin
このツールはファームウェアバイナリ内でAES S-boxを検索し、隣接するnull終端16バイトASCII文字列を見つけ、各候補ペアをボイスパックの復号を試行して有効なLZMAヘッダーがあるか検証します。
├── cli/
│ ├── extract.ts # Bun CLI ツール(抽出+鍵検索)
│ └── extract_key.py # Python BLE ファームウェアダンプ+鍵検索
├── docs/
│ └── WRITEUP.md # 完全な技術解説
├── voice-packs/ # ダウンロードされた .bin ファイル(gitignore)
├── extracted/ # 抽出されたMP3プロンプト(gitignore)
├── extract_all.py # Python版抽出スクリプト
├── package.json
└── README.md
このプロジェクトは、個人所有のハードウェアに対して教育目的で実施されたセキュリティ研究を文書化したものです。解析されたヘッドホンは通常通りペアリング・接続されており、不正アクセスは行われていません。
ボイスパック .bin ファイルおよび抽出されたMP3プロンプトはソニー株式会社の著作物であり、このリポジトリには 含まれていません。CLIツールは実行時にソニーの公開CDNから直接ダウンロードします。復号されたボイスパックや抽出されたMP3ファイルを再配布しないでください。このツールは研究および相互運用性の目的でのみ提供されます。
MIT