Du NFC, un Raspberry Pi et un passeport

Et si on parlait de NFC ? Apple ne s’intéresse pas trop à cette technologie, mais comme j’ai eu l’occasion pour mon travail d’aller voir des applications concrètes, j’ai profité de mon temps libre pour (enfin) installer mon récepteur NFC en USB. Je l’ai installé sur un Raspberry Pi et j’ai essayé de lire quelques trucs en NFC qui « trainaient » à la maison. Petit résumé.
NFC

Le NFC, c’est quoi ? Une technologie sans contact, avec une portée très courte (quelques centimètres), utilisée dans énormément d’appareils. Sous le nom générique NFC (ou RFID, c’est assez proche), on trouve différentes technologies, un Pass Navigo (pour les parisiens), un passeport ou un Nanoztag n’utilisent par exemple pas les mêmes technologies. Magie des récepteurs, on peut tout de même lire le contenu de pas mal de types de tags avec un seul lecteur.

Une puce NFC, c’est quelques ko de données (dans le meilleur des cas), une interface pas très rapide (100 kilobits/s environ) et une portée très faible, environ 3 cm en temps normal, un peu plus avec des montages adaptés. On utilise des puces NFC pour différents usages : comme déclencheur (cas du Nabaztag), pour stocker des données (le passeport), comme moyen de paiement (les cartes Visa) ou moyen de validation (le Pass Navigo).

Vous avez sûrement chez vous pleins de choses qui utilisent des technologies de type NFC. Dans mon cas, j’avais pas mal de trucs liés au Nabaztag et au Karotz, un passeport récent, un badge récupéré lors d’un salon et des Pass Navigo.

Si le sujet vous intéresse, Canard PC Hardware a un dossier très complet sur le sujet.

Un peu de pratique

Ceci n’est pas un dossier théorique (il y a Tom’s Hardware pour ça), mais bien un truc un peu pratique. J’ai utilisé mon fidèle Raspberry Pi et un lecteur USB acheté il y a un moment, un SCL3711 de chez Identive. Ce n’est pas franchement le meilleur lecteur du monde, les pilotes sont assez mauvais et l’installation souvent laborieuse, mais il était dans mon fourbi et à l’avantage de fonctionner en USB sans devoir jouer avec des fils.

Avant de continuer, un petit point sur la compatibilité : je n’ai pas pu lire mon Pass Navigo ni les différentes puces liées au Nabaztag (Nanoztag récents ou vieux, Ztamps, etc.). Je pense que ça vient du lecteur, sans en être totalement certain. Avec un lecteur à base de PN532, ça passe peut-être.

L’installation

Premièrement, on va avoir besoin de pas mal de trucs liés à Python, le langage souvent utilisé pour les outils NFC. PCSC n’est pas réellement nécessaire avec le SCL3711.

sudo apt-get install python-imaging-tk python-serial python-crypto python-pyscard pcscd pcsc-tools

Ensuite, on va installer libnfc. Les premières lignes ne sont pas nécessaires dans tous les cas, c’est souvent déjà installé.

apt-get install git autoconf libtool gcc libusb-dev
apt-get install dpkg-dev debhelper dh-autoreconf
git clone https://code.google.com/p/libnfc/
cd libnfc
dpkg-buildpackage -b -uc -us
cd ..
dpkg -i *deb

Si vous avez un SCL3711 (comme moi), attention : le système charge par défaut un pilote qui pose problème. Il faut donc empêcher le chargement.

sudo nano /etc/modprobe.d/blacklist-libnfc.conf

Et ajouter les deux lignes dans le fichier.

blacklist pn533
blacklist nfc

Enfin, il faut redémarrer.

Maintenant, on va installer quelques outils, avec RFIDIOt.

git clone https://github.com/AdamLaurie/RFIDIOt
cd RFIDIOt
sudo python ./setup.py install

Là, c’est prêt, on va tester un peu.

Premier test, un badge reçu lors d’un salon, qui contient (a priori au départ, mais j’ai vérifié) des informations. Pour la petite histoire, après ce salon, j’ai reçu des mails professionnels sur mon adresse personnelle et j’ai toujours soupçonné que le badge contenait donc mon adresse personnelle, une erreur de ma part.

Pour vérifier que le badge est reconnu, il suffit de la commande suivante.

nfc-poll

Qui donne donc le résultat suivant :

ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): d2 de 75 4e
SAK (SEL_RES): 08

Maintenant, on va essayer de lire. RFIDIOt contient quelques scripts de lecture, et readmifaresimple.py a fonctionné sur ce tag (je n’avais aucune idée du type de tag).

Il suffit de lancer le programme en utilisant l’argument -f 1, qui oblige RFIDIOt à utiliser libnfc au lieu des pilotes PCSC. Le 1 indique simplement le premier lecteur, si on en a plusieurs.

readmifaresimple.py -f 1

Sur mon badge, on a donc le contenu brut, avec notamment mon nom (normal), un code imprimé sur la carte, ma société mais aussi — soupçon confirmé — mon adresse courriel personnel.

Un passeport

Un passeport et un lecteur

Un passeport et un lecteur

Plus amusant, on peut lire le contenu d’un passeport récent assez facilement. En théorie, il faut un numéro inscrit dans le passeport pour accéder aux données, en pratique, si on a le numéro, la date d’expiration et la date de naissance de la personne, on peut parfaitement reconstruire les données. Au pire, s’il manque une donnée, ça peut éventuellement se faire en brute force.

Il faut simplement entrer la ligne qui est en-dessous de la page principale du passeport. Typiquement, elle contient le numéro, le pays, la date de naissance et la date d’expiration.

mrpkey.py -f 1 "EJxxxxxx<9BELxxxxxxxMxxxxxxx<<<<<<<<<<<<<<06"

Le programme va lire le passeport, ce qui prend quelques (longues) secondes, et afficher les données. On a donc les certificats, les données inscrites sur le passeport et une copie en JPEG2000 de la photo présente dans le passeport (en 400 x 514 dans mon cas). Il y a aussi des données comme les empreintes digitales, mais la lecture est bloquée. En théorie, on peut même cloner les données sur une carte avec ce programme (dérivé de RFIDIOt) mais mon lecteur ne fonctionne pas avec.

Maintenant, ne devenons pas paranoïaques : il faut une bonne vingtaine de secondes pour lire le passeport, certaines données sont protégées, et la portée du lecteur est faible, même avec une antenne adaptée. De plus, il faut connaître certaines données du passeport pour accéder aux données, ce qui enlève en partie de l'intérêt à la chose. D'un point de vue éducatif, ça reste assez intéressant tout de même.

Je n'ai pas (encore ?) de carte de crédit NFC, mais si j'ai l'occasion d'en avoir une, je vous en reparlerais.

Je précise par ailleurs que les logiciels utilisés sont disponibles depuis quelques années et que le couple Raspberry Pi + lecteur NFC basique ne dépasse pas les 100 €...