mirror of
https://github.com/qtmleap/revkit.git
synced 2026-09-16 08:11:51 +02:00
- kAppBootKey (RSA-4096) / kAppBootEccKey (P-256) / kSharkBootKey を NFWebCrypto.framework から静的抽出し constants.py に追加 - DH prime p は MslClient.framework @ 0x001265a0 で確認済み - apphmac / devicetoken / device_key_data はランタイム生成と判明 - docs/spec/unknown_values_report.md に全調査結果を記載 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4.6 KiB
4.6 KiB
Work Plan: Pure Python App-Boot to MSL Authentication
Date: 2026-04-09
Goal
appboot から MSL 認証までの全フローを純粋な Python で実行可能にする。 未知の値の出所を調査し、バイナリにハードコードされている場合はその箇所を特定・報告する。
Tasks
Reverse Engineer (静的バイナリ解析)
- NFWebCrypto.framework から
kAppBootKey(RSA-4096 SPKI/DER) を抽出 →constants.IOS_APPBOOT_RSA_KEY_DER - NFWebCrypto.framework から
kAppBootEccKey(ECDSA P-256 SPKI/DER) を抽出 →constants.IOS_APPBOOT_ECC_KEY_DER - DH prime
p(1024-bit, 128B) の完全な値を確認 → MslClient @0x001265a0→constants.IOS_DH_P apphmacの HMAC 鍵素材を特定 → ハードコード鍵なし、全 6 call site がランタイム導出device_key_data(6,576B) の構築ロジックを解明 → CBOR ランタイム組立 (IosMGKAuthenticationData)devicetokenの生成関数を特定 → Nbp.framework NRM サービスからランタイム取得
Frida Engineer (ランタイムキャプチャ)
hook_entityauth_capture.js作成: devicetoken / apphmac / device_key_data キャプチャhook_nfwebcrypto_keys.js作成: kAppBootKey / kAppBootEccKey をメモリスキャン + importKey フックhook_appboot_dh.js拡張: DH primepの完全な 128B をログ出力
Python Engineer (実装)
crypto.py: DH 鍵生成/共有秘密計算ラッパー (cryptographyライブラリ使用)crypto.py: Phase 0 MGK 導出の統合 (emulate_tfit.pyをライブラリとして呼び出し)crypto.py: Phase 3 KDF 配線 (enc_key_0, sign_key_0 → enc_key_1, sign_key_1, session_bind)crypto.py: Phase 2 KDF 配線 (session_bind → 48B key → HMAC-SHA384 → session keys)cbor_encoder.py: appboot CBOR リクエストビルダー (entity_auth_data + key_request_data)cbor_decoder.py: appboot CBOR レスポンスパーサー (key 33.6, 33.9, nfvdid, deviceIdToken 抽出)- 新規
ios_client.py: エンドツーエンド iOS MSL セッションオーケストレーター tools/verify_full_key_chain.py: 既知テストベクトルによる全フェーズ回帰テスト (12/12 PASS)
Execution Order
- Parallel (Phase A — 調査):
- RE: バイナリ解析 (kAppBootKey, kAppBootEccKey, DH prime, apphmac key, device_key_data, devicetoken)
- Frida: ランタイムキャプチャフック作成 & 実行
- Sequential (Phase B — Python 実装 / 調査結果依存):
- Python: DH ラッパー + KDF 配線 (DH prime 確定後)
- Python: appboot リクエスト/レスポンスビルダー (entity_auth_data 構造確定後)
- Sequential (Phase C — 統合):
- Python: ios_client.py オーケストレーター
- Python: 回帰テスト
Deliverables
src/netflix_msl/ios_client.py: iOS appboot → MSL 認証の Python クライアントsrc/netflix_msl/crypto.py: DH + 全 KDF フェーズ統合src/netflix_msl/cbor_encoder.py: appboot CBOR リクエスト構築src/netflix_msl/cbor_decoder.py: appboot CBOR レスポンス解析tools/verify_full_key_chain.py: エンドツーエンド回帰テストpackages/frida/hook_entityauth_capture.js: entity_auth_data 値キャプチャpackages/frida/hook_nfwebcrypto_keys.js: 署名検証鍵ダンプdocs/spec/unknown_values_report.md: 未知の値の調査結果レポート
Unknown Values (調査対象)
| 値 | サイズ | 現状 | 出所 |
|---|---|---|---|
kAppBootKey |
550B (RSA-4096 DER) | 抽出済み | NFWebCrypto @ 0x0020cd31 (Base64) |
kAppBootEccKey |
91B (P-256 DER) | 抽出済み | NFWebCrypto @ 0x0020d10c (Base64) |
devicetoken |
216B protobuf | 要ランタイムキャプチャ | Nbp.framework NRM サービス応答 |
apphmac |
32B HMAC-SHA256 | 要ランタイムキャプチャ | ランタイム導出 (固定鍵なし) |
device_key_data |
~6,576B | 構造解明済み | CBOR ランタイム組立 (IosMGKAuthenticationData) |
DH prime p |
128B | 抽出済み | MslClient @ 0x001265a0 (__TEXT.__const) |
Risks / Notes
devicetokenはデバイス固有値の可能性が高く、Python 単体での生成は不可能かもしれない → キャプチャした値のハードコードで代替device_key_dataも同様にデバイス固有の可能性あり- appboot.netflix.com は SSL ピンニングあり → Python からの直接接続にはプロキシ経由が必要
- TFIT WB-AES エミュレーションは Unicorn 依存 (ARM64 エミュレータ)