
POC pour tester la vulnérabilité BootROM trouvée dans LPC55S69 et la série K82
POC pour tester la vulnérabilité BootROM trouvée dans les séries LPC55S69 et K82 révision A2. La vulnérabilité est corrigée dans les appareils plus récents avec la nouvelle révision A3 pour le LPC55S69.
Appareils vulnérables :
Confirmé : les MCU des séries LPC55S69 et K82
Suspecté : d’autres MCU des séries NXP avec une pile USB ISP similaire - séries Kinetis K et RT
Une vulnérabilité de dépassement de lecture a été observée dans le mode de programmation en système (ISP) USB des microcontrôleurs NXP LPC55S69 et Kinetis K82. Lorsqu’elle est exploitée, la vulnérabilité permet à un attaquant de lire 16KB (LPC55S69) et 64KB (K82) de données depuis la mémoire flash protégée.
Les MCU NXP LPC55S69 et K82 fournissent des modes de programmation en système (ISP) pour la mise à jour sur le terrain du firmware des MCU à l’aide de périphériques tels que USB, SPI, UART et I2C. Le mode USP ISP fournit un hôte embarqué pour mettre à jour le firmware via les commandes de mise à jour documentées par NXP.
L’ISP fait partie du BootROM des LPC55S69 et K82, et est déclenché en fonction des valeurs de certains bits de registres, de la broche ISP et de la définition de l’en-tête d’image. Pour le LPC55S69, la classe USB HID est utilisée pour télécharger une image du port USB0/1 et, de même, pour le K82, le Kinetis Bootloader dans la ROM prend en charge le chargement de données dans la flash via le périphérique USB en tant que classe USB HID.
Les ISP USB des IC des séries LPC55S69 et K82 utilisent tous deux trois (3) endpoints, énumérés ci-dessous :
La vulnérabilité de dépassement de lecture a été observée pour l’endpoint USB Control 0, qui est utilisé pour l’énumération de l’hôte USB.
Cible 1 : LPC55S69
La vulnérabilité de dépassement de lecture est observée lors de la requête GET Descriptor Configuration de l’hôte USB embarqué. Un attaquant peut demander jusqu’à 16KB de données de réponse, en élaborant une requête USB pour envoyer GET Descriptor Configuration, en modifiant la valeur « wlength » à 65535 octets. Le LPC556S9 limite, puis réinitialise, lorsque 16KB de données sont copiés dans le tampon TX USB et transmis avec succès à l’hôte.
Détails de l’appareil :
Carte de développement cible : LPC55S69 – EVK RevA2 Hôte USB : Ubuntu 20.04 ou Raspberry-pi 4 Model B
Étapes pour reproduire la vulnérabilité :
Figure 1 : l’utilitaire dmesg d’Ubuntu affichant les détails du périphérique 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


Note 1 : Le dépassement de lecture de 4KB peut être demandé sur un système Ubuntu en raison de la restriction « MAX_CTRL_BUFFER_LENGTH » de Libusb. Celle-ci peut être modifiée sur un système Raspberry-pi et 16KB peuvent être demandés. Le firmware « LPC.bin » joint a été récupéré depuis la carte LPC55s69-EVK à l’aide d’un raspberry-pi 4 model b.
Si vous souhaitez émettre des requêtes de plus de 4KB, utilisez cet excellent script créé par Horac sur un Raspi et exécutez la PoC avec wlength modifié à 65535(0xffff).
Cible 2 : Kinetis K82
La vulnérabilité de dépassement de lecture est observée lors de la requête GET Status-Other d’un hôte USB embarqué. Un attaquant peut demander jusqu’à 64KB de données de réponse, en élaborant une requête USB pour envoyer GET Status-Other, en modifiant la valeur « wlength » à 65535 octets. Le périphérique USB K82 envoie avec succès 64KB de données.
Détails de l’appareil :
Carte de développement cible : FRDM-K82F Hôte USB : ordinateur portable Ubuntu ou Raspberry-pi
sudo python3 K82_USB.py
Note 1 : Le dépassement de lecture de 4KB peut être demandé sur un système Ubuntu en raison de la restriction « MAX_CTRL_BUFFER_LENGTH » de Libusb. Celle-ci peut être modifiée sur un Raspberry-pi et 64KB peuvent être demandés.
Note 2 : la vulnérabilité du K82 n’est reproduite que lorsque les requêtes USB pour GET Status-Device, Interface, Endpoint, et autres se produisent ensuite afin de déclencher la vulnérabilité. Cela peut être réalisé en exécutant les scripts PoC développés après plusieurs réinitialisations de l’ISP.
Si vous souhaitez émettre des requêtes de plus de 4KB, utilisez cet excellent script créé par Horac sur un Raspi et exécutez la PoC avec wlength modifié à 65535(0xffff).