Décoder le certificat Covid européen

Qu'y a-t-il dans le certificat Covid européen, aussi appelé pass sanitaire. Il s'agit d'un code QR. Est-il chiffré ? Inviolable ? Sécurisé ? Examinons (très brièvement) le format et ce qu'on peut y lire.

Hanno Böck a développé un analyseur de ce pass, installons son script Python sous MacOS avec Homebrew et Pip :

1brew install zbar
2pip3 install pillow pyzbar base45 cbor2
3git clone https://github.com/hannob/vacdec
4cd vacdec

Après avoir reçu les 2 doses, j'ai récupéré sur ameli mon pass en .pdf puis recadré et exporté l'image sous le nom certificat.png. Je ne la partage pas pour des raisons de confidentialité mais c'est un code QR d'environ 100x100 cases.

Des personnes partagent parfois publiquement des codes QR, faites très attention si vous ne savez pas exactement ce qu'ils renferment ! Autant pour l'auteur qui pourrait divulguer par accident des informations confidentielles, que le lecteur/scanneur de code qui pourrait se faire rerouter vers des sites malicieux, ou bien se faire rickroller... (spoil)

QR Code Greta Thunberg

Il est déjà bon de s'assurer que ce script et ses dépendances soient de confiance avant d'aller plus loin. Examinons les :

  • pyzbar est un décodeur généraliste de code barres et QR code
  • pillow est une bibliothèque standard de traitement d'image
  • base45 est un encodage dont la description ouverte est ici
  • cbor est un encodage (Concise Binary Object Representation) dont la description ouverte repose sur la RFC 8949

Toutes ces dépendances semblent neutres, généralistes, et utilisables dans de nombreux contextes. À priori pas d'inquiétude de ce côté là. Le script en lui même ne fait qu'une vingtaine de lignes et s'occupe juste d'appeler ces bibliothèques.

  • Lecture de l'image
  • Décodage pyzbar
  • Décodage base45
  • Décompression zlib
  • Décodage cbor2
  • Dump du résultat brut
1python3 vacdec certificat.png

donne le résultat suivant (j'ai volontairement remplacé mes données par des placeholders) :

 1{-260: {1: {'dob': '$YYYY-MM-DD',
 2            'nam': {'fn': '$nom',
 3                    'fnt': '$nom',
 4                    'gn': '$prenom',
 5                    'gnt': '$prenom'},
 6            'v': [{'ci': '$code_sérialisé',
 7                   'co': '$code_country',
 8                   'dn': $dose_number,
 9                   'dt': '$YYYY-MM-YY',
10                   'is': '$emetteur_du_certificat',
11                   'ma': '$fabricant',
12                   'mp': '$code_medicament_vaccinal',
13                   'sd': $number_of_doses_in_the_serie,
14                   'tg': '$code_maladie',
15                   'vp': '$code_vaccin'}],
16            'ver': '$version'}},
17 1: '$emetteur',
18 4: $timestamp,
19 6: $timestamp}

Voici la description par rétro-analyse que j'en ai faite, il y a sûrement des erreurs ou des imprécisions ! N'hésitez pas à me le dire si vous avez des infos.

Clé -260 :

Champ Description
dob date of birth, date de naissance format YYYY-MM-DD
nam.fn Nom d'usage ?
nam.fnt Nom de naissance ?
nam.gn Prénom
nam.gnt Prénom aussi
v.ci identifiant du certificat
v.co country, pays de vaccination sur 2 lettres
v.dn dose number, nombre de doses reçues
v.dt date du vaccin format YYYY-MM-DD
v.is issuer, émetteur du certificat
v.ma manufacturer, fabricant ou titulaire de l'autorisation de mise sur le marché du vaccin
v.mp vaccine medicinal product, médicament vaccinal
v.sd nombre de doses de la série
v.tg target, maladie ou aggent ciblé
v.vp vaccin prophylaxis
ver numéro de version format x.y.z du schéma ?
  • Clé 1 est l'émetteur du certificat comme la caisse nationale de l'assurance maladie
  • Clé 4 est numérique de type timestamp, donnant une date 2 ans dans le futur, une date de fin de validité du passeport sans doute
  • Clé 6 est numérique de type timestamp, qui pourrait la date de génération du qrcode

Conclusions

  • Oui il y a des données personnelles dans ce code QR.
  • Ces données sont aussi globalement reprises dans le document papier.
  • On peut imaginer qu'un scanneur de code (comme l'app TousAntiCovid Verif) fait le contrôle si les champs v.sd et v.dn sont égaux (ex: 2 doses / 2), et si la date courante est comprise entre la clé 6 (date d'émission du certificat) et la clé 4 (date de fin de validité)
  • Tous les autres champs servent peut être à contrôler notre identité, couplé à un autre document (carte d'identité, passeport...), ainsi que savoir si le vaccin est bien autorisé sur le marché.

Voilà, maintenant nous savons ce que potentiellement les scanners de code qr peuvent lire, stocker ? Espérons un encadrement rigoureux par la CNIL du traitement de ces données. Techniquement aucun accès réseau n'est donc selon moi nécessaire pour savoir si un pass est valide ou pas.

Voilà c'était ma rapide analyse. L'objectif primaire étant atteint: décoder les informations contenues.

Restent beaucoup de questions: comment le générer, comment est-il signé, quelles sont les sécuritées mises en place dans les apps de scans pour le contrôle d'intégrité .... à vous lire ;)

Ressources

comments powered by Disqus