MediaTek XFlash Carbonara DA2 Hash Bypass
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Summary
Το “Carbonara” εκμεταλλεύεται τη διαδρομή λήψης XFlash της MediaTek για να τρέξει έναν τροποποιημένο Download Agent stage 2 (DA2) παρά τους ελέγχους ακεραιότητας του DA1. Ο DA1 αποθηκεύει το αναμενόμενο SHA-256 του DA2 στη RAM και το συγκρίνει πριν τη διακλάδωση. Σε πολλούς loaders, ο host ελέγχει πλήρως τη DA2 load address/size, δίνοντας μια ανεπαλήθευτη εγγραφή μνήμης που μπορεί να αντικαταστήσει αυτό το hash στη μνήμη και να ανακατευθύνει την εκτέλεση σε αυθαίρετα payloads (προ-OS context με invalidation της cache χειριζόμενο από τον DA).
Trust boundary in XFlash (DA1 → DA2)
- DA1 is signed/loaded by BootROM/Preloader. When Download Agent Authorization (DAA) is enabled, only signed DA1 should run.
- DA2 is sent over USB. DA1 receives size, load address, and SHA-256 and hashes the received DA2, comparing it to an expected hash embedded in DA1 (copied into RAM).
- Weakness: Σε μη ενημερωμένους loaders, ο DA1 δεν επικυρώνει τη DA2 load address/size και διατηρεί το expected hash εγγράψιμο στη μνήμη, επιτρέποντας στον host να αλλοιώσει τον έλεγχο.
Carbonara flow (“two BOOT_TO” trick)
- First
BOOT_TO: Εισέρχεται στη ροή staging DA1→DA2 (ο DA1 δεσμεύει, προετοιμάζει DRAM και εκθέτει το expected-hash buffer στη RAM). - Hash-slot overwrite: Στέλνεται ένα μικρό payload που σαρώνει τη μνήμη του DA1 για το αποθηκευμένο DA2-expected hash και το αντικαθιστά με το SHA-256 του attacker-modified DA2. Αυτό εκμεταλλεύεται τη φόρτωση υπό έλεγχο του χρήστη για να τοποθετήσει το payload εκεί όπου βρίσκεται το hash.
- Second
BOOT_TO+ digest: Ενεργοποιείται άλλο έναBOOT_TOμε τα patched DA2 metadata και στέλνεται το raw 32-byte digest που ταιριάζει με τον τροποποιημένο DA2. Ο DA1 επανυπολογίζει SHA-256 πάνω στο ληφθέν DA2, το συγκρίνει με το πλέον τροποποιημένο expected hash, και το άλμα πετυχαίνει στον κώδικα του attacker.
Επειδή η load address/size ελέγχονται από τον attacker, το ίδιο primitive μπορεί να γράψει οπουδήποτε στη μνήμη (όχι μόνο στο hash buffer), επιτρέποντας early-boot implants, βοηθήματα bypass για secure-boot ή κακόβουλα rootkits.
Minimal PoC pattern (mtkclient-style)
if self.xsend(self.Cmd.BOOT_TO):
payload = bytes.fromhex("a4de2200000000002000000000000000")
if self.xsend(payload) and self.status() == 0:
import hashlib
da_hash = hashlib.sha256(self.daconfig.da2).digest()
if self.xsend(da_hash):
self.status()
self.info("All good!")
payloadαναπαράγει το paid-tool blob που κάνει patch στο buffer του expected-hash μέσα στο DA1.sha256(...).digest()στέλνει raw bytes (όχι hex) ώστε το DA1 να συγκρίνει με τον patched buffer.- DA2 μπορεί να είναι οποιαδήποτε εικόνα που δημιούργησε ο επιτιθέμενος· η επιλογή της διεύθυνσης/του μεγέθους φόρτωσης επιτρέπει αυθαίρετη τοποθέτηση στη μνήμη με την εκκαθάριση της cache να διαχειρίζεται ο DA.
Patch landscape (hardened loaders)
- Αντιμετώπιση: Ενημερωμένα DAs κάνουν hardcode τη διεύθυνση φόρτωσης του DA2 σε
0x40000000και αγνοούν τη διεύθυνση που παρέχει ο host, οπότε οι εγγραφές δεν μπορούν να φτάσουν στο hash slot του DA1 (~περιοχή 0x200000). Το hash εξακολουθεί να υπολογίζεται αλλά δεν είναι πλέον εγγράψιμο από επιτιθέμενο. - Εντοπισμός patched DAs: mtkclient/penumbra σκανάρουν το DA1 για μοτίβα που υποδεικνύουν address-hardening· αν βρεθεί, το Carbonara παραλείπεται. Τα παλιά DAs εκθέτουν εγγράψιμα hash slots (συνήθως γύρω από offsets όπως
0x22dea4στο V5 DA1) και παραμένουν εκμεταλλεύσιμα. - V5 vs V6: Κάποιοι V6 (XML) loaders εξακολουθούν να δέχονται διευθύνσεις που παρέχει ο χρήστης· τα νεότερα V6 binaries συνήθως επιβάλλουν τη σταθερή διεύθυνση και είναι ανθεκτικά στο Carbonara εκτός αν γίνει downgrade.
Μετά την Carbonara (heapb8) — σημείωση
MediaTek διόρθωσε το Carbonara· μια νεότερη ευπάθεια, heapb8, στοχεύει τον DA2 USB file download handler σε patched V6 loaders, παρέχοντας εκτέλεση κώδικα ακόμα και όταν το boot_to είναι σκληρυμένο. Εκμεταλλεύεται ένα heap overflow κατά τη διάρκεια chunked file transfers για να καταλάβει τη ροή ελέγχου του DA2. Το exploit είναι δημόσιο στο Penumbra/mtk-payloads και δείχνει ότι οι διορθώσεις του Carbonara δεν κλείνουν όλη την επιφάνεια επίθεσης των DA.
Σημειώσεις για αξιολόγηση και σκληροποίηση
- Συσκευές όπου η διεύθυνση/το μέγεθος του DA2 δεν ελέγχονται και το DA1 διατηρεί το expected hash εγγράψιμο είναι ευάλωτες. Εάν ένας μεταγενέστερος Preloader/DA επιβάλει όρια διευθύνσεων ή διατηρεί το hash αμετάβλητο, το Carbonara μετριάζεται.
- Η ενεργοποίηση του DAA και η διασφάλιση ότι το DA1/Preloader επικυρώνουν τις παραμέτρους BOOT_TO (όρια + αυθεντικότητα του DA2) κλείνει το primitive. Το να κλείσετε μόνο το patch του hash χωρίς να περιορίσετε τη φόρτωση αφήνει ακόμη κίνδυνο αυθαίρετων εγγραφών.
References
- Carbonara: The MediaTek exploit nobody served
- Carbonara exploit documentation
- Penumbra Carbonara source code
- heapb8: exploiting patched V6 Download Agents
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.


