Édition de tag RFID MIFARE sous Linux avec le lecteur ACR122

Ayant récemment acquis un lecteur NFC ACR122, je m’attendais à trouver un logiciel me permettant de l’exploiter simplement sous Linux Mint.

Étonnamment, je n’en ai pas trouvé, et l’emploi du lecteur pour programmer des tags Mifare s’est avéré moins intuitif que je ne l’espérait.

Après quelques heures de galère, voilà un résumé de la procédure :

Installation

Installer libnfc et ses outils :

$ apt install libnfc-bin

Modifier le fichier /etc/modbprobe.d/blacklist-libnfc.conf pour inclure le driver pn533_usb. En effet, celui ci (ainsi que les autres déja inclus dans ce fichier ) interfèrent avec le bon fonctionnement du pilote utilisé par libnfc :

$ echo "blacklist pn533_usb" >> /etc/modprobe.d/blacklist-libnfc.conf

Redémarrer la machine ( cette fois ci le bon pilote sera chargé ).

Lister les tags visibles

Lister les tags visible s’effectue avec la commande nfc-list :

A vide (sans tag sur le lecteur )


$ nfc-list
nfc-list uses libnfc 1.7.1
NFC device: ACS / ACR122U PICC Interface opene

Avec un tag Mifare sur le lecteur ( UID = A4 0B 44 76 )

$ nfc-list 
nfc-list uses libnfc 1.7.1
NFC device: ACS / ACR122U PICC Interface opened
1 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): a4 0b 44 76
SAK (SEL_RES): 08

L’option -v permet d’en savoir plus sur le tag détecté ( ici un tag différent de celui lu précédemment ) :

$ nfc-list -v
nfc-list uses libnfc 1.7.1
NFC device: ACS / ACR122U PICC Interface opened
1 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04  
* UID size: single
* bit frame anticollision supported
       UID (NFCID1): ec  11  9c  1e  
      SAK (SEL_RES): 08  
* Not compliant with ISO/IEC 14443-4
* Not compliant with ISO/IEC 18092

Fingerprinting based on MIFARE type Identification Procedure:
* MIFARE Classic 1K
* MIFARE Plus (4 Byte UID or 4 Byte RID) 2K, Security level 1
* SmartMX with MIFARE 1K emulation
Other possible matches based on ATQA & SAK values:

0 Felica (212 kbps) passive target(s) found.

0 Felica (424 kbps) passive target(s) found.

0 ISO14443B passive target(s) found.

0 ISO14443B' passive target(s) found.

0 ISO14443B-2 ST SRx passive target(s) found.

0 ISO14443B-2 ASK CTx passive target(s) found.

0 Jewel passive target(s) found.

Lecture / écriture

Les opérations de lecture / écriture sur un tag Mifare Classic s’effectuent avec la commande nfc-mfclassic. Les clés par défaut sont utilisées mais il est possible de spécifier sont propre fichier de clé ( cf man nfc-mfclassic)

Lecture du contenu du tag et enregistrement dans le fichier mifare.mfd

$ nfc-mfclassic r a mifare.mfd
NFC reader: ACS / ACR122U PICC Interface opened
Found MIFARE Classic card:
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): a4 0b 44 76
SAK (SEL_RES): 08
Guessing size: seems to be a 1024-byte card
Reading out 64 blocks |……………………………………………………….|
Done, 64 of 64 blocks read.
Writing data to file: mifare.mfd …Done.

Ecriture du tag depuis le fichier mifare.mfd

$ nfc-mfclassic w a mifare.mfd
NFC reader: ACS / ACR122U PICC Interface opened
Found MIFARE Classic card:
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): a4 0b 44 76
SAK (SEL_RES): 08
Guessing size: seems to be a 1024-byte card
Writing 64 blocks |………………………………………………………|
Done, 63 of 64 blocks written.

Edition du contenu

Pour l’édition, l’emploi d’un editeur hexadécimal est nécessaire. Je recommande bless. Pour faciliter la lecture du contenu, je préconise d’ajuster la taille de la fenêtre pour afficher 16 octets sur chaque ligne, ainsi chaque ligne contient 1 bloc du tag :


En rouge le bloc 0 contient l’UID de la carte

En jaune le bloc 4 contient les données que j’y ai écrit

Le premier bloc de chaque secteur contient les permissions d’accès. Par défaut l’accès en lecture / écriture est possible avec les clés d’origines. Le bloc 0 est en lecture seule. Attention de ne pas modifier la longueur du fichier ( utiliser le mode remplacement plutôt que le mode insertion avec la touche « insert » du clavier )

Les 16 caractères d’un bloc me suffisant pour mon application, et n’ayant pas de problématique de sécurité, cet article touche à ça fin. Peut être le compléterais-je plus tard si je venais à devoir stocker des données sur plusieurs blocs, ou à mettre en place différentes clés pour l’accès aux données. Ce second cas est cependant improbable, étant donné que les carte Mifare sont gravement défaillante d’un point de vue sécurité (cf les nombreux article sur le web concernant la récupération des clés, ainsi que la possibilité d’obtenir des cartes dont le bloc 0 est accessible en écriture )

7 Commentaires

Passer au formulaire de commentaire

  1. Bonjour,
    Merci pour le tuto !
    Pour ceux qui sont sur Windows, j’ai cross compilé les différents outils pour le ACR122U (mfoc, mfcuk, cropto1_bs, nfc-mfcclassic,nfc-list,…) pour Windows 64 bits. C’est sur mon blog : http://legacy.averbouch.biz/libnfc-and-nfc-utils-binaries-on-windows-10/

    1. Bonjour,
      Le lien est mort, un autre site où le trouver ?
      Merci

  2. Bonjour, merci pour le tuto,

    j’ai une question que faire quand le tag est non visible/introuvable par le lecteur ACR122 de la clé. Je ne trouve aucune info sur ce cas. Mes autres clés bien reconnues et affichent le tag et la dernière juste UID et pas de tag.

    Merci beaucoup de votre aide

  3. Bonjour,

    Quelle version de linux mint faut-il utiliser ?

    Est-ce que la version actuelle de libnfc et ses outils fonctionne aussi avec la dernière version de linux mint ?

    Merci.

    1. Bonjour,
      Oui en principe la dernière version de linux mint devrait fonctionner
      Cordialement

    • Ctoupouraujourdui sur 19 août 2023 à 18h42
    • Répondre

    Bonjour,

    Avec la dernière version ( linuxmint-21.2-cinnamon-64bit – libnfc 1.8.0) plus besoin de modifier blacklist-libnfc.conf (mais rien n’empèche de vérifier le contenu du fichier)

    Cependant, la commande nfc-mfclassic r a mifare.mfd est incomplete :

    Usage: nfc-mfclassic f|r|R|w|W a|b u|U [ [f]]
    f|r|R|w|W – Perform format (f) or read from (r) or unlocked read from (R) or write to (w) or unlocked write to (W) card
    *** format will reset all keys to FFFFFFFFFFFF and all data to 00 and all ACLs to default
    *** unlocked read does not require authentication and will reveal A and B keys
    *** note that unlocked write will attempt to overwrite block 0 including UID
    *** unlocking only works with special Mifare 1K cards (Chinese clones)
    a|A|b|B – Use A or B keys for action; Halt on errors (a|b) or tolerate errors (A|B)
    u|U – Use any (u) uid or supply a uid specifically as U01ab23cd.
    – MiFare Dump (MFD) used to write (card to MFD) or (MFD to card)
    – MiFare Dump (MFD) that contain the keys (optional)
    f – Force using the keyfile even if UID does not match (optional)
    Examples:
    Read card to file, using key A:
    nfc-mfclassic r a u mycard.mfd
    Write file to blank card, using key A:
    nfc-mfclassic w a u mycard.mfd
    Write new data and/or keys to previously written card, using key A:
    nfc-mfclassic w a u newdata.mfd mycard.mfd
    Format/wipe card (note two passes required to ensure writes for all ACL cases):
    nfc-mfclassic f A u dummy.mfd keyfile.mfd f
    nfc-mfclassic f B u dummy.mfd keyfile.mfd f
    Read card to file, using key A and uid 0x01 0xab 0x23 0xcd:
    nfc-mfclassic r a U01ab23cd mycard.mfd

    @+

    • Ctoupouraujourdui sur 19 août 2023 à 19h55
    • Répondre

    Que pensez-vous de
    https://github.com/mdeverdelhan/ACR122U-reader-writer
    Comment est-ce que ça fonctionne sous linuxmint ?

    Ou serai préférable d’utiliser mfoc (commen installer les librairies manquantes : pas la même version de libnfc )

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.