
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 का उपयोग करना चाहिए:
| कुंजी 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 |
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
| पेलोड | आउटपुट पथ | उद्देश्य |
|---|---|---|
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 द्वारा उपयोग किया जाने वाला कस्टम-कुंजी हस्ताक्षरित-लोडर पेलोड। |
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
यह इन पर हस्ताक्षर करता है:
| इमेज | उपयोग की गई कुंजी सामग्री | रोलबैक रिवीज़न |
|---|---|---|
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 |
बैच साइनर प्रत्येक इमेज के लिए दशमलव 23 पास करता है और किसी मौजूदा फ़ुटर में पहले से मौजूद पुराने रोलबैक मान का पुनः उपयोग नहीं करता।