Sådan hackes en bil - et hurtigt crash-kursus

Målet med denne artikel er at komme i gang med at hacke biler - hurtigt, billigt og nemt. For at gøre dette spoofer vi RPM-måleren som et eksempel.

Følgende er på ingen måde en udtømmende tutorial. Det sigter i stedet for at give lige nok information til at komme i gang. Hvis du vil grave dybere, kan du tjekke de must-læsninger i slutningen.

Hvis du beslutter at udføre denne tutorial i det virkelige liv, skal du bruge en Linux-computer (eller en virtuel Linux-maskine) og en CAN-til-USB-enhed (som vi vil se på senere).

En bil er et netværk

En bil består af flere computere til styring af motor, transmission, vinduer, låse, lys osv. Disse computere kaldes elektroniske styreenheder (ECU) og kommunikerer med hinanden via et netværk.

For eksempel, når du trykker på knappen på rattet for at øge radioens lydstyrke, sender rat-ECU'en en kommando for at øge lydstyrken til netværket, radio-ECU'en ser derefter denne kommando og handler i overensstemmelse hermed.

Der er flere netværk i en bil, generelt mindst to:

  • En til kritiske data såsom motor- og drivlinjemeddelelser
  • Og en til mindre kritiske data såsom radio og dørlåse

Det kritiske netværk bruger en hurtig og pålidelig protokol, mens det ikke-kritiske netværk bruger en langsommere, mindre pålidelig, men billigere protokol. Antallet af netværk samt hvilke ECU'er, der er sammenkoblet, afhænger af bilmærke, model og år. En ECU kan også forbindes til flere netværk.

Opretter forbindelse til et netværk

Der er adgang til nogle netværk via OBD-II-porten. OBD-II er obligatorisk på alle biler og lette lastbiler bygget i USA efter 1996 og Europa efter 2004.

Stikket er inden for rækkevidde af førersædet. Du skal muligvis løfte noget plastikdæksel af, men det er altid tilgængeligt uden værktøj.

OBD-II-standarden giver mulighed for fem signalprotokoller. Det er op til producenten at beslutte, hvilken der skal bruges. CAN er den mest populære og er, hvad vi vil diskutere. Det er tilgængeligt via ben 6 og 14 på OBD-II-stikket. Hvis din bil har en CAN-bus, vil du se metalkabler på stifterne som på billedet ovenfor.

CAN-bussen er en pålidelig bus med høj hastighed, der bruges til at sende kritiske data. Desværre er datapakkerne på bussen ikke standardiserede, så du bliver nødt til at vende dem for at vide, hvad de betyder. OBD-II-standarden giver også plads til leverandørspecifikke ben, der kan bruges til leverandørspecifikke protokoller. Dette gør det lettere for forhandleren at diagnosticere problemer.

På min bil (GM) har jeg en standard CAN-bus på ben 6 og 14 og en leverandørspecifik enkelt-ledning CAN-bus på pin 1. Standard CAN-bus er en pålidelig protokol med høj hastighed (500 kbps), også kaldet høj hastighed CAN (HS-CAN). Det bruges til kritiske data. CAN-bussen med enkelt ledning (SW-CAN) eller GMLAN er langsommere (33,3 kbps) og mindre pålidelig, men billigere, da den kun bruger en ledning. Denne bus bruges til ikke-kritiske data.

Hvis du ser en leverandørspecifik pin og ikke ved, hvilken protokol der bruges, skal du “OBD pinout” fra Google. Der er også lav hastighed CAN (LS-CAN) og mellemhastighed CAN (MS-CAN). MS-CAN er generelt på ben 3 & 11 og kører ved 125 kbps på Ford- og Volvo-biler.

Værktøjer

Du har brug for både en enhed, der er i stand til at fortolke CAN-data, samt software til at analysere dataene

Hardware

For at modtage og sende CAN-pakker har du brug for en enhed, der er i stand til dette. Du kommer ofte på tværs af ELM327-baserede enheder. Mens disse har deres brug, er de forfærdelige for hacking. De er alt for langsomme til at overvåge CAN-bussen.

Der er også avancerede enheder som Kvaser, Peak eller EMS Wünsche. Disse vil få arbejdet gjort, men er for dyre og ret dyre.

Nogle avancerede enheder kræver også, at du køber software sammen med den. USB2CAN er et oprindeligt CAN-interface til Linux, der giver god værdi for pengene.

Du kan også bruge Cantact eller CANUSB. Disse er dog ikke native CAN-enheder i Linux og bruger en ASCII-baseret protokol. Dette betyder, at de er lidt mere komplicerede at konfigurere og har mindre ydelse. På den anden side understøttes de godt på tværs af flere operativsystemer.

Jeg bruger CANalyze, som jeg har designet til mine behov. Det svarer til USB2CAN, fordi det er en overkommelig native CAN-grænseflade, men den bruger en nyere mikrocontroller, er open source og kan bygges ved hjælp af open source-værktøjer. Resten af ​​denne vejledning antager, at du bruger en native CAN-grænseflade.

Software

For at kommunikere med enheden skal du installere pakken med kan-værktøjer på din Linux-maskine. Du kan gøre dette ved at skrive følgende i Linux-prompten:

sudo apt-get install can-utils

Can-utils gør det ekstremt let at sende, modtage og analysere CAN-pakker. Dette er de kommandoer, vi vil bruge.

  • cansniffer viser kun de pakker, der ændrer sig
  • candump dump alle modtagne pakker
  • cansend sende en pakke

Linux har CAN-support indbygget i kernen via SocketCAN. Dette gør det nemt at skrive dine egne ekstra programmer. Du kan interagere med CAN-bussen på samme måde som du ville interagere med ethvert andet netværk, dvs. via sockets.

CAN-bus

Før du begynder at bakke, skal du have en vis forståelse af, hvordan CAN-bussen fungerer. Den består af 2 ledninger og bruger differentiel signalering. Da det er en bus, kan der forbindes flere enheder til disse to ledninger. Når en CAN-ramme sendes på bussen, modtages den af ​​alle ECU'er, men behandles kun, hvis den er nyttig til ECU'en. Hvis der sendes flere CAN-rammer på samme tid, vinder den med den højeste prioritet. En CAN-ramme har 3 dele, der er relevante for os.

  • voldgiftsidentifikator Identifikatoren for en meddelelse. En ECU bruger den til at beslutte at behandle eller ignorere den modtagne ramme. Det repræsenterer også meddelelsens prioritet. Et lavere tal har en højere prioritet. Så for eksempel, hvis du er ingeniør, der designer netværket, giver du rammen til implementering af airbags en meget høj prioritet eller et lavt voldgifts-ID. På den anden side vil du give en lavere prioritet eller højere voldgifts-id til data beregnet til dørlåsene.
  • datalængdekode (DLC) Angiver længden af ​​datafeltet i byte. En CAN-ramme kan højst have 8 byte data.
  • datafelt Indeholder op til 8 byte data.

Reversering af CAN-bussen

Den generelle tilgang til at vende CAN-bussen er at generere den adfærd, du vil efterligne, og finde den besked, der forårsager denne adfærd. Lad os f.eks. Sige, at baneholdeassistentsystemet (LKAS) på din bil er lort, og du har lavet din egen.

For at den kan styre styringen, skal du vide, hvilke meddelelser der skal sendes. Måden at finde ud af er ved at tænde den originale LKAS, overvåge CAN-bussen og identificere de pakker, der er ansvarlige for at dreje rattet. Når du har identificeret disse pakker, kan du få din egen LKAS til at sende disse pakker på CAN-bussen for at kontrollere rattet.

I vores tilfælde vil vi spoof omdrejningstælleren, så vi er nødt til at ændre omdrejningstallet ved at træde på bensinen med bilen tændt og i neutral og derefter prøve at finde den pakke, der er ansvarlig for at ændre omdrejningstallet.

Opsætning

Sæt CAN-enheden i bilens OBD-II-port og computerens USB-port. Få CAN-interface op ved at køre følgende i din Linux-prompt:

sudo ip link set can0 up type can bitrate 500000

hvilket bringer can0grænsefladen op (altid can0hvis du kun har en enhed tilsluttet) med en bithastighed på 500 kbps, hvilket er standard.

Identificere

Når bilen er slukket, sover ECU'erne normalt, så du skal tænde bilen eller sætte den i tilbehørstilstand. Du kan se på rå CAN-data ved at køre dette i din Linux-prompt:

candump can0

Dette udskriver CAN-data til skærmen, så snart de er modtaget. Dette er dog meget uorganiseret, og det er meget vanskeligt at se, hvilke pakker der svarer til en bestemt begivenhed. Du kan trykke på ctrl + c for at stoppe programmet. For at gøre dataene mere læsbare bruger vi cansniffer, som grupperer pakkerne efter voldgifts-id og kun viser de pakker, der ændrer sig. For at starte det skal du køre kommandoen i din Linux-prompt:

cansniffer -c can0

hvor -cfarvelægger de skiftende byte og can0er grænsefladen til at snuse. Det tager et par sekunder at fjerne de konstante pakker.

Du skal se noget, der ligner billedet nedenfor, selvom tallene sandsynligvis vil være helt forskellige.

Den første kolonne (delta) viser hastigheden i sekunder, hvor pakkerne med det voldgifts-ID modtages. Den anden kolonne (ID) indeholder voldgifts-ID'et. De resterende alfanumeriske kolonner (data ...) indeholder databytes. Hvis dataene har en ASCII-repræsentation, kan de ses til højre, ellers er det en prik.

Når du træder på gashåndtaget med motoren i gang for at øge omdrejningstallet, vises der muligvis nye CAN-meddelelser på skærmen, og / eller eksisterende skifter.

Vi er nødt til at finde en CAN-besked, hvor de skiftende byte korrelerer med ændringen i RPM. Vi kan sandsynligvis forvente, at værdien vil stige / falde, når RPM stiger / falder.

Den første CAN-ramme i cansniffer, der synes at variere med RPM, er rammen med voldgifts-id C9. Der er sandsynligvis flere potentielle pakker, der varierer med RPM, dette er bare den første.

Der er 4 byte, der ændrer sig (farvet rødt) i denne meddelelse, men ikke alle disse indikerer nødvendigvis RPM. Variationer i den tredje byte 07ser ikke ud til at korrelere med varierende RPM. Den sidste byte 1Bgør det.

Men så snart vi tager foden fra gashåndtaget, går den til 00. Dette vil indikere, at det repræsenterer gashåndtaget og ikke omdrejningstallet.

Endelig er der de to bytes, 21 C0der ser ud til at svare til en ændring i RPM. Mere så varierer det som et 16 byte heltal, dvs. når den anden byte C0flyder over, bliver den første byte 21øget med en. Det ser ud til, at det 21svarer til ca. 2000 omdr./min. Dette er godt at bemærke, når du vil afspille beskeden igen.

Afspil igen

Når du har en kandidat, skal du sende den til CAN-bussen med følgende kommando i din Linux-prompt:

cansend can0 0C9#8021C0071B101000

hvor rammen har formatet #{data} og skal erstattes med din egen CAN-besked.

Din bil kan køre eller i tilbehørstilstand til dette. Sørg for at bruge en pakke, som du fik, når motoren ikke var tomgang, ellers vil du ikke se noget ændre sig, når du afspiller den igen, mens din motor er tomgang.

Hvis du bare sender pakken en gang, vil du sandsynligvis ikke se noget ændre på instrumentklyngen. Dette skyldes, at den oprindelige besked stadig sendes kontinuerligt på bussen med 0,2 sekunders intervaller af ECU'en, så din besked bare ignoreres.

Husk at satsen er angivet i den første kolonne af cansniffer. Der er to måder at komme rundt på dette bortset fra at frakoble den ECU, der genererer disse meddelelser. En mulighed er at sende pakkerne med en meget højere frekvens end dem, der aktuelt sendes. Du kan gøre dette ved at køre følgende i din Linux-prompt:

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

og erstatte CAN-meddelelsen med den, du har identificeret. Tryk på ctrl + c for at stoppe.

En anden mulighed er at overvåge bussen, og hver gang du opdager den pakke, du vil spoofe, skal du sende din egen pakke straks efter. Dette kan gøres ved at køre i din Linux-prompt:

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

hvor du har brug for at erstatte CAN-meddelelsen og 0C9med CAN-meddelelse, du identificerede, og det er henholdsvis voldgifts-id. Du kan eksperimentere med begge tilgange for at se, hvilken der fungerer bedre.

Hvis omdrejningstælleren skifter, godt stykke arbejde, fandt du det! Hvis ikke, skal du identificere den næste meddelelse, der korrelerer med RPM, og afspille den igen.

Fuzzing

Nu hvor du har CAN-rammen, der indstiller RPM på instrumentklyngen, kan du lege med de data, du sender, for at se hvad der sker. Vi har bemærket, at de to bytes, der svarer til RPM, opfører sig som et 16-bit heltal, så for at indstille omdrejningstælleren til 8k RPM kører vi følgende i din Linux-prompt:

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

og resultatet er ...

Det er det! Du kan nu prøve at styre speedometer, radio, lys, dørlåse osv. Ved hjælp af samme tilgang.

Mulige problemer

  • Mens CAN-bussen er det mest populære netværk, er det ikke det eneste netværk. Hvis du ikke kan finde den besked, du leder efter på CAN-bussen, kan du prøve et andet netværk. Især ikke-kritiske meddelelser som radio, lys og dørlåse vil sandsynligvis være på et andet netværk.
  • Som nævnt afhænger de nøjagtige data, der overføres via CAN, af bilens mærke, model og år. Nogle biler bruger en tæller i CAN-meddelelsen for at sikre, at den samme besked ikke behandles flere gange. Dette er lidt sværere, men du skal kunne gøre det med de angivne oplysninger. Nogle biler bruger også et kontrolsum for at sikre integriteten af ​​dataene. Det kan være svært at beregne denne kontrolsum. Hvis du har en Toyota, skal du tjekke Adventures in Automotive Networks and Control Units, p10, Checksum-Toyota. Alle burde virkelig læse hele papiret.
  • Når du genafspiller den identificerede pakke på bussen, kan din CAN til USB-enhed muligvis gå i "bus off" -tilstand. Dette er en del af CAN-standarden og sker, når enheden oplevede for mange fejl. Dette sker generelt, når der er stor trafik på bussen. For at omgå dette kan du lege med forsinkelser og timing, måske prøve at afspille beskeden straks efter at have sat bilen i tilbehørstilstand, prøv at vente lidt, prøv den med bilen osv. Hvis du har identificeret, hvad ECU'er er tilsluttet bussen, kan du også trække i sikringen for at forhindre dem i at sende beskeder og sænke trafikken på bussen.

Skal læse

  • Car Hacker's Handbook
  • Charlie Millers og Chris Valaseks forskning, ja det hele
  • University of California San Diego og University of Washingtons forskning.

Sørg også for at tjekke Open Garages og deres videoer.