NFC unter Android

From SarWiki
Jump to: navigation, search

Dies ist der Ergebnisartikel des Projekts "NFC Interface unter Android" im Rahmen des IT-Security Workshops 2012. Ziel des Projekts war es, zu untersuchen, welche Möglichkeiten sich auf mobilen Android Gerät bieten, mit dem NFC Interface von Android zu arbeiten. Grundlegende Eckpunkte bildeten dabei das Auslesen des Guthabens der Mensakarte in Form einer "Guthaben App" für Android und das Emulieren einer solchen mit einem Android Gerät.

Guthaben-App

Unser erstes Ziel war es, eine Android App zu erstellen, welche in der Lage ist, das Guthaben einer beliebigen Mensakarte auszulesen und anzuzeigen. Die zum aktuellen Zeitpunkt (Sep. 2012) im Umlauf befindlichen Mensakarten sind vom Typ Mifare Classic 1k.

Diese Karten stellen einen 1024 Byte großen Speicher dar, welcher in Sektoren unterteilt ist. Dabei sind die Sektoren, in denen wichtige Informationen wie z.B. das Guthaben gespeichert sind, mit einem Schlüssel versehen. Nur wenn ein Lesegerät diesen spezifischen Schlüssel kennt, kann es diese Sektoren auslesen.

Die kartenspezifische UID steht in Block 0 in den ersten 4 Bytes, bleibt bei jedem Auslesen gleich und kann ohne speziellen Schlüssel eingesehen werden. Die Blöcke 4-19 sind verschlüsselt und enthalten unter anderem das Guthaben, Anzahl der Aufladungen und Prüfbits. Nach vielen ungenutzen Blöcken folgen die letzten beiden Sektoren in verschlüsselter Form. Da für das Auslesen und Berechnen des Guthabens nur Block 12 interessant ist (das Guthaben ist nochmal in Block 13 gespeichert), haben wir uns die anderen Bytes nicht näher angesehen.

libnfc & nfc-tools

Um diesen Schlüssel zu knacken haben wir unter Ubuntu das Programm mfoc verwendet, welches Teil des NFC-Tools Paket ist, welches wiederum die Library libnfc verwendet. Alle Tools und Libraries wurden in der aktuellsten Version bzw. Revision verwendet.

Links:

Zum compilieren und installieren genügt:

autoreconf -vis
./configure
make
make install

Danach kann man dann z.B. mit

nfc-list

und einem USB-Kartenleser erstmals eine Smartcard am PC erkennen und nach einfachen Informationen scannen.

< ! > Dabei ist zu beachten, dass ab der Version 3.2 des Linux Kernels vor dem Scannen mit nfc-list zwei Module in der korrekten Reihenfolge entfernt werden müssen:

rmmod pn533
rmmod nfc
nfc-list

Wird über nfc-list eine Mifare Classic Karte am Kartenleser erkannt, kann nun von dieser ein dump mittels mfoc erstellt werden:

mfoc -O /Zielpfad/für/das/DumpFile

Dem Dumpfile kann man nun den Schlüssel der kritischen Sektoren und den kompletten Speicherinhalt der (Mensa)Karte in Hexadezimaldarstellung entnehmen. Dabei stellte sich heraus, dass für alle Mensakarten ein und der selbe Schlüssel für die kritischen Sektoren verwendet wurde, sodass ein einmaliges Knacken einer beliebigen Mensakarte ausreicht, um dann mit dem erlangten Schlüssel weiterarbeiten zu können. Des Weiteren konnte man an Hand mehrer Dumps mit unterschiedlichen Guthaben erkennen, in welchen Bytes der Karte das Guthaben kodiert ist und konnte dieses somit mit einem kleinen selbst gebauten Skript leicht automatisiert ablesen.

Dump

Hier ein Auszug, wie die Ausgabe von mfoc bei Erstellung eines Dumps aussehen kann. Bei verschiedenen Mensakarten ändert sich in diesem Teil nur die UID.

Allgemeine Informationen der Karte :

    ATQA (SENS_RES): 00  04  
* UID size: single
* bit frame anticollision supported
       UID (NFCID1): 63  eb  53  4d  
      SAK (SEL_RES): 08  
* Not compliant with ISO/IEC 14443-4
* Not compliant with ISO/IEC 18092
Fingerprinting based on ATQA & SAK values:
* Mifare Classic 1K
* Mifare Plus (4-byte UID) 2K SL1
* SmartMX with Mifare 1K emulation
...

Inhalt der für uns interessanten Blöcke :

...
Block 20, type A, key ffffffffffff :00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  
Block 19, type A, key XXXXXXXXXXXX :00  00  00  00  00  00  78  77  88  00  00  00  00  00  00  00  
... 
Block 13, type A, key XXXXXXXXXXXX :00  00  00  21  21  00  00  01  39  38  00  00  00  00  21  21  Guthaben und Prüfbyte
Block 12, type A, key XXXXXXXXXXXX :00  00  01  39  38  00  00  00  21  21  00  53  53  00  00  01  Guthaben, Prüfbyte und Anzahl der Aufladungen
...  
Block 02, type A, key ffffffffffff :00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  
Block 01, type A, key ffffffffffff :00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  
Block 00, type A, key ffffffffffff :63  eb  53  4d  96  88  04  00  46  b9  94  d9  51  20  39  09  UID

Das Guthaben ergibt sich aus folgender Rechnung (Umrechnung von hexadezimal in dezimal nötig) :

erstes Byte x 255 + zweites Byte  + erstes Byte
 ( 1 -> ) 1 x 255 + ( 39 -> ) 57  + ( 1 -> ) 1   = 313 (Cent)

Demzufolge befindet sich auf dieser Karte ein Guthaben von 3,13 € und sie wurde ( 53 -> ) 83 mal aufgeladen, wie in Block 12 zu sehen ist. Da der Key für alle Mensakarten des Studentenwerken gleich ist wurde er an dieser Stelle entfernt.

Umsetzung unter Android

App bereit zum scannen einer Karte

Nachdem man den Schlüssel, mit dem auf allen Mensakarten die kritischen Sektoren verschlüsselt sind, über mfoc ermittelt hat, braucht man diese Information nur noch mit Hilfe des Android NFC API in die Form einer Android App zu bringen. Wir haben dafür erste Schritte unter Android mit dem Android Emulator unternommen, welcher Teil des Android Eclipse Plugins ist.

Links:


Nach den ersten kleinen selbst gebauten Apps ist man schnell in der Lage, sich mit dem NFC API zu beschäftigen um eine App zu schreiben, welche mit Hilfe der bereitgestellten Funktionalitäten und dem ermittelten Schlüssel gezielt die richtigen Bytes der Mensakarte ausliest, um damit korrekt das jeweilige Guthaben anzuzeigen.

Da der Android Emulator des Eclipse Plugins aber leider keinen Zugriff auf USB Geräte bietet, kommt man ab hier mit einem USB Kartenleser nicht mehr weiter, sondern benötigt ein NFC fähiges Android Smartphone oder Tablet. Wir hatten im Rahmen des Workshops die Möglichkeit mit einem Google/Asus Nexus 7 Tablet und einem Google/Samsung Nexus S arbeiten zu können, welche beide über einen eingebauten NFC Chip verfügen. Somit konnte man direkt in Eclipse die erstellte App starten, welche dann nicht über den Emulator sondern direkt auf dem über USB angeschlossenen Android Gerät ausgeführt wurde.

Karte mit 3,13€ Guthaben

Links:


Der Quelltext unserer Guthaben-App befindet sich als Git-Repository namens android.nfc auf dem SAR-Github gitsar und steht frei zur Verfügung.




Kartenemulation unter Android

Der zweite Teil unserer Arbeit hatte das Ziel, zu untersuchen, welche Möglichkeiten zum einen Android und zum anderen das Nexus S bieten, um die Emulation einer Smartcard umzusetzen. Bei der Emulation wird das Smartphone nicht wie üblich als Kartenleser eingesetzt, sondern gibt sich selbst als Karte aus, ist also selbst die Smartcard und sollte demnach von einem Kartenleser gelesen werden können.

Da wir im ersten Teil des Workshops speziell mit der Mensakarte gearbeitet haben, lag auch hier zuerst der Fokus darauf, eine Emulation der Mensakarte hinzubekommen.

Problemstellung

Schon die originale Androidversion bietet die Möglichkeit einer Kartenemulation. Dies ergibt sich, da es u.a. von Google selbst einen Online-Bezahldienst namens Google Wallet gibt, mit welchem man in der Lage sein soll, an einem Point of Sale (PoS) mit dem Smartphone zu bezahlen, indem dies z.B. eine vorher über Paypal gekaufte Guthabenkarte oder eine Kreditkarte emuliert.

Google Wallet:


Damit allerdings die Sicherheit dieses speziellen Emulationsmodus gewahrt bleibt, wurde im NFC Chip des Nexus S ein sog. Secure Element verbaut. So gesehen eine kleine Smartcard, dessen Zugriff nur für ausgewählte Firmen und deren Apps erlaubt ist. Die Kartenemulation findet ausschließlich über dieses Secure Element statt und ist somit auch nur für ausgewählte Apps möglich.

Um also nun mit einer selbstgebauten App die Kartenemulation zu ermöglichen mussten wir uns ersteinmal ein Android System einrichten, welches diese Restriktionen umgeht. Danach muss man dann versuchen, mit einer selbst geschriebenen App eine Kartenemulation zu ermöglichen.

Links:

Vorbereitung

Einen ersten Anhaltspunkt zur selbst gebauten Kartenemulation bietete uns dabei die App NFC Proxy, welche allerdings eine inoffizielle Version des Android Betriebssystems namens CyanogenMod benötigt, bei der viele Restriktionen des Originals aufgehoben sind. Um CyanogenMod auf dem Nexus S installieren zu können benötigt man ersteinmal root-Rechte auf dem Gerät, man muss das Gerät also rooten. Dadurch verfällt die Garantie des Geräts und bestimmte Dienste wie z.B. Google Wallet können danach nicht mehr genutzt werden.

Links:

NFC Proxy

Die App NFC Proxy wurde auf der diesjährigen Defcon20 von ihrem Entwickler Eddie Lee vorgestellt und lieferte uns einen ersten Anhaltspunkt dafür, wie eine Kartenemulation unter Android aussehen könnte.

Hauptaugenmerk dieser App ist es, NFC Pakete, welche sonst nur zwischen einer Smartcard und einem Smartcard-Reader auf kürzester Distanz ausgetauscht werden, über eine größere Distanz mit Hilfe einer Bluetooth oder einer Wifi Verbindungen zu übertragen. Dafür benötigt man zwei NFC fähige Android Geräte. Ein Gerät befindet sich bei der Karte und das andere beim Kartenleser. Mit Hilfe der App kann die Kommunikation zwischen Karte und Leser nun weiter ausgedehnt werden, wobei diese weiterhin denken, sich direkt nebeneinander zu befinden.

NFC Proxy:

Als Beiprodukt bietet die App aber auch die Möglichkeit mit einem Smartphone eine Karte zu scannen um diese dann danach zu emulieren, welches genau die Funktionalität ist, welche wir bezogen auf unsere Mensakarte umsetzen wollten.

Leider funktioniert die App von Hause aus nur mit Kreditkarten und obwohl der Source Code der App frei zur Verfügung steht, ist es uns leider nicht gelungen die Funktionalität der App auf unsere Mensakarte anzupassen.

Probleme mit NFC Proxy

Dafür gab es zwei Gründe. Der Kartenemulationsmodus der App sieht vor, dass man als erstes ein bestimmtes Kreditkartenprofil wie z.B. Mastercard oder Visa auswählt und damit das Handy in einen Kartenleser für eine solche Karte verwandelt. In diesem PCD Replay Modus (PCD = Proximity coupling device = Kartenleser) werden fest im Quelltext verankerte und für die entsprechende Karte passende APDUs versendet, um eine mögliche Karte diesen Typs anzusprechen.

Genau solche APDUs hatten wir für die Mensakarte nicht vorliegen, sodass wir ersteinmal eine Mensakarten/Mensakartenautomat Transaktion hätten mitschneiden müssen, um an die genauen APDUs für den Kommunikationsauf zu kommen, was uns zusätzlich einen Teil der knappen Workshop Zeit gekostet hätte.

Desweiteren ist zu erwähnen, dass die von der App unterstützen Kreditkarten ISO-14443 konforme Karten sind, welche sich auf allen Schichten an den vorgeschriebenen Standard halten. Damit die App überhaupt mit Karten dieses Standards arbeiten kann, benötigt sie einen ganz bestimmten CyanogenMod Patch von Doug Yeager, welcher es überhaupt erst ermöglicht, ISO-14443 Tags anzusprechend bzw. zu emulieren.

Da es sich bei der Mensakarte allerdings um Karten vom Typ Mifare Classic handelt, welche sich nicht auf allen Schichten an den ISO-14443 Standard halten, wären wir höchstwahrscheinlich erneut auf große Probleme gestoßen, selbst wenn wir es geschafft hätten eine Mensakarte zu scannen und in den eigentlichen Emulationsmodus zu wechseln.

Somit haben wir uns an dieser Stelle entschieden die Kartenemulation nicht mit der Mensakarte zu verfolgen, sondern, auf Grund des Zeitumfangs des Workshops, lieber zu versuchen, die Emulation mit einer auf allen Schichten ISO-14443 konformen Karte anzustreben, wobei die Wahl spontan auf den neuen Personalausweis fiel.

nPA Emulation

Als erstes sei hier angemerkt, dass das nun neue Ziel - eine Emulation auf Basis des neuen Personalausweises (nPA) - nicht beinhaltete, den kompletten Personalausweis zu emulieren. Vielmehr war das kurzfristige Ziel, es zu schaffen, dass zumindest die AusweisApp erkennt, dass es sich um einen nPA handelt.

Dafür wurden die entsprechenden APDUs im Quelltext der NFC Proxy App eingetragen, was dazu führte, das man erfolgreich den nPA scannen und in den Emulationsmodus der NFC Proxy App wechseln konnte.

Leider stellte sich hier heraus, dass NFC Proxy wohl keinen Einfluss auf den NFC Stack hat, da beim Scannen des Smartphones das gleiche Select Acknowledge gesendet wurde, wie noch bei einer Kreditkartenemulation, nämlich SAK 0x40. Sodass sich die ersten Befürchtungen, an dieser Stelle ersteinmal nicht weiterkommen zu können, wahr zu werden schienen.

Simply Tapp

Obwohl oben nur beiläufig erwähnt, spiel Doug Yeager eine zentrale Rolle beim Thema Kartenemulation unter Android. Da, wie oben erwähnt, nach dem rooten die Möglichkeit erlischt Bezahldienste auf Basis von Kartenemulation wie u.a. Google Wallet zu benutzen, bietet die eigene App von Doug Yeager genau solch eine Möglichkeit für gerootet Smartphones.

Somit haben wir als letzten Test mal geschaut, ob die eingebaute Kartenemulation dieser App funktioniert.

Ein Test der App, bei der eine McDonalds Guthabenkarte emuliert und das Smartphone mit einem Kartenleser gescannt wurde, ergab ein SAK mit Wert 0x60.

Das entspricht zwar immer noch nicht dem für eine nPA Emulation nötigen SAK 0x20, zeigt aber zumindest schoneinmal, dass man mit den richtigen CyanogenMod Patches und dem richtigen Know-How diese zu benutzen in der Lage ist, dem NFC Chip im Nexus S genauestens zu sagen, welches Protokoll gesprochen werden soll und man somit in der Lage ist, dem Smartphone zu sagen, als welche Karte es sich ausgeben soll.

Zusammenfassung

Mensakarte

Zur GuthabenApp und Mensakarte lässt sich zusammenfassend sagen, dass es viele Werkzeuge und gute Dokumentationen gibt, die es einem ermöglichen, sich binnen kürzester Zeit in das Thema einzuarbeiten und erste kleinere Erfolge zu verbuchen.

Weiterführend mussten wir feststellen, dass, nachdem wir uns ein Setup angelegt hatten, mit dem wir das Mensakartenguthaben bequem auslesen konnten, es keine technischen Hindernisse gab die Sache weiterzuführen, sodass die Realisierung eines Schreibvorgangs und die daraus resultierende Guthabensveränderung keine Schwierigkeiten bereitet hätte.

Kartenemulation

Zur Kartenemulation kann man abschließend sagen, dass wir es in der Kürze der Zeit nicht geschafft haben eine funktionierende Kartenemulation unter Android umzusetzen. Allerdings konnten wir zeigen, dass die technischen Möglichkeiten definitiv vorhanden sind und das Secure Element, welches eigentlich dafür sorgen soll, dass nur spezielle Apps von ausgewählten Firmen in der Lage sind eine Kartenemulation durchzuführen, nicht den Schutz bietet, den es eigentlich bieten soll.

Allerdings gibt es keine fertigen Werkzeuge, die es erlauben, eine beliebige Kartenemulation ganz simpel und einfach durchzuführen. Es sind bisher tiefgehende Kenntnisse des Android Betriebssystems und der internen Funktionsweise des NFC Chips von Nöten, um überhaupt kleine Fortschritte in dieser Hinsicht zu machen und da es sich bei der einzigen vielversprechenden App nicht um eine OpenSource Variante handelt, ist es weiterhin nur unter erhöhtem Zeitaufwand möglich, eine Kartenemulation zu realisieren.