Tag Archives: Mifare

Planka på bussen i Umeå

Att åka gratis buss i Umeå är inga problem, varken med SMS-biljett (där man bör kunna algoritmen) eller ens med de faktiska busskorten (närmare beskrivningar kommer i veckan hoppas jag). En applikation för terminalexekvering har skrivits (samt en i Python), till skillnad från fucking-bullshit-iPhone-“appar”, och någon screenshot-genererare för iPhone-skräpprodukterna har jag hört ska finnas för lokaltrafiken i Umeå.

Följande video beskriver hur man kan ändra giltighetstiden på ett busskort, samt att det faktiskt är giltigt efteråt med modifikationens nya egenskaper:

[Youtubevideo för alla utan WebM-stöd i webläsaren]

Eftersom jag är en sådan där ärlig typ så hade jag följande mailkonversation med Länstrafiken i Västerbottens VD/ekonomichef häromveckan:

Date 22.02.2011 11:38

Hej Maria.

Det här gäller något ni rimligen redan bör vara medvetna om från Länstrafikens sida, nämligen möjligheten för vem som helst att manipulera era busskorts innehåll.

Jag har på egen hand, med mycket billig utrustning plus tillgänglig fri mjukvara, undersökt de busskort som används idag i Umeå med omnejd. Detta eftersom RFID-tekniken som kallas “Mifare Classic” varit erkänt osäker i många år och jag äntligen fick tummen ur i år att undersöka Umeås lokala användningsområden av tekniken ifråga.

Resultaten av mina undersökningar har, kortfattat, lett till upptäckten att vem som helst kan, utan nämnvärd ansträngning:

* Läsa av andra passagerares busskort (veta hur de reser)
* Skriva över andra passagerares busskort (manipulera/sabotera)
* Programmera om sitt eget kort (lägga till resor/förlänga tid)

Utförandet av ovanstående punkter förutsätter tillgång till det busskort som är inblandat. Denna tillgång är begränsad, med min billiga utrustning, till c:a 5cm avstånd (även genom kläder). Med dyrare utrustning går det i teorin att utföra samma saker med längre distans.

Omprogrammerade kort klarar förövrigt att identifiera sig korrekt mot biljettkontrollanternas maskiner.

Som resultat av undersökningen har jag nu under en period rest gratis vid tillfällen. Jag ämnar dock betala för mig och skall köpa den mängd resor jag åkt på ett rabattkort och sedan helt enkelt nollställa eller förstöra det.

…och så har vi kommit fram till poängen med mitt mail.

Eftersom detta är en så stor säkerhetsrisk, inte bara för ert kortsystems verifikat utan även för varje enskild passagerares integritet och ekonomi, anser jag att allmänheten har intresse av detta. En förening som jag är medlem i har tänkt publicera denna information med förklaringar hur man går tillväga, samt demonstrationer som visar att det faktiskt fungerar.

Jag mailar dig som VD på Länstrafiken i Västerbotten för att få veta era synpunkter och funderingar på detta, samt ifall någon annan part bör kontaktas i frågan innan informationen når allmänheten. Vilken roll spelar t.ex. Nobina i detta? (eller vilka andra som har med lokaltrafiken i Umeå samt Västerbottens regionaltrafik att göra)

Vilka köptes systemet från och kan de ställas ansvariga för den låga säkerhetsnivån i systemet? Eller menade inte upphandlingen täcka denna typ av missbruk?

Min önskan är att hjälpa er förbättra systemet. Vid redovisning av sårbarheten kommer det även att presenteras föreslagna lösningar till problemet. Om man nu ens ser på detta som ett problem, förstås

Önskas en demonstration går det givetvis att ordna.


Mikael Nordfeldth

PS, SMS-bussbiljetterna är inte särskilt svårknäckta nötter de heller: http://blog.mmn-o.se/2010/12/19/en-siffra-narmare-bussarnas-kod-i-sms-biljett/ DS.

Svaret var ruggigt kallt och intetsägande, efter att ha vidarebefordrats från VDns slutna låtsasdator som begränsas av ett företag vars största önskan verkar vara att kontrollera användarna snarare än att låta dem bruka hårdvara:

Date 23.02.2011 08:35

Hej Michael

Tack för att du uppmärksammat oss om sårbarheten för RFID-korten.

Vi är dock medvetna om problemen och detta är ett av skälen till att vi nu går över till ett nytt system.

Med vänlig hälsning

Tom Westerberg
Ekonomichef
Länstrafiken i Västerbotten AB
[…]

Från: Höglander Maria
Skickat: den 22 februari 2011 14:27
Till: Westerberg Tom
Ämne: Fwd: Sårbara RFID-busskort 

Skickat från min iPhone

Vidarebefordrat brev:

[mitt mail ovan]

Givetvis tyckte jag att det var ruskigt oförskämt att svara så kort när vi faktiskt erbjuder vår hjälp. Så jag förtydligar det lite samt frågar om ett par andra saker:

Date 23.02.2011 12:09

Tack för att du uppmärksammat oss om sårbarheten för RFID-korten.

Vi är dock medvetna om problemen och detta är ett av skälen till att vi nu går över till ett nytt system.

Halloj Tom,
detta gör mig givetvis lite nyfiken om hur länge ni vetat om problemen då jag lyckas pricka av i tiden då ni precis ska gå över till ett nytt system.

Vad innebär att ni “nu går över”. Är det faktiskt väldigt snart, har ni redan upphandlat och hur får ni detta nya system i rullning? (brukas samma kort etc. etc.)

Erbjudandet om att betrakta systemet som oberoende tredjepart består. Jag och föreningen (Umeå Hackerspace) har inget vinstsyfte utan skulle gärna göra en analys bara av intresset för problemlösning och säkerhetstänk.

Mvh,
Mikael Nordfeldth
http://blog.mmn-o.se/
070-5657637

Fortfarande har jag inte fått något svar på detta.

In other news: Nyligen skrevs det i Västerbottens Folkblad om hur fuskresandet med SMS-biljetter beräknas handla om resor som annars hade gett inkomster kring en miljon per år. Jag planerar att skriva ett inlägg gällande detta, med regelrätt kritik och fördold utskällning av de som klagar och gnäller på “biljettfuskarna”. Jag återkommer.

—-

Update 2011-03-08 17.12: Tydligen har Länstrafiken i Västerbotten polisanmält mig och/eller föreningen Umeå Hackerspace (som inte ens hunnit få sitt organisationsnummer!). Som svar på denna från media delgivna uppgift, som jag inte fått verifierad ännu (t.ex. blivit förhörd), så mailade jag Tom Westerberg igen. Som jag alltså ännu inte fått svar från gällande mina tidigare frågor:

ons 2011-02-23 klockan 08:35 +0100 skrev Westerberg Tom:

Hej Michael
>
> Tack för att du uppmärksammat oss om sårbarheten för RFID-korten.
>

Som sagt, varsågod. Och vi ställer fortfarande gärna upp från föreningens håll att utvärdera möjliga lösningar på problemet.

Vad som ger mig lite huvudbry är dock hur det kommer sig att reportern från Västerbottens Folkblad ringer och meddelar mig att du/ni lämnat in en polisanmälan med anledning av dessa undersökningar som gjorts.

Vår önskan är att kommunicera snarare än dra in rättsväsendet, som väl ändå har riktiga brott att utreda och behöver sina resurser till.

Förutsatt att vad denna reporter sagt stämmer, att jag och/eller föreningen Umeå Hackerspace är polisanmälda, så är jag fundersam kring vilken rubricering fallet har fått.

Jag har mycket svårt att se något kriminellt i de handlingar som utförts av mig som privatperson med mina personliga ägodelar – dit busskorten faktiskt räknas in. Särskilt när mina resor faktiskt har återgäldats rent ekonomiskt och därmed inte på något sätt skadat er organisation ekonomiskt.

Så – ifall nu polisanmälan faktiskt är gjord och jag inte misstar mig – vore det möjligt att få veta ärendenummer och vilket poliskontor som tar hand om detta, för att få veta mer? Jag har i alla fall ej blivit kontaktad av polis ännu i alla fall för att delges misstanke om brott.

Det vore uppskattat ifall jag kunde få lite klarhet på den här fronten, dvs ifall jag ska behöva ligga vaken på nätterna och vänta på husrannsakan eller ej.

Mvh,
Mikael Nordfeldth
http://blog.mmn-o.se/
070-5657637
mmn@hethane.se

Att spärra ett busskort

Nu har det blivit dags för busskortshärjandet att undersöka hur spärrade kort hanteras.

Jag har registrerat kortet tidigare på tabussen.nu och betraktat historiken där under tiden jag undersökt funktionaliteten, innehållet etc. Idag klickade jag på “Anmäl förlorat” och fick följande frågor där jag gav tillhörande svar:

Välj korttyp: Rabattkort
Var gjorde du din senaste påfyllning: Fick det i julklapp
När gjorde du din senaste påfyllning: 2010-12-24
Var förlorade du kortet: How should I know?
När förlorade du kortet: 2011-02-22
Hur mycket (dagar eller resor) hade du kvar på kortet: 0 resor

Klicketiklick, så sade sidan det glada meddelandet:

Ditt kort har nu blivit anmält som borttappat.

Då ska vi se om jag kan vandra iväg och åka buss på ett annat kort med samma inprogrammerade ID-nummer då… Jag återkommer nedan hur det gick…

PS. Jag mailade VD:n för Länstrafiken i Västerbotten idag om de undersökningar jag gjort. För att höra om de har något att säga innan det publiceras instruktioner och information om busskortens funktion och innehåll publikt.

Mifare goes Umeå

Remember Umeå’s SMS bus tickets? Well, we didn’t really go all out on that one, considering it is reasonably an online system. Which means we can’t modify the central database and only imitate a legitimate ticket. However, of course, that’s good enough as long as the ticket inspectors don’t actually check the tickets against the central database. But with risk of becoming stale, we’re moving on to the real tickets. Pre-purchased cards containing any given amount of trips (that people can reasonably afford).

Länstrafiken i Västerbotten (though the buses are driven by Nobina) use RFID cards operating at 13.56MHz following the Mifare Classic standard. This is a fairly easy system to use, giving you contact-less tickets operating at a slightly more rapid verification speed than the old magnetic cards that were in use before.

Mifare Classic is also used in several other scenarios, be it other sorts of ticket systems or even security-related such as access control to buildings or computer systems. Thus, knowing how Mifare works is a good start if you want to crack it. Fortunately (so one doesn’t have to get in over one’s head) lots of people have been doing lost of fine work over the last decade. The tools needed to complete a full secret-key recovery of just about any Mifare classic card are all available as open source hardware and software. Thanks to a friend of mine, I now have access to a reader that allows for toying around with the security issues on Mifare cards.

A lot of the RFID technology has been, by me too, perhaps incorrectly bashed upon to be unsafe. Me and others have concluded that “just by walking into a room” you can know who are present through reading their RFID data. This is not true in the sense of immediate access to this knowledge. However, aggregating enough data may definitely resolve information needed to this at a restricted level. Regardless, the fact remains that RFID is contact-less, meaning it WILL transmit data available for interception – without being removed from your pocket – to the general public. It’s not as easy as 1-2-3. Maybe 5 though.

For my part I’m first going to read up on the actual standard, the available security research and whatever else may be necessary to know. In parallell I have started applying the available tools for dumping keys on RFID cards in my personal possession. For example, the crapto1 project (from Mifare Classic’s encryption scheme CRYPTO1) lists these sources as security research reports, it’s as good a start as any:

Also, the documentation provided by the libnfc project is very good and carries the ISO 14443, Mifare dump specifications etcetera. The project which binds crapto1, libnfc etc. together is mfcuk, which I use to maneuver a simple 30€ reader (ACS122 compatible, device ID 072f:2200). Because of WordPress’ disliking of certain file-endings, I’ll tar-gzip just this once and present to you 58127350-initial_payload.tar.gz – straight from nfc-mfclassic. Remember to take into account big/little endian decoding issues. I’m not dead-certain which order is which in the software versus Mifare specifications etc.

In either case, this is what hexdump tells me (cutting off the ASCII part):

00000000  67 62 ce fb 30 88 04 00  43 29 9c 43 00 19 08 09
00000010  34 01 14 07 14 07 14 07  14 07 14 07 14 07 14 07
00000020  14 07 14 07 14 07 00 00  00 00 00 00 00 00 00 00
00000030  a0 a1 a2 a3 a4 a5 78 77  88 c1 83 69 85 fa a9 3e
00000040  80 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
00000050  00 01 40 16 09 b0 03 76  f3 f6 06 59 08 8e 00 10
*
00000070  71 4a 90 80 b0 9b 78 77  88 00 e0 a8 67 68 31 6f
00000080  13 88 13 88 70 73 dd 70  74 19 00 10 8d 13 88 00
00000090  13 88 13 88 70 74 58 70  74 94 00 90 40 13 88 00
000000a0  1e 20 00 02 02 00 00 00  00 00 00 00 00 00 00 00
000000b0  5b 53 fb 10 d0 0c 78 77  88 00 92 c1 2e fb 21 24
000000c0  1e 1e 00 02 02 00 00 00  00 00 00 00 00 00 00 00
000000d0  10 40 dc 18 aa 1c 18 aa  1c 1c f7 5c 18 9f 70 00
000000e0  10 40 1c 18 aa 1c 18 aa  1c 1c f7 5c 1d 16 30 00
000000f0  32 a9 09 15 8a 1c 78 77  88 00 70 b8 b0 f2 f5 5a
00000100  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
*
00000130  34 4d 0a 51 12 87 78 77  88 00 fe 8f 9e 57 6d e4
00000140  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00

- empty sectors -

000002f0  a0 a1 a2 a3 a4 a5 ff 07  80 69 b0 b1 b2 b3 b4 b5
00000300  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00

- default keys -

0001000
  • 0x30, I’m not really sure what’s in Sector 0. A friend says it might be a Mifare Application Directory, MAD, sector. This seems reasonable. I’ll still have to read up on how those are specified.
  • 0x70, Sector 1 is most likely relevant data. Note similarities between 0x80-0x8F and 0x90-0x9F
  • 0xB0, Sector 2 is most likely also relevant data. Note similarities between 0xD0-0xDF and 0xE0-0xEF
  • 0x130, from here there are only empty sectors (at least on this specific card)
  • 0x2F0, from here default keys (0xA0A1A2A3A4A5/0xB0B1B2B3B4B5) are used and the sectors contain no data

I haven’t pondered yet at what the various hexes might decode to yet, but the similarities mentioned in sectors 1 and 2 will probably be of interest. Now we need diffs, timestamps, refills etc. This specific card is pretty unknown to me even at this point. But it’s a start and proof of concept.

And we’re out of coffee to brew at Umeå hackerspace. That sucks.

Update 2010-01-07 13.25: Having dumped another card, I verified that they used the very same keys on all sectors. The only difference on the key dump was the following (the first line, 0x0, being the card’s UID). Below is the payload diff:

1c1
< 00000000  d5 d8 20 f3 de 88 04 00  43 25 b4 53 00 11 0a 05
---
> 00000000  67 62 ce fb 30 88 04 00  43 29 9c 43 00 19 08 09
5,6c5,6
< 00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
< 00000050  00 01 40 16 09 b0 03 75  4c 6b 01 51 88 57 80 10
---
> 00000040  80 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
> 00000050  00 01 40 16 09 b0 03 76  f3 f6 06 59 08 8e 00 10
9,11c9,11
< 00000080  13 88 13 88 6b fc 01 6b  fc 3d 00 10 28 13 88 00
< 00000090  13 88 13 88 6b df 2d 6b  df 69 00 10 19 13 88 00
< 000000a0  12 00 00 02 02 00 00 00  00 00 00 00 00 00 00 00
---
> 00000080  13 88 13 88 70 73 dd 70  74 19 00 10 8d 13 88 00
> 00000090  13 88 13 88 70 74 58 70  74 94 00 90 40 13 88 00
> 000000a0  1e 20 00 02 02 00 00 00  00 00 00 00 00 00 00 00
13,15c13,15
< 000000c0  12 02 00 02 02 00 00 00  00 00 00 00 00 00 00 00
< 000000d0  10 40 9a f7 cb 5a ff 00  5a e4 2a 5a e6 0a 00 00
< 000000e0  10 40 5a f7 cb 5a df eb  9a e4 2a 5a e6 0a 00 00
---
> 000000c0  1e 1e 00 02 02 00 00 00  00 00 00 00 00 00 00 00
> 000000d0  10 40 dc 18 aa 1c 18 aa  1c 1c f7 5c 18 9f 70 00
> 000000e0  10 40 1c 18 aa 1c 18 aa  1c 1c f7 5c 1d 16 30 00

There is no plaintext in any sector. I’ll collect more data for later posts. Once the system is reverse-engineered, there’ll be a post describing the process of interpreting and what all differences are.