Untersuchung NFC Interface auf Android Telefonen
Wie schon im Vorjahr im Artikel NFC unter Android ist auch dieses Jahr Near-field communication (NFC) ein Thema des Seminars IT Security Workshop WS2013.
Ziele
Evaluation der Hardware
Im Rahmen des Seminars wird ein Samsung Galaxy Nexus <ref>http://www.areamobile.de/handys/3014-samsung-galaxy-nexus/datenblatt</ref> zu Verfügung gestellt. Auf diesem ist als NFC-fähiger Chip ein NXP PN65N <ref>http://www.nfc-tag.de/was-sind-nfc-tags/nfc-tag-kompatibilitatsliste/</ref><ref>http://www.nxp.com/news/press-releases/2011/11/nxp-nfc-solution-implemented-in-galaxy-nexus-from-google.html</ref> verbaut, der aus einem NXP PN544 und einem SecureElement SmartMX besteht.
Als weitere NFC-fähige Geräte stehen ein Google Nexus 7 (2013) und ein Samsung Galaxy S4 Mini zu Verfügung. Diese besitzen jedoch mit einem Broadcom BCM20793M (Nexus 7) bzw. BCM20794 (S4 Mini) einen im Grunde NFC-fähigen Chip, der aber durch die fehlenden proprietären Protokollerweiterung von NXP Tags vom Typ Mifare Classic nicht mehr unterstützt. Lediglich ein Auslesen der UID ist möglich; ein lesender oder schreibender Zugriff auf weitere Daten schlägt fehl.<ref>http://www.andytags.com/nfc-tags-compatibility-issues.html</ref>
Die zur Verfügung stehenden NFC-Transponder sind meist vom Typ Mifare Classic. Hier ist die klassische Mensakarte (Mifare Classic 1K) und die Karte für das Zugangssystem zum Johann von Neumann Haus (Mifare Classic 4K) zu erwähnen.
Da Nexus Geräte generell eine gute Treiberunterstützung bieten und das Galaxy Nexus schon seit 2011 auf dem Markt ist, ist dieses für die Zwecke des Seminarthemas gegenüber den neueren Geräten zu bevorzugen. Die fehlende Kompatibilität der zur Verfügung stehenden Karten unterstützt diese Entscheidung zusätzlich.
Evaluation der Software
Android stellt für die Kommunikation mit dem NFC-Chip lediglich eine High-Level-API in Java bereit, die keine Kommunikation auf dem Raw-Device zulässt. Aus dieser Tatsache entstehen zwei Probleme: Eine einfache Anbindung von in C-geschriebener Software (z.B. mfoc, zum Brechen der Schlüssel von Mifare Classic Karten) ist nicht möglich. Hierzu muss ein Binding zwischen der Java-NFC-API mittels JNI (Java Native Interface) erstellt werden. Das weitaus größere Problem ist jedoch die fehlende direkte Kommunikationsmöglichkeit mit dem NFC-Chip auf device-level.
Der Android Kern basiert auf dem Linux Kernel und es gibt diverse Projekte, die zum Ziel haben auf Android-fähigen Geräten einen Linux-Kernel mit zugehörigem Userland zu betreiben. Hierfür existieren prinzipiell drei Methoden: Eine Variante besteht darin Linux innerhalb des Android-Systems in einem Container zu betreiben oder zu emulieren <ref> http://www.archlinuxuser.com/2013/01/how-to-install-archlinux-arm-on-any.html</ref>. Die andere Möglichkeit ist eine native Installation auf dem Android-Gerät <ref>http://www.ubuntu.com/phone</ref>. Als weitere Variante ist noch der parallele Einsatz des Linux-Userlands zu nennen, das die Möglichkeiten des Android-Userlands um bekannte GNU-Tools erweitert<ref> http://www.awa.tohoku.ac.jp/~benda/projects/android.html</ref>.
Da für den Zugriff auf das NFC-Device entweder ein direkter Zugriff über einen Kerneltreiber (kernelinterner NFC-Subsystem, seit Kernel 3.1) oder libnfc (via libusb) als Stack benötigt wird, entfällt die Containerlösung. Die Erweiterung des Android-Userlands um bekannte Tools aus der Linuxwelt erscheint reizvoll, ist aber zum jetzigem Standpunkt noch in einer sehr frühen Entwicklungsphase. Etwas reifer hingegen ist Ubuntu Touch, welches einen CyanogenMod 10.1.2 Kernel (Android 4.2 / Kernel 3.0) nutzt und bereits vorgefertigte Images bereitstellt.
Ubuntu Touch
Installation
Aus einem Ubuntu-Host-System ist die Installation nach der Anleitung möglich. Eine direkte Installation per Recovery gestaltet sich ebenfalls unproblematisch. Dazu werden die beiden zip-Dateien armel & armhf nacheinander geflasht:
Dazu wird das Handy im Recovery-Modus gestartet indem im ausgeschaltetem Zustand beide Lautstärketasten gefolgt von der Power-Taste gedrückt werden. Sind die Abbilder korrekt installiert bootet nach einem Neustart Ubuntu Touch.
Internetverbindung
Zur einfachen Installation und dem Aktualisieren von Programmen wollten wir zunächst WLAN benützen. Dies ist zwar theoretisch möglich funktioniert aber leider nur sehr instabil. Ein Verbindung zu Eduroam ist zum aktuellen Zeitpunkt gänzlich nicht möglich. Auch die Konfiguration per Kommandozeile schlägt fehl.
Ein zweiter Anlauf gilt dem Herstellen einer Verbindung per Ethernet. Dies ist dank zweier Adapter möglich: Ein USB-OTG Kabel ermöglicht das Anschließen von USB Geräten an das Handy. Dieses wird verwendet um einen USB-LAN Adapter zu verwenden. Nun kann man per dmesg beobachten dass ein neues Ethernet-Gerät erkannt wird. Dieses muss aufgrund der fehlenden grafischen Oberfläche per Kommandozeile konfiguriert werden:
ip link set eth0 up
ip addr add 192.168.2.2/24 dev eth0
Bei ausgeschaltetem WLAN sollte die direkte Verbindung zu einem PC möglich sein. Von da aus kann das Internet weiter geleitet werden.
Leider war Ubuntu Touch noch relativ instabil. Nur einmal ist es uns gelungen die Paketquellen zu aktualisieren. Ein "Hello World" c-Programm ließ sich daraufhin nach der Installation von gcc kompilieren und ausführen. Installation weiter Pakete führt zum Absturz des System welches darauf hin nicht mehr bootfähig ist und neuinstalliert werden muss.
gewohnte Linux-Umgebung
Der Paketmanager kann per apt-get update/upgrade/install
bedient werden. Dies führt allerdings häufiger noch zu Abstürzen des Betriebssystems.
Ubuntu Touch nutzt einen gepatchen Cyanogen-Mod-Kernel in der Version 3.0.5.
Ein ssh-Dienst ist bereits vorinstalliert und kann per: "start ssh" gestartet werden. Nun kann man per phablet@192.168.2.2
(PW: phablet) wie gewohnt auf dem Gerät arbeiten.
Zurück zu Android
Google bietet ein One-Click-Tool zum Zurücksetzen des Gerätes auf Werkseinstellungen an. Dazu muss es sich im Bootloader befinden:
adb reboot bootloader
Im Anschluss wird mit einem Aufruf von ./flash-all.sh der Vorgang gestartet. Das Handy startet automatisch mehrmals neu und bootet schlussendlich Android.
Weiterführende Links
libnfc basierend:
kernel-stack basierend:
Kartenemulation:
Ein Tool um Karten-Dumps auf einem NFC-fähigen Android-Handy zu erstellen:
Einzelnachweise
<references />