- Sur fond de controverse autour de l’interdiction du Flipper Zero au Canada, l’auteur capture et analyse de vrais signaux RF de porte-clés automobile afin de vérifier jusqu’où une simple attaque par rejeu peut aller
- Le RTL-SDR peut recevoir des données I/Q brutes sur la plage 24 à 1750 MHz et les visualiser, stocker et analyser ; le CC1101 du Flipper Zero peut émettre et recevoir, mais nécessite des réglages RF corrects
- À 433,92 MHz, trois courtes salves apparaissent à chaque pression sur un bouton, et les deux pics de part et d’autre de la fréquence centrale sont interprétés comme du 2-FSK, où les 0 et les 1 sont portés sur des fréquences différentes
- Dans Universal Radio Hacker, l’application de FSK, 50 samples/symbol et du décodage Manchester II révèle une structure composée d’une longue salve sans données, de 3 paquets principaux et d’un court paquet final
- Le signal contient une zone à forte entropie pour le rolling code, un compteur croissant, des octets de commande lock/unlock, un numéro de séquence de paquet, une somme de contrôle XOR et un syncword, ce qui conduit à conclure qu’il est difficile de voler la plupart des voitures par simple rejeu
Objectif de l’expérience et contexte
- Depuis plusieurs années, l’auteur explore des protocoles de communication radio avec un dongle RTL-SDR ; cette fois, l’objectif est de comprendre comment un porte-clés automobile transmet ses données et d’évaluer la faisabilité d’une attaque par rejeu
- Des signaux de porte-clés avaient déjà été capturés auparavant, mais l’accès limité à une voiture de test avait empêché une analyse vraiment utile
- Cette expérience constitue une étape préparatoire pour rétroconcevoir et rejouer un signal de porte-clés, en suivant le processus depuis les notions RF de base jusqu’au flux d’analyse
- Contrairement à l’interdiction du Flipper Zero au Canada, la plupart des voitures ne sont pas si faciles à voler avec une simple attaque par rejeu, et c’est aussi ce constat qui est abordé
- L’exception liée à Honda mentionnée est RollingPwn
Matériel utilisé
-
RTL-SDR
- Un dongle USB TNT/radio d’environ 10 dollars peut être transformé en récepteur RF polyvalent, capable d’inspecter et de décoder des signaux entre 24 et 1750 MHz
- Le RTL-SDR est puissant grâce à la puce RTL2832U, qui permet d’utiliser la SDR
- Il contourne une partie du traitement du signal habituellement effectué par le matériel, ce qui donne à l’hôte un accès direct aux données I/Q brutes
- En recevant les données brutes, il est possible de capter, visualiser, enregistrer puis analyser un signal sans connaître à l’avance les paramètres précis comme la modulation, la bande passante ou le débit
-
Flipper Zero et CC1101
- Sur le Flipper Zero, l’élément important pour cette expérience est le module Sub-GHz
- Ce module repose sur la puce CC1101 et prend en charge les fréquences inférieures à 1 GHz utilisées par de nombreux appareils radio grand public
- Le module CC1101 peut aussi s’acheter séparément pour plus de 5 dollars et être utilisé avec un Arduino, un Raspberry Pi ou un adaptateur USB-vers-TTL
-
Différences entre CC1101 et RTL2832U
- Le CC1101 du Flipper Zero est un émetteur-récepteur capable à la fois d’émettre et de recevoir
- Le RTL2832U du RTL-SDR peut recevoir et analyser des signaux bruts, mais ne peut pas émettre
- Le CC1101 ne prenant pas en charge la SDR, il ne renvoie que des données entièrement traitées ; pour être utile en émission, les réglages RF doivent donc être corrects
- Il existe aussi des équipements SDR capables d’émettre et de recevoir, mais ils sont généralement coûteux
Notions de base pour lire un signal RF
- Une transmission radio envoie des signaux à l’aide d’ondes radio, qui sont des ondes électromagnétiques
- Pour améliorer la fiabilité de la transmission dans l’air, on utilise une porteuse à une fréquence plus élevée que le signal d’origine
- La fréquence correspond au nombre d’oscillations de la porteuse par seconde et sert généralement à définir un canal de communication
- La modulation est la manière de représenter des données sur une onde radio
- AM exprime les données par des variations d’amplitude
- FM exprime les données par des variations de fréquence
- La bande passante est la plage de fréquences occupée par le signal RF modulé, et elle est liée à la quantité de données que le signal peut transporter
Le signal du porte-clés observé avec SDR#
-
Outil et fréquence
- SDR# est une application DSP gratuite écrite en C# qui permet la visualisation en temps réel du spectre pour les SDR et la démodulation de certaines modulations courantes
- Le dongle RTL-SDR est branché avec le pilote WinUSB à la place du pilote DVB-T par défaut
- En se calant sur 433,92 MHz, on peut observer l’activité des télécommandes à courte portée
- 433,92 MHz est présenté comme une fréquence standard libre de licence utilisée dans l’UE, dans les pays voisins et au Maroc, où vit l’auteur
-
Motif observé
- Chaque pression sur un bouton du porte-clés automobile produit trois courtes salves consécutives
- Deux grands pics apparaissent de part et d’autre de la fréquence centrale de 433,92 MHz
- Après examen des modulations courantes, cette forme semble correspondre à du 2-FSK
- Les petits pics visibles à l’écran sont considérés comme des fréquences parasites dues au matériel d’émission bon marché et à la proximité entre la télécommande et l’antenne, puis ignorés
-
Interprétation du 2-FSK
- FSK signifie Frequency-Shift Keying, une modulation de fréquence qui encode les données en basculant la fréquence de la porteuse entre plusieurs fréquences discrètes
- Le « 2 » de 2-FSK désigne le nombre de canaux utilisés pour l’encodage
- Ici, les 0 et les 1 sont encodés sur deux fréquences différentes, ce qui explique les deux pics observés
Extraction des bits et des octets avec Universal Radio Hacker
-
Analyse avec URH
- Universal Radio Hacker est une suite d’outils open source pour l’étude des protocoles radio, avec prise en charge native de plusieurs SDR
- URH fournit la démodulation du signal et la détection automatique des paramètres de modulation, et sert à identifier les bits et les octets transmis dans l’air
- Au départ, de mauvais résultats ont été obtenus faute de trouver les bons paramètres
- En enregistrant plusieurs signaux répétés à la fois, le taux de réussite de la détection automatique a augmenté et, dans ce cas, 50 samples/symbol, FSK est ressorti comme configuration correcte
-
Structure des salves et décodage Manchester
- En zoomant sur le signal, on retrouve les 3 salves vues dans SDR#
- La deuxième salve se compose elle-même de 3 parties séparées, ce qui porte le total à 5 sections à analyser
- Après extraction automatique des suites de bits et conversion en hexadécimal pour chaque section, un motif répétitif apparaît, mais les mêmes 5 nombres hexadécimaux et de nombreux octets
0x55se répètent, ce qui impose un traitement supplémentaire - Dans l’onglet Analysis de URH, plusieurs algorithmes de décodage sont testés ; Manchester II est celui qui transforme les octets
0x55en null sans générer d’erreurs de décodage
-
Rôle de l’encodage Manchester
- Le Manchester est une modulation numérique simple qui évite au signal de rester trop longtemps dans un état logique bas ou haut
- Il convertit un signal de données en un signal combinant données et synchronisation, ce qui est utile pour la clock recovery
- Les supports analogiques étant sensibles au bruit et aux interférences, cette propriété aide à transporter des données numériques
- En Manchester, les données binaires sont encodées en deux bits opposés
- Par exemple :
0devient01, et1devient10, ou l’inverse selon la convention utilisée
Structure des paquets et hypothèse de rolling code
-
Structure visible à chaque pression sur un bouton
- Une comparaison manuelle de plusieurs captures montre que chaque pression sur un bouton suit une structure constante
- Il y a une longue salve sans données qui, une fois décodée, devient 100 octets nuls
- On observe ensuite 3 salves très proches les unes des autres, avec toutefois 2 octets qui changent partiellement
- Elles sont suivies d’une salve finale plus courte, assez semblable aux 3 précédentes
- Les 3 salves du milieu sont considérées comme les paquets principaux et analysées plus en détail
- Un identifiant croissant qui semble augmenter de 1 à chaque nouveau signal a été repéré
-
Mécanisme de rolling code
- Le rolling code est utilisé dans les systèmes d’entrée sans clé pour empêcher les attaques par rejeu simples
- Il vise à empêcher qu’un attaquant enregistre une transmission puis la rejoue plus tard pour amener le récepteur à déverrouiller
- La voiture et la télécommande s’accordent sur un algorithme cryptographiquement sûr pour générer le rolling code utilisé dans l’authentification
- La clé est générée et suivie à l’aide d’un compteur, et les compteurs de la télécommande et de la voiture doivent rester synchronisés
- Une fenêtre de validité permet à la télécommande de ne pas se désynchroniser si la voiture ne reçoit pas le signal
- De nombreuses implémentations autorisent jusqu’à 255 pressions hors de portée, après quoi une resynchronisation manuelle de la télécommande est nécessaire
-
Identification des champs du signal
- Comme le rolling code est cryptographiquement sûr, la partie à l’entropie la plus élevée du signal est identifiée comme la zone liée à cette implémentation
- L’identifiant croissant repéré plus tôt est supposé être le compteur du système de rolling code
- En comparant les signaux lock et unlock, l’octet correspondant à la commande est identifié
8= unlock4= lock
Numéro de séquence, somme de contrôle et syncword
-
Valeur interprétée comme numéro de séquence de paquet
- L’une des zones variables restantes reprend les mêmes valeurs dans d’autres signaux capturés
- Si l’on regarde les 3 valeurs en binaire, les bits de poids fort augmentent comme un numéro de séquence
0x6:01100xA:10100xE:1110- En incluant le 4e paquet final, on obtient
0x13:10011, ce qui correspond à l’interprétation d’un numéro de séquence de paquet - La variation du bit de poids faible n’est pas prise en compte dans cette interprétation
-
Somme de contrôle XOR
- Le dernier octet change d’un paquet à l’autre et varie aussi de façon apparemment aléatoire entre les signaux complets
- Comme il s’agit du dernier octet du paquet et qu’il varie de manière irrégulière, il peut s’agir d’une somme de contrôle
- En appliquant un XOR entre cet octet et l’octet de séquence analysé plus haut, on obtient une valeur fixe dans chaque exemple
- Exemple 1:
0x06 ^ 0xB9 = 0xBF0x0A ^ 0xB5 = 0xBF0x0E ^ 0xB1 = 0xBF
- Exemple 2:
0x06 ^ 0xCC = 0xCA0x0A ^ 0xC0 = 0xCA0x0E ^ 0xC4 = 0xCA
- En appliquant le XOR à tous les octets du paquet, la valeur restait toujours décalée de 1, ce qui suggère fortement que les 2 premiers octets sont exclus de la somme de contrôle
- Ces 2 premiers octets sont interprétés comme un syncword servant à synchroniser le récepteur et à indiquer le début des données
Composition finale du signal et suite
- La longue salve initiale sert à réveiller le récepteur radio en mode basse consommation lorsqu’il est inactif, afin de le préparer à recevoir les données
- La télécommande envoie 3 paquets contenant presque les mêmes données pour améliorer la fiabilité au cas où l’un d’eux serait corrompu pendant la transmission
- Après étiquetage final, le signal du porte-clés automobile est interprété comme étant composé d’un syncword, d’une zone liée au rolling code, d’un compteur, d’un octet de commande, d’un numéro de séquence de paquet, d’une somme de contrôle XOR, etc.
- L’étape suivante consiste à intégrer ce format de signal dans le Flipper Zero afin de permettre sa lecture, sa resérialisation et son rejeu
- En cas d’informations inexactes ou de pistes d’amélioration, il est possible d’envoyer une pull request sur GitHub
1 commentaires
Commentaires Hacker News
J’ai dû rétroconcevoir une télécommande de clé de voiture bon marché achetée sur AliExpress pour un projet électronique, et avec seulement un oscilloscope et Wikipédia, en s’y accrochant assez longtemps, j’ai fini par y arriver.
La prochaine fois, j’essaierai la méthode de cet article de blog, histoire de devenir un meilleur hacker.
Il existe aussi un graphe de flux GNU Radio pour un objectif similaire : https://github.com/bastibl/gr-keyfob
Slides de présentation : https://www.fleark.de/keyfob.pdf
Si la télécommande et la voiture génèrent et suivent des clés au moyen d’un compteur pour rester synchronisées, je me suis toujours demandé comment les télécommandes apprenantes contournent ça.
Ma voiture a quelques boutons de porte de garage intégrés, et il me semble que je les avais configurés en mettant la voiture en mode apprentissage puis en appuyant sur le bouton de la télécommande du garage. Je me demande si ce n’est pas bien plus complexe qu’une simple relecture : décoder le signal, reconnaître son type, puis lancer un appairage avec l’ouvre-porte.
D’après ce que je comprends, ils coopèrent avec plusieurs entreprises pour prendre en charge les codes fixes et les codes tournants, et permettre l’appairage avec la porte de garage concernée. Chamberlain[0], le plus grand fabricant de portes de garage aux États-Unis, possède plusieurs marques et utilise un algorithme de code tournant connu que l’on peut décoder[1].
[0] https://www.chamberlain.com/
[1] https://github.com/argilo/secplus
Le processus revient plutôt à dire à l’ouvre-porte : « tu entends cette nouvelle télécommande ? Autorise-la aussi à ouvrir la porte ». Les boutons côté voiture semblent faire défiler quelques protocoles courants, et en pratique, aux États-Unis, les plus répandus doivent être quatre ou cinq familles du type Chamberlain/Liftmaster ou Genie.
Une télécommande apprenante pour ce type de système peut fonctionner en rejouant simplement le signal enregistré, mais si, pendant l’enregistrement, d’autres signaux sur la même bande — par exemple une sonnette sans fil — se mélangent, elle risque aussi de les rejouer par erreur. Il faut donc au minimum isoler la partie correspondant au vrai signal de la porte ; mieux encore, décoder le signal pour en extraire le code, puis générer à chaque fois un nouveau signal propre.
Aux États-Unis, presque tous les fabricants d’ouvre-portes de garage résidentiels sont passés aux codes tournants sur leurs nouveaux modèles dans les années 1990 ; si l’installation a environ 25 ans ou moins, elle utilise donc très probablement un code tournant. En général, la télécommande génère une suite pseudo-aléatoire avec une graine, envoie la valeur suivante à chaque pression, et le boîtier, en mode apprentissage, observe quelques valeurs consécutives pour estimer cette graine et ajouter la télécommande à sa liste.
En fonctionnement, le boîtier décode la valeur de la séquence reçue, vérifie si elle se trouve dans la plage attendue pour l’une des télécommandes connues, puis, si c’est le cas, ouvre la porte et met à jour la position de cette télécommande. Il prévoit aussi une certaine marge, pour éviter qu’un enfant qui appuie plusieurs fois sur le bouton en déplacement ne se retrouve avec une télécommande qui n’ouvre plus en rentrant à la maison.
Il est en principe possible d’avoir une télécommande apprenante qui clone une télécommande existante à code tournant, mais du point de vue du boîtier, le clone et l’original sont la même télécommande. Si l’une des deux n’est pas utilisée pendant longtemps pendant que l’autre fait avancer la séquence au-delà de la marge tolérée, l’une peut cesser de fonctionner, et le réappairage peut aussi se compliquer selon les détails d’implémentation du système.
Les télécommandes universelles pour codes tournants que j’ai effectivement vues ne cherchaient pas à apprendre depuis une télécommande existante : on indiquait plutôt à la télécommande le type de boîtier, puis elle s’appairait comme une nouvelle télécommande du fabricant. Avec une interface utilisateur rudimentaire, cela ressemble souvent à : trouver un numéro dans un tableau du manuel, appuyer sur un bouton caché, puis appuyer sur le bouton à programmer autant de fois que ce numéro.
Ce serait bien de pouvoir identifier automatiquement le système de code tournant à partir du signal d’une télécommande existante, mais il faudrait pour cela un récepteur, qui n’aurait presque aucun autre usage, ce qui est difficile à justifier. L’appairage de la porte de garage et les commandes d’ouverture/fermeture sont fondamentalement unidirectionnels, de la télécommande vers le boîtier.
L’auteur a tout décodé, mais n’a pas réellement ouvert la portière de la voiture. Il reste à casser le code tournant, et il ne suffit pas d’y ajouter 1 puis de le renvoyer.
Vu de l’extérieur, le prochain code tournant doit ressembler à du hasard.
J’aimerais que les constructeurs automobiles se mettent à fabriquer des télécommandes RFID vraiment minuscules, à glisser dans un portefeuille.
Ou alors qu’un petit appareil au format carte de crédit, façon Flipper, fasse la même chose. Sérieusement, la clé de voiture est le deuxième plus gros objet dans ma poche après mon téléphone, et au moins en épaisseur, elle est franchement gênante.
C’était rafraîchissant de lire un article que je pouvais comprendre, pour une fois.
Avec l’accès de plus en plus facile aux équipements de programmation de clés, il est intéressant de voir les droits de programmation de clés passer derrière une couche de « sécurité » plus forte.
C’est le fabricant qui décide de ce qui fait partie du système de « sécurité », et cela peut s’étendre non seulement aux clés, mais aussi à de nombreux modules. On peut débattre de l’efficacité de ce dispositif face à des criminels réputés pour leur respect scrupuleux des règles (/s), mais il a clairement un impact sur certains acteurs.
Un casier judiciaire peut empêcher de participer. Or, créer sa propre activité après avoir purgé sa peine et réussir en indépendant est l’une des voies importantes pour les anciens condamnés ; avec ce système, cela peut devenir très compliqué.
https://wp.nastf.org/?page_id=367
https://wp.nastf.org/wp-content/uploads/2023/07/ApplicationC...
Pourquoi se donner la peine d’intercepter le signal, de le décoder puis de le réencoder ? Il suffit de faire une attaque de l’homme du milieu entre la télécommande et le véhicule avec une grosse antenne pour leur faire croire qu’ils sont plus proches l’un de l’autre.
De nos jours, il suffit d’entrer dans la voiture pour programmer une nouvelle clé avec un outil OBD et repartir avec ; c’est beaucoup plus intéressant, et beaucoup plus gravement non sécurisé.
Le Flipper de base peut aussi recevoir des signaux bruts.
On peut peut-être lui faire sortir des données FSK ou OOK brutes démodulées sans traitement supplémentaire, mais obtenir des échantillons IQ bruts, ça me paraît vraiment douteux.