
CVE-2022-38694 استغلال محصّن - أداة وميض تلقائي لمضيف USB من RP2350 لأجهزة Unisoc
استغلال ثغرة CVE-2022-38694 في BootROM الخاص بشركة Unisoc عبر Raspberry Pi RP2350 مع USB Host لإرسال SPL Loader تلقائيًا عند الإقلاع وتشغيل أي u-boot.
ينقل سلسلة الاستغلال — التي كانت تتطلب في الأصل جهاز كمبيوتر + spd_dump — إلى متحكم RP2350. وصّل الجهاز، وستتم عملية الوميض تلقائيًا، مع دعم الوميض المستمر.
CVE-2022-38694 هي تجاوز لمرة واحدة للتحقق من التوقيع في BootROM الخاص بشركة Unisoc. بإرسال exec stub إلى عنوان ذاكرة محدد، يتم استبدال عنوان الإرجاع، مما يتجاوز فحوصات التوقيع ويسمح لـ BootROM بقبول وتنفيذ أي FDL1.
النقطة الأساسية: يتشارك FDL1 وSPL Loader في نفس عنوان التحميل (0x28007000)، لذلك يمكن إرسال SPL Loader مُصحَّح بدلاً من FDL1 لتشغيل أي u-boot.
يتطلب الإعداد الأولي جهاز كمبيوتر مع spd_dump:
┌──────────────────────────────────────────────────────────────────────────┐
│ Stage 1: PC-side Initial Unlock │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ Step 1: Exploit CVE-2022-38694 to boot patched SPL │
│ ┌────────────┐ ┌────────────┐ ┌─────────────────┐ │
│ │ Exec Stub │───►│ spl-unlock │───►│ Device boots │ │
│ │ @0x3F28 │ │ @0x28007000│ │ into DL mode │ │
│ └────────────┘ └────────────┘ └────────┬────────┘ │
│ │ │
│ Step 2: Send patched FDL2 via spd_dump, flash u-boot without │
│ secure boot, erase splloader │
│ │ │
│ ┌─────────────────┐ ┌──────────────────────▼───────────┐ │
│ │ Send fdl2-dl │───►│ Write u-boot (secure boot removed│ │
│ │ (patched FDL2) │ │ + Erase splloader partition) │ │
│ └─────────────────┘ └──────────────────────────────────┘ │
│ │
│ ★ After erasing splloader, device enters BootROM DL mode on every boot │
└──────────────────────────────────────────────────────────────────────────┘
الخطوات:
spl-unlock.bin وتشغيل الجهازfdl2-dl.bin المُصحَّح (FDL2 مع إزالة التحقق من الإقلاع الآمن)عند مسح splloader، يدخل الجهاز في وضع تنزيل BootROM عند كل تشغيل. يتعامل USB Host الخاص بـ RP2350 تلقائيًا مع سلسلة الاستغلال:
┌──────────────────────────────────────────────────────────────────────────┐
│ Stage 2: RP2350 Automated Boot │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ Power on → no splloader → BootROM download mode │
│ │
│ ┌─────────┐ ┌────────────┐ ┌─────────────┐ ┌──────────────┐ │
│ │ BootROM │───►│ Exec Stub │───►│ spl-unlock │───►│ U-Boot │ │
│ │ Handshk │ │ Bypass sig │ │ as FDL1 │ │ (no secboot) │ │
│ └─────────┘ └────────────┘ └─────────────┘ │ Boot OK ✓ │ │
│ └──────────────┘ │
│ │
│ ★ Fully automatic. Unplug → auto-reset → ready for next device. │
└──────────────────────────────────────────────────────────────────────────┘
لماذا مسح splloader؟
┌─────────────┐ ┌──────────────────┐ ┌───────────────────┐ ┌──────────────┐
│ BootROM │ │ Exec Stub │ │ SPL Loader │ │ U-Boot │
│ Handshake │ ──► │ @0x3F28 (136B) │ ──► │ @0x28007000 │ ──► │ Boot OK │
│ CHECK_BAUD │ │ Bypass sig chk │ │ Replaces FDL1 │ │ │
└─────────────┘ └──────────────────┘ └───────────────────┘ └──────────────┘
CHECK_BAUD + CONNECT, إنشاء اتصال BSL0x3F28, استغلال CVE-2022-38694 لاستبدال عنوان الإرجاع وتجاوز التحقق من التوقيع0x28007000، وقد تم تجاوز فحص التوقيع بالفعللا يتضمن هذا المشروع برامج ثابتة مصححة لجميع الأجهزة. يجب عليك تصحيح البرنامج الثابت لجهازك بنفسك.
راجع Wiki الخاص بـ TomKing062:
xxd -i spl-unlock.bin > fdl1_data.h
حدّث اسم المصفوفة والماكرو في fdl1_data.h ليتوافق مع مراجع الكود.
يستخدم هذا المشروع حاليًا UDX710 exec stub (custom_exec_3f28.bin).
للتكيف مع شرائح أخرى، استبدل exec stub وعنوان التحميل في custom_exec_data.h:
قائمة الدعم الكاملة: SupportList
| المكوّن | الوصف |
|---|---|
| لوحة RP2350 | مثل Raspberry Pi Pico 2 |
| كابل USB Host | OTG أو تعديل عتادي لـ USB Host الخاص بـ RP2350 |
| جهاز SPD المستهدف | تم مسح splloader، ويدخل تلقائيًا في وضع BootROM DL عند التشغيل |
| الطرف | الوظيفة |
|---|---|
| USB D+/D- | التوصيل بجهاز SPD المستهدف |
| GP4 (TX) | إخراج تصحيح UART |
| GP5 (RX) | إدخال تصحيح UART |
يُستخدم منفذ USB للاتصال عبر Host. تُرسل سجلات التصحيح عبر UART1 (GP4/GP5, 115200bps).
cd spd_flasher
mkdir build && cd build
cmake .. -DTARGET_CHIP=rp2350
make -j$(nproc)
المخرجات: spd_flasher.uf2 (يُسحب ويُفلت عبر BOOTSEL) / spd_flasher.bin (للمبرمج)
spd_flasher.uf2 إلى RP2350spd_flasher/
├── main.c # Main program, USB Host init & device management
├── spd_protocol.c # SPD BSL protocol (HDLC framing, state machine)
├── spd_protocol.h # Protocol definitions
├── tusb_config.h # TinyUSB Host configuration
├── custom_exec_data.h # Exec Stub data (136B @0x3F28)
├── fdl1_data.h # SPL Loader data (spl-unlock.bin @0x28007000)
├── spl-unlock.bin # SPL Loader raw binary
├── CMakeLists.txt # CMake build configuration
└── signing_key.pem / aes_key.bin / iv_salt.bin # RP2350 secure boot keys
هذا المشروع مخصص لأغراض البحث الأمني والتعليم فقط. يجب على المستخدمين الامتثال لجميع القوانين واللوائح المعمول بها. لا يتحمل المؤلف أي مسؤولية عن أي أضرار مباشرة أو غير مباشرة ناتجة عن استخدام هذه الأداة.
هذا المشروع مرخّص بموجب GNU General Public License v3.0.
| البرنامج الثابت | التصحيح | المخرَج | الغرض |
|---|
| FDL2 (u-boot/lk) | NOP لفحوصات كتابة الأقسام الآمنة | fdl2-dl.bin | المرحلة 1: يُرسَل عبر spd_dump لكتابة الأقسام |
| U-Boot | تصحيح do_cboot() لإزالة الإقلاع الآمن | uboot معدَّل | المرحلة 1: يُكتب إلى الجهاز، ليحل محل uboot الأصلي |
| SPL Loader | NOP لدالة signcheck() وفحوصات النتيجة | spl-unlock.bin | المرحلتان 1 و2: يُرسَل عبر CVE-2022-38694 |
| المنصة | عنوان التنفيذ | المرجع |
|---|
| UDX710 | 0x3F28 | هذا المشروع (الافتراضي) |
| UMS312 / UMS512 | 0x3EE8 | exec_addr_v2 |
| UMS9230 | 0x65017F08 | exec_addr_v2 |
| SC9820E / SC9832E | 0x4F18 / 0x4EE8 | CVE-2022-38694 |
| PC + spd_dump | RP2350 المُحصَّن |
|---|
| الحجم | يتطلب كمبيوتر | متحكم واحد |
| التشغيل | أوامر يدوية | تشغيل = يعمل |
| الاستمرارية | يدوي لكل جهاز | إعادة تعيين تلقائية |
| النشر | غير ملائم | جاهز للإنتاج |
| التكلفة | — | ~3$ |