Schwarzladen: Ladekarten manipulieren leicht gemacht


Nicht zuletzt durch große Förderprogramme wird die Ladeinfrastruktur zur Zeit massiv ausgebaut. Die Ladeverbünde haben mit den derzeitigen Ladekarten leider ein System etabliert, das extrem einfach zu missbrauchen ist: Man kann ohne großen Aufwand auf fremde Kosten laden.

In dem Video sieht man, wie ich mit meiner "Cyberkarte" an einer E-Wald Ladesäule den Strom freischalte. Als "Fahrzeug" verwende ich meinen Elektroauto-Simulator. Die Cyberkarte ist ein Klon meiner eigenen New Motion-Karte, d.h. ich habe diesen Ladevorgang selbst bezahlt. Das sieht man auch in der New Motion-App:

New Motion App: Abrechnung der Ladevorgänge

Allerdings wäre es sehr einfach gewesen, eine andere Karte zu klonen und damit auf fremde Kosten zu laden. Im Folgenden erkläre ich, was technisch passiert und warum es derzeit unmöglich ist, die Ladekarten sicher zu machen.

Was passiert da?

Zunächst habe ich die notwendigen Informationen von meiner New Motion-Ladekarte auf einen Kartenemulator übertragen. Ich nutze den Chameleon Mini: Das ist ein kleiner NFC-Kartensimulator, der beliebige Karten simulieren kann. Nachdem ich meinen Elektroauto-Simulator angeschlossen hab kann ich mit dieser Kartenkopie einen Ladevorgang freischalten. Das ist spannender als es sich anhört: Es ist nämlich sehr simpel, eine existierende Karte zu kopieren. Und noch schlimmer: Man braucht dafür nicht notwendigerweise eine New Motion-Karte, man kann die notwendigen Daten auch einfach raten.

Untersucht man die New Motion-Ladekarten mit einem NFC-Lesegerät (in meinem Fall ein ACR122U) findet man schnell heraus, das es sich bei den Karten um den Typ "Mifare Classic 1k" handelt. Das ist ziemlich schlecht, da die Sicherheitsfunktionen dieses Kartentyps schon vor etwa 10 Jahren geknackt wurden. Schauen wir uns also einfach mal an, was auf einer New Motion-Karte gespeichert ist:

$ xxd newmotion.mfd
00000000: XXXX XXXX XXXX XX88 4400 c820 0000 0000
00000010: 0000 0000 0000 0000 0000 0000 0000 0000
00000020: 0000 0000 0000 0000 0000 0000 0000 0000
00000030: ffff ffff ffff ff07 8069 ffff ffff ffff
00000040: 0000 0000 0000 0000 0000 0000 0000 0000
00000050: 0000 0000 0000 0000 0000 0000 0000 0000
00000060: 0000 0000 0000 0000 0000 0000 0000 0000
00000070: ffff ffff ffff ff07 8069 ffff ffff ffff
[...]
000003c0: 0000 0000 0000 0000 0000 0000 0000 0000
000003d0: 0000 0000 0000 0000 0000 0000 0000 0000
000003e0: 0000 0000 0000 0000 0000 0000 0000 0000
000003f0: ffff ffff ffff ff07 8069 ffff ffff ffff

Richtig — die Karte ist leer. Im ersten Block sieht man die Kartennummer (XXXX XXXX XXXX XX). Ansonsten stehen da nur Nullen und die Standardberechtigungen in den Datenblöcken. Es reicht also aus, einer Ladesäule eine existierende Kartennummer zu geben — und schon startet der Ladevorgang.

Die Werkzeuge: Links der Chameleon Mini, rechts mein NFC-Leser.

Eigentlich wird die Kartennummer von einem Kartenleser dazu genutzt, unterschiedliche Karten voneinander unterscheiden zu können. Ein Kartenleser findet zunächst heraus, welche Karten in der Nähe sind. Dazu fragt er alle Karten nach der Kartennummer. Dann spricht er über die Kartennummer gezielt einzelne Karten an. Die Kartennummer muss also öffentlich und unverschlüsselt sein und sollte lediglich für die Initialisierung der Datenverbindung genutzt werden. Das kann man in der ISO 14443-3 nachlesen ("initialization and anticollision").

New Motion nutzt jedoch die Kartennummer zur Abrechnung des Ladevorgangs. Das ist wie eine alte Kreditkarte: Die Kreditkartennummer reicht aus, um damit einkaufen zu können.

Man braucht also noch nicht einmal die (defekte) Verschlüsselung der Mifare Classic zu knacken, um eine Ladekarte zu klonen. Ein beliebiger Kartenleser und die mit der Chameleon Mini gelieferten Werkzeuge reichen aus, um eine perfekte Kopie der New Motion-Karte herzustellen:

python3 ./chamtool.py -s 2 -c MF_CLASSIC_1K_7B -U <Kartennummer> \
    -p /dev/<device> -u <kartendump.mfd>

Genau das sieht man oben im Video. Und über die Roaming-Funktion funktioniert der Kartenklon auch an Ladesäulen der folgenden Ladeverbünde:

  1. New Motion selbst
  2. BMW Charge Now
  3. E-Wald
  4. Ladenetz

Ich gehe allerdings davon aus, das so ziemlich jeder Ladeverbund damit funktioniert, auch wenn ich noch nicht alle testen konnte. Neben New Motion ist z.B. auch die Karte der Stadtwerke Kaiserslautern als Whitelabel-Lösung von Ladenetz bis auf die Kartennummer leer. Im OCPP-Protokoll, mit dem die Ladesäulen an ein Abrechnungsbackend angebunden werden, ist ebenfalls nur eine Kartennummer und keine weiteren Informationen vorgesehen.

Kurzes Zwischenfazit: Ladekarten sind nicht verschlüsselt und man kann sehr einfach perfekte Klone herstellen. Diese Klone funktionieren an Ladesäulen verschiedener Ladeverbünde über die Roaming-Funktion. Es kommt allerdings noch schlimmer.

Ladekarten raten

Bislang hab ich nur meine existierende Karte kopiert — ich will ja nicht auf fremde Kosten laden. Aber es ist ziemlich einfach, eine fremde Kartennummer zu raten. Wenn man sich eine Reihe von New Motion-Karten anschaut, so liegen die Kartennummern recht nahe beieinander:

  1. XX aa bb XX XX XX XX
  2. XX cc dd XX XX XX XX
  3. XX ee ff XX XX XX XX
  4. XX gg hh XX XX XX XX
  5. XX ii jj XX XX XX XX

Das XX meint einfach eine Zahl, die bei allen Kartennummern gleich ist. Die kleinen Buchstaben zeigen Ziffern an, die bei den Karten unterschiedlich sind. Um eine funktionierende Kartennummer zu raten würde ich Folgendes machen:

  1. An einer Ladesäule meinen Elektroauto-Simulator leicht modifiziert so anbringen, das ein Raspberry Pi diesen fernsteuern kann.
  2. Den Chameleon Mini mit dem Raspberry Pi verbinden und ihn Kartennummern durchprobieren lassen.
  3. Sobald Strom aus der Ladesäule kommt hat man eine fremde Kartennummer gefunden und kann diese zum Laden nutzen.

Im Endeffekt müsste man zwei Bytes, also 2^16=65536 Kombinationen, durchprobieren. Allerdings reicht es ja, einfach die nächste gültige Kombination zu raten. Wenn man davon ausgeht, das jede 100ste Kombination gültig ist, kommt man mit 100 Versuchen zum Ziel. Mein Desktop-Kartenleser kann in Kombination mit dem Chameleon Mini alle 2,5 Sekunden eine neue Kombination testen. Da noch etwas Datenkommunikation für die Ladesäule anfällt würde ich von 7 Sekunden/Test ausgehen. Macht 700 Sekunden oder knapp 12 Minuten. Das ist durchaus nachts auf einem Parkplatz machbar. Im Prinzip kann also jeder eine passende Kartennummer raten und diese dann zum Laden benutzen — ohne das der Besitzer der Ladekarte davon etwas mitbekommt.

Fazit

Es ist für jedermann recht einfach, Ladekarten zu klonen und auf fremde Kosten laden. Liebe Ladenverbundbetreiber — ihr habt Mist gebaut:

  1. Ihr benutzt keine Verschlüsselung.
  2. Die Karten, die ihr ausgebt, haben zwar Möglichkeiten zur Verschlüsselung, aber diese sind seit 10 Jahren gebrochen. Ist aber egal, weil ihr sowieso keine Verschlüsselung benutzt.
  3. Eure Kunden dürften es sehr schwer haben, eine unberechtigte Nutzung zu belegen.

Dooferweise ist diese Technik nun im Feld. Sowohl die Ladesäulen als auch die Abrechnungssysteme dahinter sind komplett auf diese Technik ausgelegt. Es dürfte also noch eine ganze Weile dauern, bis diese Technik durch etwas Besseres ersetzt wird. Leider müssen die Kunden solange mit dieser Unsicherheit leben.


Mathias Dalheimer

Yours truly.

likes distributed & embedded systems

GPG key: B6501625
fingerprint: E7BA B68E A2D3 9B6A ECEF 4DE4 823E 0DBE B650 1625
github | twitter


Proudly made using vim, jekyll, bootstrap (cosmo theme) & coffee. Last update: 08 Jan 2018