
macOS向けUNISOC BootROM/FDLフラッシャー: CVE-2022-38694 exec_addr2を適用したパッチ済みspd_dump、プロトコルリファレンス、パーティションルール、バックアップ検証 (UMS9621)
English | 日本語
UNISOC(展锐)BootROM/FDL 書き込みツールの macOS 移植版。ilyakurdyukov/spreadtrum_flash(MIT)をベースに、クローズドソースの spd_dump に exec_addr2(CVE-2022-38694 の署名検証バイパス)を追加し、macOS(arm64 + libusb)上で以下の全チェーンを実現しています:
BootROM → CVE 越界写 → FDL1 → FDL2 → GPT 解析 → 分区读写 → reset
検証プラットフォーム:UMS9621(T158)、Android 13、kernel 5.15、GKI(init_boot)アーキテクチャ。UMS9620 ファミリはアドレス互換。その他の SoC は適合を参照。
依存関係:Xcode CLT、brew install libusb。
./scripts/build-macos.sh # 产出 ./spd_dump
電源オフの状態で Reset(または機種に応じたキーコンビネーション)を押しながら USB に接続すると、デバイスは 1782:4d00 として列挙されます。BootROM は列挙後約 20 秒間だけ応答し、その後は沈黙します(USB は残ったまま)。自動化ではデバイスの「無→有」エッジでトリガーする必要があります(scripts/runner.sh 参照)。
./spd_dump --wait 3 exec_addr2 0x65017f08 verbose 1 \
fdl fdl1-dl.bin 0x65000800 \
fdl fdl2-dl.bin 0xbefffe00 \
disable_transcode partition_list gpt.xml
| パラメータ | 説明 |
|---|---|
exec_addr2 <addr> | CVE バイパス。custom_exec_no_verify_<addr>.bin を自動ロードします。実装 |
python3 scripts/backup_gen.py gpt.xml backup/ --img-dir data/
./spd_dump --wait 3 verbose 0 disable_transcode $(cat backup_args.txt)
backup_gen.py は GPT に基づいて read_part シーケンスを生成します(途中再開対応。GPT の size 単位は MB)。また、vbmeta* の AVB flags をオフラインで 3 に設定します(verity 0 と同等)。
python3 scripts/flash_gen.py gpt.xml data/ flash_ops.txt
N=$(grep -c 'write_part\|erase_part' flash_ops.txt)
{ yes yes | head -n $N; sleep 3600; } | ./spd_dump --wait 3 verbose 0 \
disable_transcode $(cat flash_ops.txt | tr '\n' ' ')
flash_gen.py にはパーティションルールが組み込まれています(runtimenv は消去に変換、fixnv/calinv はスキップ、スロットエイリアスなしは mtime で重複排除)。末尾に erase_part userdata + reset を追加します。
詳細は docs/protocol-notes.md を参照:
verbose 1 はそのループを早期終了します0x8A(DOWN_SIZE_ERROR)は次の用途に使われます:保護アドレスへの個別ダウンロード、runtimenv 書き込み、巨大な読み取りブロックnr_fixnv1)を名前アドレス指定で読み取るとセッションがハングします。ルールは docs/partition-rules.md を参照静的パーティション(dtb など)は既知の同型イメージと md5 相互比較を行い、読み取りチェーンの正当性を検証できます。
| 項目 | 入手先 |
|---|---|
| fdl1/fdl2 ロードアドレス | 機種の pac ファームウェア XML(SPD Research Tool で展開) |
| CVE blob とスタックアドレス | TomKing062/CVE-2022-38694 soc/<chip>/ |
| fdl イメージ | 機種の公式ファームウェアから抽出(DHTB 署名ヘッダー) |
src/ にパッチソースを含む画面なしデバイス向け Magisk su の事前承認:docs/headless-magisk-su.md。
BootROM レベルの操作は文鎮化(ブリック)のリスクがあります。必ずバックアップを取ってから自己責任で行ってください(AS IS)。
fdl <file> <addr> | FDL イメージと SoC 固有の SRAM ロードアドレス |
disable_transcode | 新しいプロセスの開始時に必ず 1 回送信する必要があります(状態はプロセスをまたいで残ります) |
| 検証項目 | 値 |
|---|
| サイズ | GPT と 1 つずつ照合(バイト単位で正確) |
| boot / init_boot | ANDROID! @0 |
| vendor_boot | VNDRBOOT @0 |
| vbmeta ファミリー | AVB0 @0、flags @0x78 |
| splloader/trustos/uboot/fdl | DHTB @0 |
| super | gDla @4096 と @8192(ジオメトリ上の二重コピー)、先頭 4K はゼロ保持 |
| NV | NV(0x4E56)@0 または @0x200 |