Projets étudiants cryptographie et sécurité/Saint-Marcel failles NFC

De Wiki du LAMA (UMR 5127)
Aller à la navigation Aller à la recherche

Introduction

Terminal.png

Le NFC (Near Field Communication), est de plus en plus utilisé. Ce système de communication permet de payer sans qu’il n’y ai de contact physique entre le terminal de paiement et la carte bancaire. Ce mode de paiement ne nécessite pas le code confidentiel d’un paiement classique. Les montants de paiement pour le sans contact, sont faibles (<20€) et sont de maximum 140€ à la suite. Dès lors que le code de carte bancaire est entré, ce compteur repart à zéro.


Le Sniffing

Exemple de retour de scan par une application mobile

Comme son nom l’indique, le sniffing consiste à récupérer des informations. Il existe de nombreuses application de lecture de carte bancaire sur smartphone. En effet beaucoup d’entre eux sont équipés de la technologie NFC. Les cartes NFC peuvent être détectés à environ 10cm. Une personne mal intentionnée, peut prendre cette application et sans servir de manière détourné. En effet, pour garantir une facilité et une rapidité de paiement, les données de la carte ne sont pas dur à récupérer. Avec un simple scan NFC, on peut récupérer le numéro de carte bancaire, la date de validité, la listes des dernières opérations, le type de carte et anciennement le nom du titulaire de la carte. Nous ne pouvons récupérer le code confidentiel ni le cryptogramme visuel. Cependant, ces quelques informations suffisent pour payer sur certains sites marchands. Il est donc simple pour n’importe quel individu de récupérer une application mobile, de se coller à un passant pour sniffer sa carte et ensuite de faire tranquillement des achats sur internet.


Les terminaux

Un risque est aussi présent sur les terminaux de paiement eux-mêmes. En effet, il existe une faille de sécurité. Celle-ci apparait lorsque le terminal n’est plus relié au réseau de paiement (il est Offline). Pour ne pas gêner le commerçant ni le client, lorsque le terminal de paiement est offline, les transactions sont enregistrées localement dans le terminal. C’est alors là que la faille apparait, il suffit de modifier la devise de la transaction dans le terminal pour pouvoir changer le montant de la transaction elle-même. Ainsi, la transaction n’est plus limitée à 20euros.

Les faux terminaux

Ce risque est le moins évident à mettre en place, il nécessite de bonnes connaissances en informatique et en blanchiment d’argent. Cette méthode consiste, avec un ordinateur de simuler un faux terminal de paiement. Il faut ensuite mettre ce terminal en attente de paiement (comme chez un commerçant lorsque vous devez réglé). Le terminal attend donc la détection d’une carte de paiement NFC. Les malfaiteurs qui ont connecté un dongle NFC à leur pc, on juste à marcher dans la rue et détecter la carte de crédit d’une personne afin de valider le paiement. L’étape suivante consiste à l’aide de la technique précédente de modifier le montant de cette transaction. Ensuite grâce à un système de blanchiment d’argent, il suffit aux malfaiteurs de dirigé ces transactions frauduleuses vers leurs comptes. On a ainsi forcé une carte à effectuer le paiement sans même que son propriétaire ne soit au courant.

Développement

Il existe des librairies spécialement conçu pour exploiter les communications NFC. Ainsi avec un peu de temps et de connaissances, il est possible de créer sa propre application ou son propre programme de lecture de carte NFC. Exemple libnfc

Exemple de code pour connaitre le type de carte :

byte[] recv = transceive("00 A4 04 0C 09 D2 76 00 00 25 45 50 02 00");

if (new String(transceive("00 A4 04 0C 07 A0 00 00 00 04 10 10"), "ISO-8859-1").contains("MasterCard")) { // MasterCard

cardtype.setText("MasterCard"); } else if (new String(transceive("00 A4 04 0C 07 A0 00 00 00 03 10 10"), "ISO-8859-1").length() > 2) {

cardtype.setText("Visa");

} else if (new String(transceive("00 A4 04 0C 07 A0 00 00 00 04 99 99"), "ISO-8859-1").length() > 2) {

cardtype.setText("MasterCard");

} else if (new String(transceive("00 A4 04 0C 07 A0 00 00 00 04 30 60"), "ISO-8859-1").length() > 2) {;

cardtype.setText("Maestro");

Exemple de code pour récupérer le numéro de carte:

// Read EF_ID

recv = transceive("00 B2 01 BC 00");

cartenumber.setText(SharedUtils.Byte2Hex(Arrays.copyOfRange(recv, 4, 9)).replace(" ", ""));