Bezpečnost očkovacích certifikátů a aplikace (č)Tečka

Je tomu více jak půl roku, co Ministerstvo zdravotnictví České republiky vypustilo do světa oficiální aplikace na správu a kontrolu digitálních Covid-19 očkovacích certifikátů: Tečka a čTečka. V několika týdnech se z nich staly nejstahovanější a nejpoužívanější aplikace na českém trhu. Pokud by aplikace obsahovaly vážné bezpečnostní chyby, ohrozily by tak soukromí statisíců uživatelů chytrých mobilních telefonů. Proto jsme se rozhodli podívat pod pokličku celého očkovacího a certifikačního systému.

Za dobu své existence si aplikace Tečka i čTečka prošly několika horkými chvilkami, které byly mimo jiné způsobeny odlišnými pravidly v zemích EU, jejich častými změnami a v neposlední řadě také výpadky systémů Ústavu zdravotnických informací a statistiky ČR (dále ÚZIS). Poslední měsíce hýbou zpravodajstvím v celé Evropě také aféry s falešnými očkovacími dokumenty. Ty jsou, alespoň podle veřejně známých informací, způsobené spíše prodejnými lékaři, pracovníky očkovacích center či chybami v zabezpečení certifikačních serverů v některých zemích EU, než sofistikovanými útoky na mobilní telefony evropských občanů, užívajících aplikace s uloženými certifikáty.

Abychom si tyto hypotézy mohli ověřit a zjistit, jak celý ekosystém s certifikáty a jejich správou pod pokličkou funguje, v následujících odstavcích se na obě aplikace, vytvořené Národní agenturou pro komunikační a informační technologie (dále NAKIT), podíváme více do detailu.

Co je vlastně očkovací certifikát a jak se vytváří?

Digitální certifikát EU Covid je osobní certifikát, který zahrnuje údaje o očkování, testování či prodělání nemoci Covid-19. Obsahuje pouze nezbytně nutný soubor informací, s jejichž pomocí mohou občané EU prokazovat svůj zdravotní stav doma i ve většině zemí po celém světě.

Pro zabezpečení certifikátů a zamezení černého trhu s falešnými průkazy jsou všechny certifikáty digitálně podepsány. Všechny instituce, které mají pravomoc certifikáty vystavovat, mají své digitální podpisové klíče, které jsou generovány a ukládány do dedikovaných „zabezpečených“ databází v každé zemi. Samotné digitální podpisy jsou pak distribuovány dedikovanou infrastrukturou po zemích celé unie, a tak je možné mezi nimi sdílet data například o zneplatněných certifikátech.

Vše si do detailu ukážeme v druhé části článku, nyní se však ponořme do hlubin aplikací Tečka a čTečka.

Mobilní aplikace (č)Tečka

Jak již bylo napsáno, jejich autorem je NAKIT, který se specializuje na informační služby a jejich zabezpečení. Dá se tedy očekávat, že aplikace budou naprogramovány podle současných bezpečnostních standardů.

Co se týká binární analýzy, jsou aplikace pro obě platformy psány nativně, a to v programovacím jazyku kotlin, respektive Swift. Zdrojový kód aplikací pro Android je silně obfuskovaný (upravený tak, aby nebyl jednoduše čitelný), je tedy velmi nepravděpodobné, že by hackeři dokázali kód rozluštit, najít v něm případné bezpečnostní chyby či do něj přímo injektovali vlastní škodlivé funkce.

Příklad obfuskace a jedné ze tříd aplikace Tečka:

 1public final class a0 extends o implements a<Collection<?extendsu<?>>> {
 2  public a0(int paramInt, Object paramObject) {
 3    super(0);
 4  }
 5 6  public final Object d() {
 7    d0 d02;
 8    i0 i01 = i0.g0;
 9    i0 i02 = i0.f0;
10    int i = this.g0;
11    if (i != 0) {
12      if (i != 1) {
13        g1 g1;
14        if (i != 2) {
15          if (i != 3) {
16            if (i == 4) {
17              d1 d1 = (d1)this.h0;
18              g1 = d1.i;
19              j2 j2 = d1.f;
20              r r = d1.d[1];
21              return g1.s((r)j2.d(), i02);
22            } 
23            throw null;
24          } 
25          d0 d03 = ((d0.a)this.h0).p;
26          return d03.s(d03.F(), (i0)g1);
27        } 
28        d02 = ((d0.a)this.h0).p;
29        return d02.s(d02.E(), (i0)g1);
30      } 
31      d0 d0 = ((d0.a)this.h0).p;
32      return d0.s(d0.F(), (i0)d02);
33    } 
34    d0 d01 = ((d0.a)this.h0).p;
35    return d01.s(d01.E(), (i0)d02);
36  }
37}
Obfuskace jedné z tříd aplikace

Všechny sdílené knihovny, které aplikace integrují, jsou sestavené se všemi bezpečnostními prvky, a tak nehrozí ani útoky typu buffer overflow či shellcode injection. Stejně kvalitní je zpracování i pro platformu Apple, binární soubory mají všechna bezpečnostní opatření, kód je zašifrovaný a navíc digitálně podepsaný.

Ve statické analýze jsme tedy zjistili, že aplikace jsou psány a sestaveny přesně podle současných trendů a pravidel, která v AEC svým klientům doporučujeme. Jedinou kaňkou na vysvědčení je pro nás fakt, že produkční verze aplikací Tečka i Čtečka pro platformu Android v sobě obsahují hypertextové odkazy na testovací prostředí UZIS či MZCR, které jsou veřejně dostupné a které by případně mohly hackerům sloužit jako testovací prostředí pro jejich útoky.

https://ockotest.uzis.cz/
https://ockotest.uzis.cz/Account/Prihlaseni?Type=AlternativeOnly
https://ockotest.uzis.cz/Account/Prihlaseni?Type=NiaOnly
https://dgcverifytest.mzcr.cz/

V oblasti autentizace aplikace Tečka poskytuje uživatelům možnost přihlašování 6ti-místným kódem či pomocí biometrie, pokud ji telefon poskytuje.

PIN autentizace do aplikace Tečka
PIN autentizace do aplikace Tečka

Volená hodnota PINu není sice nijak omezována, a tak může uživatel zvolit jednoduché číslo 123456 či 111111, v případě odcizení má však útočník vždy pouze 3 pokusy na jeho uhodnutí, než se aplikace na 5 minut uzamkne. Samotný kód není do telefonu ukládán v prosté podobě, nýbrž dochází k jeho kryptografickému zpracování, aby ani v případě kompromitace zařízení nebylo možné útočníkem jeho správnou hodnotu odhalit. Aplikace používá AES symetrickou kryptografii se 256 bitovým klíčem a 128 bitovými bloky.

Ukázka kryptografických funkcí aplikace Tečka pro zpracování PINu:

[CCKeyDerivationPBKDF]
algorithm : kCCPBKDF2
password : qÙ♫…¯•DeAÍUpdIP²‰Ð€BÂŧš}_uT☺*
saltBytes : db6933c6c35e2fe83b27f77e0bb53382
prf : kCCPRFHmacAlgSHA512
rounds : 2
derivedKey : 7ad02a1ef5d3a29f364edfbfa8690b74e404ac6b9ffbfd205ffd647dd8381c13
[CCCryptorCreate]
op : kCCEncrypt
alg : kCCAlgorithmAES128
options : undefined
keyLength : 32
key : 71d9070e85af95446541cd557090644950b289d08042c2c5159a7d5f7554012a
iv : 8533f713e76a69268ffc6a43613218eb

Dále Tečka sleduje aktivitu přihlášeného uživatele a po delší nečinnosti se uzamkne, čímž zabraňuje vstupu neoprávněných osob do aplikace a přístupu k certifikátům, pokud by se útočníci dostali k odemknutému telefonu, který by měl Tečku otevřenou na pozadí.

Z hlediska spojení s okolním světem jsou Tečka i Čtečka, alespoň co se týče správy certifikátů a jejich načítání pomocí QR kódů, víceméně autonomními aplikacemi pracujícími po většinu času v offline režimu. To je pochopitelné, pokud mají být užívané za každé situace a v jakémkoliv prostředí, tudíž i na telefonech v prostorách bez možnosti přístupu k internetu.

Intenrnetová komunikace odchycená nástrojem Burp
Intenrnetová komunikace odchycená nástrojem Burp

Pokud je mobilní telefon online, aplikace si vždy po 60ti minutovém intervalu stahují nová data ze serverů Ministerstva zdravotnictví, dále si každých 5 minut aktualizují uživatelskou relaci vůči ÚZISu a při novém otevření iniciují spojení s analytickou službou Firebase. Jinou aktivitu v základním režimu současné verze aplikace nevytváří.

Možnosti přidání nového certifikátu
Možnosti přidání nového certifikátu

V případě, že uživatelé načítají své očkovací certifikáty ze stránek ÚZISu pomocí SMS kódů či Identity občana, odehrávají se veškeré přihlašovací a registrační procedury mimo mobilní aplikace v internetovém prohlížeči. Pro uživatele v tomto procesu nastává důležitý úkon, a to ten, že dochází ke spárování klientské relace Tečky s identitou, pod kterou se na webu ocko.uzis.cz přihlašuje. Tento krok má za následek mimo jiné to, že všechny jeho certifikáty jsou nyní pod touto relací v aplikaci Tečka dostupné a stažitelné v PDF formátu. Aplikaci se tak otevírá možnost volat několik dalších API metod.

Další intenrnetová komunikace odchycená nástrojem Burp
Další intenrnetová komunikace odchycená nástrojem Burp

Na závěr analýzy internetového provozu je důležité zmínit, že ani jedna z aplikací neodesílá žádné osobní informace o uživateli či o obsahu načítaných a spravovaných očkovacích certifikátů, jak bylo v dezinformacích často šířeno. Kromě jediného POST požadavku, nesoucího parametry telefonu a unikátního instalačního identifikátoru jsou aplikace v pasivním režimu a pouze přijímají data od aplikačních serverů.

Testy autorizace neprokázaly žádné bezpečnostní nedostatky, privátní údaje občanů jsou správně řízené a dostupné pouze s platným OAuth relačním tokenem, který má platnost 10 minut.

Samotná API MZČR jsou veřejně přístupná a nejsou chráněna API klíči či jinými autentizačními prvky, nejspíše je však takto „nezabezpečený“ otevřený systém navrhnutý proto, aby mohl být obsah dostupný odkudkoliv a pro jakoukoliv aplikaci i v ostatních zemích EU. Swagger API rozhraní je dostupné na této adrese https://dgcverify.mzcr.cz/index.html

Aplikace neobsahují mnoho funkcionalit, a tak toho také mnoho lokálně neukládají do mobilních telefonů uživatelů. Digitální Covid certifikáty jsou vkládány do SQLite databáze, aplikace na Android i iOS však obsah této databáze šifrují pomocí open source nástroje SQLCipher, využívajícího 256 bitovou AES symetrickou kryptografii.

Pokud pomineme lokální kopii veřejných informací ze serveru MZČR, stojí dále za zmínku pouze ukládání části internetového provozu do NSURLCache, proti kterému nejsou aplikace na iOS platformě chráněny. Tato cache v podobě SQLite databáze může obsahovat informace z odpovědí v podobě profilových dat, relačních tokenů, uživatelských identifikátoru, cest k certifikátům a podobným datům, zmíněným v předešlém odstavci věnovaném internetovému provozu.

Lokální cache internetového provozu ukládaná aplikcí na platformě iOS
Lokální cache internetového provozu ukládaná aplikcí na platformě iOS

Autorizační data, jako jsou PIN kódy, relační identifikátory a podobné údaje, jsou ukládány v patřičných částech operačního systému, jako je databáze iOS Keychain, respektive Android Keystore.

Musíme však čtenáře uklidnit a vysvětlit, že aplikace využívají pro svá data pouze interní úložiště, chráněné mobilním operačním systémem. Aplikační data jsou tak zranitelná a přístupná pouze na kompromitovaných zařízeních, běžících pod uživatelem root.

Důležitým zjištěním pro bezpečí uživatelů je, že aplikace čTečka si lokálně do své paměti neukládá signatury naskenovaných certifikátů či dokonce celý QR kód, ale pouze zaznamenává počet takto zkontrolovaných certifikátů a jejich stav. Nehrozí tak, že by mohli zaměstnanci ve službách a pohostinství sbírat kontrolované certifikáty návštěvníků a nelegálně s nimi dále nakládat.

Certifikační ekosystém

Jak již bylo napsáno na začátku článku, digitální očkovací certifikáty se distribuují, sdílejí a kontrolují pomocí QR kódů. Tyto kódy obsahují jen a pouze ty informace, které jsou rovněž uvedeny na papírové formě certifikátu či v jeho detailu v aplikacích Tečka a čTečka (základní informace o osobě, o vakcíně, datum vakcinace a unikátní identifikátor certifikátu).

Pokud si obsah QR obrázku dekódujeme, zjistíme, že kód začíná řetězcem HC1 (zkratka Health Certificate verze 1). Zbytek tvoří dříve popsané informace, které jsou strukturované do standardizovaného formátu CBOR Web Token (CWT). Tento objekt je následně komprimovaný a v poslední fázi kódovaný do Base45 formátu:

QR = HC1 : ( ( ( ( data ) CWT ) zlib ) Base45 )

Příklad obsahu QR kódu:

HC1:NCFSY7PUNJPOJ21:MA84P88ARBHYDEP/NU7H+W7AFKQT2S 9BAB+MO2KAZ48*FGUBAOUK%ACR1S07D$Y0%SH6/92DN4JTDJS9-2MK8QPKSKC6WR92DS:TA2LG%HM%L:0UDDLLQ76/EPDJG$GR%4C/MOETASQ.%DJRARFA748-ND18T-V6V/S+LO8C6ZM9D72N78:E9+$55 6H9LSA0T/3LFF I65G6-IL9Q6M31S47IBUL$51GAKCWB.8FDKDDABC02ZOKEHGG1%.IWS8F:A*LH.6SVPDVQF2E2*/867JX N05D+P4Y3ECX4DX3CTC6B53RM :GN01R8EJHTTK4M.5S376E2N582-1SBATOC/*8R8VDIGPW8566PV9X001ZK88U3HIW*82U0:EFQP3KEE7IHAEK17AB-IWTBLPM+KEI.6SNCCIIRBJH-HD-4-WA$18LIA*JG7HST+VVBN-FMOWFT$EJ:OYSF11WS S%.C/KD$47J0OF 3ID7S6JGTR303H6D6PJTEE2+SULGL.39DFXQ3B2OD5OLSU.05WTMTA4.UG

Po jehož dešifrování dostaneme následující JWT objekt (ilustrační ukázka):

 1{
 2  "1": "CZ",
 3  "4": 1625835153,
 4  "6": 1622638353,
 5  "-260": {
 6    "1": {
 7      "v": [
 8        {
 9          "ci": "01CZ/00000/WTC6WCHNZ22E86PSV26XSUSP67Y6RHJF#S",
10          "co": "CZ",
11          "dn": 2,
12          "dt": "2021-07-09",
13          "is": "Ministerstvo zdravotnictví České republiky",
14          "ma": "ORG-100031184",
15          "mp": "EU/1/20/1007",
16          "sd": 2,
17          "tg": "840539006",
18          "vp": "1119349007"
19        }
20      ],
21      "dob": "1987-01-01",
22      "nam": {
23        "fn": "Musil",
24        "gn": "Martin",
25        "fnt": "MUSIL",
26        "gnt": "MARTIN"
27      },
28      "ver": "1.0.0"
29    }
30  }
31}
Obsah certifikačního QR kódu

Většina údajů by měla být intuitivně zřejmá. Parametry „ma“ a „mp“ popisují kód vakcíny, respektive jejího výrobce, parametry „tg“ a „vp“ značí typ viru a typ vakcíny. Oficiální seznam všech schválených vakcín a jejich kódových označení můžete najít v tomto dokumentu: https://ec.europa.eu/health/sites/default/files/ehealth/docs/digital-green-value-sets_en.pdf

Pro nás je důležitý parametr „ci“, který nese jedinečný identifikátor certifikátu. Z hlediska zabezpečení očkovacích certifikátů a kryptografie se jedná o jeho, v úvodní části zmiňovaný, digitální podpis. Pokud bychom šli do větší hloubky, zjistili bychom, že se jedná o výsledek funkce, ve které je vypočítán hash dokumentu, který je následně podepsaný privátním klíčem (PK) certifikační autority – v našem případě instituce Ministerstva zdravotnictví České republiky:

Podpis = ( ( Očkovací certifikát ) hash ) PKPKI )

Obě mobilní aplikace Tečka i čTečka si stahují ze serveru MZČR aktuální podoby podpisových certifikátů, což jsou jinými slovy veřejné klíče (VK) k certifikátům všech certifikačních autorit, které v EU vydávají očkovací certifikáty. Ty jsou k nalezení na této adrese:

https://dgcverify.mzcr.cz/api/v1/verify/NactiPodpisoveCertifikaty

Zatímco Tečka pouze certifikáty spravuje a zobrazuje jejich obsah, čTečka navíc ověřuje jejich věrohodnost. Verifikaci provádí tak, že podle certifikační autority uvedené v QR kódu vybere správný veřejný klíč, kterým dešifruje digitální podpis. Získá tak původní hodnotu hashe dokumentu. Aplikace si pak sama vypočítá hash načteného certifikátu a zkontroluje, zdali se výsledné hodnoty shodují:

( ( Očkovací certifikát ) hash ) =? ( ( digitální podpis ) VKPKI )

V rámci všech ministerstev zdravotnictví členských států a speciálně vytvořené infrastruktury se pak mezi zeměmi přenáší pouze hodnoty digitálních podpisů, nikoliv celé certifikáty (QR kódy), jak je možné vidět například v seznamu všech revokovaných (zneplatněných) certifikátů, který má Tečka a hlavně čTečka také k dispozici:

https://dgcverify.mzcr.cz/api/v1/verify/NactiRevokovaneCertifikaty

V době psaní článku list obsahuje téměř 43 tisíc záznamů, což je při desítkách milionů očkovacích či testovacích certifikátů, které se v Unii vytváří každý den, velmi malé číslo. Domníváme se, že se může jednat pouze o výčet problémových certifikátů, které byly vydány nelegálně či které byly z nějakého jiného důvodu nutno zneplatnit.

Samotná vyhodnocovací pravidla, která se ve všech zemích dynamicky s nárustem či úbytkem pozitivně testovaných občanů mění, jsou rovněž na serveru MZČR aktualizována. Mobilní aplikace tyto změny načítají na následující adrese a patřičně pak certifikáty a testy samy validují:

https://dgcverify.mzcr.cz/api/v1/verify/NactiPravidlaPlatnostiDgc

Takto ve zkratce celý systém vytváření, distribuce a ověřování certifikátů funguje.

Závěrem

Studium systému evropských digitálních Covid-19 certifikátů ukázalo, že co se týká dosahu, jedná se určitě o jeden z největších projektů, na kterém země EU kdy musely společně pracovat. Ekosystém je propracovaný a v ideálních podmínkách také velmi spolehlivý. Jak už to tak bývá, nejslabším článkem takovýchto projektů bývá většinou člověk sám, který i v tomto případě, ať již ze zištných či nezištných důvodů, v několika případech narušil integritu a věrohodnost systému. Co se však týká ochrany osobních údajů a soukromí občanů, funguje evropský certifikační systém bezpečně.

Stejně tak i analýza mobilních aplikací Tečka a čTečka přinesla velmi pozitivní výsledky. Obě aplikace jsou ve své podstatě co se týká funkčnosti velmi jednoduché a transparentní. Jsou psány dle aktuálních bezpečnostních praktik a s pomocí veřejně dostupných certifikačních a kryptografických údajů spravují naše digitální očkovací certifikáty s téměř maximální spolehlivostí.

Doufám, že Vám tento článek aspoň trochu přiblížil jak celý evropský očkovací systém funguje a dodal Vám k němu důvěru.