V aplikácii Moje eZdravie sme identifikovali triviálnu zraniteľnosť, ktorá nám umožnila získať osobné informácie o viac ako 390 000 pacientoch, ktorí boli na Slovensku testovaní na COVID-19 (na demonštráciu sa nám podarilo získať osobné informácie o viac ako 130 000 pacientoch, z toho viac ako 1600 COVID-19 pozitívnych).
Medzi získané osobné informácie každého pacienta patrí meno, priezvisko, rodné číslo, dátum narodenia, pohlavie, mobilné číslo, miesto pobytu, informácie o klinických príznakoch (pneumónia, teplota, kašeľ, malátnosť, nádcha, bolesť hlavy, bolesť kĺbov a svalov), kód vzorky, dátum presného odberu, laboratórium, ktoré daný test vykonalo, lekár žiadateľ, číslo protokolu, dátum prijatia a vyšetrenia, druhy testu a samozrejme jeho výsledok.
Popis zraniteľnosti
Zneužitie uvedenej zraniteľnosti vedúce k úniku viac ako štvrť milióna osobných údajov a výsledkov COVID-19 testov slovenských občanoch bolo možné vďaka nasledujúcim faktorom:
- Únik formátu API volaní verejným vyhľadávačom (ktoré ho zaindexovali)
- Umožnenie neautorizovaného prístupu k samotným volaniam API, ktoré umožňovalo prístup k citlivým informáciám a to bez akejkoľvek autentifikácie
- Možnosť získať informácie o všetkých pacientoch jednoduchou enumeráciou číselného identifikátora
- Absencia akýchkoľvek mechanizmov, ktoré by znemožňovali masívne sťahovanie uvedených údajov
- Všetky dáta boli v nešifrovanej, teda úplne nezabezpečenej forme (v „plaintext“)
Získanie databázy pacientov testovaných na COVID-19
Útočník dokázal k uvedeným údajom všetkých pacientov pristúpiť bez akejkoľvek autentifikácie a tiež bez špeciálnych technických znalostí. Skript na získanie údajov o všetkých pacientov v XML formáte je úplne triviálny:
#!/bin/bash
for (( i=8966; i < 391000; i++ )); do
wget https://mojeezdravie.nczisk.sk/api/cntnt.dnld.php/$i
done
Na získanie celej databázy testovaných pacientov nebol teda potrebný žiadny špeciálny exploit.
Informácie o dátach a potenciálne zneužitie
- Stiahli sme dostatočne veľkú vzorku náhodných dát a analyzovali, že ide o skutočne unikátne záznamy
- Na základe numerických identifikátorov sme odhalili minimálne 391250 validných záznamov (podľa https://korona.gov.sk/ je ich momentálne 393486)
- Identifikovali sme úplne čerstvé záznamy o testovaných pacientoch (pár hodín predtým ako uvedená zraniteľnosť bola opravená)
- Prvý záznam mal identifikátor 8966
- Uniknuté informácie ako meno, priezvisko, rodné číslo, dátum narodenia, pohlavie, mobilné číslo, miesto pobytu či email dokážu byť zneužité na sofistikované cielené útoky sociálneho inžinierstva (phishing, vishing a iné). Využitím ďalších dostupných informácií ako výsledok testu, informácia o zdravotnej poisťovni či názvu laboratória, ktoré vykonalo testy, je možné realizovať sofistikované cielené „scam“ útoky.
Zodpovedné zverejnenie zraniteľnosti
Vzhľadom k tomu, že išlo o veľmi citlivé dáta veľkej časti slovenskej populácie, uvedenú zraniteľnosť sme nahlásili oficiálnym kanálom CSIRT 13.9 o 23:30. K oprave uvedenej zraniteľnosti došlo 16.9 zhruba medzi 16:30-16:50. Až po oprave tejto zraniteľnosti sme sa rozhodli uvedenú zraniteľnosť publikovať.
Záver
Je potrebné sa zamyslieť:
- Prečo tak citlivé informácie o všetkých COVID-19 testovaných pacientoch musia boli vôbec umiestnené na verejnom Internete?
- Prečo neboli nijako anonymizované alebo šifrované?
- Prečo neboli nijako chránené autentifikáciou?
- Prečo neboli zničené informácie o niekoľko mesiacoch starých záznamoch pacientov?
- Ak štát nedokáže ochrániť osobné informácie o všetkých testovaných ľuďoch na COVID-19, prečo si myslíme, že dokáže ochrániť citlivé lokalizačné údaje, ktoré dokáže získať od mobilných operátorov?