Cet article de blog sera un peu différent de mes habitudes. En effet j'ai été vacciné contre la Covid-19 (enfin la première dose seulement pour l'instant) et j'ai donc le document magique disant que je suis un bon citoyen qui se fait vacciner et permettre au gouvernement de tracer tout le contenu de mon cerveau via des nano robot qui utilisent le réseau 5G nouvellement déployé (troll à part, si vous hésitez encore, faite vous vacciner, c'est le mieux à faire). Du coup je vous propose de décrypter un peu les informations qu'on peut en extraire des QRCode et voir si on a besoin de l'application TousAntiCovid pour profiter d'un pass sanitaire sur mobile.

Spoiler : sans surprise, absolument pas. L'application TousAntiCovid intègre un lecteur de code barre 2D qui est partiellement buggé (voir plus loin), qui lit le code barre 2D et ensuite reproduit celui-ci sur l'écran du smartphone. Donc si vous ne voulez pas utiliser cette application, vous pouvez prendre en photo le code barre 2D, le scanner, utiliser une application qui sait réafficher des codes barres 2D (comme Loyalty Card Keychain, une application pour les cartes fidélités) ou même faire une photocopie et plastifier avec du scotch et le coller au dos de votre mobile, ça reviendra au même.

Note : tous les codes barres et quelques contenus sont de l'article ont volontairement été rendus inexploitables pour des raisons de confidentialité et d'empêcher une falsification, donc ne vous étonnez pas de voir des marques sur les codes 😉

Avertissements

Ce billet de blog n'a pas pour but d'expliquer comment falsifier les attestations de vaccination Covid-19. J'explique uniquement à but pédagogique comment j'ai pu analyser les codes fournis au moment de la vaccination.

J'ai volontairement masqué les signatures et certificats, car je ne sais pas à quel point ceux-ci pourraient être exploités pour de la falsification, je me concentre uniquement sur les données qui sont non chiffrées et non protégées en me basant sur des ressources librement disponibles en ligne, y compris sur les sites du gouvernement français.

L'attestation

L'attestation est plutôt simple à lire :

  • une courte note indiquant qu'on peut scanner les codes avec TousAntiCovid et qu'il est préférable de ne montrer que les codes et pas ses infos pour la confidentialité (vous allez voir assez vite que c'est une bonne blague 👌)
  • une section avec les infos qu'on attend : nom, prénom, date de naissance, le vaccin, le nombre d'injection qu'on a reçu, la date de dernière injection, l'état de vaccination
  • 2 code barre en 2D : un 2D-DOC et un QRCode
  • quelques mentions légales
Attestation de vaccination Covid-19

Extraction des données

Je commence par utiliser un outil très basique : Barcode Scanner sur Android. Mon idée est très simple : je veux juste voir le contenu des QRCode pouvoir copier ce contenu et voir ce que je peux retirer comme informations.

On voit que le premier code barre est lu comme étant au format Datamatrix, ce qui est logique un 2D-DOC c'est basé sur le format Datamatrix mais ajoute de la sécurité avec une signature.

Le second code barre est bien un QRCode, contenant une URL menant vers le site du gouvernement pour nous proposer de télécharger l'application TousAntiCovid. On voit qu'il y a de l'information dans l'URL, le but est sans doute d'ajouter automatiquement le code à l'installation de l'application (non testé).

Avec TousAntiCovid

Avant de creuser plus j'ai quand même tenté de voir ce que donnait l'ajout d'un certificat dans TousAntiCovid.

Sur l'attestation, on voit qu'il y a une indication sous le QRCode "Flashez pour ajouter dans TousAntiCovid". Dans la pratique j'obtiens systématiquement un message "Une erreur est survenue.".

Mise à jour du 24/06/2021 : J'ai eu l'information d'un collègue (Merci Olivier Rafal ! 😀) qui a contacté directement la CNAM, le lundi matin où j'ai été vacciné il y avait un bug dans la génération des QRCode, c'est réparé depuis et on peut obtenir une version actualisé sur le site de attestation-vaccin.ameli.fr ou en retournant au centre de vaccination. Pour plus de détail, la discussion est ici.

Pour le 2D-DOC pas de souci, l'ajout est rapide, en ligne ou hors ligne, donc à priori pas de validation de certificat comme pour 2DOrigin (voir partie suivante).

On retrouve peu d'informations et uniquement des informations présentes sur l'attestation.

Décodage du 2D-DOC

Pour avoir plus d'information sur le premier code barre, je suis passé par une nouvelle application 2DOrigin qui est capable de lire et valider les 2D-DOC.

Là on peut lire très facilement le contenu du 2D-DOC. Avant de m'afficher ces informations l'application a effectué des échanges réseaux à minima pour valider le certificat.

On notera qu'on retrouve plus d'information que ce qu'on trouvait sur l'attestation.

On notera aussi que le certificat est valide jusqu'au 24 avril 2024 (et ne pourra pas être actualisé pour mon code car il m'a été donné au format papier). Le certificat appartient bien à la CNAM ce qui est parfaitement logique.

Décodage du QRCode

Autant le 2D-DOC contenait des informations qu'il était difficile de lire en l'état, autant le QRCode contient une URL et c'est quelque chose que je manipule tous les jours donc je sais jouer avec 😈

Reprenons l'URL (tronquée) :

https://bonjour.tousanticovid.gouv.fr/app/wallet2d#DC04FR03AV011EA21EA2L101FRL0PENA%1DL1ANTHONY%1DL228021993L3COVID-19%1DL4J07BX03%1DL5PFIZER%2FBIONTECH+-+COMIRNATY%1DL6PFIZER%2FBIONTECH+-+COMIRNATY%1DL71L82L921062021LACO%1F...

Quand on est habitué on voit très vite des %1D qui se promène. Je suis habitué à voir des %3A ou %2F (respectivement : et /) mais %1D je n'avais jamais vu. En fouillant un peu sur le net je suis tombé sur une table de correspondances (https://www.heap.se/docs/http/URL_Encode.html) m'indiquant qu'à priori %1D ne correspond à rien. Nous admettrons que c'est un décodage non standard qui est effectué sur cette chaîne. On trouve aussi deux %2F (/) et un %1F (non attribué).

Je ne creuserai pas ici mais intuitivement je pense que le %1F sert à délimiter la partie donnée de la partie signature/certificat, donc je vais totalement ignorer cette partie dans cet article.

L'URL pour TousAntiCovid ne m'intéresse pas, ce qui m'intéresse c'est ce qui se trouve après le wallet2d#. Si on remplace les %2F par des / et qu'on coupe au niveau des %1D et %1F, on obtient quelque chose de beaucoup plus lisible :

DC04FR03AV011EA21EA2L101FRL0PENA
L1ANTHONY
L228021993L3COVID-19
L4J07BX03
L5PFIZER/BIONTECH+-+COMIRNATY
L6PFIZER/BIONTECH+-+COMIRNATY
L71L82L921062021LACO

On voit très bien quelques informations encore plus visibles que précédemment comme le nom du vaccin ou mon prénom. Si on regarde bien, les coupe démarre très souvent par L + un chiffre et que certains chiffres se suivent. Donc découpons de nouveau pour chaque L+chiffre :

DC04FR03AV011EA21EA2L101FR
L0PENA
L1ANTHONY
L228021993
L3COVID-19
L4J07BX03
L5PFIZER/BIONTECH+-+COMIRNATY
L6PFIZER/BIONTECH+-+COMIRNATY
L71
L82
L921062021
LACO

On voit donc 11 L (0 à 9 + A, A correspondant à 10 si on est en base hexadécimale par exemple). Poussons même le vice en ajoutant des espaces après les L+chiffre et remplaçons les + par des espaces (encodage URL oublié) :

DC04FR03AV011EA21EA2L101FR
L0 PENA
L1 ANTHONY
L2 28021993
L3 COVID-19
L4 J07BX03
L5 PFIZER/BIONTECH - COMIRNATY
L6 PFIZER/BIONTECH - COMIRNATY
L7 1
L8 2
L9 21062021
LA CO

Je vous épargne la création d'une table de correspondance L+chiffre avec le nom des informations, je pense que c'est relativement évident.

Si on veut aller jusqu'au bout, on peut creuser un peu la première ligne qui reste obscure : DC04FR03AV011EA21EA2L101FR. Si on compare le contenu des deux codes barres, on remarque que le début du contenu est le même. On est face au même 2D-DOC dans les deux cas, mais la partie certificat et signature est un peu différente. J'ai fait quelques recherches et j'ai pu "comprendre" qu'il s'agissait d'un entête défini dans la norme 2D-DOC qui se lit comme ça :

DC 04 FR03 AV01 1EA2 1EA2 L1 01 FR

DC: Marqueur d'identification, toujours DC
04: La version de la spécification (ici la version 04)
FR03: Identifiant de l'Autorité de Certification (doit correspondre à la CNAM)
AV01: Identifiant du certificat (le certificat de la CNAM qui expire ici en Avril 2024)
1EA2: Date d'émission du document indiqué avec le nombre de jour écoulé depuis le 1ᵉʳ janvier 2000 en hexadécimal (ici 7842 jours, ce qui correspond au 21 juin 2021)
1EA2: Date de création de la signature du Code 2D-DOC en nombre de jour depuis le 1ᵉʳ janvier 2000 (toujours le 21 juin 2021)
L1: Code d'identification du type de document
01: Identifiant du périmètre
FR: Pays émetteur du document

Les données de l'entête ne nous apprennent pas grand-chose de plus. Je suis juste intrigué et fasciné par l'idée d'utiliser une date encodée en nombre de jour depuis le 1ᵉʳ janvier 2000. Ce système permet de couvrir les dates jusqu'au 5 juin 2179 ce qui est largement suffisant à priori pour un 2D-DOC.

Quelques tests

J'ai voulu valider qu'au moins la signature était toujours vérifiée quand on scannait un code barre avec TousAntiCovid et même TousAntiCovid Verif. Pour ça j'ai donc essayé de remplacer mon nom et prénom par un autre nom et prénom.

J'ai tenté de scanner avec du réseau et sans réseau. Dans tous les cas les deux applications refusent les codes barres, donc elles doivent valider le certificat. Le refus est matérialisé par le message "Une erreur est survenue." pour TousAntiCovid, ce qui me laisse penser que le 2D-DOC présent dans l'URL du QRCode de mon attestation n'est tout simplement pas valide, ce qui est bien dommage pour un document de ce type… 😰

Conclusion

Le contenu des deux codes est totalement en clair, on peut en extraire les informations très facilement, sans aucun outil particulier : je n'ai utilisé que mon smartphone Android et des applications qu'on trouve sur le Google Play Store et un éditeur de texte pour faire des sauts de lignes.

J'étais curieux de connaître les informations qui étaient présentes dans les codes barres. Ayant donné ma carte vitale au moment de la vaccination, j'avais peur d'y trouver des informations comme mon numéro de sécurité sociale mais ce n'est pas le cas, ce qui est rassurant. On y trouve finalement peu d'informations, surtout des informations sur l'injection. Le nom, le prénom et la date de naissance servant à valider qu'on est bien la personne qui a été vaccinée via une pièce d'identité.

Je reviens sur la note indiquant de ne montrer que les codes quand quelqu'un valide notre vaccination : les codes barres contenant plus d'information que ce qui est sur l'attestation, ne vous fatiguez, si la personne veut ces informations, scanner l'un des codes barres lui donnera l'ensemble des informations et même plus. 🙈

De mon côté j'ai ajouté les deux codes barres à mon application de carte de fidélité histoire d'avoir l'attestation toujours sur moi au besoin. Je vous propose d'en faire autant, car cette application sera sans doute plus simple et contiendra moins de traqueur, en plus de vous permettre de débarrasser vos poches et sacs de vos cartes de fidélité ! 😎

Sources :

Crédit photo : https://pixabay.com/photos/seal-sealing-wax-certificate-old-1463911/