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é risiko trestního stíhání! Četba na vlastní nebezpečí!

Dnešní vyprávění o Arduinu bude poněkud antiklimaktické, protože největší vzrušení mi připravilo, když jsem se spálil při pájení. Co dělat, i takový je někdy život hardwaráře na odpočinku.

Dnes si pomocí Arduina rozebereme SIM kartu k mobilnímu telefonu. Studijní pomůcku mi zaslal T-Mobile, v marné naději, že bezplatným posláním Twist karty s kreditem 10 Kč – který ovšem nesmíte využít, dokud si SIM kartu nedobijete, a zakázána máte do té doby dokonce i příchozí volání – ze mne udělá svého platícího zákazníka (promiň, T-Mobile, ale mám lepšího operátora…).


V experimentech jsme omezeni ze tří směru: ustanovení § 182 odst. 1 písm. b) TrZ nám brání odposlouchávat mobilní provoz, podle § 231 odst. 1 písm. a) TrZ nesmíme za účelem spáchání takového trestného činu přechovávat hardwarové nebo softwarové prostředky způsobilé odposlech realisovat, a všeobecné smluvní podmínky T-Mobilu nám v čl. 3.2.3 přikazují užívat služby operátora pouze prostřednictvím jeho SIM karty a zakazují nám bez jeho souhlasu zasahovat do softwaru na SIM kartě nebo jej kopírovat. Není přitom jasné, zda se softwarem míní pouze firmware karty – ten modifikovat nebo kopírovat není normálně vůbec možné – anebo i data, konkrétně i tajný klíč Ki, který SIM karta obsahuje.

Zákaz využívat mobilních služeb jinak než prostřednictvím SIM karty znamená, že si nesmíme vyluštit Ki a udělat si z Arduina SIM simulátor, což naše možnosti vyžití notně omezuje.

Zakoupil jsem tedy cca za dvacet korun patici na SIMy a pustil se do experimentování. Patice se dodává pouze v provedení SMD, naštěstí nebylo nijak složité připájet její vývody k precisní lámací liště. Připojení k Arduinu je až směšně jednoduché: postačí jediná Schottkyho dioda, kterou se spojí vysílací a přijímací vývod USARTu. RESET se napojí na libovolný general I/O port a jako hodiny můžeme využít výstup libovolného časovače. Aby byl výsledek vůbec fotogenický, zapojil jsem přes PNP transistory na data a hodiny dvě LEDky.

SIMka s námi bude komunikovat na 9600 baud jedině v případě, že hodiny mají frekvenci 3,5712 MHz. Takovou frekvenci přímo z Arduina nevyrobíme; kdybychom ji skutečně potřebovali, museli bychom použít externí krystalový oscilátor nebo sestrojit jednoduchý PLL (fasový závěs). To je celkem zbytečné, zavedeme prostě do karty 4 MHz a budeme s ní komunikovat na 10753 baud, což náš USART zvládne naprosto přesně, přesněji než 9600 baud. Je to ostatně logické, hodiny USARTu jsou odvozeny od krystalu v Arduinu.

Do monitoru si doplníme dva příkazy, sr pro reset SIM a sa pro odeslání dat (A jako APDU). Prostudujeme ještě (jednoduché) normy ISO/IEC 7816-3 a -4 a GMS 11.11 a můžeme se SIM kartou začít komunikovat:

MON V1.0 ready
>sr
3B 9F 95 80 1F C3 80 31 A0 73 BE 21 13 67 D0 02 03 21 05 00 00 2A
>sa a0 f2 00 00 1a
F2 00 00 29 2A 3F 00 01 00 00 00 00 00 0D 93 03 0C 04 00 83 8A 83 8A 00 03 29 2A 90 00
>sa a0 a4 00 00 02
A4
>sa 2f e2
9F 0F
>sa a0 c0 00 00 0f
C0 00 00 00 0A 2F E2 04 00 04 00 55 01 01 00 00 90 00
>sa a0 b0 00 00 0a
B0 98 24 00 11 41 13 88 04 60 F6 90 00
>

Hotovo, vše funguje bez nejmenších problémů, můžeme si se SIM dělat, cokoli potřebujeme. Tak tohle byla vyloženě nuda! Odřazuji ještě ručně PIN kód alias CHV1 a intelektuálně neukojen vyjímám SIM i s paticí z kontaktního pole.

Jako druhý dnešní úkol se podíváme, jak se SIM komunikuje skutečný mobilní telefon. Ve starém haraburdí nacházím Nokii 8310, u které se mi před sedmi lety po pádu poškodila vysokofrekvenční část (funguje, ale s občasnými výpadky). Na kontakty pro SIM pájím plochý kabel, který vyvádím otvorem v boční stěně telefonu a zakončuji kolíky. Ty spojuji s odpovídajícími kontakty na SIM a zapínám telefon. Skvěle, vše funguje na první pokus, hlásí se operátor T-Mobile.

Datový vodič připojuji na RX Arduina a nově doplněným příkazem sm zkoumám komunikaci. Ta se ale nezdá probíhat na očekávaných 9600 baud. Přímo změřit frekvenci hodin bychom pomocí Arduina mohli, ale žlutá LED nám prozrazuje, že hodiny jsou spouštěny jen na dobu komunikace a měření by tudíž muselo být krátkodobé, např. triggerované aktivitou na datech. Také bychom si mohli požadovanou informaci vygooglit, jenže to by bylo už úplně nesportovní.

Připojuji proto datový vodič k logickému analysátoru, který jsme si napsali minule, a zjišťuji:

>l0201
00000000.0000 01 -------1
00021481.0000 (00021481.0000) 00 -------0
00021595.5000 (00000114.5000) 01 -------1
00021824.5000 (00000229.0000) 00 -------0
00021939.0000 (00000114.5000) 01 -------1
00022282.5000 (00000343.5000) 00 -------0
00022511.5000 (00000229.0000) 01 -------1
>

To máme start-bit, dvě jedničky, nula, tři jedničky a dvě nuly – no jasně, TS! Bitový slot má cca 114,5 μs, což odpovídá 8734 baudům. Nastavuji tedy USART na tuto rychlost a konečně vidím ATR.

Jenže ouha, o pár bytů dál jsou data opět nesmyslná. Po ATRu objevuji PPS, jímž si mobil na SIMce vyžaduje změnu parametrů na F=512 a D=16. Teď už přece jen googlím a zjišťuji, že frekvence hodin je 3,2768 MHz, což s těmito děliteli dává rychlost 102400 baud.

Tam mám s Arduinem problém, takové rychlosti se přiblížím pouze s chybou kolem 5 %, a použít pro USART v asynchronním režimu externí hodiny nelze, to atmel neumožňuje. Řešením je buď napsat si čtení softwarově (velmi jednoduché, jen trochu pracné a já jsem dnes v mimořádně líné náladě), anebo doufat, že seriový přenos bude i tak velkou nepřesnost tolerovat. Volím druhou možnost, sm si upravuji tak, že po prvních 30 bytech se přepne USART na rychlost 111111 baud a dostávám konečně rozumný výpis komunikace; je možné, že občas některý byte vinou nepřesných hodin vypadl, ale pro naše demonstrační účely to nevadí.

Data jsou ovšem přenášena po jednom vodiči, takže nevidíme, co je komunikace od SIMky mobilu a co od mobilu SIMce. To by se dalo vyřešit hardwarově např. tak, že bychom angažovali dva USARTy (naše Arduino má celkem čtyři), mezi SIM a mobil vložili malý resistor a na něj pověsili dva rail-to-rail komparátory, z nichž každý by byl mírně rozvážen v opačném smyslu. Nicméně protokol je tak jednoduchý, že tuto informaci nepotřebujeme, můžeme ji snadno odvodit z kontextu. Rozdělíme tedy tok dat ručně na jednotlivá APDU a máme tento výsledek:

3B 9F 95 80 1F C3 80 31 A0 73 BE 21 13 67 D0 02 03 21 05 00 00 2A
FF 10 95 7A
FF 10 95 7A
A0 A4 00 00 02 A4 3F 00 9F 1A
A0 A4 00 00 02 A4 2F E2 9F 0F
A0 B0 00 00 0A B0 98 24 00 11 88 90 00
A0 A4 00 00 02 A4 7F 20 9F 1A
A0 A4 00 00 02 A4 6F B7 9F 0F
A0 C0 00 00 C0 09 00 01 00 00
A0 C0 00 00 C0 09 00 01 00 00
A0 B0 00 09 B0 11 F2 FF FF FF 00
A0 A4 00 00 02 A4 9F 0F
A0 B0 00 00 01 B0 03 90 00
A0 F2 00 00 1A F2 00 00 00 7F 00 0D 04 83 00 00
A0 A4 00 00 02 A4 6F 05 9F 0F
A0 C0 00 00 C0 04 00 01 00 00
A0 B0 00 04 B0 20 01 FF FF 00
A0 A4 00 00 02 A4 6F AD 9F 0F
A0 B0 00 00 03 B0 00 FF FF 90 00
A0 A4 00 02 A4 7F 40 94 04
A0 A4 00 00 02 A4 3F 00 9F 1A
A0 10 00 00 09 10 0F 61 FF FF 00 04 60 91 8A
A0 A4 00 00 02 A4 7F 20 9F 1A
A0 A4 00 00 02 A4 6F 38 9F 0F
A0 C0 00 00 C0 10 00 01 00 8A
A0 B0 00 0B B0 FF 33 C3 03 3C C0 8A
A0 A4 00 02 A4 6F 7E 9F 0F
A0 C0 00 00 C0 0B 00 01 00 8A
A0 A4 00 02 A4 6F 07 9F 0F
A0 B0 00 00 09 B0 08 29 03 10 75 8A
A0 A4 00 02 A4 6F 78 9F 0F
A0 B0 00 00 02 B0 02 00 91 8A
A0 A4 00 00 02 A4 6F 46 9F 0F
A0 B0 00 00 11 B0 00 54 2D 4D 69 43 FF 8A
A0 A4 00 00 02 A4 6F 14 94 04
A0 A4 00 00 02 A4 7F 10 9F 1A
A0 A4 00 00 02 A4 6F 40 9F 0F
A0 C0 00 00 C0 1E 00 01 1E 8A
A0 12 00 00 8A 12 D0 81 87 81 00 82 54 62 8F 70 6F 73 8F 6F 76 61 73 0E 64 61 6C 07 62 \
8F 72 08 6F 61 50 74 65 4D 54 62 65 47 62 69 00
A0 A4 00 00 02 A4 3F 00 9F 1A
A0 A4 00 00 02 A4 7F 20 9F 1A
A0 A4 00 00 02 A4 6F 07 9F 0F
A0 C0 00 00 C0 09 00 01 00 00
A0 B0 00 09 B0 08 29 03 10 34 00
A0 A4 00 00 02 A4 6F 3E 94 04
A0 A4 00 00 02 A4 6F 3F 94 04
A0 A4 00 00 02 A4 6F 74 9F 0F
A0 B0 00 00 10 B0 00 00 05 20 00 00 00 00
A0 A4 00 02 A4 6F 7E 9F 0F
A0 B0 00 00 0B B0 80 C8 F6 E5 40 00 00
A0 A4 00 02 A4 6F 30 9F 0F
A0 C0 00 00 C0 99 00 01 00 00
A0 B0 00 99 B0 62 F2 10 32 F2 F2 10 32 F4 20 02 F4 20 02 F2 71 82 F8 40 10 52 F0 04 32 \
F2 20 42 F8 20 72 F2 70 02 32 F4 30 02 F8 07 82 F8 33 00
A0 A4 00 00 02 A4 6F 20 9F 0F
A0 B0 00 00 09 B0 E7 50 42 62 79 00
A0 A4 00 02 A4 6F 7B 9F 0F
A0 B0 00 00 0C B0 FF FF FF FF FF FF 00
A0 A4 00 02 A4 6F 53 9F 0F
A0 B0 00 00 0E B0 FF FF FF FF FF 00 90 00
A0 A4 00 02 A4 6F 52 9F 0F
A0 B0 00 00 09 B0 FF FF FF FF FF 00
A0 A4 00 00 02 A4 6F 39 9F 0F
A0 C0 00 00 C0 1E 40 01 03 00
A0 A4 00 02 A4 6F 37 9F 0F
A0 C0 00 00 C0 03 00 01 00 00
A0 A4 00 00 02 A4 6F 41 9F 0F
A0 C0 00 00 C0 05 00 01 00 00
A0 A4 00 02 A4 6F 16 94 04
A0 A4 00 00 02 A4 6F 39 9F 0F
A0 B2 00 04 03 B2 00 00 00 90 00
A0 A4 00 02 A4 6F 37 9F 0F
A0 B0 00 00 03 B0 00 00 00 90 00
A0 A4 00 02 A4 6F 41 9F 0F
A0 B0 00 00 05 B0 4B 63 FF 00 00
A0 A4 00 00 02 A4 6F 31 9F 0F
A0 B0 00 00 01 B0 05 90 00
A0 A4 00 00 02 A4 6F 48 94 04
A0 A4 00 00 02 A4 7F 10 9F 1A
A0 A4 00 00 02 A4 6F 43 9F 0F
A0 B0 00 00 02 B0 FF FF 90 00
A0 A4 00 00 02 A4 6F 42 9F 0F
A0 C0 00 00 C0 28 00 01 28 00
A0 A4 00 02 A4 7F 20 9F 1A
A0 A4 00 00 02 A4 6F 17 94 04
A0 A4 00 00 02 A4 7F 43 94 04
A0 A4 00 00 02 A4 3F 00 9F 1A
A0 A4 00 00 02 A4 7F 10 9F 1A
A0 A4 00 00 02 A4 6F 3C 9F 0F
A0 C0 00 00 C0 50 00 01 B0 00
A0 A4 00 00 02 A4 6F 3A 9F 0F
A0 C0 00 00 C0 58 00 01 1C 00
A0 A4 00 02 A4 6F 3B 9F 0F
A0 C0 00 00 C0 2C 00 01 1E 00
A0 F2 00 00 1A F2 00 00 00 7F 00 0D 04 83 00 00 00 00 00 00
A0 A4 00 00 02 A4 6F 3C 9F 0F
A0 B2 01 04 B0 B2 01 07 91 24 09 0C 42 00 01 62 F6 FF FF FF FF FF FF FF FF FF FF FF FF \
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00
A0 B2 02 04 B0 B2 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF \
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00
A0 B2 03 04 B0 B2 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF \
FF FF FF FF FF FF FF FF F0 F7 F7 F7 F7 F7 F7 F7 F7 F0 F7 F7 F7 F7 F7 F7 F7 07 00 00
A0 B2 04 04 B0 B2 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF \
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00
A0 B2 05 04 B0 B2 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF \
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00
A0 B2 06 04 B0 B2 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF \
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00
A0 A4 00 00 02 A4 7F 20 9F 1A
A0 88 00 00 10 00 88 A3 C3 94 11 13 DF 00 00 00 00 00 00 00 00 9F 0C
A0 C0 00 0F FF FF FF FF FF FF FF FF FF FC B2 FF FF FF FF FF FF FF FF FF FF 00

Opět nic překvapivého: párkrát SELECT, několik READů, jeden FETCH pro SIM toolkit a jeden RUN GSM ALGORITHM, s polovičním RANDem. S bezpečností to u T-Mobilu tedy skutečně nepřehánějí…

Dál už s Arduinem v rámci zákona jít nemůžeme, proto dnešní experiment ukončujeme.

K tomu jednu obecnější poznámku:

Zabezpečení mobilní komunikace je noční můrou každého odborníka na kryptografii. Pokud zvolíme systém, v němž se předplatitel (zákazník) prokazuje identifikačním předmětem (tokenem), musíme počítat s tím, že tento předmět musí být schopen bezpečně plnit svou funkci ještě za 20–25 let, protože žádný operátor nepřistoupí na to, že svým zákazníkům bude SIMky každých 10 let měnit. Toto zadání je samo o sobě nesplnitelné, vyrobit věc, která bude odolávat kryptoanalytickým pokusům ode dnešního dne za 20 let, je prostě vyloučeno.

Důsledkem je, že po 10–15 letech provozu je každá síť mobilní komunikace spolehlivě kompromitována, a otázkou není, zda lze její bezpečnostní mechanismy obejít, ale pouze, kolik to bude stát.

V případě SIMek byl navíc zvolen vadný algorithmus, který dovoluje zjistit Ki u většiny SIM, s pomocí čtečky, za pár desítek minut, a vyrobit tak její kopii – klon. Co je daleko větším problémem, je možnost prolomit ochranu pouhým odposlechem radiové komunikace, což znamená, že ke zjištění Ki – a získání možnosti odposlouchávat provoz sítě – nepotřebujeme SIMku ani fysicky získat. A to nemluvím o takových lahůdkách, jako je možnost dosáhnout odposlechu zřízením falešné BTS, která odposlouchávaný telefon požádá o komunikaci algorithmem A5/0, tzn. bez šifrování. Telefon, panna nevinná, naprosto nepochopitelně a v rozporu se zdravým rozumem této žádosti vyhoví, a ani o tom nijak neinformuje telefonujícího, takže ten nemá tušení, že jeho hovor nebo SMS putuje k neoprávněnému adresátovi.

Komentáře   

+1 # Wu 2010-10-03 23:37
Hm, už pomalu začínám chápat, na co se tohle Arduino dá použít.
Prakticky na cokoliv :).

Komentovat články mohou pouze registrovaní uživatelé; prosím, zaregistrujte se (v pravém sloupci dole)