
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 はこのデバイスでは役に立ちません(すべて空を返します)ので、確認のためにそこを参照しないでください。
これは recovery パーティションを持たない VAB デバイスです。書き込みを行う前に、必ずアクティブスロットを確認してください:
adb shell getprop ro.boot.slot_suffix
純正の B06 ブートイメージは、書き込み前に Magisk の出力を再署名する必要があります。テスト済みの Windows 向け純正フラッシュ、AVB 署名、リカバリ手順は docs/windows-flash-root.md にあります。ブートイメージを文鎮化しても BROM は 引き続き動作します。パーティションマップ: docs/partition-table.md。
再ロック: 可能です(BROM 経由で miscdata トークンをゼロ化)が、セキュリティ上は無意味です —
BootROM のバグは恒久的なものであり、誰でも同じ手順で再アンロックできます。
クレジット: CVE-2022-38694 は NCC Group によるものです。ツールは TomKing062 のものです。 ここにあるスクリプトは MIT ライセンスです。端末のデータは消去されます。その責任はあなたにあります。