MediaTek bl2_ext Secure-Boot Bypass (EL3 Code Execution)

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

์ด ํŽ˜์ด์ง€๋Š” ๋””๋ฐ”์ด์Šค ๋ถ€ํŠธ๋กœ๋” ๊ตฌ์„ฑ(seccfg)์ด โ€œunlockedโ€ ์ƒํƒœ์ผ ๋•Œ ๊ฒ€์ฆ ๊ณต๋ฐฑ์„ ์•…์šฉํ•ด ์—ฌ๋Ÿฌ MediaTek ํ”Œ๋žซํผ์—์„œ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” secure-boot break๋ฅผ ๋ฌธ์„œํ™”ํ•œ๋‹ค. ์ด ๊ฒฐํ•จ์€ ํŒจ์น˜๋œ bl2_ext๋ฅผ ARM EL3์—์„œ ์‹คํ–‰์‹œ์ผœ ํ•˜๋ฅ˜์˜ ์„œ๋ช… ๊ฒ€์ฆ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ, ์‹ ๋ขฐ ์ฒด์ธ์„ ๋ถ•๊ดด์‹œ์ผœ ์ž„์˜์˜ ์„œ๋ช…๋˜์ง€ ์•Š์€ TEE/GZ/LK/Kernel ๋กœ๋“œ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

๊ฒฝ๊ณ : ์ดˆ๊ธฐ ๋ถ€ํŠธ ๋‹จ๊ณ„์—์„œ์˜ ํŒจ์น˜๋Š” ์˜คํ”„์…‹์ด ํ‹€๋ฆฌ๋ฉด ๊ธฐ๊ธฐ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ๋ฒฝ๋Œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํ•ญ์ƒ ์ „์ฒด ๋คํ”„์™€ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ณต๊ตฌ ๊ฒฝ๋กœ๋ฅผ ๋ณด๊ด€ํ•˜๋ผ.

์˜ํ–ฅ ๋ฐ›๋Š” ๋ถ€ํŠธ ํ”Œ๋กœ์šฐ (MediaTek)

  • ์ •์ƒ ๊ฒฝ๋กœ: BootROM โ†’ Preloader โ†’ bl2_ext (EL3, verified) โ†’ TEE โ†’ GenieZone (GZ) โ†’ LK/AEE โ†’ Linux kernel (EL1)
  • ์ทจ์•ฝ ๊ฒฝ๋กœ: seccfg๊ฐ€ unlocked๋กœ ์„ค์ •๋˜๋ฉด Preloader๊ฐ€ bl2_ext์˜ ๊ฒ€์ฆ์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋‹ค. Preloader๋Š” ์—ฌ์ „ํžˆ EL3์—์„œ bl2_ext๋กœ ์ ํ”„ํ•˜๋ฏ€๋กœ, ์กฐ์ž‘๋œ bl2_ext๊ฐ€ ์ดํ›„์— ๊ฒ€์ฆ๋˜์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ต์‹ฌ ์‹ ๋ขฐ ๊ฒฝ๊ณ„:

  • bl2_ext๋Š” EL3์—์„œ ์‹คํ–‰๋˜๋ฉฐ TEE, GenieZone, LK/AEE ๋ฐ ์ปค๋„์˜ ๊ฒ€์ฆ์„ ๋‹ด๋‹นํ•œ๋‹ค. bl2_ext ์ž์ฒด๊ฐ€ ์ธ์ฆ๋˜์ง€ ์•Š์œผ๋ฉด ๋‚˜๋จธ์ง€ ์ฒด์ธ์€ ์‰ฝ๊ฒŒ ์šฐํšŒ๋œ๋‹ค.

๊ทผ๋ณธ ์›์ธ

์˜ํ–ฅ ๋ฐ›๋Š” ๊ธฐ๊ธฐ๋“ค์—์„œ๋Š” seccfg๊ฐ€ โ€œunlockedโ€ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋•Œ Preloader๊ฐ€ bl2_ext ํŒŒํ‹ฐ์…˜์˜ ์ธ์ฆ์„ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” bl2_ext๋ฅผ ํ”Œ๋ž˜์‹œํ•ด EL3์—์„œ ์‹คํ–‰๋˜๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.

bl2_ext ๋‚ด๋ถ€์—์„œ ๊ฒ€์ฆ ์ •์ฑ… ํ•จ์ˆ˜๋Š” ๊ฒ€์ฆ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋ฌด์กฐ๊ฑด ๋ณด๊ณ ํ•˜๋„๋ก ํŒจ์น˜๋  ์ˆ˜ ์žˆ๋‹ค. ์ตœ์†Œํ•œ์˜ ๊ฐœ๋…์  ํŒจ์น˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

// inside bl2_ext
int sec_get_vfy_policy(...) {
return 0; // always: "no verification required"
}

์ด ๋ณ€๊ฒฝ์œผ๋กœ EL3์—์„œ ์‹คํ–‰๋˜๋Š” ํŒจ์น˜๋œ bl2_ext๊ฐ€ ๋กœ๋“œํ•  ๋•Œ, ์ดํ›„์˜ ๋ชจ๋“  ์ด๋ฏธ์ง€(TEE, GZ, LK/AEE, Kernel)๋Š” ์•”ํ˜ธํ™” ๊ฒ€์ฆ ์—†์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํƒ€๊นƒ์„ ๋ถ„๋ฅ˜ํ•˜๋Š” ๋ฐฉ๋ฒ• (expdb ๋กœ๊ทธ)

bl2_ext ๋กœ๋“œ ์ฃผ๋ณ€์˜ ๋ถ€ํŠธ ๋กœ๊ทธ(์˜ˆ: expdb)๋ฅผ ๋คํ”„/๊ฒ€์‚ฌํ•˜์„ธ์š”. ๋งŒ์•ฝ img_auth_required = 0 ์ด๊ณ  certificate verification time ์ด ์•ฝ ~0 ms ๋ผ๋ฉด, enforcement๊ฐ€ ๊บผ์ ธ ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฉฐ ๊ธฐ๊ธฐ๋Š” exploitableํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ๋กœ๊ทธ ๋ฐœ์ทŒ:

[PART] img_auth_required = 0
[PART] Image with header, name: bl2_ext, addr: FFFFFFFFh, mode: FFFFFFFFh, size:654944, magic:58881688h
[PART] part: lk_a img: bl2_ext cert vfy(0 ms)

Note: Some devices reportedly skip bl2_ext verification even with a locked bootloader, which exacerbates the impact.

์ผ๋ถ€ ๋””๋ฐ”์ด์Šค๋Š” locked bootloader ์ƒํƒœ์—์„œ๋„ bl2_ext ๊ฒ€์ฆ์„ ๊ฑด๋„ˆ๋›ด๋‹ค๊ณ  ๋ณด๊ณ ๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ๋” ์•…ํ™”์‹œํ‚จ๋‹ค.

Devices that ship the lk2 secondary bootloader have been observed with the same logic gap, so grab expdb logs for both bl2_ext and lk2 partitions to confirm whether either path enforces signatures before you attempt porting.

lk2 secondary bootloader๋ฅผ ํƒ‘์žฌํ•œ ๋””๋ฐ”์ด์Šค์—์„œ๋„ ๋™์ผํ•œ ๋…ผ๋ฆฌ์  ๊ฒฐํ•จ์ด ๊ด€์ฐฐ๋˜์—ˆ์œผ๋ฏ€๋กœ, ํฌํŒ…์„ ์‹œ๋„ํ•˜๊ธฐ ์ „์— bl2_ext ๋ฐ lk2 ํŒŒํ‹ฐ์…˜์˜ expdb logs๋ฅผ ์ˆ˜์ง‘ํ•ด ๋‘ ๊ฒฝ๋กœ ์ค‘ ์–ด๋А ์ชฝ์ด ์„œ๋ช…์„ ๊ฐ•์ œํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ผ.

If a post-OTA Preloader now logs img_auth_required = 1 for bl2_ext even while seccfg is unlocked, the vendor likely closed the gapโ€”see the OTA persistence notes below.

๋งŒ์•ฝ post-OTA Preloader๊ฐ€ seccfg๊ฐ€ unlocked ์ƒํƒœ์ž„์—๋„ bl2_ext์— ๋Œ€ํ•ด img_auth_required = 1์„ ๊ธฐ๋กํ•œ๋‹ค๋ฉด, ๊ณต๊ธ‰์—…์ฒด๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค โ€” ์•„๋ž˜์˜ OTA persistence notes๋ฅผ ์ฐธ์กฐํ•˜๋ผ.

Practical exploitation workflow (Fenrir PoC)

Fenrir is a reference exploit/patching toolkit for this class of issue. It supports Nothing Phone (2a) (Pacman) and is known working (incompletely supported) on CMF Phone 1 (Tetris). Porting to other models requires reverse engineering the device-specific bl2_ext.

Fenrir๋Š” ์ด ํด๋ž˜์Šค์˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฐธ์กฐ exploit/patching ํˆดํ‚ท์ด๋‹ค. Nothing Phone (2a) (Pacman)์„ ์ง€์›ํ•˜๋ฉฐ, CMF Phone 1 (Tetris)์—์„œ๋„ ๋ถ€๋ถ„์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋ธ๋กœ ํฌํŒ…ํ•˜๋ ค๋ฉด ๊ธฐ๊ธฐ๋ณ„ bl2_ext์— ๋Œ€ํ•œ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง์ด ํ•„์š”ํ•˜๋‹ค.

High-level process:

  • Obtain the device bootloader image for your target codename and place it as bin/<device>.bin
  • Build a patched image that disables the bl2_ext verification policy
  • Flash the resulting payload to the device (fastboot assumed by the helper script)

์ƒ์œ„ ์ˆ˜์ค€ ์ ˆ์ฐจ:

  • ๋Œ€์ƒ codename์— ๋Œ€ํ•œ device bootloader image๋ฅผ ํ™•๋ณดํ•˜๊ณ  bin/<device>.bin์œผ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค
  • bl2_ext verification policy๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” patched image๋ฅผ ๋นŒ๋“œํ•œ๋‹ค
  • ์ƒ์„ฑ๋œ payload๋ฅผ device์— flashํ•œ๋‹ค (ํ—ฌํผ ์Šคํฌ๋ฆฝํŠธ๋Š” fastboot ์‚ฌ์šฉ์„ ์ „์ œ๋กœ ํ•œ๋‹ค)

Commands:

# Build patched image (default path bin/[device].bin)
./build.sh pacman

# Build from a custom bootloader path
./build.sh pacman /path/to/your/bootloader.bin

# Flash the resulting lk.patched (fastboot required by the helper script)
./flash.sh

fastboot๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ํ”Œ๋žซํผ์— ์ ํ•ฉํ•œ ๋‹ค๋ฅธ flashing method๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

OTA-patched firmware: ์šฐํšŒ ์œ ์ง€ํ•˜๊ธฐ (NothingOS 4, late 2025)

Nothing๋Š” 2025๋…„ 11์›” NothingOS 4 stable OTA (build BP2A.250605.031.A3)์—์„œ Preloader๋ฅผ ํŒจ์น˜ํ•˜์—ฌ seccfg๊ฐ€ ์ž ๊ธˆ ํ•ด์ œ๋˜์–ด ์žˆ๋”๋ผ๋„ bl2_ext ๊ฒ€์ฆ์„ ๊ฐ•์ œํ–ˆ์Šต๋‹ˆ๋‹ค. Fenrir pacman-v2.0๋Š” NOS 4 beta์˜ ์ทจ์•ฝํ•œ Preloader์™€ stable LK payload๋ฅผ ์„ž์–ด ๋‹ค์‹œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค:

# on Nothing Phone (2a), unlocked bootloader, in bootloader (not fastbootd)
fastboot flash preloader_a preloader_raw.img   # beta Preloader bundled with fenrir release
fastboot flash lk pacman-fenrir.bin            # patched LK containing stage hooks
fastboot reboot                                # factory reset may be needed

์ค‘์š”:

  • ์ œ๊ณต๋œ Preloader๋ฅผ ์˜ค์ง ์ผ์น˜ํ•˜๋Š” device/slot์—๋งŒ Flashํ•˜์‹ญ์‹œ์˜ค; ์ž˜๋ชป๋œ preloader๋Š” ์ฆ‰์‹œ hard brick์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.
  • flashing ํ›„ expdb๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค; img_auth_required๋Š” bl2_ext์— ๋Œ€ํ•ด 0์œผ๋กœ ๋Œ์•„์™€์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ์ทจ์•ฝํ•œ Preloader๊ฐ€ ํŒจ์น˜๋œ LK๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ํ–ฅํ›„ OTAs๊ฐ€ Preloader์™€ LK ๋‘˜ ๋‹ค ํŒจ์น˜ํ•˜๋ฉด, ์ทจ์•ฝํ•œ Preloader์˜ ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ์„ ๋ณด๊ด€ํ•˜์—ฌ ํ•ด๋‹น ๊ฐ„๊ทน์„ reโ€‘introduceํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์‹ญ์‹œ์˜ค.

๋นŒ๋“œ ์ž๋™ํ™” & payload ๋””๋ฒ„๊น…

  • build.sh์€ ์ฒ˜์Œ ์‹คํ–‰ํ•  ๋•Œ Arm GNU Toolchain 14.2 (aarch64-none-elf)๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  exportํ•˜๋ฏ€๋กœ cross-compilers๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • build.sh์„ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— DEBUG=1์„ exportํ•˜๋ฉด verbose serial prints๋ฅผ ํฌํ•จํ•ด payloads๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฏ€๋กœ, EL3 ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ blind-patchingํ•  ๋•Œ ๋””๋ฒ„๊น…์— ํฌ๊ฒŒ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด lk.patched์™€ <device>-fenrir.bin ๋‘ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค; ํ›„์ž๋Š” ์ด๋ฏธ payload๊ฐ€ ์ฃผ์ž…๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ flash/boot-testํ•  ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„ payload ๊ธฐ๋Šฅ (EL3)

ํŒจ์น˜๋œ bl2_ext payload๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค:

  • ์ปค์Šคํ…€ fastboot ๋ช…๋ น์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค
  • boot mode๋ฅผ ์ œ์–ด/์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋Ÿฐํƒ€์ž„์— builtโ€‘in bootloader ํ•จ์ˆ˜๋ฅผ ๋™์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์‹ค์ œ๋กœ๋Š” unlocked ์ƒํƒœ์ธ๋ฐ๋„ โ€œlock stateโ€๋ฅผ locked๋กœ ์Šคํ‘ธํ•‘ํ•˜์—ฌ ๋” ์—„๊ฒฉํ•œ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋‹ค (์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ๋Š” ์—ฌ์ „ํžˆ vbmeta/AVB ์กฐ์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ)

์ œํ•œ์‚ฌํ•ญ: ํ˜„์žฌ PoCs๋“ค์€ ๋Ÿฐํƒ€์ž„ ๋ฉ”๋ชจ๋ฆฌ ์ˆ˜์ •์„ MMU ์ œ์•ฝ์œผ๋กœ ์ธํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ณด๊ณ ํ•˜๋ฉฐ; ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ payloads๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ผ์ด๋ธŒ ๋ฉ”๋ชจ๋ฆฌ ์“ฐ๊ธฐ๋ฅผ ํ”ผํ•ฉ๋‹ˆ๋‹ค.

Payload ์Šคํ…Œ์ด์ง• ํŒจํ„ด (EL3)

Fenrir๋Š” ๊ณ„์ธก์„ ์„ธ ๊ฐœ์˜ compile-time ๋‹จ๊ณ„๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค: stage1์€ platform_init() ์ด์ „์— ์‹คํ–‰๋˜๊ณ , stage2๋Š” LK๊ฐ€ fastboot ์ง„์ž…์„ ์‹ ํ˜ธํ•˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋ฉฐ, stage3๋Š” LK๊ฐ€ Linux๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์ง์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. payload/devices/ ์•„๋ž˜์˜ ๊ฐ device ํ—ค๋”๋Š” ์ด๋Ÿฌํ•œ ํ›„ํฌ๋“ค์˜ ์ฃผ์†Œ์™€ fastboot ํ—ฌํผ ์‹ฌ๋ณผ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ํ•ด๋‹น ์˜คํ”„์…‹์„ ํƒ€๊นƒ ๋นŒ๋“œ์™€ ๋™๊ธฐํ™”ํ•ด ๋‘์‹ญ์‹œ์˜ค.

Stage2๋Š” ์ž„์˜์˜ fastboot oem verbs๋ฅผ ๋“ฑ๋กํ•˜๊ธฐ์— ํŽธ๋ฆฌํ•œ ์œ„์น˜์ž…๋‹ˆ๋‹ค:

void cmd_r0rt1z2(const char *arg, void *data, unsigned int sz) {
video_printf("r0rt1z2 was here...\n");
fastboot_info("pwned by r0rt1z2");
fastboot_okay("");
}

__attribute__((section(".text.main"))) void main(void) {
fastboot_register("oem r0rt1z2", cmd_r0rt1z2, true, false);
notify_enter_fastboot();
}

Stage3๋Š” ํ•˜์œ„ ๋‹ค์šด์ŠคํŠธ๋ฆผ ์ปค๋„ ์ ‘๊ทผ ์—†์ด Android์˜ โ€œOrange Stateโ€ ๊ฒฝ๊ณ ์™€ ๊ฐ™์€ ๋ถˆ๋ณ€ ๋ฌธ์ž์—ด์„ ํŒจ์น˜ํ•˜๊ธฐ ์œ„ํ•ด ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ์†์„ฑ์„ ์ผ์‹œ์ ์œผ๋กœ ๋ฐ˜์ „์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์‹œ์—ฐํ•ฉ๋‹ˆ๋‹ค:

set_pte_rwx(0xFFFF000050f9E3AE);
strcpy((char *)0xFFFF000050f9E3AE, "Patched by stage3");

stage1์ด ํ”Œ๋žซํผ ๊ธฐ๋™ ์ด์ „์— ์‹คํ–‰๋˜๋ฏ€๋กœ, verified boot chain์ด ํ•ด์ฒด๋˜๊ธฐ ์ „์— OEM ์ „์›/๋ฆฌ์…‹ primitives๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ ๋ฌด๊ฒฐ์„ฑ ๋กœ๊น…์„ ์‚ฝ์ž…ํ•˜๊ธฐ์— ์ ์ ˆํ•œ ์œ„์น˜์ž…๋‹ˆ๋‹ค.

Porting tips

  • ๊ธฐ๊ธฐ๋ณ„ bl2_ext๋ฅผ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋งํ•˜์—ฌ ๊ฒ€์ฆ ์ •์ฑ… ๋กœ์ง(์˜ˆ: sec_get_vfy_policy)์„ ์ฐพ์œผ์„ธ์š”.
  • ์ •์ฑ…์˜ ๋ฐ˜ํ™˜ ์ง€์ ์ด๋‚˜ ๊ฒฐ์ • ๋ถ„๊ธฐ(decision branch)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ด๋ฅผ โ€œno verification requiredโ€ (return 0 / unconditional allow)๋กœ ํŒจ์น˜ํ•˜์„ธ์š”.
  • ์˜คํ”„์…‹์€ ์™„์ „ํžˆ ๊ธฐ๊ธฐ ๋ฐ ํŽŒ์›จ์–ด๋ณ„๋กœ ์œ ์ง€ํ•˜์„ธ์š”; ๋ณ€ํ˜•๋“ค ๊ฐ„์— ์ฃผ์†Œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.
  • ๋จผ์ € ํฌ์ƒ์šฉ ์žฅ์น˜์—์„œ ๊ฒ€์ฆํ•˜์„ธ์š”. ํ”Œ๋ž˜์‹œํ•˜๊ธฐ ์ „์— ๋ณต๊ตฌ ๊ณ„ํš(์˜ˆ: EDL/BootROM loader/SoC-specific download mode)์„ ์ค€๋น„ํ•˜์„ธ์š”.
  • lk2 ์„ธ์ปจ๋”๋ฆฌ ๋ถ€ํŠธ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ž ๊ธด ์ƒํƒœ์ž„์—๋„ bl2_ext์— ๋Œ€ํ•ด โ€œimg_auth_required = 0โ€์„ ๋ณด๊ณ ํ•˜๋Š” ์žฅ์น˜๋Š” ์ด ์ทจ์•ฝ์  ํด๋ž˜์Šค์˜ ์ทจ์•ฝํ•œ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ๊ฐ„์ฃผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค; Vivo X80 Pro๋Š” ๋ณด๊ณ ๋œ ์ž ๊ธˆ ์ƒํƒœ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๋ฏธ ๊ฒ€์ฆ์„ ๊ฑด๋„ˆ๋›ฐ๋Š” ๊ฒƒ์ด ๊ด€์ฐฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • OTA๊ฐ€ ์–ธ๋ฝ ์ƒํƒœ์—์„œ bl2_ext ์„œ๋ช…(img_auth_required = 1)์„ ๊ฐ•์ œํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด, ๊ตฌ๋ฒ„์ „ Preloader(์ข…์ข… beta OTA์—์„œ ์ œ๊ณต ๊ฐ€๋Šฅ)๋ฅผ ํ”Œ๋ž˜์‹œํ•˜์—ฌ ์ทจ์•ฝ์ ์„ ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ๋‹ค์Œ, ์ƒˆ๋กœ์šด LK์— ๋งž๊ฒŒ ์—…๋ฐ์ดํŠธ๋œ ์˜คํ”„์…‹์œผ๋กœ fenrir๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์„ธ์š”.

Security impact

  • Preloader ์ดํ›„ EL3 ์ฝ”๋“œ ์‹คํ–‰ ๋ฐ ๋‚˜๋จธ์ง€ ๋ถ€ํŒ… ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ „์ฒด chain-of-trust ๋ถ•๊ดด.
  • ์„œ๋ช…๋˜์ง€ ์•Š์€ TEE/GZ/LK/Kernel์„ ๋ถ€ํŒ…ํ•  ์ˆ˜ ์žˆ์–ด secure/verified boot ๊ธฐ๋Œ€๋ฅผ ์šฐํšŒํ•˜๊ณ  ์ง€์†์ ์ธ ์นจํ•ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ.

Device notes

  • Confirmed supported: Nothing Phone (2a) (Pacman)
  • Known working (incomplete support): CMF Phone 1 (Tetris)
  • Observed: Vivo X80 Pro reportedly did not verify bl2_ext even when locked
  • NothingOS 4 stable (BP2A.250605.031.A3, Nov 2025) re-enabled bl2_ext verification; fenrir pacman-v2.0 restores the bypass by flashing the beta Preloader plus patched LK as shown above
  • Industry coverage highlights additional lk2-based vendors shipping the same logic flaw, so expect further overlap across 2024โ€“2025 MTK releases.

References

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ