
حزمة استغلال لـ bootROM الخاص بـ Exynos 9830 توفّر تجاوز التمهيد الموقّع، وحقن مفاتيح مخصصة، وحمولات تفريغ الذاكرة لأجهزة Samsung SM-G985F.
[!CAUTION] حزمة المفاتيح الحالية والملفات المُنشأة قادرة على الحرق (fusing-capable). بمجرد حرق جهاز ما، يكون تغيير eFuse غير قابل للتراجع، ويجب أن يستمر الجهاز في استخدام صور الإقلاع ومواد المفاتيح المطابقة للمفتاح المَحروق. استخدام هذه الملفات أو التدفقات على مسؤوليتك الخاصة بسبب سلوك الحرق؛ تظل جميع العواقب مسؤولية المستخدم الذي يشغّلها. تحقق من ملف eFuse، والمفاتيح الخاصة، وصور FWBL1 الموقعة، وLK /
sboot.bin، والجهاز الهدف قبل تشغيل أي تدفق حرق.
| المسار | الغرض |
|---|---|
bootLoaderFiles/ | ثنائيات محمّل الإقلاع، وأجزاء محمّل الإقلاع المقسمة، والصور الأصلية، والصور المفكوك تشفيرها، ومخرجات التفريغ. |
bootromNotes/ | ملاحظات Boot 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 برنامج تشغيل متوافقًا مع WinUSB/libusb
قبل أن يتمكن PyUSB من فتحه. راجع exploit/windows/README.md.
يتضمن المستودع حزمة برنامج تشغيل WinUSB في
exploit/windows/Exynos_USB_Device.inf، مع ملف الفهرس (catalog) وملف استيراد الشهادة المطابقين لها في نفس الدليل.
sboot.binpython3 exploit/split.py bootLoaderFiles/originalSboot_K/sboot.bin -o exploit/extra/images
يكتب سكربت التقسيم أجزاء الصور وملف split_manifest.json في دليل الإخراج.
يجب أن تستخدم صورة LK معرّفات أوامر مفتاح الإقلاع الآمن 2 الخاصة بـ ROM لتدفق المفتاح المخصص:
عند تطبيق ملف TSV الخاص برقعة LK داخل مشروع Ghidra، تم استدعاء المساعد عبر Ghidra بدون واجهة (headless) على النحو التالي:
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"
ضمّن مفتاح eFuse ذا الـ 32 بايت في lk.bin عند الإزاحة 0x205008، لاستبدال المفتاح الأصلي:
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 وحمولة المفتاح المخصص بتضمين ملف efuse بحجم 32 بايت وقت البناء.
افتراضيًا، يقرأ ملف Makefile الملف external/keys/exynos9830_crecker/crecker.efuse؛
ويمكن تجاوز هذا الأمر بتحديد CUSTOM_KEY_EFUSE=/path/to/crecker.efuse عند الحاجة.
تعيد خطوة الفحص المسبق التي يشغّلها exploit/exploit.py توقيع مجموعة صور SBoot في
exploit/extra/images/ في مكانها قبل كل تشغيل موقّع. لا يتم الاحتفاظ بأي ناتج موقّع
منفصل. تستخدم خطوة التوقيع حزمة المفاتيح المشتركة المتعقبة عمدًا تحت 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.
حمولة المفتاح المخصص لـ Exynos990 الموجودة تحت external/payloads/exynos990_boot_custom_key/ مبنية على
الهيكل العظمي لحمولة مفتاح الإقلاع المخصص وفكرة تدفق التحكم من
VDavid003/exynos-usbdl، وهو فرع من
frederic/exynos-usbdl. وقد أُعيدت كتابتها وتكييفها
بشكل جوهري لسلسلة GET_CONFIGURATION الخاصة بـ Exynos9830 / Exynos990، وهي ليست نسخة حرفية من الحمولة
العلوية. نظرًا لأن المشروع العلوي المُشار إليه مرخّص بموجب GNU GPL v3.0، فإن هذه الحمولة محفوظة
بموجب GPL-3.0-only؛ راجع 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 | تفريغ Boot ROM | mem.bin | يستقبل 0x20000 بايت في exynos990.bootrom.bin. |
| الخطوة | الملاحظة |
|---|
| 1 | أدخل وضع التنزيل (download mode). |
| 2 | أنشئ أو حدّث sboot.bin باستخدام exploit/merge.py عند الحاجة. |
| 3 | استخدم تدفق المفتاح المخصص الموقّع للوصول إلى وضع Crecker، وهو وضع بنمط ODIN يقبل تدفق الصورة الهدف. |
| 4 | أرسل sboot.bin الجديد عبر ODIN أو Heimdall أو أي مرسل متوافق آخر. |
| 5 | شغّل حمولة UFS. |
| 6 | اختياري: ثبّت CreckerRom لسير عمل One UI 7 وStrong Integrity. |
| 7 | اختياري: اقفل محمّل الإقلاع بعد اكتمال إعداد الهدف. |
| الخطوة | المرحلة | الملاحظات |
|---|
| 1 | BootROM | تنفيذ ROM الأولي. |
| 2 | BL1 | تسليم كامل من BootROM. |
| 3 | EPBL | تسليم كامل من BL1. |
| 4 | EPBL | يُعدّ معالج SMC أدنى (minimal). |
| 5 | BL2 | EPBL يحمّل BL2. |
| 6 | BL2 | تسليم جزئي إلى BL2. |
| 7 | LK | يستخدم BL2 أداة EPBL لتحميل LK، لكن LK لا يُنفَّذ فورًا. |
| 8 | EL3 Monitor | يستخدم BL2 أداة EPBL لتحميل EL3 Monitor. |
| 9 | EL3 Monitor | يفك EPBL تشفير EL3 Monitor. |
| 10 | EL3 Monitor | تسليم كامل إلى EL3 Monitor. |
| 11 | EL3 Monitor | يهيئ ويُعدّ معالج SMC الموسّع. |
| 12 | LK | ينتقل التنفيذ إلى LK. |
| 13 | LK / EL3 Monitor | يستدعي LK معالج SMC الخاص بـ EL3 Monitor لتحميل أجزاء TrustZone. |
| 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 | مسار مصدر الإقلاع |
|---|
1 | مسار UFS، تدفق تحميل UFS المشترك. |
2 | مسار تهيئة eMMC/SDMMC، تدفق 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 البديل، نفس تدفق UFS الأساسي للمعرّف 1 مع علامة وضع مختلفة. |
7 | مسار قراءة وحدة التحكم الخام غير MMC/UFS/USB. |
0xB / 11 | مسار USB الاحتياطي، ثم نفس معالج USB للمعرّف 4. |
| معرف المصدر | القيمة | المعنى |
|---|
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 | أبلغ Samsung بثغرة CVE-2024-56426. |
| kethily-daniel | وفّر الوصول إلى الأداة المستخدمة لتتبع حزم USB واستخراج العينات. |
| BotchedRPR | ساعد في البحث الأولي وإنشاء carte2. |
| VDavid003 | ساعد في الهندسة العكسية لـ PoC عبر تفريغات الحزم واختبرها شخصيًا على الأجهزة. |
| halal-beef / hubble | وفّر تفريغات حزم USB الأولية وتحليل PoC خلال دورة البحث، والكود الخلفي المستخدم في سكربت الاستغلال، وتخطيطات SoC المستخدمة في سكربتي التقسيم والدمج. |
| VDavid003 / exynos-usbdl | وفّر الهيكل العظمي لحمولة المفتاح المخصص بموجب GPLv3 وتدفق تنزيل USB المرجعي لـ Exynos المستخدم كأساس لحمولة المفتاح المخصص لـ Exynos990. |
| R0rt1z2 | ساعد في إنشاء الحمولة؛ بعض العمل كان مبنيًا على مشروعه kaeru. |
| AntiEngineer | شارك معرفة ARM وتلميحات ودعمًا بحثيًا. |
| AA | إلهام الثغرة وأول استخدام خارج Chimera. |