
إثبات المفهوم (POC) لاختبار ثغرة BootROM الموجودة في LPC55S69 و K82 Series
POC لاختبار ثغرة BootROM الموجودة في سلسلة LPC55S69 و K82 المراجعة A2. تم إصلاح الثغرة في الأجهزة الأحدث مع المراجعة الأحدث A3 لـ LPC55S69.
الأجهزة المعرضة للخطر:
تم ملاحظة ثغرة تجاوز سعة القراءة في وضع برمجة النظام عبر USB (ISP) لسلسلتي المتحكمات الدقيقة NXP LPC55s69 و Kinetis K82. عند استغلالها، تسمح الثغرة للمهاجم بقراءة 16 كيلوبايت (LPC55S69) و64 كيلوبايت (K82) من البيانات من ذاكرة الفلاش المحمية.
توفر متحكمات NXP LPC55S69 و K82 أوضاع برمجة داخل النظام (ISP) لتحديث البرامج الثابتة للمتحكم في الميدان باستخدام الأجهزة الطرفية مثل USB و SPI و UART و I2C. يوفر وضع ISP عبر USB مضيفًا مدمجًا لتحديث البرامج الثابتة عبر أوامر التحديث الموثقة من NXP.
يعتبر ISP جزءًا من BootROM لكل من LPC55S69 و K82، ويتم تشغيله بناءً على قيم بعض بتات السجلات، ودبوس ISP، وتعريف رأس الصورة. بالنسبة لـ LPC55S69، يتم استخدام فئة HID USB لتحميل صورة من منفذ USB0/1، وبالمثل، بالنسبة لـ K82، يدعم محمل الإقلاع Kinetis في ROM تحميل البيانات إلى الفلاش عبر الطرفية USB كفئة HID USB.
يستخدم ISP USB لكل من سلسلتي ICs LPC55S69 و K82 ثلاث نقاط نهاية (3)، وهي مدرجة أدناه:
تم ملاحظة ثغرة تجاوز سعة القراءة لنقطة النهاية التحكمية USB 0، والتي تُستخدم لتعداد المضيف USB.
الهدف 1: LPC55S69
تم ملاحظة ثغرة تجاوز سعة القراءة في طلب GET Descriptor Configuration من مضيف USB المدمج. يمكن للمهاجم طلب ما يصل إلى 16 كيلوبايت من بيانات الاستجابة، عند صياغة طلب USB لإرسال GET Descriptor Configuration، عن طريق تعديل قيمة "wlength" إلى 65535 بايت. يحد LPC55S69 ويعيد التعيين عندما يتم نسخ 16 كيلوبايت من البيانات إلى مخزن إرسال USB ويتم إرسالها بنجاح إلى المضيف.
تفاصيل الجهاز:
خطوات إعادة إنتاج الثغرة:
الشكل 1: أداة dmesg في Ubuntu تظهر تفاصيل جهاز 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: يمكن طلب تجاوز سعة القراءة بحجم 4 كيلوبايت في نظام Ubuntu بسبب قيود Libusb "MAX_CTRL_BUFFER_LENGTH". يمكن تعديل ذلك في نظام Raspberry-pi وطلب 16 كيلوبايت. البرنامج الثابت المرفق "LPC.bin" المستخرج من لوحة LPC55s69-EVK باستخدام Raspberry-pi 4 model b.
إذا كنت ترغب في إصدار طلبات أكبر من 4 كيلوبايت، استخدم هذا السكريبت الرائع الذي أنشأه Horac على Raspi وقم بتشغيل POC مع تغيير wlength إلى 65535 (0xffff).
الهدف 2: Kinetis K82
تم ملاحظة ثغرة تجاوز سعة القراءة في طلب GET Status-Other من مضيف USB مدمج. يمكن للمهاجم طلب ما يصل إلى 64 كيلوبايت من بيانات الاستجابة، عند صياغة طلب USB لإرسال GET status-Other، عن طريق تعديل قيمة "wlength" إلى 65535 بايت. يرسل جهاز USB K82 بنجاح 64 كيلوبايت من البيانات.
تفاصيل الجهاز:
sudo python3 K82_USB.py
ملاحظة 1: يمكن طلب تجاوز سعة القراءة بحجم 4 كيلوبايت في نظام Ubuntu بسبب قيود Libusb "MAX_CTRL_BUFFER_LENGTH". يمكن تعديل ذلك في نظام Raspberry-pi وطلب 64 كيلوبايت.
ملاحظة 2: يتم إعادة إنتاج الثغرة في K82 فقط عندما تتم طلبات USB لـ GET status-Device و Interface و Endpoint وغيرها بالتتابع لتحفيز الثغرة. يمكن تحقيق ذلك عن طريق تشغيل سكريبتات POC المطورة بعد عدة إعادة تعيينات ISP.
إذا كنت ترغب في إصدار طلبات أكبر من 4 كيلوبايت، استخدم هذا السكريبت الرائع الذي أنشأه Horac على Raspi وقم بتشغيل POC مع تغيير wlength إلى 65535 (0xffff).