
CVE-2022-38694 を利用した ZTE Blade V40 Vita (P606F02 / Unisoc UMS9230 / UFS) のブートローダー解除 - Linux スクリプト、FBE 解除後ハング修正、そして誰も文書化していない2つの罠
CVE-2022-38694 を使ったアンロックのための Linux 向けメモとスクリプト。MyOS11.0.13_8045_EEA を実行している私の EEA_P606F02 で実施。
これが動くかどうかを決める2つのポイント、どちらもどこにも書かれていない:
SEND fdl2-dl.bin → connection closed)。VOL_UP + VOL_DOWN のみを押し続ける。リセットが必要なら POWER を一度だけタップする。misc ワイプ BCB は何もしない — このブートローダーはそれを無視する。代わりに BROM 経由で userdata + metadata を消去する。| モデル | ZTE Blade V40 Vita — ZTE 8045 / EEA_P606F02 |
| SoC / ストレージ | Unisoc UMS9230 / UFS |
| パッケージ | ums9230_universal_unlock_UFS。UFS の fdl2-*.bin は 934088 バイト、eMMC のものは約 1 MB。間違ったローダーは端末をワイプする可能性がある |
| OS / スロット | Android 11、MyOS11.0.13 · スロット _b |
git clone --recursive https://github.com/TomKing062/CVE-2022-38694_unlock_bootloader
cd CVE-2022-38694_unlock_bootloader
gcc chsize.c -o chsize
gcc gen_spl-unlock.c -o gen_spl-unlock
cd spreadtrum_flash && make # spd_dump
chsize、gen_spl-unlock、spd_dump と UFS パッケージの4つのファイル(fdl1-dl.bin、fdl2-dl.bin、fdl2-cboot.bin、misc-wipe.bin)を1つの作業ディレクトリに置く。以下のスクリプトはそのディレクトリに対して実行する。
端末の電源を切る → VOL_UP + VOL_DOWN を押し続ける → USB を挿す → 押し続ける。USB 1782:4d00 を目指す:
for d in /sys/bus/usb/devices/*/; do
[ "$(cat $d/idVendor 2>/dev/null)" = 1782 ] && echo "BROM: $(basename $d)"
done
19d2:135x は端末の通常の USB であり、BROM ではない。ブートループしている端末でも問題ない — リセットのたびに BootROM が再実行され、リセット時にキーを再サンプリングする。
一度に1ステップずつ、各ステップの前に BROM に再進入する。実行中は音量キーを押し続ける。
cd /path/to/working-dir
sudo /path/to/repo/scripts/unlock.sh 1 # back up SPL + uboot_b, erase SPL (won't boot after this)
sudo /path/to/repo/scripts/unlock.sh 2 # prep images locally, phone not needed
sudo /path/to/repo/scripts/unlock.sh 3 # write fdl2-cboot.bin to uboot_b
sudo /path/to/repo/scripts/unlock.sh 4 # the unlock. ends in "connection closed" = success
sudo /path/to/repo/scripts/unlock.sh 5 # read miscdata @8192: 64 zeros = locked, string+2 hashes = unlocked
sudo /path/to/repo/scripts/unlock.sh 6 # restore uboot/SPL. never skip this
ステップ4は EXEC FDL1 → タイムアウト → connection closed で終わる。これはアンロックが失敗しているのではなく、機能している証拠。ステップ5でゼロが表示される場合は、ステップ4を再度実行する。
ステップ3の後、端末は Android を起動できなくなる(ペイロードは本物のブートローダーではない)— ステップ6で元の uboot_bak.bin を戻す。途中で止めないこと。
trustos 内の FBE キーはロック状態に封印されているため、/data は決してマウントできない。ワイプは必須:
sudo /path/to/repo/scripts/fix-post-unlock-hang.sh
音量キーを押し続けると、BROM を捕捉するまで自身を再アームする。userdata + metadata を消去し、BCB を書き込み、リセットする。3回目の試行で捕捉され、1分未満で完了した。
adb shell getprop ro.boot.flash.locked # 0
adb shell getprop ro.boot.verifiedbootstate # orange
adb shell getprop ro.boot.vbmeta.device_state # unlocked
このデバイスでは fastboot getvar は役に立たない(すべて空を返す)ので、確認のためにそこを見ないこと。
VAB デバイス、スロット b、recovery パーティションなし:
fastboot flash boot_b magisk_patched.img
ブートイメージを壊しても BROM に戻れるので、まだ機能する。パーティションマップ: docs/partition-table.md。
再ロック: 可能(BROM 経由で miscdata トークンをゼロにする)だが、セキュリティ上は無意味 — BootROM のバグは永続的で、誰でも同じ手順で再アンロックできる。
クレジット: CVE-2022-38694 は NCC Group のもの。ツールは TomKing062 のもの。ここにあるスクリプトは MIT。端末をワイプするので、自己責任で。