Comment nous avons perdu 230 euros chez CJ Affiliate (Conversant)

vers Virus Info


[accueil]  [menu]  [suivez-nous !]  [chercher]


2011-01-10 00:00

Les secrets des cartes à puce des stations-service


Cartes de lavage de voitures, de fidélité ou de paiement de carburant, les pétroliers proposent depuis longtemps une vaste panoplie de cartes privatives à la clientèle de leurs stations-service. A puce ou magnétiques, elles suscitent une telle convoitise qu'une analyse approfondie de leurs mécanismes de sécurité était bien tentante...


La borne de lecture de cartes d'une piste de lavage Total


Avec un prix de l'essence durablement installé autour du seuil symbolique de « dix francs » le litre, des programmes de lavage de voitures de haut de gamme flirtant avec les dix euros et des cadeaux de fidélisation de plus en plus alléchants, les cartes émises par les pétroliers prennent toujours davantage de valeur. Par quels moyens leur sécurité est-elle assurée ? Leurs défauts de jeunesse ont-ils été complètement corrigés ? Quelques surprises pourraient bien nous attendre... Ne jamais avoir payé un seul lavage de voiture depuis 1992 ou s'approprier les points de fidélité d'un illustre inconnu, ce ne sont là que deux scénarios nullement invraisemblables dans l'état actuel des choses, et parfois même vécus. Pour combien de temps encore ?

Puce ou piste magnétique ?
Historiquement, les premières cartes « pétrolières » ont fait appel à la technologie de la piste magnétique. Un chiffre 7 leur a même été réservé en première position de leur numéro, contre 4 (Visa) ou 5 (Mastercard) pour les cartes de crédit, auxquelles elles sont finalement assez comparables. Surtout destinées aux grands rouleurs, elles servent en effet principalement à bénéficier d'une facturation différée (et parfois de tarifs avantageux) pour les achats de carburant. Tout comme les cartes bancaires, elles s'équipent progressivement de puces électroniques apportant une sécurité accrue à cette application éminemment « sensible ».
Les cartes de fidélité, pour leur part, ont également une vocation « monétique » dans la mesure où les points qu'elles collectent peuvent servir à se procurer non seulement de menus cadeaux, mais aussi des bons d'achat ou des cartes de lavage arborant des valeurs faciales en euros sonnants et trébuchants.
Pourtant, on a assisté ces dernières années à une migration en sens inverse, de la puce vers la piste magnétique (le meilleur exemple étant Shell, aussi bien en France qu'au Royaume-Uni). Problèmes de sécurité ? Coût excessif ? Peut-être, mais surtout frénésie de centralisation. Tout comme la grande distribution, les pétroliers ont relié tous leurs points de vente par un réseau informatique suffisamment performant pour que les points de fidélité puissent être gérés, en temps semi-réel et à peu de frais, par un serveur distant. La carte (magnétique ou même à code-barres) ne contient alors plus de compteur de points autonome, mais un numéro d'identification identique à celui qui est imprimé dessus. Cela facilite évidemment la commande de cadeaux par Internet, tandis que les points d'une carte perdue (et mise en opposition) pourraient théoriquement être récupérés. Mais cela permet aussi de surveiller plus finement le comportement du client, notamment à des fins de marketing... L'inconvénient, c'est que la falsification devient enfantine : après effacement avec un simple aimant, une piste magnétique peut très facilement être réencodée avec un contenu lu sur une autre, ou construit de toute pièce. De quoi détourner, vers un seul et même compte, des points acquis par plusieurs clients distincts, par exemple. Même sans aucune manipulation technique, il arrive déjà couramment qu'une caissière complaisante fasse profiter un client des points dont aurait pu bénéficier le précédent, qui lui ne possédait pas de carte de fidélité ! Inversement, une carte copiée sur une autre pourrait, en l'absence de code confidentiel ou de contrôle d'identité, permettre de se procurer des cadeaux en station sur le compte de quelqu'un d'autre...

En matière de cartes de lavage, c'est Mobil qui a courageusement essuyé les plâtres de la technologie carte à puce. Il y a de cela presque vingt ans, c'était une grande nouveauté, directement inspirée de la brillante réussite de la première génération de la Télécarte. Vendues « sans limitation de durée » (entendons par là sans date limite de validité), leurs 10 ou 20, puis 12 ou 24, unités de lavage sont toujours utilisables dans de nombreuses stations BP, quitte à procéder à un « couper-coller » soigneux avec les toutes premières cartes dont la puce était en position AFNOR. Les cartes vendues aujourd'hui (avec une puce à six contacts en position ISO) sont cependant basées sur une technologie plus récente (dite Eurochip), présentant une sécurité supérieure à la précédente, si facile à émuler avec quelques composants électroniques courants. Venue sur ce marché un peu plus tard, Total a commencé elle aussi par la technologie T1G, mais avec une possibilité au moins latente de traçabilité, comme nous n'allons pas tarder à le mettre en évidence. Aujourd'hui, ses nouvelles cartes lavage (aux couleurs de Total ou d'Elf) font appel à une très innovante puce baptisée CryptoMemory, ce qui leur permet d'être rechargeables en station et non plus jetables.
Cela nous fait donc trois technologies carte à puce à analyser, à partir d"une matière première on ne peut plus facile à se procurer en faisant les poubelles des stations, ou en échangeant ses points de fidélité (100 points Total pour une carte pré-chargée de 10 euros, par exemple). C'est parti !

Les cartes lavage T1G
Développée dès 1983 pour équiper les premières Télécartes françaises, la technologie dite T1G doit être considérée aujourd'hui comme totalement obsolète. La tension Vpp de 21 volts nécessaire à l'écriture dans sa mémoire EPROM NMOS de 256 bits n'est d'ailleurs plus générée par les lecteurs de cartes à puce actuellement fabriqués. Il n'empêche que l'on peut toujours construire, pour une bouchée de pain, des lecteurs-encodeurs « maison » pour les bricoler à volonté (voir notre ouvrage Cartes à puce et PC dans la collection ETSF des éditions Dunod).


Les premières cartes de lavage à puce


Les cartes lavage initialement émises sous la marque Mobil ont vu leur puce descendre en position AFNOR au moment où ses stations-service sont passées sous l'enseigne BP. Rien n'a cependant changé, à ce stade, sur le plan fonctionnel. Contrairement aux Télécartes qui contiennent toutes, dans leurs 96 premiers bits à lecture seule, un numéro de série unique et un message d'authenticité permettant une vérification cryptographique rudimentaire, toutes les anciennes cartes lavage Mobil ou BP de même valeur faciale ont un contenu strictement identique ! Voici par exemple ce que l'on peut lire dans n'importe quelle carte neuve de 24 unités à puce "8 contacts" :

1000 1000 1000 0000 0010 0000 0000 0010
0011 1100 0111 0101 1000 0010 0010 0100
1010 0001 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0000
00
00 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000

Lorsque toutes les unités sont consommées, 24 zéros consécutifs sont devenus irréversiblement des uns, ce qui permet de repérer où résident les « jetons » matérialisant le contenu monétique de la carte :

1000 1000 1000 0000 0010 0000 0000 0010
0011 1100 0111 0101 1000 0010 0010 0100
1010 0001 0000 0000 0000 0000 0000 0001
0000 0000 0011 1111 1111 1111 1111 1111
11
00 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000

Dans le cas d'une carte de 12 unités, le mécanisme est exactement identique, mais le contenu des 96 premiers bits est légèrement différent :

1000 1000 1000 0000 0010 0000 0000 0010
0011 1100 0111 0101 1000 0010 0001 0010
1010 0001 0000 0000 0000 0000 0000 0001

A vrai dire, seul le « pouvoir financier » de la carte, exprimé en notation BCD, est de 12 (0001 0010) au lieu de 24 (0010 0100). La solution de facilité consistant à ne pas individualiser la zone de 96 bits de chaque carte a certainement contribué à limiter les coûts de production, tout en ayant de grandes chances, à l'époque, de passer inaperçue. C'était pourtant là une faute de sécurité que l'on considèrerait aujourd'hui comme impardonnable, car rendant d'éventuels clones absolument indétectables. Or, si France Télécom a été contraint d'appliquer des procédés anti-clones sur ses publiphones jusqu'à la généralisation de la T2G (Télécarte de seconde génération), c'est bien en raison de la déconcertante facilité avec laquelle des clones rechargeables pouvaient être produits à partir de mémoires EPROM effaçables aux ultra-violets (en l'occurence des 2716).

Total a pour sa part adopté une démarche plus prudente, dans la mesure où ses cartes de lavage à technologie T1G ne sont pas toutes identiques pour une valeur faciale donnée. Pendant un temps, elles n'ont même été utilisables que dans la seule station où elles avaient été achetées ! Faut-il en déduire que les numéros des cartes arrivant à épuisement étaient systématiquement mis en « liste noire » (d'abord locale puis centralisée) afin de détecter d'éventuelles tentatives de rechargement ? Pour le vérifier, il aurait fallu essayer de tricher, et nous ne mangeons évidemment pas de ce pain là... Voici donc comment se présente, par exemple, une carte de 18 unités lorsqu'elle est neuve :

1100 0001 1000 0101 0000 0000 0000 0000
1010 0000 0000 1111 1101 0001 1111 1001
0000 0000 0000 0000 0001 0001 0100 0001
0000 0010 0001 0001 0001 0010 0011 0111
0100 1001 0011 0001 0001 1101 1001 0000
0000 0000 0000 00
11 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 1111

Comparons avec une autre carte de même valeur faciale, mais épuisée :

1100 0011 1000 0101 0000 0000 0000 0000
1010 0000 0010 0111 1001 1011 1001 0100
0000 0000 0000 0000 0001 0001 0100 0001
0000 0010 0001 0001 0001 0010 0111 1000
0001 1010 0001 0101 0001 1110 1101 1111
1111 1111 1111 11
11 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 1111

Là encore, la zone dite « des unités » est facile à repérer, mais il est intéressant de noter que les différences entre les deux cartes se situent non seulement parmi les 96 premiers bits, inaltérables, mais également dans les 60 bits « vierges à 0 » qui précèdent le compteur d'unités. Comme leur valeur ne change pas d'une utilisation à l'autre, le semblant de certificat qu'ils pourraient constituer n'authentifierait donc pas le débit d'unités, mais plutôt le numéro de série. Rien n'interdit d'ailleurs de chercher une corrélation entre les quelques octets qui diffèrent ainsi d'une carte à l'autre et le numéro qui est imprimé au verso, mais le moins que l'on puisse dire est qu'elle ne saute pas aux yeux.
A l'heure où nous rédigeons ce dossier, ces cartes sont toujours utilisables dans les stations dont la piste de lavage n'a pas encore été modernisée, mais elles ne fonctionnent pas dans les stations neuves ou rénovées (sauf parfois dans leurs aspirateurs !).

Les cartes lavage Eurochip
D'origine allemande (Infineon), la technologie Eurochip n'est rien d'autre que la concurrente dite « européenne » de la T2G franco-française. C'est elle qui a été retenue pour équiper les cartes lavage BP lorsque les bornes de lecture des pistes de lavage ont été modernisées.


La carte lavage BP de seconde génération (puce Eurochip à six contacts)


Comme il aurait été commercialement et juridiquement périlleux de rendre inutilisables du jour au lendemain des cartes vendues sans date de péremption, une possibilité de lecture des anciennes (et donc aussi de leurs éventuels clones !) a toutefois été maintenue, du moins pour le moment.
Dans une telle carte fonctionnant selon le principe bien connu du boulier, les unités sont enregistrées dans des groupes de huit bits faisant office de compteurs par 1, 8, 64, 512, et 4096. Dans l'exemple ci-dessous, trois bits étant à 1 dans le compteur « par 1 », la carte contient encore 3 unités.

1010 0001 0010 1011 1010 0011 0110 1010
0000 0000 0000 0010 1101 0110 0111 1101
0000 0000 0000 0000 0000 0000 0000 0000
0000 0111 1111 1111 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 1111
0000 0000 0111 1011 0001 1010 0101 0100
0001 0000 1011 1101 1011 0110 1111 1111

1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 1111
1010 0001 0010 1011 1010 0011 0110 1010

Contrairement aux cartes en technologie T1G, qui ne peuvent guère être lues sur un PC qu'avec des lecteurs de fabrication personnelle, les Eurochip sont reconnues par certains lecteurs du commerce. C'est ainsi que le logiciel CardEasy, supportant le regretté lecteur ACR 20 d'ACS ou CyberMouse, présente le contenu de la carte sous la forme de 11 groupes d'octets exprimés en hexadécimal.

Identifiant de la puce : 85 D4 C5
Identifiant de la carte : 56 00 40 6B BE
Compteur x 4096 : 00
Compteur x 512 : 00
Compteur par 64 : 00
Compteur x 8 : 00
Compteur x 1 : E0
Zone de contrôle : FF
Zone utilisateur 1 : 00 00
Clef cryptographique : FF FF FF FF FF FF
Zone utilisateur 2 : 00 DE 58 2A 08 BD 6D FF

Par rapport à une lecture en binaire, dans l'ordre naturel des bits, on remarquera quelques « trous » intéressants à explorer, mais surtout que chaque octet est présenté poids faible en premier, ce qui est une convention courante dans le monde des cartes à puce. Si l'identifiant de la puce (ou « numéro de silicium ») indiquant la famille de composant interne (Eurochip) est invariable, en revanche l'identifiant de la carte est unique. Son premier octet joue un rôle intéressant, dans la mesure où on peut mettre en évidence une corrélation entre sa valeur (4Ah, 52h, 56h, 92h, 96h...) et au moins deux variantes de la puce électronique. Respectivement marqués M1332 et M2432, ces « masques » sont clairement identifiables au microscope après extraction à l'acide sulfurique concentré et bouillant. Or, on murmure qu'une Eurochip 2 (plus complexe ?) aurait été développée en urgence pour corriger de sérieuses failles de sécurité dans la première version du composant...


Cette puce Eurochip mesure 1,3 x 1,3 mm



Cette nouvelle puce mesure 1,3 x 0,9 mm



Ces chiffres font 2 centièmes de millimètre de haut !


De plus, chaque carte contient une clef cryptographique unique, dont la lecture est évidemment impossible de l'extérieur (car masquée par des octets FFh). Certaines séries de cartes, repérables selon le numéro imprimé au verso, bénéficient également de ce qui ressemble à un certificat dans leur zone utilisateur n° 2. Bref, on l'aura compris, l'arsenal sécuritaire est désormais sans commune mesure avec celui des cartes en technologie T1G, réduisant quasiment à néant le risque de clonage... s'il est mis en oeuvre à bon escient.

Beaucoup de manipulations édifiantes peuvent être menées sur ces cartes jetables, donc récupérables en grandes quantités (et pas toujours vides !) dans les poubelles des stations-service. A défaut d'un lecteur permettant d'y lire et écrire directement, nous avons conçu un adaptateur « intelligent » capable de les rendre compatibles avec n'importe quel lecteur PC/SC, et par conséquent avec la programmation en ZCBasic si chère aux habitués de la BasicCard.


Le schéma de l'adaptateur PC/SC pour cartes Eurochip


On voit sur ce schéma qu'un microcontrôleur PIC16F84 est tout simplement intercalé entre un connecteur de cartes à puce recevant l'Eurochip (à gauche), et une « fausse carte » en circuit imprimé de 8/10 mm (à droite) à insérer dans le lecteur PC/SC (par exemple un TeoByXiring).


Un exemple de réalisation pratique de l'adaptateur


Pour un exemple de réalisation matérielle, avec typons, on se reportera utilement aux pages 81 et suivantes de notre ouvrage Plus loin avec les cartes à puce, que nous avons décidé d'offrir en téléchargement gratuit depuis que tous ses exemplaires « papier » se sont mystérieusement volatilisés dans les entrepôts où ils étaient stockés (ce qui n'a bien évidemment aucun rapport avec les révélations « dérangeantes » qu'il contient sur la carte Vitale !). Par rapport au projet d'origine, prévu pour lire et écrire dans les Télécartes T2G, il faut programmer le PIC avec un logiciel spécifiquement développé pour les Eurochip :

; Adaptateur PC/SC pour EUROCHIP (PIC 16F84)
; (c)2001,2010 Patrick GUEULLE
;
list p=16F84
#include

; Oscillateur en mode XT
; PWRT OFF
; WDT OFF

org 0
goto init
org 4
init bsf 3,5 ;bank 1
movlw 0 ;port A: SSSSSSSS
movwf 85
movlw 10 ;port B: SSSESSSS
movwf 86
bcf 3,5 ;bank 0

;mise au repos Eurochip

bcf 6,0
bcf 6,1
bcf 6,2

;ATR
call tx ;mode sortie
movlw .50
movwf 10
tempo call delay1 ;retard avant ATR
decfsz 10,1
goto tempo
movlw 3F ;emission ATR
call even
movlw 00
call even ;emission ATR
call rx

;RESET Eurochip

bsf 6,0
call delay1
bsf 6,1
call delay1
bcf 6,1
call delay1
bcf 6,0

;attente commande

cde call rx ;mode entree
call recv ;attente reception octet CLA
call recv ;attente reception octet INS
movf 11,0
movwf 2E
movwf 2D
movlw 44 ;l'octet recu est-il 44h ? (UP)
xorwf 11,1
btfsc 3,2
goto UP ;si oui micro-instruction UP
movlw 22 ;l'octet recu est-il 22h ? (PROG)
xorwf 2D,1
btfsc 3,2
goto PROG ;si oui micro-instruction PROG
call recv ;ignorer P1
call recv ;ignorer P2
call recv ;ignorer LEN
call tx ;mode sortie
call delay1
movlw 6F ;compte-rendu d'erreur SW1SW2 = 6F00
call even
movlw 00
call even
goto cde ;attendre prochaine commande

UP call recv ;ignorer P1
call recv ;ignorer P2
call recv ;ignorer LEN
call tx ;mode sortie

;lecture "avant"

movlw 50
btfsc 6,4
movlw 0A0
movwf 2F ;resultat "avant" dans registre 2F

;avance 1 bit

bsf 6,1
call delay1
bcf 6,1

;lecture "apres"

movlw 05
btfsc 6,4
movlw 0A ;resultat "apres"
addwf 2F,1 ;2 resultats dans registre 2F

;reponse au lecteur

movlw 90 ;SW1 = 90h
call even
movf 2F,0 ;registre 2F dans SW2
call even
goto cde

PROG call recv ;ignorer P1
call recv ;ignorer P2
call recv ;ignorer LEN
call tx ;mode sortie
call delay1
movlw 90 ;SW1 = 90h
call even
movlw 22 ;SW2 = 22h
call even
call delay1
;corps de la micro-instruction PROG
bsf 6,0
call delay1
bcf 6,0
call delay1
bsf 6,1
movlw .100 ;impulsion programmation
movwf 10
ttt call delay1
decfsz 10,1
goto ttt
bcf 6,1
call delay1
goto cde

;bibliotheque T=0 convention inverse

tx bsf 3,5 ;routine de mise en mode sortie
bcf 85,4
bcf 3,5
return
rx bsf 3,5 ;routine de mise en mode entree
bsf 85,4
bcf 3,5
return
send movwf 0D ;routine UART emission
comf 0D,1
movlw 8
movwf 0E
bcf 5,4
call delay1
next bcf 3,0
rlf 0D,1
btfsc 3,0
bsf 5,4
btfss 3,0
bcf 5,4
call delay2
decfsz 0E,1
goto next
return
recv clrf 11 ;routine UART reception
btfsc 5,4
goto delay3
call delay4
movlw 8
movwf 10
rnext bcf 3,0
rlf 11,1
btfsc 5,4
bsf 11,0
call delay1
decfsz 10,1
goto rnext
parity call delay4 ;ignorer le bit de parite recu
comf 11,1 ;bit a 1 = niveau bas (convention inverse)
return
call delay1
even call send ;emission d'un octet en parite paire
bsf 5,4
call delay1
bsf 5,4
call delay1
return
odd call send ;emission d'un octet en parite impaire
bcf 5,4
call delay1
bsf 5,4
call delay1
return
delay4 movlw .34 ;temporisation 1,25 bit
goto time
delay3 movlw .14 ;temporisation 1/2 bit
call time
goto recv
delay2 movlw .27 ;temporisation 1 bit (104 uS a 9600 bauds)
goto time
delay1 movlw .28 ;duree d'un bit de start/stop
time movwf 0F ;boucle de temporisation
redo decfsz 0F,1
goto redo
retlw 0
mute goto mute ;boucle sans fin (mutisme et blocage de la carte)
end ;(il faudra faire un RESET pour repartir)

En pratique, on pourra soit compiler le code source assembleur EUROCHIP.ASM ci-dessus, soit télécharger directement le fichier EUROCHIP.HEX à « brûler » dans un PIC16F84 au moyen d'un programmateur approprié.
Grâce à cet artifice, l'Eurochip munie de son adaptateur est vue comme une carte asynchrone "T=0", pour laquelle on pourra écrire des logiciels ZCBasic qui fonctionneront sur n'importe quel PC équipé d'un système d'exploitation Windows 95 ou supérieur.
Le programme CREDEURO.BAS permet ainsi d'afficher directement le nombre d'unités que contient une carte lavage BP, sans se compliquer la vie en interprétant des bits ou des octets lus avec un lecteur pour cartes synchrones.

#include CARDUTIL.DEF
#include COMMERR.DEF
ComPort=101
Declare Command &H22 &H44 UP(S$,Disable Le)
Call WaitForCard:CLS
ResetCard:Call CheckSW1SW2
Print"Lecture EUROCHIP (c)2010 Patrick GUEULLE":Print
For F=1 To 66
S$="":Call UP(S$)
Next F
C=0
For F=1 to 5
S$="":Call UP(S$)
IF SW2=&HAA OR SW2=&H5A Then C=C+4096
Next F
For F=1 to 8
S$="":Call UP(S$)
IF SW2=&HAA OR SW2=&H5A Then C=C+512
Next F
For F=1 to 8
S$="":Call UP(S$)
IF SW2=&HAA OR SW2=&H5A Then C=C+64
Next F
For F=1 to 8
S$="":Call UP(S$)
IF SW2=&HAA OR SW2=&H5A Then C=C+8
Next F
For F=1 to 8
S$="":Call UP(S$)
IF SW2=&HAA OR SW2=&H5A Then C=C+1
Next F
Print:Print"Il reste : ";C; " UNITE(S)"
Print:Call WaitForNoCard

Obtenu par compilation au moyen du kit BasicCard, le fichier exécutable CREDEURO.EXE peut être lancé avant ou après introduction de l'adaptateur dans le lecteur PC/SC, la carte lavage ayant été préalablement insérée dans son connecteur. Et la bonne surprise, c'est qu'une proportion non négligeable (autour de 3 % ?) des cartes récupérées dans les poubelles contiennent encore des unités !
Pour inspecter au bit près le contenu de la mémoire (EEPROM) des cartes Eurochip, on utilisera cette fois le logiciel EURO.BAS suivant :

#include CARDUTIL.DEF
#include COMMERR.DEF
ComPort=101
Declare Command &H22 &H44 UP(S$,Disable Le)
Call WaitForCard:CLS
ResetCard:Call CheckSW1SW2
Print"Lecture EUROCHIP (c)2010 Patrick GUEULLE":Print
FOR F=1 TO 16
FOR G=1 TO 8
FOR H=1 TO 4
S$="":Call UP(S$)
IF SW2=&HAA OR SW2=&H5A Then L$="1"
IF SW2=&H55 OR SW2=&HA5 Then L$="0"
IF F+G+H>3 Then Goto bit
IF SW2=&HA5 OR SW2=&HAA Then Print"1";:H=H+1
IF SW2=&H5A OR SW2=&H55 Then Print"0";:H=H+1
bit:Print L$;
Next H
Print" ";
NEXT G
Print
NEXT F

Là encore, la version exécutable, compilée par nos soins, est directement téléchargeable sous la forme du fichier EURO.EXE. Elle pourra notamment servir à débusquer les cartes dont le compteur d'adresses « fait le tour » avant le 512e bit, en l'occurence au 480e. Tel est le cas lorsque la dernière ligne de 32 bits qui s'affiche est identique à la première au lieu d'être remplie de « 1 », phénomène qu'il est particulièrement instructif de corréler avec le modèle de puce électronique que contient la carte... Faut-il se risquer à en déduire qu'il se passait des choses dangereuses dans les 32 dernières adresses de certaines séries de composants ? Nous n'irons évidemment pas jusque-là.
Tout comme avec la version T2G de l'adaptateur, il est possible non seulement de lire, mais aussi d'écrire des bits, autrement dit de transformer des « 1 » en « 0 », avec ou sans mise en oeuvre du mécanisme de « retenue » (effacement d'un compteur lors de l'écriture d'un bit dans celui de poids supérieur). Est-il besoin de préciser que ces manoeuvres sont uniquement destinées à débiter des unités, et en aucun cas à « recharger » les cartes ?
On se servira pour ce faire du logiciel MANIP.EXE (version compilée de MANIP.BAS), en se référant aux explications détaillées que fournit notre ouvrage précité, et que nous n'avons pas la place de reprendre dans ce dossier.

#include CARDUTIL.DEF
#include COMMERR.DEF
ComPort=101
Declare Command &H22 &H44 UP(S$,Disable Le)
Declare Command &H22 &H22 WR(S$,Disable le)
Call WaitForCard
ResetCard:Call CheckSW1SW2
CLS
Print" barre d'espace : avance lecture"
Print" touche + : mise a 0 de bit"
Print" touche - : mise a 0 de bit avec retenue"
Print" touche ESCape : quitter":Print

FOR F=1 TO 16
FOR G=1 TO 8
FOR H=1 TO 4
S$="":Call UP(S$)
IF SW2=&HAA OR SW2=&H5A Then L$="1"
IF SW2=&H55 OR SW2=&HA5 Then L$="0"
IF F+G+H>3 Then Goto bit
IF SW2=&HA5 OR SW2=&HAA Then Print"1";:H=H+1
IF SW2=&H5A OR SW2=&H55 Then Print"0";:H=H+1
bit:Print L$;
touche:Z$=Inkey$:If Z$="" Then Goto touche
If Z$=Chr$(32) Then Goto suite
If Z$=Chr$(43) Then Goto pgm
If Z$=Chr$(45) Then Goto carry
If Z$=Chr$(27) Then Exit
Goto touche

suite:Next H
Print" ";
NEXT G
Print
NEXT F
ResetCard:Call CheckSW1SW2:Exit

carry:S$="":Call WR(S$)
pgm:S$="":Call WR(S$)
fin:IF Inkey$<>"" Then Goto fin
Goto touche
REM (c)2001 Patrick GUEULLE

Les cartes lavage à Cryptomemory
Rechargeables en station, les nouvelles cartes lavage de Total et Elf sont basées sur une puce électronique particulièrement intéressante, la CryptoMemory d'Atmel (désormais Inside Secure). Fidèle au culte du secret, son fabricant n'a jusqu'à présent dévoilé que très partiellement (ou alors contre engagement de confidentialité) les caractéristiques de ce composant, ou plus exactement de cette famille de composants. Il ne fallait pas davantage lui demander dans quelles applications on retrouve ses puces sur le terrain, ce qui donne naturellement envie de partir à leur recherche ! Nous en avons notamment trouvé dans des cartes de fidélité telles que l'éphémère carte des supermarchés U (lire notre dossier) et dans la Cartaplus, tellement verrouillée que l'on ne peut même pas y consulter son solde de points par ses propres moyens : il faut aller chez un commerçant équipé du terminal ad-hoc, ou interroger le serveur central par Internet !
La grande originalité des cartes équipées de ces composants est que bien qu'il s'agisse de cartes à mémoire (et non pas à microprocesseur), elles fonctionnent en protocole asynchrone (T=0). Elles sont par conséquent compatibles avec les terminaux de point de vente acceptant les cartes bancaires, mais aussi avec n'importe quel lecteur PC/SC, ce qui va singulièrement nous faciliter les choses...
A force de recouper des informations de nature publique avec des investigations personnelles, nous avons fini par reconstituer une bonne partie de ce qui est réputé confidentiel, suffisamment en tout cas pour comprendre l'essentiel du fonctionnement des cartes de lavage basées sur cette technologie prometteuse.


La carte lavage Total rechargeable, de type CryptoMemory


Toute une partie de leur mémoire est librement accessible en lecture, au moyen de commandes faciles à programmer en langage script ou en ZCBasic.
00 B6 01 00 08 retourne ainsi, outre un compte-rendu de bonne exécution (90 00), les huit octets dont se compose la réponse au reset (ATR) de la carte : 3B B2 11 00 10 80 00 02 dans le cas du composant AT88SC0204C (à mémoire de 2 Kbits).
00 B6 00 08 08 va chercher huit octets identifiant notamment le fabricant de la puce et son encarteur. A noter que dans cette zone, deux octets (adresses 0Ah et 0Bh) sont à écriture libre : on peut donc les modifier à volonté, notamment à des fins de test.
00 B6 00 10 08 donne accès à huit octets contenant des informations sur l'historique du lot de composants à partir duquel la carte a été fabriquée.
Avec 00 B6 00 18 08, nous entrons vraiment dans le vif du sujet, puisque c'est là que réside le numéro d'identification de la carte, celui-là même qui est bien souvent imprimé au verso. Dans la carte n°0001361083, nous avons ainsi lu FF 00 00 00 01 36 10 83. Le premier octet (ici FFh contre 2Fh dans une Cartaplus) est baptisé « DCR », et cette valeur par défaut indique qu'aucune des options particulières que peut supporter le composant n'est activée.
00 B6 00 20 08 permet de prendre connaissance des conditions de sécurité auxquelles est soumis l'accès aux quatre zones utilisateur de la mémoire. Ici, la réponse EF 3F EF 3F EF 3F EF 3F indique que ces conditions sont les mêmes pour les quatre zones, à savoir : pas de cryptage, pas de mots de passe, mais une authentification mutuelle (à 64 bits) de la carte et du terminal avant toute opération d'écriture. En d'autres termes, nous pourrons consulter librement le solde de la carte, mais ni débiter celui-ci, ni encore moins le créditer (rechargement). Un bon compromis, en somme !
Par comparaison, nous lirions 9F 38 9F 38 9F 39 9F 39 dans une Cartaplus, ce qui signifie qu'une authentification mutuelle est exigée avant l'écriture ou même la lecture (sans cryptage), et qu'un mot de passe doit être présenté, en plus, avant de pouvoir écrire. A l'inverse, la regrettée carte U se contentait d'un simple mot de passe en écriture, sans authentification mutuelle ni cryptage, autrement dit d'un niveau de sécurité pour le moins basique et donc plutôt facile à déjouer : BF F8 BF F9 BF F8 BF F9.
Une commande 00 B6 00 40 10 permet enfin de lire une zone de 16 octets dite « code émetteur », qui est ici remplie de 00h, à l'exception d'un 02h en troisième position. Quelques zones de plus pourraient encore être lues en accès libre, mais elles n'apporteraient rien de décisif à notre exploration dans le cas spécifique des cartes de lavage.
Occupons nous plutôt des zones utilisateur dont le contenu, variant au fil de la vie des cartes, est infiniment plus intéressant à analyser ! Pour y accéder, il faut commencer par sélectionner une zone de 64 octets parmi les quatre que contient la carte. Dans le cas présent, seule la première (n°0) est utilisée, et nous enverrons donc la commande 00 B4 0B 00 00. Pour accéder à la seconde (n°1), nous enverrions 00 B4 0B 01 00, et ainsi de suite. Une fois la zone « ouverte », nous pouvons la lire en totalité au moyen d'une commande 00 B2 00 00 40. Voici ce que nous avons trouvé dans une carte pré-chargée de 10 euros, après avoir payé avec elle, le 7 novembre 2010, un lavage coûtant 3,90 euros :

00 00 02 62 00 00 00 60 FF FF FF FF FF FF FF FF
97 80 00 00 01 00 00 11 17 04 08 00 00 03 E8 FF
00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF
05 95 22 07 11 10 90 01 00 00 03 E8 00 00 00 CE

A condition de convertir le solde restant (610 centimes) en hexadécimal (0262h), on repère immédiatement à quel endroit il est enregistré. A noter que sa valeur précédente (03E8h pour 10 euros) apparaît toujours vers la fin de la seconde ligne, assortie d'une date (17 avril 2008) qui est fort probablement celle du chargement initial de la carte. En huitième position, un octet qui était à EBh est par ailleurs passé à 60h, valeur qui correspond au OU exclusif des 7 octets qui le précèdent : à l'évidence une clef de contrôle d'intégrité. Mais c'est dans la quatrième ligne (initialement remplie de 00h) qu'il s'est passé le plus de choses ! On y trouve, notamment, la date du dernier lavage effectué (07 11 10), ainsi que le solde de la carte avant celui-ci (03 E8). Aucune trace évidente, par contre, du montant qui a été débité (0186h), mais il est si facile de faire la soustraction... Les octets 05 95 22, quant à eux, identifient à coup sûr (en BCD) la station où le lavage a été payé, car on retrouve les mêmes chiffres sur certains tickets d'achat de carburant. Un éventuel rechargement intermédiaire pourrait aussi apparaître dans la troisième ligne, avec sa date (8 juillet 2009) et son montant (0BB8h soit 30 euros) :

07 81 10 08 07 09 00 00 0B B8 FF FF FF FF FF FF

A noter que cette opération, lue dans une autre carte, a été effectuée dans une station-service différente (07 81 10), ce qui confirme que dans une certaine mesure, on peut « suivre à la trace » son utilisateur... En fin de compte, nous sommes en présence d'un porte-monnaie électronique en bonne et due forme, qui n'est pas sans rappeler certaines fonctionnalités de Monéo, basé par contre sur une carte à microprocesseur (lire notre dossier). Un jour, peut-être pourra-t-on donc le recharger lui aussi en ligne, ou s'en servir pour payer tout autre chose que des lavages de voiture ?
Au point où nous en sommes, nous en savons largement assez pour développer un petit logiciel ZCBasic (TOTAL.BAS) capable d'afficher le numéro de la carte et son solde exprimé en centimes d'euro ! Pratique pour vérifier si les cartes (même rechargeables) récupérées dans les poubelles contiennent encore un peu de crédit...

#Include CARDUTIL.DEF
#Include COMMERR.DEF
ComPort=101

Declare Command &H00 &HB6 RDC(Lc=0,S$)
Declare Command &H00 &HB2 RDU(Lc=0,S$)
Declare Command &H00 &HB4 WRC(S$,Disable Le)

Call WaitForCard
ResetCard:Call CheckSW1SW2:Print

CLS:Print"Carte No ";

Call RDC(P1=0,P2=&H18,S$,Le=8)
For F=4 To Len(S$)
C$=MID$(S$,F,1):C=ASC(C$):C$=HEX$(C)
IF LEN(C$)=1 then C$="0"+C$
Print C$;
Next F:Print:Print

Call WRC(P1P2=&H0B00,Lc=0,S$)
Call RDU(P1P2=&H0000,S$,Le=4)
E$=""
For F=1 To Len(S$)
C$=MID$(S$,F,1):C=ASC(C$):C$=HEX$(C)
IF LEN(C$)=1 then C$="0"+C$
E$=E$+C$
Next F
E=ValH(E$)
Print"Il reste ";E;" centimes d'euro"

Print:Print
Call WaitForNoCard

Là encore, c'est sa version compilée (TOTAL.EXE) que l'on exécutera sous Windows, en insérant simplement la carte dans un quelconque lecteur PC/SC installé sur le PC. Bien que nous nous trouvions en présence d'une carte réalisée en « logique câblée » (c'est-à-dire n'exécutant aucun micro-code en interne), nous communiquons avec elle comme s'il s'agissait d'une carte à microprocesseur, très sensiblement plus coûteuse. Et de la façon dont elle est mise en oeuvre, rien ne nous permet de penser pour le moment que sa sécurité pourrait laisser à désirer...
Patrick Gueulle

Tous les ouvrages de l'auteur




Vous voulez soutenir une information indépendante ? Rejoignez notre Club privé !


[homepage]  [RSS]  [archives]
[contact & legal & cookies]  [since 1997]