
# استغلال Bootrom لمعالج Exynos9830 - CVE-2024-56426 - 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 لتدفق المفتاح المخصص:
| أمر المفتاح 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 |
عند تطبيق ملف 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
| الحمولة | مسار الإخراج | الغرض |
|---|---|---|
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 وحمولة المفتاح المخصص بتضمين ملف 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
يوقّع هذا:
| الصورة | مادة المفتاح المستخدمة | مراجعة التراجع |
|---|---|---|
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 لكل صورة ولا يعيد استخدام قيمة
تراجع أقدم موجودة بالفعل في تذييل قائم.
يُعاد تشفير epbl.img أولاً عند الحاجة، ثم يُوقَّع على البايتات النهائية.
لا يزال ldfw.img وtzsw.img يحتاجان إلى تدفق AVB الخارجي إذا كان المقصود
تحديث محتوى AVB الخاص بهما.
أمر FWBL1 فقط هو: