L’allerta arriva dal Garante della Privacy: non pubblicate sui social le foto del QR Code abbinato al Green Pass perché potrebbe contenere dati sensibili. Che dati contiene questo QR Code?

Negli ultimi giorni milioni di italiani hanno ricevuto il messaggio dal Ministero della Salute con il codice di autorizzazione al recupero del certificato digitale sui server. Certificato che si installa sull'app IO o sull'app Immuni.

Il certificato, la sua erogazione e anche il suo controllo da parte delle persone che sono autorizzate a farlo rientrano all’interno di quello che è un progetto europeo: il server di backend è stato sviluppato a livello europeo e l’Italia lo ha solamente adattato, e la stessa cosa vale anche per l’applicazione VerificaC19, che è un fork localizzato dell’app europea EU Digital COVID Certificate Verifier App.

Il codice sorgente delle due applicazioni che vengono usate per la lettura dei dati, quelle più sensibili sotto il profilo della privacy, è disponibile su Github ed è opensource: all’interno non sono presenti tracker di sorta, neppure tracker tecnici. Questo è bastato al Garante per dare il via libera alla distribuzione e al controllo dei pass.

L’uso del pass è relativamente semplice: all’ingresso di un evento o di un locale dove il pass è richiesto basta mostrarlo, e una persona con l’app VerificaC19 può controllare che il pass sia valido, e soprattutto che la persona che lo sta mostrando è la stessa alla quale è intestato il certificato, questo in base a nome, cognome e data di nascita. Senza un controllo del documento sarebbe semplice infatti passare ad amici e conoscenti lo screenshot del proprio pass.

Ma cosa è contenuto all’interno dell’enorme e fitto QRCode che viene mostrato dalle app sugli smartphone? Vediamo come leggerlo.

Tutte le specifiche dei dati contenuti sono visibili all’interno del documento in PDF dell’Unione Europea, documento che stabilisce anche un set di dati che ogni certificato deve contenere.

Una semplice analisi, questo è importante, ci mostra che effettivamente non viene trasmesso nient’altro che non sia quello che è dichiarato dal certificato: nessun dato nascosto, niente di niente.

Se leggiamo questo QRCode tramite una libreria opensource come ad esempio zbar, quello che ci viene restituito è una stringa di questo tipo.

HC1:6BFOXN%TS3DHPVO13J /G-/2YRVA.Q/R8RNM2FC1J9M$DI9C3K9%SAR:PS$S:LC/GPWBILC9GGBYPLDXI25P-+R2YBV44PZB6H0CJ0%H0%P8. KOKGTM8$M8SNCXL9LM0C KPLIUM45FMCHGX2MUEE-JE6GQ2%KYZPQV6YP8412YPCGJ4HM84-2YNAG0B807+PE82D/K4EH05.4$M8WL6KN8LQE.UKK*R3T3+7A.N88J4R$F/MAITHP+PIJ6W*PP+PDPIGOK-*GN*Q:XJR-GM%O-RQV*Q6QS03L0QIRR97I2HOAZEKX:CIGF5JNCPIGSUXOQ0WBAMKK$F.UI%SUR+PLXEGAE%9OMPDNBH9JAZ%3KHJF0JEYI1DLNCKUCI5OI9YI:8DG:D%PDB2MLTC-NS K87NTFBNM/VGMNL%1Z8F 2D7DQHH3-31U98NQI7UQCLV64LO6B+U98-47KC2UU*9KEQ1A7OE3O7BPN47H.STS2JE5%CQC/AO1S112+B3XUE

Dalle specifiche rilasciato dall’Unione Europea sappiamo che questa è una stringa codificata Base45 e compressa con zlib.

Tolti i byte iniziali, possiamo risalire alla forma decodificata e decompressa.

b'\xd2\x84M\xa2\x04H4\x9aB\xb0\xc2\xd0r\x8e\x01&\xa0Y\x01\x04\xa4\x04\x1ad]\x81\x80\x06\x1a`\xd2s\x1b\x01bIT9\x01\x03\xa1\x01\xa4av\x81\xaabdn\x01bmamORG-100030215bvpj1119349007bdtj2021-06-03bcobITbcix&01IT037281FD58AE4FC79CF2508B8196A1C7#2bmplEU/1/20/1528bisvMinistero della Salutebsd\x02btgi840539006cnam\xa4cfntgPEZZALIbfngPEZZALIcgntgROBERTObgngROBERTOcvere1.0.0cdobj1978-07-25X@\xa8\x11\xe5\xf7F\xb7\x0f\x0bm\xd6\xc0\xa8\xe4\x9c\xb2\x8c\xaf|\x19X\x1cQ?\xc9\xa0g\xbcL\x8dg|: \x97\x96\x18D>\xc9\xdaN\x13\x98\x18\xfd\x88M\x86\xc7\xb4A o\xb9\x16\xb5\x16_\x03Fz\xb7@1’

Siamo davanti ad un pacchetto di dati in formato COSE, CBOR Object Signing and Encryption: utilizzando un paio di librerie opensource si possono estrarre le chiavi, gli header e il payload.

(_, (header_1, header_2, cbor_payload, sign)) = flynn.decoder.loads(qrcode_data)
data = flynn.decoder.loads(cbor_payload)

La "sign" è la firma digitale che è quella che poi viene verificata in base ai certificati scaricati dal client, quella che insomma si assicura che questo dato sia autentico e che non sia un QRCode generato da altri usando gli stessi dati. Dentro "cbor_payload" troviamo invece le informazioni contenute nel certificato:

{4: 1683849600, 6: 1624404763, 1: 'IT', -260: {1: {'v': [{'dn': 1, 'ma': 'ORG-100030215', 'vp': '1119349007', 'dt': '2021-06-03', 'co': 'IT', 'ci': '01IT037281FD58AE4FC79CF2508B8196A1C7#2', 'mp': 'EU/1/20/1528', 'is': 'Ministero della Salute', 'sd': 2, 'tg': '840539006'}], 'nam': {'fnt': 'PEZZALI', 'fn': 'PEZZALI', 'gnt': 'ROBERTO', 'gn': 'ROBERTO'}, 'ver': '1.0.0', 'dob': ‘1978-07-25'}}}

Un classico formato JSON, che applicato allo schema dettato sempre dal documento dell’Unione Europea, visibile qui, permette di ricostruire il nostro certificato.

QR Code Issuer : IT
QR Code Expiry : 2023-05-12 00:00:00
QR Code Generated : 2021-06-22 23:32:43
 Vaccination Group
   Dose Number : 1
   Marketing Authorization Holder : ORG-100030215
   vaccine or prophylaxis : 1119349007
   ISO8601 complete date: Date of Vaccination : 2021-06-03
   Country of Vaccination : IT
   Unique Certificate Identifier: UVCI : 01IT037281FD58AE4FC79CF2508B8196A1C7#2
   vaccine medicinal product : EU/1/20/1528
   Certificate Issuer : Ministero della Salute
   Total Series of Doses : 2
   disease or agent targeted : 840539006
 Surname(s), forename(s)
   Standardised surname : PEZZALI
   Surname : PEZZALI
   Standardised forename : ROBERTO
   Forename : ROBERTO
 Schema version : 1.0.0
 Date of birth : 1978-07-25

Questo è il certificato per le vaccinazioni, dove si capisce che è stata fatta una dose su un totale di due dosi necessarie, che la vaccinazione è stata fatta il 3 giugno 2021 e che il certificato è stato rilasciato dal Ministero della Salute.

Ci sono alcuni dati che possono suonare strani: il Marketing Authorization Holder con codice ORG-100030215 è in questo caso Biontech. Manufacturing. GmbH, ovvero la società che con il permesso dell’ente regolatore ha portato sul mercato il vaccino somministrato facendo i test necessari. Non ha niente a che fare con il “marketing”, è semplicemente l’ente che lo ha messo sul mercato.

Al tipo di vaccino è associato un codice numerico: in questo caso ‘1119349007’ sta dicendo che il vaccino è di tipo SARS-CoV2 mRNA, quindi al momento o Moderna o Pfizer.

Il “disease or agent targeted” è ovviamente solo uno: al codice ‘840539006’ corrisponde il Covid 19.

C'è poi il codice univoco di certificazione e alcuni dati come nome, cognome e data di nascita. Il certificato viene emesso anche per i tamponi e in caso di dimissione da ricovero, e i dati possono variare leggermente: non sarà più presente il vaccino ma sarà presente il risultato del tampone e la data del tampone, oltre al luogo dove è stato fatto.

Dentro quel QRCode enorme non c'è nulla di strano. Non c'è scritto se abbiamo problemi di salute, se ci sono controindicazioni e neppure se abbiamo avuto il covid: ci sono solo nome, cognome e data di nascita, indispensabili per verificare l'autenticità del portatore del pass, oltre al tipo di vaccino fatto con il numero di dosi e la data di vaccinazione.