
CVE-2022-38694 हार्डन्ड एक्सप्लॉइट - Unisoc डिवाइसों के लिए RP2350 USB होस्ट ऑटो फ्लैशर
CVE-2022-38694 Unisoc BootROM भेद्यता का दोहन Raspberry Pi RP2350 USB होस्ट के माध्यम से किया गया है, ताकि बूट के समय स्वचालित रूप से SPL लोडर भेजा जा सके और मनमाना u-boot प्रारंभ किया जा सके।
एक्सप्लॉइट चेन — जिसके लिए मूल रूप से एक PC + spd_dump की आवश्यकता थी — अब RP2350 माइक्रोकंट्रोलर पर स्थानांतरित हो गई है। डिवाइस प्लग इन करें, स्वचालित रूप से फ्लैश करें, निरंतर फ्लैशिंग का समर्थन करता है।
CVE-2022-38694 Unisoc BootROM में एक बार की सिग्नेचर सत्यापन बायपास है। एक विशिष्ट मेमोरी पते पर exec स्टब भेजने से, रिटर्न एड्रेस ओवरराइट हो जाता है, सिग्नेचर जाँचें बायपास हो जाती हैं और BootROM को मनमाना FDL1 स्वीकार करने और निष्पादित करने की अनुमति मिलती है।
मुख्य बिंदु: FDL1 और SPL लोडर एक ही लोड एड्रेस (0x28007000) साझा करते हैं, इसलिए FDL1 के स्थान पर एक पैच्ड SPL लोडर भेजा जा सकता है, जिससे मनमाना u-boot बूट होता है।
पहली बार सेटअप के लिए spd_dump वाले PC की आवश्यकता होती है:
┌──────────────────────────────────────────────────────────────────────────┐
│ 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 डाउनलोड मोड में प्रवेश करता है। RP2350 USB होस्ट स्वचालित रूप से एक्सप्लॉइट चेन को संभालता है:
┌──────────────────────────────────────────────────────────────────────────┐
│ 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, BSL संचार स्थापित करें0x3F28 पर 136 बाइट्स लोड करें, रिटर्न एड्रेस ओवरराइट करने के लिए CVE-2022-38694 का दोहन करें, सिग्नेचर सत्यापन बायपास करें0x28007000 साझा करते हैं, सिग्नेचर पहले ही बायपास हो चुका हैइस प्रोजेक्ट में सार्वभौमिक पैच्ड फर्मवेयर शामिल नहीं है। आपको अपने डिवाइस के फर्मवेयर को स्वयं पैच करना होगा।
TomKing062 की Wiki देखें:
xxd -i spl-unlock.bin > fdl1_data.h
कोड संदर्भों से मेल खाने के लिए fdl1_data.h में ऐरे नाम और मैक्रोज़ अपडेट करें।
यह प्रोजेक्ट वर्तमान में UDX710 exec स्टब (custom_exec_3f28.bin) का उपयोग करता है।
अन्य चिप्स के लिए अनुकूलित करने हेतु, custom_exec_data.h में exec स्टब और लोड एड्रेस बदलें:
पूर्ण समर्थन सूची: SupportList
| घटक | विवरण |
|---|---|
| RP2350 बोर्ड | जैसे Raspberry Pi Pico 2 |
| USB होस्ट केबल | RP2350 USB होस्ट के लिए OTG या हार्डवेयर मॉड |
| टार्गेट SPD डिवाइस | splloader मिटा हुआ, पावर-ऑन पर स्वतः BootROM DL मोड में प्रवेश करता है |
| पिन | कार्य |
|---|---|
| USB D+/D- | टार्गेट SPD डिवाइस से कनेक्ट करें |
| GP4 (TX) | UART डीबग आउटपुट |
| GP5 (RX) | UART डीबग इनपुट |
USB पोर्ट होस्ट संचार के लिए उपयोग किया जाता है। डीबग लॉग 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 को RP2350 पर फ्लैश करेंspd_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 लोडर | signcheck() और रिज़ल्ट जाँचों को NOP करें | spl-unlock.bin | चरण 1 और 2: CVE-2022-38694 के माध्यम से भेजा जाता है |
| प्लेटफ़ॉर्म | exec एड्रेस | संदर्भ |
|---|
| UDX710 | 0x3F28 | यह प्रोजेक्ट (डिफ़ॉल्ट) |
| UMS312 / UMS512 | 0x3EE8 | exec_addr_v2 |
| UMS9230 | 0x65017F08 | exec_addr_v2 |
| SC9820E / SC9832E | 0x4F18 / 0x4EE8 | CVE-2022-38694 |
| PC + spd_dump | RP2350 हार्डन्ड |
|---|
| आकार | PC की आवश्यकता | एकल MCU |
| संचालन | मैन्युअल कमांड | पावर ऑन = चालू |
| निरंतरता | प्रति डिवाइस मैन्युअल | ऑटो-रीसेट |
| तैनाती | असुविधाजनक | प्रोडक्शन-रेडी |
| लागत | — | ~$3 |