Come hackerare un'auto: un rapido corso accelerato

L'obiettivo di questo articolo è farti iniziare ad hackerare le auto: veloce, economico e facile. Per fare ciò, falsificheremo l'indicatore RPM come esempio.

Quanto segue non è affatto un tutorial esaustivo. Mira invece a fornire le informazioni sufficienti per farti diventare operativo. Se vuoi approfondire puoi controllare le letture obbligatorie alla fine.

Se decidi di eseguire questo tutorial nella vita reale, avrai bisogno di un computer Linux (o una macchina Linux virtuale) e di un dispositivo da CAN a USB (che esamineremo in seguito).

Una macchina è una rete

Un'auto è composta da più computer per controllare il motore, la trasmissione, i finestrini, le serrature, le luci, ecc. Questi computer sono chiamati unità di controllo elettroniche (ECU) e comunicano tra loro su una rete.

Ad esempio, quando si preme il pulsante sul volante per aumentare il volume della radio, la ECU del volante invia un comando per aumentare il volume sulla rete, la ECU della radio quindi vede questo comando e agisce di conseguenza.

Ci sono più reti in un'auto, generalmente almeno due:

  • Uno per i dati critici come i messaggi del motore e del gruppo propulsore
  • E uno per dati meno critici come radio e serrature

La rete critica utilizza un protocollo veloce e affidabile mentre la rete non critica utilizza un protocollo più lento, meno affidabile ma più economico. Il numero di reti e le ECU collegate in rete dipendono dalla marca, dal modello e dall'anno dell'auto. Una ECU potrebbe anche essere collegata a più reti.

Connessione a una rete

È possibile accedere ad alcune reti tramite la porta OBD-II. OBD-II è obbligatorio su tutte le auto e autocarri leggeri costruiti negli Stati Uniti dopo il 1996 e in Europa dopo il 2004.

Il connettore è a portata di mano del sedile del conducente. Potrebbe essere necessario sollevare una copertura di plastica, ma è sempre accessibile senza attrezzi.

Lo standard OBD-II consente cinque protocolli di segnalazione. Spetta al produttore decidere quale utilizzare. CAN è il più popolare ed è ciò di cui discuteremo. È accessibile tramite i pin 6 e 14 del connettore OBD-II. Se la tua auto ha un bus CAN, vedrai dei cavi metallici sui pin come nell'immagine sopra.

Il bus CAN è un bus affidabile e ad alta velocità utilizzato per inviare dati critici. Sfortunatamente i pacchetti di dati sul bus non sono standardizzati, quindi dovrai invertirli per sapere cosa significano. Lo standard OBD-II lascia spazio anche a pin specifici del fornitore che possono essere utilizzati per protocolli specifici del fornitore. Ciò rende più facile per il rivenditore diagnosticare i problemi.

Sulla mia auto (GM), ho un bus CAN standard sui pin 6 e 14 e un bus CAN a filo singolo specifico del fornitore sul pin 1. Il bus CAN standard è un protocollo affidabile ad alta velocità (500 kbps) indicato anche come CAN ad alta velocità (HS-CAN). Viene utilizzato per dati critici. Il bus CAN a filo singolo (SW-CAN) o GMLAN è più lento (33,3 kbps) e meno affidabile ma più economico poiché utilizza un solo filo. Questo bus viene utilizzato per i dati non critici.

Se vedi un pin specifico del fornitore e non sai quale protocollo viene utilizzato, Google "pinout OBD". C'è anche il CAN a bassa velocità (LS-CAN) e il CAN a velocità media (MS-CAN). MS-CAN è generalmente sui pin 3 e 11, che funziona a 125 kbps su Ford e Volvo.

Utensili

Avrai bisogno sia di un dispositivo in grado di interpretare i dati CAN sia di un software per analizzare i dati

Hardware

Per ricevere e trasmettere pacchetti CAN, è necessario un dispositivo in grado di farlo. Ti imbatterai spesso in dispositivi basati su ELM327. Mentre questi hanno il loro uso, sono terribili per l'hacking. Sono troppo lenti per monitorare il bus CAN.

Esistono anche dispositivi di fascia alta come Kvaser, Peak o EMS Wünsche. Questi faranno il loro lavoro ma sono eccessivi e piuttosto costosi.

Alcuni dispositivi di fascia alta richiedono anche l'acquisto di software insieme ad esso. USB2CAN è un'interfaccia CAN nativa per Linux che offre un ottimo rapporto qualità-prezzo.

Puoi anche usare Cantact o CANUSB. Tuttavia, questi non sono dispositivi CAN nativi in ​​Linux e utilizzano un protocollo basato su ASCII. Ciò significa che sono leggermente più complicati da configurare e hanno prestazioni inferiori. D'altra parte, sono ben supportati su più sistemi operativi.

Uso CANalyze che ho progettato per le mie esigenze. È simile a USB2CAN in quanto è un'interfaccia CAN nativa economica ma utilizza un microcontrollore più recente, è open source e può essere costruito utilizzando strumenti open source. Il resto di questo tutorial presume che tu stia utilizzando un'interfaccia CAN nativa.

Software

Per comunicare con il dispositivo è necessario installare il pacchetto can-utils sulla macchina Linux. Puoi farlo digitando quanto segue nel prompt di Linux:

sudo apt-get install can-utils

Can-utils rende estremamente facile inviare, ricevere e analizzare i pacchetti CAN. Questi sono i comandi che useremo.

  • cansniffer mostra solo i pacchetti che stanno cambiando
  • candump scarica tutti i pacchetti ricevuti
  • cansend invia un pacchetto

Linux ha il supporto CAN integrato nel kernel tramite SocketCAN. Ciò semplifica la scrittura di programmi aggiuntivi personalizzati. Puoi interagire con il bus CAN nello stesso modo in cui interagiresti con qualsiasi altra rete, cioè tramite prese.

CAN bus

Prima di iniziare la retromarcia, dovresti avere una certa comprensione di come funziona il bus CAN. Consiste di 2 fili e utilizza la segnalazione differenziale. Poiché è un bus, più dispositivi possono essere collegati a questi due fili. Quando un frame CAN viene inviato sul bus, viene ricevuto da tutte le ECU ma viene elaborato solo se è utile per l'ECU. Se vengono inviati più frame CAN contemporaneamente, vince quello con la priorità più alta. Un frame CAN ha 3 parti che sono rilevanti per noi.

  • identificatore di arbitrato L'identificativo di un messaggio. Una ECU lo utilizza per decidere di elaborare o ignorare il frame ricevuto. Rappresenta anche la priorità del messaggio. Un numero inferiore ha una priorità più alta. Quindi, ad esempio, se fossi un ingegnere che progetta la rete, daresti al telaio per l'attivazione degli airbag una priorità molto alta o un ID di arbitraggio basso. D'altra parte daresti una priorità più bassa o un ID di arbitrato più alto ai dati destinati alle serrature delle porte.
  • codice lunghezza dati (DLC) Indica la lunghezza del campo dati in byte. Un frame CAN può contenere al massimo 8 byte di dati.
  • campo dati Contiene fino a 8 byte di dati.

Inversione del bus CAN

L'approccio generale per invertire il bus CAN consiste nel generare il comportamento che si desidera imitare e trovare il messaggio che causa quel comportamento. Ad esempio, diciamo che il sistema di assistenza al mantenimento della corsia (LKAS) sulla tua auto è una schifezza e tu hai creato il tuo.

Affinché possa controllare lo sterzo, è necessario sapere quali messaggi inviare. Il modo per capirlo è accendere l'LKAS originale, monitorare il bus CAN e identificare i pacchetti responsabili della rotazione del volante. Dopo aver identificato questi pacchetti, puoi fare in modo che il tuo LKAS invii questi pacchetti sul bus CAN per controllare il volante.

Nel nostro caso, vogliamo falsificare il contagiri, quindi dobbiamo cambiare gli RPM premendo il gas con l'auto accesa e in folle e quindi provare a trovare il pacchetto responsabile della modifica degli RPM.

Impostare

Collega il dispositivo CAN alla porta OBD-II dell'auto e alla porta USB del computer. Apri l'interfaccia CAN eseguendo quanto segue nel prompt di Linux:

sudo ip link set can0 up type can bitrate 500000

che fa apparire l' can0interfaccia (sempre can0se hai un solo dispositivo connesso) a un bit rate di 500 kbps, che è standard.

Identificare

Quando l'auto è spenta, le centraline di solito dormono quindi è necessario accendere l'auto o metterla in modalità accessori. Puoi guardare i dati CAN grezzi eseguendolo nel tuo prompt di Linux:

candump can0

Questo stampa i dati CAN sullo schermo non appena vengono ricevuti. Questo tuttavia è molto disorganizzato ed è molto difficile vedere quali pacchetti corrispondono a un determinato evento. È possibile premere ctrl + c per interrompere il programma. Per rendere i dati più leggibili utilizziamo cansniffer che raggruppa i pacchetti per ID arbitrario e mostra solo i pacchetti che stanno cambiando. Per avviarlo, esegui il comando nel tuo prompt di Linux:

cansniffer -c can0

dove -ccolora i byte che cambiano ed can0è l'interfaccia da annusare. Occorrono alcuni secondi per rimuovere i pacchetti costanti.

Dovresti vedere qualcosa di simile all'immagine qui sotto, anche se i numeri saranno probabilmente completamente diversi.

La prima colonna (delta) mostra la velocità in secondi alla quale vengono ricevuti i pacchetti con quell'ID di arbitraggio. La seconda colonna (ID) contiene l'ID dell'arbitrato. Le restanti colonne alfanumeriche (dati…) contengono i byte di dati. Se i dati hanno una rappresentazione ASCII, possono essere visualizzati a destra, altrimenti è un punto.

Quando si preme l'acceleratore con il motore acceso per aumentare il regime, potrebbero essere visualizzati nuovi messaggi CAN sullo schermo e / o potrebbero cambiare quelli esistenti.

Dobbiamo trovare un messaggio CAN in cui la modifica dei byte è correlata alla modifica dell'RPM. Probabilmente possiamo aspettarci che il valore aumenterà / diminuirà all'aumentare / diminuire dell'RPM.

Il primo frame CAN in cansniffer che sembra variare con RPM è il frame con arbitration id C9. Probabilmente ci sono più pacchetti potenziali che variano con RPM, questo è solo il primo.

Ci sono 4 byte che stanno cambiando (colorati in rosso) in questo messaggio ma non tutti indicano necessariamente l'RPM. Le variazioni nel terzo byte 07non sembrano essere correlate alla variazione di RPM. L'ultimo byte 1Bfa.

Tuttavia, non appena togliamo il piede dall'acceleratore, va a 00. Ciò indicherebbe che rappresenta la posizione dell'acceleratore e non l'RPM.

Infine ci sono i due byte 21 C0che sembrano corrispondere a un cambiamento di RPM. Inoltre, varia come un numero intero di 16 byte, ovvero quando il secondo byte va in C0overflow, il primo byte 21viene aumentato di uno. Inoltre sembra che 21corrisponda a circa 2000 RPM. È bene notare quando riprodurrai il messaggio.

Replay

Una volta che hai un candidato, invialo sul bus CAN con il seguente comando nel tuo prompt di Linux:

cansend can0 0C9#8021C0071B101000

dove il frame ha il formato #{data} e deve essere sostituito con il tuo messaggio CAN.

La tua auto può essere in funzione o in modalità accessori per questo. Assicurati di utilizzare un pacchetto che hai ottenuto quando il motore non era al minimo, altrimenti non vedrai alcun cambiamento durante la riproduzione mentre il tuo motore è al minimo.

Se invii il pacchetto una sola volta, probabilmente non vedrai alcun cambiamento sul quadro strumenti. Questo perché il messaggio originale viene ancora inviato continuamente sul bus a intervalli di 0,2 secondi dall'ECU, quindi il tuo messaggio verrà semplicemente ignorato.

Ricorda che il tasso è dato nella prima colonna di cansniffer. Ci sono due modi per aggirare questo problema oltre a scollegare l'ECU che sta generando questi messaggi. Un'opzione è inviare i pacchetti a una frequenza molto più alta rispetto a quelli attualmente inviati. Puoi farlo eseguendo quanto segue nel tuo prompt di Linux:

while true; do cansend can0 0C9#8021C0071B101000; sleep 0.002; done

e sostituendo il messaggio CAN con quello che hai identificato. Premi ctrl + c per interrompere.

Un'altra opzione è monitorare il bus e ogni volta che rilevi il pacchetto che desideri falsificare, invia il tuo pacchetto immediatamente dopo. Questo può essere fatto eseguendo nel tuo prompt di Linux:

candump can0 | grep " 0C9 " | while read line; do cansend can0 0C9#8021C0071B101000; done

dove è necessario sostituire il messaggio CAN e 0C9con il messaggio CAN che hai identificato e il suo ID di arbitrato rispettivamente. Puoi sperimentare entrambi gli approcci per vedere quale funziona meglio.

Se il contagiri cambia, buon lavoro, l'hai trovato! In caso contrario, identificare il messaggio successivo correlato a RPM e riprodurlo.

Fuzzing

Ora che hai il frame CAN che imposta gli RPM sul quadro strumenti, puoi giocare con i dati che invii per vedere cosa succede. Abbiamo notato che i due byte che corrispondono a RPM si comportano come un numero intero a 16 bit, quindi per impostare il tachimetro su 8k RPM, eseguiamo quanto segue nel tuo prompt di Linux:

while true; do cansend can0 0C9#0080000000101000; sleep 0.002; done

e il risultato è ...

Questo è tutto! Ora puoi provare a controllare il tachimetro, la radio, le luci, le serrature delle porte, ecc. Usando lo stesso approccio.

Possibili problemi

  • Sebbene il bus CAN sia la rete più popolare, non è l'unica rete. Se non riesci a trovare il messaggio che stai cercando sul bus CAN, prova una rete diversa. Soprattutto i messaggi non critici come radio, luci e serrature saranno probabilmente su una rete diversa.
  • Come accennato, i dati esatti trasmessi tramite CAN dipendono dalla marca, dal modello e dall'anno dell'auto. Alcune auto utilizzano un contatore nel messaggio CAN per garantire che lo stesso messaggio non venga elaborato più volte. Questo è leggermente più difficile ma dovresti essere in grado di farlo con le informazioni fornite. Alcune auto utilizzano anche un checksum per garantire l'integrità dei dati. Il calcolo di questo checksum può essere difficile. Se hai una Toyota, controlla Adventures in Automotive Networks and Control Units, p10, Checksum-Toyota. Tutti dovrebbero davvero leggere l'intero giornale.
  • Quando si riproduce il pacchetto identificato sul bus, il dispositivo da CAN a USB potrebbe passare allo stato "bus spento". Questo fa parte dello standard CAN e si verifica quando il dispositivo ha riscontrato troppi errori. Questo generalmente accade quando c'è molto traffico sull'autobus. Per aggirare questo problema puoi giocare con ritardi e tempistiche, magari provare a riprodurre il messaggio subito dopo aver messo l'auto in modalità accessori, provare ad aspettare un po ', provare con l'auto accesa, ecc. Se hai identificato cosa sono le ECU collegati al bus, puoi anche tirare il loro fusibile per impedire loro di inviare messaggi e ridurre il traffico sul bus.

Deve leggere

  • Manuale di Hacker per auto
  • Le ricerche di Charlie Miller e Chris Valasek, sì, tutte
  • Ricerca dell'Università della California di San Diego e dell'Università di Washington.

Assicurati di controllare anche Open Garages e i loro video.