
LPC55S69 और K82 सीरीज़ में पाई गई BootROM भेद्यता का परीक्षण करने के लिए POC
LPC55S69 और K82 सीरीज़ Revision A2 में पाई गई BootROM भेद्यता का परीक्षण करने के लिए POC। यह भेद्यता LPC55S69 के लिए नई Revision A3 वाले नए उपकरणों में ठीक कर दी गई है।
असुरक्षित डिवाइस:
पुष्टि: LPC55S69 और K82 सीरीज़ के MCU
संदिग्ध: समान USB ISP स्टैक वाले अन्य NXP सीरीज़ के MCU - Kinetis K सीरीज़ और RT सीरीज़
NXP LPC55s69 और Kinetis K82 माइक्रोकंट्रोलर सीरीज़ के USB इन-सिस्टम प्रोग्रामिंग (ISP) मोड में एक बफर ओवर-रीड भेद्यता देखी गई। शोषण किए जाने पर, यह भेद्यता हमलावर को संरक्षित फ्लैश मेमोरी से 16KB (LPC55S69) और 64KB (K82) डेटा पढ़ने की अनुमति देती है।
NXP LPC55S69 और K82 MCU, USB, SPI, UART और I2C जैसे परिधीय उपकरणों का उपयोग करके MCU के फर्मवेयर के फ़ील्ड अपडेट के लिए इन-सिस्टम प्रोग्रामिंग (ISP) मोड प्रदान करते हैं। USB ISP मोड NXP के प्रलेखित अपडेट कमांड के माध्यम से फर्मवेयर को अपडेट करने के लिए एक एम्बेडेड होस्ट प्रदान करता है।
ISP, LPC55S69 और K82 BootROM का हिस्सा है, और कुछ रजिस्टर बिट्स, ISP पिन और इमेज हेडर परिभाषा के मानों के आधार पर ट्रिगर होता है। LPC55S69 के लिए, USB HID क्लास का उपयोग USB0/1 पोर्ट की इमेज डाउनलोड करने के लिए किया जाता है, और इसी तरह, K82 के लिए ROM में Kinetis Bootloader, USB HID क्लास के रूप में USB परिधीय के माध्यम से फ्लैश में डेटा लोड करने का समर्थन करता है।
LPC55S69 और K82 सीरीज़ दोनों IC के USB ISP तीन (3) एंडपॉइंट्स का उपयोग करते हैं, जो नीचे सूचीबद्ध हैं:
बफर ओवर-रीड भेद्यता USB Control endpoint 0 के लिए देखी गई थी, जिसका उपयोग USB होस्ट एन्यूमरेशन के लिए किया जाता है।
लक्ष्य 1: LPC55S69
बफर ओवर-रीड भेद्यता एम्बेडेड USB होस्ट से GET Descriptor Configuration अनुरोध पर देखी जाती है। एक हमलावर, "wlength" मान को 65535 बाइट्स में संशोधित करके GET Descriptor Configuration भेजने के लिए USB अनुरोध तैयार करते समय, अधिकतम 16KB प्रतिक्रिया डेटा का अनुरोध कर सकता है। जब 16KB डेटा USB TX बफर में कॉपी होकर होस्ट को सफलतापूर्वक प्रेषित हो जाता है, तो LPC556S9 सीमित करता है और रीसेट करता है।
डिवाइस विवरण:
लक्ष्य डेव बोर्ड: LPC55S69 – EVK RevA2 USB होस्ट: Ubuntu 20.04 या Raspberry-pi 4 Model B
भेद्यता को पुनः उत्पन्न करने के चरण:
चित्र 1: Ubuntu dmesg उपयोगिता USB डिवाइस विवरण दिखा रही है
[43295.318228] usb 1-1.4: USB disconnect, device number 95
[43296.175536] usb 1-1.4: new full-speed USB device number 96 using xhci_hcd
[43296.397315] usb 1-1.4: New USB device found, idVendor=1fc9, idProduct=0021, bcdDevice= 3.00
[43296.397331] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[43296.397337] usb 1-1.4: Product: USB COMPOSITE DEVICE
[43296.397342] usb 1-1.4: Manufacturer: NXP SEMICONDUCTOR INC.
[43296.400768] hid-generic 0003:1FC9:0021.0055: hiddev0,hidraw4: USB HID v1.00 Device [NXP SEMICONDUCTOR INC. USB COMPOSITE DEVICE] on usb-0000:00:14.0-1.4/input0
sudo python3 LPC_USB.py


नोट 1: Ubuntu सिस्टम में Libusb की सीमा "MAX_CTRL_BUFFER_LENGTH" के कारण 4KB का बफर ओवर-रीड अनुरोध किया जा सकता है। इसे Raspberry-pi सिस्टम में संशोधित किया जा सकता है और 16KB का अनुरोध किया जा सकता है। रास्पबेरी-पाई 4 मॉडल बी का उपयोग करके LPC55s69-EVK बोर्ड से प्राप्त संलग्न फर्मवेयर "LPC.bin"।
यदि आप 4KB से अधिक के अनुरोध जारी करना चाहते हैं, तो Raspi पर Horac द्वारा बनाई गई इस शानदार स्क्रिप्ट का उपयोग करें और wlength को 65535(0xffff) में बदलकर POC चलाएँ।
लक्ष्य 2: Kinetis K82
बफर ओवर-रीड भेद्यता एम्बेडेड USB होस्ट से GET Status-Other अनुरोध पर देखी जाती है। एक हमलावर, "wlength" मान को 65535 बाइट्स में संशोधित करके GET status-Other भेजने के लिए USB अनुरोध तैयार करते समय, अधिकतम 64KB प्रतिक्रिया डेटा का अनुरोध कर सकता है। K82 USB डिवाइस सफलतापूर्वक 64KB डेटा भेजता है।
डिवाइस विवरण:
लक्ष्य डेव बोर्ड: FRDM-K82F USB होस्ट: Ubuntu लैपटॉप या Raspberry-pi
sudo python3 K82_USB.py
नोट 1: Ubuntu सिस्टम में Libusb की सीमा "MAX_CTRL_BUFFER_LENGTH" के कारण 4KB का बफर ओवर-रीड अनुरोध किया जा सकता है। इसे Raspberry-pi में संशोधित किया जा सकता है और 64KB का अनुरोध किया जा सकता है।
नोट 2: K82 में भेद्यता केवल तभी पुनः उत्पन्न होती है जब USB अनुरोध GET status-Device, Interface, Endpoint और अन्य के लिए भेद्यता को ट्रिगर करने हेतु क्रमिक रूप से हों। यह कई ISP रीसेट के बाद विकसित PoC स्क्रिप्ट चलाकर प्राप्त किया जा सकता है।
यदि आप 4KB से अधिक के अनुरोध जारी करना चाहते हैं, तो Raspi पर Horac द्वारा बनाई गई इस शानदार स्क्रिप्ट का उपयोग करें और wlength को 65535(0xffff) में बदलकर POC चलाएँ।