Files
revkit/docs/plans/appboot_to_msl_auth_python.md
tkgstratorandClaude Opus 4.6 b8b27b1ef9 feat(re): appboot署名検証鍵を抽出し未知の値の調査レポートを作成
- 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>
2026-04-09 08:43:08 +00:00

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 @ 0x001265a0constants.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 prime p の完全な 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

  1. Parallel (Phase A — 調査):
    • RE: バイナリ解析 (kAppBootKey, kAppBootEccKey, DH prime, apphmac key, device_key_data, devicetoken)
    • Frida: ランタイムキャプチャフック作成 & 実行
  2. Sequential (Phase B — Python 実装 / 調査結果依存):
    • Python: DH ラッパー + KDF 配線 (DH prime 確定後)
    • Python: appboot リクエスト/レスポンスビルダー (entity_auth_data 構造確定後)
  3. 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 エミュレータ)