DŮLEŽITÉ UPOZORNĚNÍ!
Policie České republiky a šéfcensor Ústavu pro studium totalitních režimů Jaroslav Čvančara varují: citovat jakékoli texty z tohoto blogu způsobuje vážné nebezpečí trestního stíhání! Četba na vlastní nebezpečí!

9. 10. 2010

Arduino na šikmé ploše

Dnes budeme pomocí Arduina krást auta; prozatím pouze taková, která mají centrální zamykání s dálkovým ovládáním vysílajícím na frekvenci 433,92 MHz – ta jsou v Evropě pro přenos signálu z tlačítkem ovládaného klíčku zapalování nebo přívěsku do CPU v automobilu nejrozšířenější.

Protože Arduino obsahuje krystalový oscilátor, mohli bychom si postavit universální digitálně laděný přijímač – což časem bezesporu stejně učiníme – ale pro tak jednoduchý úkol jako je sledování provozu na 433,92 MHz postačí pořídit si za o něco víc než sto korun jednoúčelový přijímací modul (na snímku). Není to zbytečná investice, časem tento modul určitě využijeme i pro další aplikace, ve kterých budeme potřebovat přenášet data mezi základnovou stanicí a vzdáleným atmelem.

Modul zasadíme do malého kontaktního pole, přes stabilisátor napětí LM78L05 připojíme devítivoltovou baterii a můžeme začít sledovat, co se kolem nás v etheru děje. LED indikuje ihned po zapojení, s třiceticentimetrovou antenou z drátu, velice čilý provoz.

Na frekvenci 433,92 MHz, v tzv. pásmu ISM (v rozsahu 433,05–434,79 MHz), pracuje kromě dálkových ovládání zámkových systémů celá řada nejrůznějších zařízení, od dálkově ovládaných (RC) modelů přes různé hlásiče po tak banální zařízení, jakým je bezdrátové tlačítko k domovnímu zvonku.

Z bezpečností to není slavné: jednodušší systémy ji ani nepředstírají, ale ani ty dražší, pyšnící se přídomkem s plovoucím kodem (angl. code-hopping), pokusu o kryptoanalysu neodolají, třebaže některé z nich, např. KeeLoq firmy Microchip, dokážou klást slušný odpor a s běžnou výpočetní technikou by bylo prolomení kodu otázkou měsíců až let.

Nejprve ale musíme data nějak dopravit do počítače.

Je řada možností, jak toho dosáhnout. Zvolíme maximalistický přístup a rozhodujeme se pro přenos dat snímaných s frekvencí 1 Ms/s v nefiltrované podobě přímo do PC. Pro Arduino je to hračka, program, který to dokáže, bude mít jen několik instrukcí:
; constants
        .equ    BAUDRATE = 0    ; 2Mbaud
        .equ    INBIT = PK0
        .equ    tc1 = 2
        .equ    tc2 = 1
...
        ldi     BL, 8
s1:     rjmp    s3
s3:     ldi     AL, tc1
s4:     dec     AL
        brne    s4
        lds     AL, PINK
        bst     AL, INBIT
        ror     AH
        bld     AH, 7
        dec     BL
        brne    s1
        sts     UDR0, AH
        ldi     BL, 8
        ldi     AL, tc2
        nop
        rjmp    s4
Druhá zpožďovací smyčka nám, jak patrno, poněkud zdegenerovala, ale podle simulátoru funguje tento program zcela přesně, každou mikrosekundu přečte vzorek, ten uloží v pořadí LSB-MSB do bytu a tento byte po osmi mikrosekundách, aniž by se přitom narušil přesný rythmus vzorkování, odešle po USB počítači.

Jak realisovat propojení čtecí jednotky s Arduinem, závisí na vzdálenosti, kterou potřebujeme překonat. Pokud nám postačí jednotky metrů, zcela vyhoví přenos dat po jednom – stíněném nebo nestíněném – vodiči, pro delší vzdálenosti se můžeme rozhodnout např. pro proudovou smyčku nebo použít některé hotové řešení, např. interface pro RS-485. Samozřejmě, můžeme využít i bezdrátové propojení, např. pomocí infračervené LED nebo radiově na jiné frekvenci, než kterou scannujeme.

V počítači mohu soubor přes jeho velikost bez obav uložit na disk: protože používám komprimovaný souborový systém, zabral by fakticky jen velmi málo prostoru.

Z cvičných důvodů si ale data zkonvertujeme hned za rourou za příkazem dd, a to tak, že ukládat budeme, decimálně, údaj o hraně a její časové souřadnici v mikrosekundách. PC to hravě zvládne v reálném čase, dokonce i když je konversní program v Pythonu.

Další postup trochu připomíná hledání signálů mimozemských civilisací z radioteleskopických dat. Nasnímal jsem si vzorek jednoho pracovního dne, cca od 6 do 21 hod., celkem 57489322831 μs. V souboru o velikosti 70 MB je zachyceno 5292211 hran. To je poněkud příliš na to, abychom v něm mohli vyhledávat signály z dálkových ovládání ručně.

Protože je systém kodování u všech systémů podobný, založený na proměnné šířce pulsu nebo mezery mezi pulsy, neměli bychom přijít o žádná cenná data, pokud si odfiltrujeme pouze sekvence takových pulsů. Výsledkem je relativně malý soubor, obsahující celkem 1060 podezřelých sekvencí.

Záznamy v čase 3133668289 až 3351122226 μs mají známého původce, moje vlastní čtyřtlačítkové dálkové ovládání pracující v systému KeeLoq. Další KeeLoq objevuji v čase 40902567981 μs. Největší počet hitů představuje signál ze zařízení, jež je pravděpodobně stacionární a používá odlišný způsob kodování než KeeLoq: pulsy mají konstantní šířku a mění se prodleva mezi nimi, přičemž 2000/4000 μs znamená platný bit – nevíme ovšem, co je nula a co jednička, pro další analysu můžeme bez újmy na obecnosti přiřadit nulu slotu s delší prodlevou, a jedničku slotu s kratší – a 8000 μs je mezera mezi vysílanými kodovými slovy.

Zajímavé je, jak se přenášený kod v čase mění. Uspořádáme-li jednotlivé záznamy pod sebe tak, aby odpovídaly bity přenosu, vidíme, že první část přenášeného slova, které je překvapivě krátké, se změnila jen několikrát za den, skokově, kdežto druhá se mění častěji a zdá se, že souvisí s určitým čítačem nebo časovačem.

Vypadá to asi takhle:
...
17 43362519353:              1 10111101 00101111
19 44109911333:         000011 10111101 00111
18 44110006418:          00011 10111101 00111
16 44713064945:                10111101 00111011
23 44713309712:        0000011 10111101 00111011
20 44946798516:           0011 10111101 01000111
19 44947067473:         000011 10111101 01000
18 44947354323:           0011 10111101 010001
16 45248225989:           0011 10111101 0100
19 45248314164:          00011 10111101 010001
21 45248499473:          00011 10111101 01000111
18 45248596412:           0011 10111101 010001
19 45380646641:            011 10111101 01010011
18 45380734854:           0011 10111101 010100
19 45682166871:            011 10111101 01010011
19 45682255080:           0011 10111101 0101001
16 45682544162:              1 10111101 0101001
22 45682616551:         000011 10111101 01010011
21 45682713749:          00011 10111101 01010011
19 45682816504:            111 10111101 01010011
18 46054791962:       10000011 10111101 01
20 46054879314:       00000011 10111101 0101
19 46249153672:           0011 10111101 0110101
20 46249244447:           0011 10111101 01101011
17 46550413240:              1 10111101 01101011
18 46550773462:             11 10111101 01101011
17 46551138594:              1 10111101 01101011
19 46775740188:            011 10111101 01110111
16 46776015788:                10111101 01110111
18 46776365637:             11 10111101 01110111
19 47077260463:            011 10111101 01110111
17 47077622191:              1 10111101 01110111
17 47077799821:              1 10111101 01110111
19 47333777758:            011 10111101 10000011
16 47333881729:                10111101 10000011
17 47333971352:             11 10111101 1000001
16 47334068351:              1 10111101 1000001
22 47334142655:         000011 10111101 10000011
24 47334228290:       00000011 10111101 10000011
24 47334606658:       00000011 10111101 10000011
18 47635298154:            011 10111101 1000001
20 47635383882:          00011 10111101 1000001
23 47635565995:        1000011 10111101 10000011
18 47635680854:             11 10111101 10000011
17 47635775520:             11 10111101 1000001
21 47635852250:         000011 10111101 1000001
19 47635955769:           0011 10111101 1000001
21 47636140517:          00011 10111101 10000011
19 47936818518:            011 10111101 10000011
21 47937093351:          00011 10111101 10000011
17 48046832976:              1 10111101 10001111
16 48047107291:                10111101 10001111
19 48047628708:         000011 10111101 10001
16 48348346422:            011 10111101 10001
21 48348419232:        0000011 10111101 100011
16 48348899885:                10111101 10001111
17 48349076242:             11 10111101 1000111
21 48349149113:         000011 10111101 1000111
19 48649866896:            011 10111101 10001111
17 48650236381:              1 10111101 10001111
18 48650324616:             11 10111101 10001111
...
Dalším zkoumáním vzorků objevujeme, že podobné kodovací schema, avšak s polovičními bitovými sloty (1000/2000 μs), bylo zachyceno rovněž, a to až na výjimky individuálně. Lze proto oprávněně předpokládat, že se jedná o signály z dálkových ovládání automobilů:
21 2229393968:   011100100100111011111
16 2559445147:   0010011101111100
19 6346261674:   1111100101100111011
17 6444681114:   11111001000011101
19 7138208330:   1111100101110111011
18 13441577798:  101001101011101111
18 13969410892:  110011111001110111
16 16345153757:  0011101001110111
16 16477301932:  1001110000111011
16 18226622740:  1111000001110111
16 19117299667:  1110011101111100
18 19217009766:  011011011101111100
Nejzajímavější jsou pro nás sekvence v časech 6346261674, 6444681114 a 7138208330 μs: mají identickou fixní část a třetí kod je přitom shodný s prvním. To nasvědčuje domněnce, že se jedná o automobil, jehož dálkové ovládání zámku nemá implementován vůbec žádný plovoucí kod, a takové vozidlo bychom mohli otevřít velice snadno, prakticky bez úsilí.

První auto je tedy naše, stačilo by vyjít na ulici a odvézt si ho.

Dobře na tom nejsou ani ostatní majitelé. Mimořádně krátká variabilní část kódu způsobuje, že zabezpečení může být prolomeno tak, že zloděj přečte fixní část a s její pomocí bude generovat kodová slova jedno za druhým, dokud se zámek neotevře. Vysílač, který je k tomu potřeba, je podobně jako přijímací modul stokorunovou záležitostí.

Poměrné krátká doba vzorkování nám nedovoluje učinit definitivní závěr, avšak můžeme se právem domnívat, že jen malá část dálkově ovládaných centrálů na místním vozovém parku by dokázala odolat úsilí kvalifikovaného zloděje, a vzdorovat zloději vybavenému jednoúčelovým hardwarem (dekryptorem na basi FPGA) by nebyly schopny žádné.

A jak ukázal případ systému DST firmy Texas Instruments, paradoxně hůře na tom jsou vlastníci nejmodernějších systémů s transpondery, k otevření jejichž vozidla postačí, když se transponder nachází v bublině kolem automobilu, není třeba mačkat tlačítko na klíči.

Rozhodně lze tedy souhlasit s těmi pojišťovnami, které pojišťují pouze automobily opatřené kromě elektronického i dostatečně robustním mechanickým zabezpečením.

2 komentáře :

  1. Paráda, jen mám strach, že budu nakažen.

    OdpovědětVymazat
  2. Jak krásně zvrhlé...

    Děkuji za intelektuální uragán, vedený v teoretické rovině teorie o zločinu, uplatňujíce přitom právo na svobodu slova a projevu dle ÚS ČR a dosti břitké mysli...
    M.H.

    P.S.: Snad preventivně nálepková vazba mine Vás...

    OdpovědětVymazat

Kursiva: <i>text</i>
Tučně (když už to musí být…): <b>text</b>
Odkaz: <a href = "http://adresa">název odkazu</a>, tedy <a href = ""></a>

Poznámka: Komentáře mohou přidávat pouze členové tohoto blogu.