Vidage du micrologiciel crypté au repos de la bouilloire intelligente Xiaomi

[aleaksah] s’est procuré une Mi Smart Kettle Pro, une bouilloire avec connectivité Bluetooth et une application pour smartphone qui va avec. Malgré toutes les astuces, il ne pouvait pas être allumé à distance. Dynamisé par sa vision d’une maison intelligente idéale où il peut allumer la bouilloire le matin dès qu’il se réveille, il s’est mis à réparer cette injustice. (russe, traduit) Tout d’abord, il a démoli la bouilloire, dans l’intention de vider le micrologiciel, de le modifier et de le retransformer. Cela semble assez simple – où est le piège?

Cette bouilloire est construite autour du contrôleur QN9022, de la famille de puces assez ouverte QN902X. QN9022 nécessite une puce flash SPI externe pour le code, contrairement à ses frères et sœurs QN9020 et QN9021 qui ont un flash interne semblable à ESP8285. On pourrait penser que le vidage du micrologiciel serait simplement une question de lecture de ce flash, mais le micrologiciel est chiffré au repos, avec une clé unique pour chaque MCU et stockée en interne. Lorsque le microcontrôleur lit le contenu de la puce flash, il est déchiffré de manière transparente avant d’être exécuté. Il a donc fallu trouver un autre moyen, impliquant le MCU lui-même en tant que seule entité ayant accès à la clé de déchiffrement.

La carte de la bouilloire, avec un USB-UART connecté[aleaksah] considéré comme l’interface SWD, une interface de débogage puissante et une référence assez courante pour l’accès aux données internes de nombreux MCU. Malheureusement, ce microcontrôleur a des bits de verrouillage pour bloquer SWD, destinés à être réglés lorsque votre produit quitte l’usine. Bien sûr, tous les fabricants ne définissent pas ces bits, mais après avoir vérifié l’interface SWD de toute façon, il ne répondait pas, et il a décidé d’aller dans l’autre sens. Il s’est réjoui en trouvant de la documentation sur le chargeur de démarrage interne du MCU et a décidé de charger son propre code dans la RAM qui viderait le contenu flash de l’intérieur. Cependant, la commande de lecture semble avoir déclenché le chargeur de démarrage pour brouiller ou effacer le flash, le laissant avec une unité morte.

Il a persévéré et a décidé d’étudier le code du chargeur de démarrage lui-même, chargeant encore un autre stub de RAM qui viderait le code du chargeur de démarrage. Après avoir décompilé le chargeur de démarrage, mis à part quelques commandes non documentées mais sans intérêt, il a découvert que le chargement de n’importe quel type de programme envoyait en effet à la puce flash une commande pour effectuer un effacement flash. À partir de là, il pourrait théoriquement faire un hack avec une pince à épiler, protégeant le flash en écriture en court-circuitant ses broches de données – pourtant, il a décidé de trouver une méthode de vidage appropriée qui s’étendrait aux puces avec flash intégré, si l’un de ceux-ci apparaissent sur nos bureaux.

Section de la fiche technique, montrant la structure de la commande flash où il est possible de substituer vos propres commandes de puce flash, y compris les commandes d'effacementSa découverte clé est venue peu de temps après. Différentes familles de puces flash SPI ont différentes commandes pour la lecture/écriture/effacement et d’autres opérations, et le chargeur de démarrage expose une structure que vous pouvez modifier pour utiliser différentes commandes pour le type de puce flash que vous avez connecté. Le simple fait de remplacer la commande d’effacement flash dans cette structure par quelque chose d’inoffensif a permis au contenu flash de rester intact même après le chargement externe du nouveau code dans la RAM. Par conséquent, [aleaksah] a découvert une méthode pour vider le micrologiciel chiffré au repos de n’importe quel MCU de la série QN902X, en utilisant uniquement un USB-UART, le chargeur de démarrage intégré de la puce et un petit stub de vidage de code (GitHub).

Un autre jour, un autre mécanisme de protection contre la lecture du micrologiciel a été contourné ! Trouver de tels exploits est bénéfique pour de nombreux voyages amusants, comme le récent piratage qui nous aide à exploiter des myriades d’appareils alimentés par STM32. Vous pouvez même utiliser les nombreux programmateurs ST-Link comme terrain d’entraînement ! Si l’interface SWD n’est pas déverrouillée sur votre appareil, consultez ce parcours éducatif sur la modification d’une manette Xbox tierce à l’aide de SWD. Vous vous demandez comment modifier le firmware que vous avez vidé ? Nous venons de couvrir un hacker moddant le firmware de leur synthétiseur Kurzweil avec Ghidra !