
CVE-2024-56426 Exynos9830 Bootrom एक्सप्लॉइट - SM-G985F
[!CAUTION] मौजूदा कुंजी बंडल और जनरेट की गई फ़ाइलें फ़्यूज़िंग-सक्षम हैं। एक बार डिवाइस फ़्यूज़ हो जाने पर, eFuse परिवर्तन अपरिवर्तनीय है और डिवाइस को फ़्यूज़ की गई कुंजी से मेल खाने वाले बूट इमेज और कुंजी सामग्री का उपयोग जारी रखना चाहिए। फ़्यूज़िंग व्यवहार के कारण इन फ़ाइलों या फ़्लो का उपयोग आपके अपने जोखिम पर है; सभी परिणामों की ज़िम्मेदारी उन्हें चलाने वाले उपयोगकर्ता की रहती है। eFuse फ़ाइल, निजी कुंजियाँ, हस्ताक्षरित FWBL1, LK /
sboot.binइमेज और लक्षित डिवाइस की पुष्टि करें, इससे पहले कि कोई फ़्यूज़िंग फ़्लो चलाया जाए।
| पथ | उद्देश्य |
|---|---|
bootLoaderFiles/ | बूटलोडर बाइनरी, विभाजित बूटलोडर भाग, मूल इमेज, डिक्रिप्टेड इमेज और डंप आर्टिफ़ैक्ट। |
bootromNotes/ | बूट ROM नोट्स, फ़्लोचार्ट और USB कॉन्टेक्स्ट ऑफ़सेट। |
exploit/ | Python टूलिंग, एक्सप्लॉइट रनर, स्प्लिट/मर्ज स्क्रिप्ट, पेलोड निर्माण सहायक और SoC डेटा। |
exploit/extra/images/ | एक्सप्लॉइट फ़्लो द्वारा उपयोग की जाने वाली कार्यशील बूटलोडर इमेज। |
exploit/extra/payloads/ | external/payloads/ से कॉपी की गई निर्मित पेलोड बाइनरी। |
external/ | पेलोड स्रोत, निर्माण Makefile, डीकंपाइल नोट्स, साझा कुंजी सामग्री और सहायक उपकरण। |
external/keys/exynos9830_crecker/ | हस्ताक्षरित-लोडर फ़्लो द्वारा उपयोग किया जाने वाला साझा Exynos9830 / Exynos990 कस्टम-कुंजी बंडल। |
exynos990reverseEng/ | Exynos 990 रिवर्स इंजीनियरिंग प्रोजेक्ट फ़ाइलें। |
sudo apt-get update
sudo apt-get install -y gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu
brew tap messense/macos-cross-toolchains
brew install aarch64-unknown-linux-gnu
python3 -m pip install -r requirements.txt
requirements.txt में coloredlogs, cryptography, hexdump, libusb, pyusb और pycryptodome शामिल हैं।
Windows पर, BootROM USB डिवाइस 04e8:1234 को PyUSB द्वारा खोले जाने से पहले WinUSB/libusb-संगत ड्राइवर का उपयोग करना चाहिए। exploit/windows/README.md देखें।
रिपॉज़िटरी में exploit/windows/Exynos_USB_Device.inf पर एक WinUSB ड्राइवर पैकेज शामिल है, जिसके साथ उसी निर्देशिका में मेल खाता कैटलॉग और प्रमाणपत्र आयात फ़ाइल भी है।
sboot.bin विभाजित करेंpython3 exploit/split.py bootLoaderFiles/originalSboot_K/sboot.bin -o exploit/extra/images
स्प्लिट स्क्रिप्ट इमेज भागों और एक split_manifest.json फ़ाइल को आउटपुट निर्देशिका में लिखती है।
LK इमेज को कस्टम-कुंजी फ़्लो के लिए ROM सिक्योर बूट कुंजी 2 कमांड ID का उपयोग करना चाहिए:
Ghidra प्रोजेक्ट के अंदर LK पैच TSV लागू करते समय, सहायक को Ghidra हेडलेस के माध्यम से इस प्रकार कॉल किया गया था:
GHIDRA=/path/to/ghidra_12.0.4_PUBLIC
REPO=$(pwd)
"$GHIDRA/support/analyzeHeadless" "$REPO/exynos990reverseEng" exynos990 \
-process lk.bin \
-noanalysis \
-scriptPath "$REPO/external/ghidra" \
-postScript ApplyLkPatches.java "$REPO/external/ghidra/lk_985_selected_patches.tsv"
स्टॉक कुंजी को प्रतिस्थापित करते हुए, 32-बाइट eFuse कुंजी को ऑफ़सेट 0x205008 पर lk.bin में एम्बेड करें:
dd if=external/keys/exynos9830_crecker/crecker.efuse of=exploit/extra/images/lk.bin bs=1 seek=$((0x205008)) count=32 conv=notrunc
xxd -g1 -s $((0x205008)) -l 32 exploit/extra/images/lk.bin
python3 exploit/merge.py exploit/extra/images Exynos9830
मर्ज स्क्रिप्ट वर्तमान कार्यशील निर्देशिका में sboot.bin लिखती है।
external/payloads/ के अंतर्गत पेलोड प्रोजेक्ट बनाएं और परिणामी बाइनरी को exploit/extra/payloads/ में कॉपी करें:
./exploit/build_payloads.sh
UFS लोडर और कस्टम-कुंजी पेलोड निर्माण समय पर एक 32-बाइट efuse फ़ाइल एम्बेड करते हैं। डिफ़ॉल्ट रूप से Makefile external/keys/exynos9830_crecker/crecker.efuse पढ़ता है; ज़रूरत पड़ने पर इसे CUSTOM_KEY_EFUSE=/path/to/crecker.efuse से ओवरराइड करें।
exploit/exploit.py द्वारा चलाया जाने वाला प्रीफ़्लाइट चरण प्रत्येक हस्ताक्षरित रन से पहले exploit/extra/images/ में मौजूद SBoot इमेज सेट को उसी स्थान पर पुनः-हस्ताक्षरित करता है। कोई अलग हस्ताक्षरित आउटपुट नहीं रखा जाता। हस्ताक्षर चरण जानबूझकर ट्रैक किए गए साझा कुंजी बंडल external/keys/exynos9830_crecker/ का उपयोग करता है।
संपूर्ण इमेज सेट के लिए समकक्ष रिपॉज़िटरी-रूट कमांड:
python3 external/tools/sign_sboot_images.py \
--images-dir exploit/extra/images \
--keys-dir external/keys/exynos9830_crecker
यह इन पर हस्ताक्षर करता है:
बैच साइनर प्रत्येक इमेज के लिए दशमलव 23 पास करता है और किसी मौजूदा फ़ुटर में पहले से मौजूद पुराने रोलबैक मान का पुनः उपयोग नहीं करता।
ज़रूरत पड़ने पर epbl.img को पहले पुनः-एन्क्रिप्ट किया जाता है, फिर अंतिम बाइट्स पर हस्ताक्षर किए जाते हैं। यदि ldfw.img और tzsw.img की AVB सामग्री को ताज़ा करना है, तो उन्हें अभी भी बाहरी AVB फ़्लो की आवश्यकता होती है।
केवल-FWBL1 कमांड है:
python3 external/tools/sign_tool.py \
-i exploit/extra/images/fwbl1.img \
-o exploit/extra/images/fwbl1.img \
-k external/keys/exynos9830_crecker/crecker_private.pem \
-H external/keys/exynos9830_crecker/crecker.hmac \
-s 0x3000 \
-r 23 \
-ma 0x9830 \
-m 0x142 \
-e 11 \
-t external/keys/exynos9830_crecker/crecker_stage2_tee_pubkey.bin \
-re external/keys/exynos9830_crecker/crecker_stage2_ree_pubkey.bin
लघु रूप, जब sign_tool.py, fwbl1.img और crecker_* फ़ाइलें वर्तमान निर्देशिका में हों:
python3 sign_tool.py -i fwbl1.img -o fwbl1.img -k crecker_private.pem -H crecker.hmac -s 0x3000 -r 23 -ma 0x9830 -m 0x142 -e 11 -t crecker_stage2_tee_pubkey.bin -re crecker_stage2_ree_pubkey.bin
जब तक अन्यथा नोट न किया गया हो, कमांड रिपॉज़िटरी रूट से चलाएं।
देखी गई Exynos 9830 बूट प्रक्रिया है:
नोट: mem.bin डंप पेलोड का उपयोग केवल तभी किया जा सकता है जब कोई कार्यशील sboot इंस्टॉल न हो।
uh.bin को Heimdall के माध्यम से बूटलोडर पर भेजें:
heimdall flash --BOOTLOADER uh.bin
डंप फ़्लो चलाएं:
python3 exploit/exploit.py --dump
जनरेट की गई exynos990.bootrom.bin डंप की समीक्षा करें।
इस रिपॉज़िटरी में Python रिकवरी टूलिंग के कुछ हिस्सों को halal-beef/hubble से अनुकूलित किया गया था।
वह अपस्ट्रीम प्रोजेक्ट GNU GPL v2.0 के अंतर्गत प्रकाशित है, और यह रिपॉज़िटरी संगतता के लिए GPL-2.0 लाइसेंस रखती है। LICENSE और NOTICE.md देखें।
external/payloads/exynos990_boot_custom_key/ के अंतर्गत Exynos990 कस्टम-कुंजी पेलोड, VDavid003/exynos-usbdl के boot-custom-key पेलोड स्केलेटन और नियंत्रण-प्रवाह विचार पर आधारित है, जो frederic/exynos-usbdl का एक फ़ोर्क है। इसे Exynos9830 / Exynos990 GET_CONFIGURATION श्रृंखला के लिए काफी हद तक पुनः लिखा और अनुकूलित किया गया है, और यह अपस्ट्रीम पेलोड की शब्दशः प्रति नहीं है। चूंकि संदर्भित अपस्ट्रीम प्रोजेक्ट GNU GPL v3.0 के अंतर्गत लाइसेंस प्राप्त है, इसलिए यह पेलोड केवल-GPL-3.0 के अंतर्गत रखा गया है; external/payloads/exynos990_boot_custom_key/LICENSE देखें।
| कुंजी 1 कमांड | मान | कुंजी 2 कमांड | मान |
|---|
CMD_W_ROM_SEC_BOOT_KEY1 | 0x001 | CMD_W_ROM_SEC_BOOT_KEY2 | 0x016 |
CMD_W_USE_ROM_SEC_BOOT_KEY1 | 0x002 | CMD_W_USE_ROM_SEC_BOOT_KEY2 | 0x017 |
CMD_C_ROM_SEC_BOOT_KEY1 | 0x100 | CMD_C_ROM_SEC_BOOT_KEY2 | 0x114 |
CMD_R_USE_ROM_SEC_BOOT_KEY1 | 0x101 | CMD_R_USE_ROM_SEC_BOOT_KEY2 | 0x115 |
| पेलोड | आउटपुट पथ | उद्देश्य |
|---|
mem.bin | exploit/extra/payloads/mem.bin | Boot ROM मेमोरी डंप पेलोड। |
loader.bin | exploit/extra/payloads/loader.bin | --ufs द्वारा उपयोग किया जाने वाला UFS पथ पेलोड। |
Exynos990_boot_custom_key.bin | exploit/extra/payloads/Exynos990_boot_custom_key.bin | --signed द्वारा उपयोग किया जाने वाला कस्टम-कुंजी हस्ताक्षरित-लोडर पेलोड। |
| इमेज | उपयोग की गई कुंजी सामग्री | रोलबैक रिवीज़न |
|---|
fwbl1.img | BL1 निजी कुंजी + Stage2 TEE/REE सार्वजनिक कुंजियाँ | 23 |
epbl.img | Stage2 TEE निजी कुंजी | 23 |
bl2.img | Stage2 REE निजी कुंजी | 23 |
lk.bin | Stage2 REE निजी कुंजी | 23 |
el3_mon.img | Stage2 TEE निजी कुंजी | 23 |
ldfw.img | Stage2 TEE निजी कुंजी, आंतरिक + बाहरी | 23 |
tzsw.img | Stage2 TEE निजी कुंजी, आंतरिक + बाहरी | 23 |
| कमांड | मोड | डिफ़ॉल्ट पेलोड | नोट्स |
|---|
python3 exploit/exploit.py --ufs | UFS पथ | loader.bin | UFS पेलोड फ़्लो शुरू करता है। |
python3 exploit/exploit.py --signed | हस्ताक्षरित बूट श्रृंखला | Exynos990_boot_custom_key.bin | SBoot इमेज सेट को पुनः-हस्ताक्षरित करता है, इमेज भेजता है। |
python3 exploit/exploit.py --dump | बूट ROM डंप | mem.bin | exynos990.bootrom.bin में 0x20000 बाइट्स प्राप्त करता है। |
| चरण | नोट |
|---|
| 1 | डाउनलोड मोड में प्रवेश करें। |
| 2 | ज़रूरत पड़ने पर exploit/merge.py से sboot.bin बनाएं या अपडेट करें। |
| 3 | लक्षित इमेज फ़्लो स्वीकार करने वाले ODIN-शैली मोड Crecker मोड तक पहुंचने के लिए हस्ताक्षरित कस्टम-कुंजी फ़्लो का उपयोग करें। |
| 4 | नए sboot.bin को ODIN, Heimdall या किसी अन्य संगत भेजने वाले माध्यम से भेजें। |
| 5 | UFS पेलोड चलाएं। |
| 6 | वैकल्पिक: One UI 7 और Strong Integrity वर्कफ़्लो के लिए CreckerRom इंस्टॉल करें। |
| 7 | वैकल्पिक: लक्षित सेटअप पूरा होने के बाद बूटलोडर लॉक करें। |
| चरण | स्टेज | नोट्स |
|---|
| 1 | BootROM | प्रारंभिक ROM निष्पादन। |
| 2 | BL1 | BootROM से पूर्ण हैंडऑफ़। |
| 3 | EPBL | BL1 से पूर्ण हैंडऑफ़। |
| 4 | EPBL | एक न्यूनतम SMC हैंडलर स्थापित करता है। |
| 5 | BL2 | EPBL, BL2 लोड करता है। |
| 6 | BL2 | BL2 को आंशिक हैंडऑफ़। |
| 7 | LK | BL2, LK लोड करने के लिए EPBL का उपयोग करता है, लेकिन LK तुरंत निष्पादित नहीं होता। |
| 8 | EL3 Monitor | BL2, EL3 Monitor लोड करने के लिए EPBL का उपयोग करता है। |
| 9 | EL3 Monitor | EPBL, EL3 Monitor को डिक्रिप्ट करता है। |
| 10 | EL3 Monitor | EL3 Monitor को पूर्ण हैंडऑफ़। |
| 11 | EL3 Monitor | विस्तारित SMC हैंडलर को आरंभ और स्थापित करता है। |
| 12 | LK | निष्पादन LK पर कूदता है। |
| 13 | LK / EL3 Monitor | LK, TrustZone भागों को लोड करने के लिए EL3 Monitor SMC हैंडलर में कॉल करता है। |
| 14 | ODIN / कस्टम लक्ष्य | बूट ODIN या कॉन्फ़िगर किए गए लक्ष्य पर जारी रहता है। |
| भाग | प्रारंभ | अंत |
|---|
fwbl1.img | 0x0 | 0x3000 |
epbl.img | 0x3000 | 0x16000 |
bl2.img | 0x16000 | 0x82000 |
lk.bin | 0xDB000 | 0x35B000 |
el3_mon.img | 0x35B000 | 0x39B000 |
| स्टेज | लोड पता |
|---|
BL1 | 0x02022000 |
EPBL | 0x02026000 |
BL2 | 0x15600000 |
LK | 0xE8000000 |
EL3_MONITOR | 0xBFE80000 |
_boot_device स्रोत ID | बूट स्रोत पथ |
|---|
1 | UFS पथ, साझा UFS लोड फ़्लो। |
2 | eMMC/SDMMC init पथ, mmc_card_detect_and_init फ़्लो। |
3 | SDMMC/MMC डिवाइस 0, mmc_read_blocks(0, ...)। |
4 | USB लोड पथ। |
5 | SDMMC/MMC डिवाइस 1, mmc_read_blocks(1, ...)। |
6 | UFS वैकल्पिक मोड, 1 के समान कोर UFS फ़्लो, भिन्न मोड फ़्लैग के साथ। |
7 | गैर-MMC/UFS/USB रॉ कंट्रोलर रीड पथ। |
0xB / 11 | USB फ़ॉलबैक पथ, फिर 4 के समान USB हैंडलर। |
| स्रोत ID | मान | अर्थ |
|---|
1 | 0x20 | UFS |
2 | 0x14 | eMMC |
3 | 0x00 | SDMMC_CH2 |
4 / 0xB | 0x40 | USB |
| क्रेडिट | योगदान |
|---|
| Chimera Tool | लगभग 2021-2022 में एक्सप्लॉइट की पहली खोज। Chimera कई डिवाइसों पर उन्नत Exynos सर्विसिंग क्षमताएं प्रदान करता है, जिसमें इस एक्सप्लॉइट पर आधारित क्षमताएं भी शामिल हैं। |
| CVE-2024-56426 | वह CVE जिस पर यह प्रोजेक्ट आधारित है। |
| Christopher Wade | CVE-2024-56426 को Samsung को रिपोर्ट किया। |
| kethily-daniel | USB पैकेट ट्रेसिंग और सैंपल निष्कर्षण के लिए उपयोग किए जाने वाले टूल तक पहुंच प्रदान की। |
| BotchedRPR | प्रारंभिक शोध और carte2 के निर्माण में सहायता की। |
| VDavid003 | पैकेट डंप के माध्यम से PoC को रिवर्स इंजीनियर करने में सहायता की और व्यक्तिगत रूप से डिवाइसों पर परीक्षण किया। |
| halal-beef / hubble | शोध जीवनचक्र के दौरान PoC के प्रारंभिक USB पैकेट डंप और विश्लेषण, एक्सप्लॉइट स्क्रिप्ट द्वारा उपयोग किया जाने वाला बैकएंड कोड, और स्प्लिट और मर्ज स्क्रिप्ट द्वारा उपयोग किए जाने वाले SoC लेआउट प्रदान किए। |
| VDavid003 / exynos-usbdl | Exynos990 कस्टम-कुंजी पेलोड के आधार के रूप में उपयोग किए जाने वाले GPLv3 कस्टम-कुंजी पेलोड स्केलेटन और Exynos USB डाउनलोड संदर्भ फ़्लो प्रदान किए। |
| R0rt1z2 | पेलोड निर्माण में सहायता की; कुछ कार्य उनके प्रोजेक्ट kaeru पर आधारित था। |
| AntiEngineer | ARM ज्ञान, संकेत और शोध सहायता साझा की। |
| AA | भेद्यता प्रेरणा और Chimera के बाहर पहला उपयोग। |