Bruce Schneier pred troma desaťročiami napísal:

Na tomto svete sú dva druhy kryptografie: taká, ktorá v čítaní vašich súborov zabráni vašej malej sestre, a kryptografia, ktorá v tom zabráni vládam (veľmocí).

Na tento známy výrok som si spomenul, keď som narazil na (nevýznamnú) vládu používajúcu ten nesprávny druh kryptografie. Ako by sa dalo očakávať, v skutočnosti nasadila niekoľko rozumných bezpečnostných protokolov. Dopĺňajú ich však príklady kryptografie, ktorú dokáže prelomiť i vaša malá sestra. Je možné, aby si úrady takéto rozdiely neuvedomovali?

eID Klient

Už niekoľko rokov sa na Slovensku vydávajú elektronické občianske preukazy. Pre niektoré skupiny občanov je využívanie elektronických služieb štátu dokonca povinné. Ministerstvo vnútra nám k dispozícii dáva softvér umožňujúci najmä on-line autentifikáciu a (off-line) elektronický podpis. Dobrou správou je, že eID klient obyčajne funguje.

Na druhej strane, prosté "fungovanie" bezpečnostného softvéru je latka postavená nesmierne nízko. Pri podrobnejšom pohľade sa ukazuje viacero príkladov nesprávneho použitia kryptografie. Každý z problémov nejako súvisí s fixnými šifrovacími kľúčmi obsiahnutými priamo v kóde.

Test integrity

Pri spustení eID klienta prebieha "test integrity". Je vraj potrebný kvôli bezpečnosti, funkčnosti a stabilite aplikácie.

Textový súbor filesHash.json obsahuje zoznam súborov, ktorých integrita sa má kontrolovať spolu s SHA-256 hašmi ich obsahu. V samostatnom súbore zvanom filesHash.json.sig sa nachádza 2048-bitový RSA podpis súboru filesHash.json.

Verejný RSA kľúč slúžiaci na overenie podpisu sa nachádza v hlavnom spustiteľnom súbore eID klienta. Akákoľvek zmena v niektorom z kontrolovaných súborov (takmer) nevyhnutne povedie k zmene SHA-256 hašu. Úprava tejto hodnoty v súbore filesHash.json by mala za následok neplatnosť podpisu. Na prvý pohľad to možno vyzerá rozumne, no celý test integrity možno (ako obvykle) vypnúť zmenou jediného bitu v hlavnom spustiteľnom súbore eID klienta.

"Test integrity" možno dokonca obísť i bez akýchkoľvek zmien v spustiteľnom kóde. eID klient totiž nekontroluje kód, ktorý sa načíta do pamäte, ale ten, ktorý sa nachádza na disku. Niektoré systémy umožňujú poľahky spúšťať programy s "prednačítanou" vlastnou verziou knižnice namiesto tej, ktorú by aplikácia obvykle načítala sama. "Test integrity" pritom samozrejme zostane nedotknutý, hoci program beží s upravenou knižnicou.

Transplantácia podpisu naprieč platformami

Softvér eID Klient je k dispozícii pre tri platformy: GNU/Linux, Mac OS a Microsoft Windows. Kľúčový pár RSA používaný na podpisovanie súboru filesHash.json je však na všetkých platformách rovnaký. Preto možno použiť filesHash.json a filesHash.json.sig z balíka pre odlišnú platformu. Aby bol "test integrity" úspešný, stačí jednoducho skopírovať i všetky súbory z "cudzorodého" zoznamu. Vďaka odlišným zvyklostiam v pomenúvaní ciest a súborov (.dll/.dylib/.so) sa každá cesta z filesHash.json vyskytuje len na jednej platforme. Preto keď skopírujete všetky potrebné súbory z Mac OS (povedzme) na Linux, žiadna z knižníc nebude prepísaná. Keď potom eID klienta pre Linux spustíte, program načíta všetky príslušné linuxové knižnice bez akejkoľvek kontroly integrity a následne poslušne skontroluje všetky súbory uvedené v súbore filesHash.json určenom pre Mac OS.

Transplantácia podpisu naprieč protokolmi

Ak je potrebná on-line autentifikácia pomocou občianskeho preukazu, internetový prehliadač obvykle aktivuje eID klienta pomocou HTTP požiadavky. Táto obsahuje adresu autentifikačného servera, s ktorým má eID klient ďalej komunikovať. Toto je príklad jednej takej HTTP požiadavky:

http://localhost:15480/?tcTokenUrl=https%3A%2F%2Feidas.minv.sk%2
Fedoc%2Feac%2Finit%3FtokenId%3D316bcd6f0751d13bb340%26nodeId%3D2
%26security%3D8f2096cab4ace68e2ea0d8f42d3091c12ab3b376eb7389238c
938224b823d93bc299a618cfcb930f507d072b4fb3e70e772b79e4b99d2d8bee
03374cd349c4982bc41c7ccd11bec3c596f1ec207779744eb815936a2f870052
385f06f5854593073ae04b4006307c877cb0c3672acbd0b7f4b855a5cee6d86f
10efc07aedbe7ceb921dacce033c85e1b254d5dbc6b2c1ba168b8b2dc70b5ff4
d843d62fe7702a088e40f64c0dfef6d3fcd5019e72e57fd5b8dae0147e8f27e1
dd8c3b359732bc22b62f13a36a0517dca8b8ff8824905cec66ce5cc4e0c2d22a
da10bf8037ddd630ab133d1a4b00490656d614736fc1f2b4ece3dfc3f4900d9d
34205640f7ce46

Obsahuje adresu (URL):

https://eidas.minv.sk/edoc/eac/init?tokenId=316bcd6f0751d13bb340&nodeId=2

a RSA podpis tejto adresy:

8f2096cab4ace68e2ea0d8f42d3091c12ab3b376eb7389238c938224b823d93b
c299a618cfcb930f507d072b4fb3e70e772b79e4b99d2d8bee03374cd349c498
2bc41c7ccd11bec3c596f1ec207779744eb815936a2f870052385f06f5854593
073ae04b4006307c877cb0c3672acbd0b7f4b855a5cee6d86f10efc07aedbe7c
eb921dacce033c85e1b254d5dbc6b2c1ba168b8b2dc70b5ff4d843d62fe7702a
088e40f64c0dfef6d3fcd5019e72e57fd5b8dae0147e8f27e1dd8c3b359732bc
22b62f13a36a0517dca8b8ff8824905cec66ce5cc4e0c2d22ada10bf8037ddd6
30ab133d1a4b00490656d614736fc1f2b4ece3dfc3f4900d9d34205640f7ce46

Toto je užitočná (a nevyhnutná) funkcia. Klient reaguje len na legitímne požiadavky pochádzajúce z vládneho autentifikačného servera.

Z akéhosi dôvodu sa však na tieto podpisy používa ten istý kľúč, ktorým sa podpisuje súbor filesHash.json. Preto ak do jedného súboru uložíte takúto adresu URL a do druhého súboru príslušný RSA podpis, test integrity bude úspešný. Nesprávny formát JSON súboru nevedie k chybe. Namiesto toho eID klient prečíta prázdny zoznam kontrolovaných súborov a poslušne ho celý prejde. Nuž a všetky haše všetkých súborov budú (nevyhnutne) sedieť.

Autorizácia webovej služby

On-line autentifikácia spočíva v prečítaní osobných údajov z čipu v občianskom preukaze. Karta uplatňuje protokol Extended Access Control (EACv1; BSI TR-03110) na rozšírenú kontrolu prístupu a údaje prezradí len oprávnenému autentifikovanému terminálu. Jedným takýmto terminálom je vládny autentifikačný server. Na zabezpečenie komunikačného kanála medzi týmto vzdialeným serverom a čipom v preukaze sa používa silná asymetrická kryptografia. Počítač, ku ktorému je pripojená čítačka kariet, len posúva (zašifrované) dáta medzi naozajstnými účastníkmi bezpečnostných protokolov vzájomne autentifikujúcich čip a terminál (Chip Authentication & Terminal Authentication; BSI TR-03110-1). Počítač nachádzajúci sa uprostred nemá prístup k údajom prečítaným z karty, môže mu ich prezradiť len vzdialený terminál.

eID klient ponúka funkciu zobrazenia údajov v čipe občianskeho preukazu. Fotografiu držiteľky či držiteľa, ak je v čipe uložená, možno prečítať off-line po zadaní Card Access Number (CAN kód). Ostatné osobné údaje musí prečítať autentifikačný server, následne ich eID klient zobrazí. Na rozdiel od "skutočnej" on-line autentifikácie obvykle vyžadujúcej PIN kód, zobrazovanie údajov uložených v čipe bolo dlho možné bez zadávania akýchkoľvek kódov. Približne od mája 2023 eID klient na zobrazenie údajov PIN vyžaduje.

Funkciu zobrazenia údajov uložených v čipe bez akýchkoľvek PIN kódov možno považovať za neškodnú, informácie zobrazené na obrazovke napokon možno prečítať z preukazu i voľným okom. Čip a všetky súvisiace protokoly sú však navrhnuté tak, aby informácie prezradili výhradne oprávneným stranám. Webová služba, ktorá zobrazuje informácie z akéhokoľvek preukazu bez potreby PIN kódov robí protokol Extended Access Control do značnej miery zbytočným.

Prístup k tejto webovej službe bol v skutočnosti tak trochu obmedzený. Pri čítaní údajov z čipu eID klient posiela HTTP požiadavku s takouto hlavičkou:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhd
WQiOiJlaWQtYXBpLWd3IiwiY2xpZW50X2lkIjoiZUlEX2tsaWVudCIsImlhdCI6M
TY4NzAwMDQ3MywiaXNzIjoiZUlEX2tsaWVudCIsIm5vbmNlIjoicHNGTm8xTi9VL
zd5dGlFZkdNajkvQ2Nubkt4anQ3ZzVCRGkxVXdzakltRT0ifQ.3TEM0tSfFIXOIt
rbANSW2jvosF6ENyUFAyP4Mkk_32I

Ide o JSON Web Token, ktorý možno nasledovne dekódovať:

{'aud': 'eid-api-gw',
 'client_id': 'eID_klient',
 'iat': 1687000473,
 'iss': 'eID_klient',
 'nonce': 'psFNo1N/U/7ytiEfGMj9/CcnnKxjt7g5BDi1UwsjImE='}

Súčasťou tokenu je autentifikačný kód (HMAC SHA-256). Staršie verzie eID klienta používali fixný 256-bitový MAC kľúč, ktorý sa nachádzal priamo v spustiteľnom súbore. Pretože kľúče možno z programu ľahko extrahovať, ktokoľvek mohol generovať platné "autorizačné hlavičky" a k službe pristupovať.

Nedávne verzie eID klienta prešli z fixného HMAC kľúča na kľúč premenný, ktorý je funkciou fixnej 256-bitovej počiatočnej hodnoty, času and časti samotných autentifikovaných dát. Tento variant nie je o nič bezpečnejší.

Tento vzdialený terminál umožňujúci čítanie údajov z preukazov bez zadávania kódov bol medzičasom fakticky vypnutý. Takýto spôsob prístupu ku kartám však zostáva možným, čipy v preukazoch sú tak naprogramované. Toto správanie je zámerné a zdokumentované:

Niektorí poskytovatelia služieb majú oprávnenie overiť identitu bez zadávania Vášho BOK.

Kontrola prístupu k čipu

Preukazy najnovšej generácie vydávané od decembra 2022 fungujú i bezkontaktne. Takéto karty spravidla na začiatku akejkoľvek interakcie vyžadujú konfiguráciu zabezpečeného komunikačného kanála (secure messaging; ISO/IEC 7816-4, pozri tiež BSI TR-03110-3 Príloha F). Dáva to zmysel, sledovanie bezdrôtovej komunikácie je jednoduchšie.

Existujú dve možnosti ako nastaviť počiatočný zabezpečený komunikačný kanál: Basic Access Control (BAC; ICAO Doc 9303 Časť 11) a Password Authenticated Connection Establishment (PACE; BSI TR-03310-2). Protokol BAC na odvodenie šifrovacích kľúčov používa informácie zo strojovo čitateľnej zóny (machine readable zone; MRZ): číslo dokladu, dátum narodenia a dátum vypršania platnosti. Na prečítanie týchto údajov je spravidla potrebný "fyzický" prístup k preukazu. Protokol BAC je postavený len na symetrickej kryptografii (3DES). PACE, moderný následník protokolu BAC, používa asymetrickú kryptografiu (ECDHE) na odvodenie bezpečných kľúčov napriek nízkej entropii použitého hesla.

Viaceré (ak nie všetky) generácie občianskych preukazov podporovali PACE, vrátane tej najnovšej. Je preto prekvapujúce, že nové karty (niekedy) používajú protokol BAC. Prečo používať BAC, keď je k dispozícii PACE? Slovenské občianske preukazy používajú vskutku špeciálnu verziu protokolu BAC. Táto špeciálna verzia namiesto údajov z MRZ, ktoré sa medzi preukazmi zaručenie líšia, používa ten istý fixný kľúč pre všetky karty. Kto tento kľúč pozná, môže vďaka vlastnostiam BAC dešifrovať ľubovoľný záznam priebehu tohto protokolu. Pretože kľúč je obsiahnutý v spustiteľnom súbore eID klienta, je kľúčom verejným. Takáto verzia protokolu BAC nemôže byť ničím užitočná.

Možnože zmyslom tohto riešenia je možnosť použitia protokolu Extended Access Control a čítanie osobných údajov bez potreby zadávať akékoľvek kódy. Odkedy je spomínaná liberálna webová služba nedostupná (pozri vyššie), je súčasná generácia preukazov prvou, pri ktorej protokol PACE (obyčajne) predchádza protokolom autentifikácie čipu a terminálu (CA & TA). Toto je iba prostá softvérová "oprava" (na strane servera), čipy sú stále naprogramované po starom.

Ktovie, či fixný BAC kľúč môže uľahčiť sledovanie čipov. V každom prípade, niektorí poskytovatelia služieb majú možno oprávnenie čítať údaje z vášho preukazu kedykoľvek je v dosahu.

Šifrovanie PIN kódov

K občianskemu preukazu patria PIN kódy, ktoré slúžia na potvrdzovanie rôznych (citlivých) úkonov. Zobrazenie príslušného grafického rozhrania na zadávanie kódov je úlohou samostatnej Virtuálnej klávesnice, ktorá PIN kód následne odovzdá modulu pracujúcemu s preukazom. Prenos PIN kódu k modulu, ktorý oň žiadal, je zašifrovaný v takejto podobe:

-{WBCvDgMuNDiCP85evglH0w==}-

Šifrovaná forma konkrétneho PIN kódu je rovnaká pri každom jeho zadaní. Možno ju preto použiť na jednoduchý replay útok aj bez porozumenia, ako toto šifrovanie funguje. Keď zachytíte zašifrovaný PIN kód, môžete ho neskôr opakovane použiť aj bez toho, aby ste poznali jeho skutočnú hodnotu. Pretože BOK aj Podpisový PIN musia pozostávať zo šiestich (desiatkových) číslic, existuje presne milión zašifrovaných PIN kódov. Postupným zadávaním kódov možno zostaviť úplnú tabuľku priraďujúcu každému možnému PIN kódu jeho zašifrovanú formu:

000000    -{QKqbHj1c7xWMGFRbn7eoYw==}-
000001    -{vQ0Za98xVf3wyG7gVrG8HQ==}-
000002    -{BCilvRN+SaMmn6niyjgYXw==}-
000003    -{4t95dOqe6QZN8aCVFA1cgQ==}-
000004    -{SHCAmSXoJ2BNMA0kiYrn5w==}-
000005    -{TqjpXE2t4hMksWs0yyF/tw==}-
  ⋮                     ⋮
999999    -{Uw9fyHSENx3TaNSs2nSkMg==}-

Pomocou takejto tabuľky možno ľubovoľný zašifrovaný PIN kód dešifrovať aj bez znalosti kľúča či použitého šifrovacieho algoritmu.

V skutočnosti ide o algoritmus AES v režime ECB a padding podľa PKCS #7. Použitý fixný kľúč má 256 bitov a nachádza sa v spustiteľnom kóde eID klienta. Takéto šifrovanie nemôže byť žiadnym prínosom.

Záver

Vďaka bezpečnému hardvéru a silnej kryptografii používanej protokolom EAC je jadro slovenskej eID platformy pravdepodobne v poriadku. Väčšina problémov, ktoré som opísal, je z hľadiska bezpečnosti nepodstatná.

Pretože takáto zlá kryptografia nič neprináša, nič by nechýbalo, ak by na jej mieste nebola žiadna kryptografia. Napriek tomu môže byť zlá kryptografia horšia ako žiadna, pretože ponúka falošný pocit bezpečia. Tiež vedie k množstvu kódu, ktorý treba napísať, otestovať, odladiť, udržiavať, zdokumentovať a podporovať.

Samotná prítomnosť zlej kryptografie ale predovšetkým narúša dôveru. Ako máme vedieť, či všetka ostatná (dôležitá) kryptografia bola implementovaná správne? Dôveru si nemožno jednoducho udeliť úradným uznesením. Azda by pomohlo úplné zverejnenie špecifikácie a zdrojového kódu. Tomu sa však ministerstvo vyhýba "z bezpečnostných dôvodov". Fundamentálny rozdiel medzi bezpečnosťou a obskúrnosťou si vláda zrejme tiež neuvedomuje.