MediaTek bl2_ext Secure-Boot Bypass (EL3 Code Execution)
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Ova stranica dokumentuje praktičan prekid secure-boot-a na više MediaTek platformi zloupotrebom praznine u verifikaciji kada je konfiguracija bootloader-a (seccfg) “unlocked”. Propust omogućava pokretanje patchovanog bl2_ext na ARM EL3 kako bi se onemogućila kasnija verifikacija potpisa, što urušava lanac poverenja i omogućava učitavanje proizvoljnih unsigned TEE/GZ/LK/Kernel slika.
Upozorenje: Patchovanje u ranoj fazi boot-a može trajno oštetiti uređaje ako su offset-i pogrešni. Uvek čuvajte potpune dump-ove i pouzdanu putanju za oporavak.
Affected boot flow (MediaTek)
- Normalan tok: BootROM → Preloader → bl2_ext (EL3, verified) → TEE → GenieZone (GZ) → LK/AEE → Linux kernel (EL1)
- Ranljiv tok: Kada je seccfg podešen na unlocked, Preloader može preskočiti verifikaciju bl2_ext. Preloader i dalje skače u bl2_ext na EL3, pa crafted bl2_ext može potom učitati neverifikovane komponente.
Ključna granica poverenja:
- bl2_ext se izvršava na EL3 i odgovoran je za verifikaciju TEE, GenieZone, LK/AEE i kernel-a. Ako bl2_ext sam nije autentifikovan, ostatak lanca se trivijalno zaobilazi.
Root cause
Na pogođenim uređajima, Preloader ne primenjuje autentifikaciju particije bl2_ext kada seccfg ukazuje na “unlocked” stanje. To omogućava flashovanje attacker-controlled bl2_ext koji se izvršava na EL3.
Unutar bl2_ext, funkcija politike verifikacije može se patch-ovati tako da bezuslovno prijavi da verifikacija nije potrebna (ili da uvek uspe), prisiljavajući boot lanac da prihvati unsigned TEE/GZ/LK/Kernel slike. Pošto se ovaj patch izvršava na EL3, efektivan je čak i ako downstream komponente imaju sopstvene provere.
Practical exploit chain
- Nabavite bootloader particije (Preloader, bl2_ext, LK/AEE, itd.) preko OTA/firmware paketa, EDL/DA readback-a, ili hardware dumping-a.
- Identifikujte bl2_ext verification routine i patch-ujte je da uvek preskače/prihvata verifikaciju.
- Flash-ujte modifikovani bl2_ext koristeći fastboot, DA, ili slične maintenance kanale koji su i dalje dozvoljeni na unlocked uređajima.
- Reboot; Preloader skače u patch-ovani bl2_ext na EL3 koji zatim učitava unsigned downstream slike (patch-ovani TEE/GZ/LK/Kernel) i onemogućava enforcement potpisa.
Ako je uređaj podešen kao locked (seccfg locked), očekuje se da Preloader verifikuje bl2_ext. U toj konfiguraciji, ovaj napad će neuspeti osim ako neki drugi propust ne dozvoli učitavanje unsigned bl2_ext.
Triage (expdb boot logs)
- Dump-ujte boot/expdb logove oko učitavanja bl2_ext. Ako je
img_auth_required = 0i vreme verifikacije sertifikata je ~0 ms, verifikacija je verovatno preskočena.
Example log excerpt:
[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)
- Neki uređaji preskaču verifikaciju bl2_ext čak i kada su zaključani; lk2 sekundarni bootloader putevi su pokazali istu rupu. Ako post-OTA Preloader prijavi
img_auth_required = 1za bl2_ext dok je uređaj otključan, verovatno je sprovođenje ponovo uspostavljeno.
Lokacije logike verifikacije
- Relevantna provera obično se nalazi unutar bl2_ext image u funkcijama koje se zovu slično kao
verify_imgilisec_img_auth. - Patchovana verzija prisiljava funkciju da vrati uspeh ili da potpuno zaobiđe poziv verifikacije.
Example patch approach (conceptual):
- Pronađite funkciju koja poziva
sec_img_authna TEE, GZ, LK i kernel images. - Zamenite telo funkcije stub-om koji odmah vraća uspeh, ili prepišite uslovnu granu koja obrađuje neuspeh verifikacije.
Osigurajte da patch čuva podešavanje stack/frame i vraća očekivane status kodove pozivaocima.
Fenrir PoC radni tok (Nothing/CMF)
Fenrir je referentni patching toolkit za ovaj problem (Nothing Phone (2a) u potpunosti podržan; CMF Phone 1 delimično). Opšti pregled:
- Postavite device bootloader image kao
bin/<device>.bin. - Sastavite patched image koji onemogućava bl2_ext verification policy.
- Flash-ujte nastali payload (fastboot helper obezbeđen).
./build.sh pacman # build from bin/pacman.bin
./build.sh pacman /path/to/boot.bin # build from a custom bootloader path
./flash.sh # flash via fastboot
Koristite drugi flashing kanal ako fastboot nije dostupan.
EL3 napomene o patchovanju
- bl2_ext izvršava se u ARM EL3. Padovi ovde mogu brick-ovati uređaj dok se ne reflashuje preko EDL/DA ili test points.
- Koristite board-specific logging/UART da potvrdite putanju izvršavanja i dijagnostikujete padove.
- Sačuvajte rezervne kopije svih particija koje menjate i prvo testirajte na disposable hardveru.
Implikaсije
- Izvršavanje EL3 koda posle Preloader-a i potpuni kolaps chain-of-trust za ostatak boot puta.
- Mogućnost boot-ovanja unsigned TEE/GZ/LK/Kernel, zaobilaženjem secure/verified boot očekivanja i omogućavajući persistent compromise.
Napomene o uređaju
- Potvrđeno podržano: Nothing Phone (2a) (Pacman)
- Poznato da radi (nepotpuna podrška): CMF Phone 1 (Tetris)
- Primećeno: Vivo X80 Pro navodno nije verifikovao bl2_ext čak i kada je zaključan
- NothingOS 4 stable (BP2A.250605.031.A3, Nov 2025) ponovo je omogućio verifikaciju bl2_ext; fenrir
pacman-v2.0vraća bypass mešanjem beta Preloader-a sa patch-ovanim LK - Izveštaji iz industrije ukazuju na dodatne lk2-based dobavljače koji isporučuju istu logičku grešku, pa očekujte dalje preklapanje u MTK izdanjima 2024–2025.
MTK DA readback i manipulacija seccfg pomoću Penumbra
Penumbra je Rust crate/CLI/TUI koji automatizuje interakciju sa MTK preloader/bootrom preko USB za DA-mode operacije. Sa fizičkim pristupom ranjivom handsetu (ako su DA extensions dozvoljene), može otkriti MTK USB port, učitati Download Agent (DA) blob i izdati privilegovane komande kao što su flipanje seccfg lock-a i readback particija.
- Environment/driver setup: Na Linuxu instalirajte
libudev, dodajte korisnika udialoutgrupu, i napravite udev pravila ili pokrenite sasudoako device node nije dostupan. Windows support je nepouzdan; ponekad radi samo nakon zamene MTK driver-a sa WinUSB koristeći Zadig (prema smernicama projekta). - Workflow: Pročitajte DA payload (npr.
std::fs::read("../DA_penangf.bin")), poll-ujte za MTK port safind_mtk_port(), i kreirajte sesiju koristećiDeviceBuilder::with_mtk_port(...).with_da_data(...). Nakon štoinit()završi handshake i prikupi device info, proverite zaštite prekodev_info.target_config()bitfield-ova (bit 0 postavljen → SBC enabled). Uđite u DA mode i pokušajteset_seccfg_lock_state(LockFlag::Unlock)—ovo uspeva samo ako uređaj prihvata extensions. Particije se mogu dump-ovati koristećiread_partition("lk_a", &mut progress_cb, &mut writer)za offline analizu ili patching. - Security impact: Uspešno otključavanje seccfg ponovo otvara flashing puteve za unsigned boot images, omogućavajući persistent compromises kao što je bl2_ext EL3 patching opisan gore. Readback particija daje firmware artefakte za reverse engineering i kreiranje modifikovanih image-a.
Rust DA sesija + seccfg unlock + dump particija (Penumbra)
```rust use tokio::fs::File; use anyhow::Result; use penumbra::{DeviceBuilder, LockFlag, find_mtk_port}; use tokio::io::{AsyncWriteExt, BufWriter};#[tokio::main] async fn main() -> Result<()> { let da = std::fs::read(“../DA_penangf.bin”)?; let mtk_port = loop { if let Some(port) = find_mtk_port().await { break port; } };
let mut dev = DeviceBuilder::default() .with_mtk_port(mtk_port) .with_da_data(da) .build()?;
dev.init().await?; let cfg = dev.dev_info.target_config().await; println!(“SBC: {}”, (cfg & 0x1) != 0);
dev.set_seccfg_lock_state(LockFlag::Unlock).await?;
let mut progress = |_read: usize, _total: usize| {}; let mut writer = BufWriter::new(File::create(“lk_a.bin”)?); dev.read_partition(“lk_a”, &mut progress, &mut writer).await?; writer.flush().await?; Ok(()) }
</details>
## Izvori
- [Fenrir – MediaTek bl2_ext secure‑boot bypass (PoC)](https://github.com/R0rt1z2/fenrir)
- [Cyber Security News – PoC Exploit Released For Nothing Phone Code Execution Vulnerability](https://cybersecuritynews.com/nothing-phone-code-execution-vulnerability/)
- [Fenrir pacman-v2.0 release (NothingOS 4 bypass bundle)](https://github.com/R0rt1z2/fenrir/releases/tag/pacman-v2.0)
- [The Cyber Express – Fenrir PoC breaks secure boot on Nothing Phone 2a/CMF1](https://thecyberexpress.com/fenrir-poc-for-nothing-phone-2a-cmf1/)
- [Penumbra – MTK DA flash/readback & seccfg tooling](https://github.com/shomykohai/penumbra)
> [!TIP]
> Učite i vežbajte AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Učite i vežbajte GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Učite i vežbajte Azure Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Podržite HackTricks</summary>
>
> - Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)!
> - **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili **pratite** nas na **Twitteru** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Podelite hakerske trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
>
> </details>


