OstaniZdrav - slovenska aplikacija za sledenje stikom
Matej Kovačič
21. avg 2020 ob 22:17:06
Od tega tedna dalje je v Googlovi trgovini Play na voljo slovenska aplikacija za sledenje stikom, ki jo je pripravilo Ministrstvo za javno upravo v sodelovanju z Nacionalnim inštitutom za javno zdravje. Aplikacija za iOS bo na voljo kmalu. Aplikacija, ki jo najdemo pod imenom #OstaniZdrav je prevod nemške aplikacije Corona Warn App, ki na Androidu uporablja Googlove, na iOS pa Applove API vmesnike za sledenje stikom.
Za delovanje aplikacije moramo imeti vključeno tehnologijo Bluetooth, zaradi tehničnih razlogov pa aplikacija zahteva dovoljenje za pridobivanje lokacije, čeprav aplikacija lokacije same (GPS) ne beleži. Preko Bluetootha je namreč (teoretično) mogoče ugotoviti lokacijo, zato je za aktivacijo Bluetootha aplikaciji potrebno dodeliti pravico za dostop do lokacije, čeprav aplikacija sama lokacijskih podatkov ne pridobiva.
Aplikacija je odprtokodna, njena izvorna koda je objavljena na Githubu in tam lahko tudi preverimo, da aplikacija lokacijskih podatkov res ne pridobiva.
Kako deluje?
Aplikacija vsakih 24 ur generira naključni dnevni ključ (TEK - Temporary Exposure Key), ki se hrani v telefonu 14 dni. Vsakih 15 minut nato aplikacija s pomočjo kriptografskih algoritmov zgenerira tim. oddajno kodo RPI (Rolling Proximity Identifyer), ki se nato izmenjuje med mobilnimi telefoni preko Bluetootha. Oddajne kode drugih telefonov v bližini, ki jih aplikacija zazna, se ne pošiljajo nikamor, pač pa ostanejo shranjene v aplikaciji. Evidenca stikov se sicer iz telefona samodejno pobriše v 14 dneh, saj po tem času hramba podatkov zaradi preteka inkubacijske dobe ni več upravičena.
V primeru, da je uporabnik aplikacije okužen, mu bo epidemiolog po telefonu posredoval 10-mestno naključno potrditveno kodo teleTAN, ki je veljavna eno uro. Okužena oseba bo nato to kodo prostovoljno vnesla v aplikacijo. V zadnjem koraku, pa bo okužena oseba potrdila, da daje soglasje, da aplikacija svoje dnevne ključe pošlje na strežnik.
S tem se prepreči, da bi kakšen nadebuden učenec lažno označil, da je okužen in posledično dosegel zaprtje celotne šole. A po drugi strani je pošiljanje informacije o tem, da si okužen popolnoma prostovoljno, niti nihče ne preverja ali je okuženi uporabnik v telefon vnesel posredovano teleTAN kodo. Prav tako se lahko zgodi, da okužena oseba ne bo dala soglasja, da aplikacija na strežnik (na seznam okuženih dnevnih ključev) pošlje njene naključne dnevne ključe. Zato ni nujno, da bo informacija o tveganem stiku sploh prišla do drugih uporabnikov.
Kako aplikacija ugotovi, da ste bili v stiku z okuženo osebo?
Aplikacija bo iz strežnika vsak dan prenašala seznam okuženih dnevnih ključev in na podlagi analize ugotovila, ali je bil mobilni telefon uporabnika v stiku z mobilnim telefonom okužene osebe. Na podlagi različnih parametrov (med drugim tudi oddaljenosti stika in času izpostavljanja) bo nato aplikacija izračunala ogroženost in uporabnika obvestila o stopnji njegove ogroženosti.
V primeru, da bo uporabnik aplikacije ugotovil, da je bil izpostavljen tveganemu stiku, se ta informacija ne pošilja nikamor. Pri NIJZ so pojasnili, da izpostavljenih stikov ne bodo testirali niti jim ne bodo odrejali karantene, se pa lahko oseba odloči za samoizolacijo ter je bolj pozorna na simptome. Skratka, aplikacija nas bo zgolj opozorila na tvegan stik, kakšnih konkretnih posledic za posameznika, ki je bil tveganemu stiku izpostavljen, pa ne bo.
Aplikacija je torej zasnovana tako, da skuša z izmenjavo anonimnih identifikacijskih številk (ki se poleg tega še spreminjajo), zaznati tvegane stike. Pri tem pa naj ne bi bilo mogoče ugotoviti kateri stik je bil tvegan, niti kje je do njega prišlo.
Ob tem je seveda kar nekaj predpostavk - da bo aplikacijo imelo nameščeno dovolj veliko število posameznikov, da bodo imele te osebe mobilni telefon vedno pri sebi (kaj če je okužena oseba recimo v bazenu), da bodo okuženi posamezniki v aplikacijo dejansko vnesli teleTAN kodo ter da bodo v tem primeru dovolili, da aplikacija njihove dnevne ključe pošlje na strežnik.
Varnostna ranljivost
Dodatno težavo pa predstavlja tudi dejstvo, da so v nemški Corona Warn App na začetku julija odkrili varnostno pomankljivost, ki je zaradi napake v kriptografski implementaciji omogočala razkritje ali je neka oseba okužena z virusom ali ne.
Raziskovalci so namreč ugotovili, da ko uporabnik, ki je potrjeno okužen, sproži postopek nalaganja svojih dnevnih ključev na strežnik, aplikacija na strežnik pošlje od enega do 13 ključev. Čeprav je promet med mobilnim telefonom in strežnikom šifriran, pa napadalec lahko v omrežju vseeno prestreže podatkovne pakete in na podlagi količine podatkov ugotovi, koliko dnevnih ključev je najverjetneje posredovanih strežniku. S tem lahko ugotovi, da je uporabnik okužen, oziroma okuženega uporabnika deanonimizira.
Rešitev je sicer razmeroma preprosta, potrebno je implementirati tim. zapolnjevanje (angl. padding), s čimer dosežemo, da zunanji opazovalec iz dolžine šifriranih podatkov ne more ugotoviti njihove vsebine.
Nemška Corona Warn App je popravek, ki omogoča verodostojno zanikanje (angl. plausible deniability) implementirala v začetku avgusta, slovenska aplikacija pa tega popravka nima, saj je kodo nemške aplikacije prevzela že pred implementacijo navedenega popravka.
Kaj pa varnostna posodobitev?
Ocenjujemo sicer, da opisana ranljivost ni zelo problematična, saj jo v praksi ni prav enostavno zlorabiti. Vseeno pa kaže na večjo težavo v ozadju. Odprtokodni projekti sicer res temeljijo na že napisani kodi, vendar pa ne smemo pozabiti, da je tudi originalno kodo potrebno vzdrževati. Programska oprema ni kot kos zemljišča, ki ga kupimo in nato imamo, pač pa je pomembno, da zagotovimo ustrezno strategijo vzdrževanja. To je pomembno še zlasti v primeru varnostnih posodobitev.
Ministrstvo za javno upravo je 12. 7. 2020 objavilo javno naročilo za vzpostavitev mobilne aplikacije COVID-19 - opozorilnik.
Ena izmed zahtev razpisa je tudi sodelovanje izvajalca pri varnostnih testih in odprava morebitnih varnostnih pomanjkljivosti, pri čemer je veljavnost sklenjene pogodbe do 31. 12. 2020.
Iz objavljene razpisne dokumentacije sledi, da se je naročnik (MJU) zavezal, da bo poskrbel za varnostne preglede kode, vzpostavitev zalednega sistema na katerega se bo mobilna aplikacija povezala, Enotni Kontaktni Center (kamor lahko pokličejo uporabniki) ter funkcionalno in varnostno testiranje mobilne aplikacije.
Glede na to, da je bila v končno kodo slovenske aplikacije sprejeta različica nemške aplikacije brez varnostne posodobitve, ki omogoča verodostojno zanikanje, se postavlja vprašanje ali je MJU sploh opravil kakšen varnostni pregled aplikacije ali pa gre samo za mrtvo črko na papirju razpisne dokumentacije? Varnostni pregled aplikacije bi namreč moral ugotoviti, da je bil v originalno aplikacijo implementiran varnostni popravek, ki ga v slovenski različici še ni.
Ob vsem skupaj ni zanemarljivo, da je vrednost pogodbe, ki jo je MJU podpisalo s podjetjem RSTeam zgolj 4026 EUR (z DDV!), kar je bistveno premalo za kakršnokoli resno varnostno testiranje oz. resen razvoj produkta, ki je odvisen od pravilne implementacije kriptografskih rešitev.
Precej verjetno je, da je podjetje RS Team v posel šlo predvsem zaradi promocije in referenc in manj zaradi denarja, a tako kot na ostalih področjih tudi tukaj velja, da za malo denarja dobimo malo muzike. Podjetje je svoj del posla vsekakor opravilo povsem korektno, a za dobrih 4000 EUR pač ne moremo pričakovati čudežev.
Ob vsem skupaj se zato ne moremo znebiti vtisa, da je bila odločitev za uvedbo aplikacije sprejeta premalo premišljeno in predvsem zato, da odločevalci lahko rečejo, da so nekaj naredili. Ali bo bo "nekaj" imelo ustrezne učinke, pa je žal povsem drugo vprašanje.