API proti epidemii – eRouška a další

logo mobilní aplikace eRouška

Zastavit epidemii? I na to je tu aplikace. S eRouškou jste se nejspíše už setkali. Jde o projekt, který umožňuje bleskurychle a anonymně upozornit na možnou nákazu COVID-19, a tím zpomalit či zastavit šíření epidemie. Jak přesně funguje? A co je potřeba k tomu si jednu takovou aplikaci naprogramovat?

Překotné první krůčky

eRouška není nic nového, už je tady několik měsíců. První dohledatelný commit se datuje k 14. březnu, plná verze 1.0 pak k začátku dubna. Ač šlo o parádní a převratný kód, neměla aplikace moc šancí se uchytit, protože trpěla významnými neduhy. Nedostatečná systémová podpora v podstatě pohřbila rozšíření jinak geniálního nápadu. Podobných aplikací vzniklo nespočet i v jiných zemí, ale žádná z nich nebyla to pravé ořechové.

Zakopali válečnou sekeru a spojili se

Naštěstí si to Apple a Google včas uvědomili. Čtrnáctého dubna společně CEO Applu a Googlu prohlásili, že vyvíjejí systém sledování kontaktů, který bude naprosto transparentní a který umožní pomocí Bluetooth trasovat epidemii nákazy s důrazem na naprostou anonymitu a předem získaný souhlas.

V květnu byla představena první verze API zvané Exposure Notification API.

ilustrace ukazuje dětem důležitost mytí rukou a jiné osobní hygieny v době koronavirové pandemie

Děti a ruce. Obrázek vytvořila Sophie Cane v rámci iniciativy OSN – kreativci pomáhají zastavit šíření COVID-19. Obrázek pochází z https://unsplash.com/photos/56LEbi7CumU

Jak to funguje?

Jsem fanoušek víceúrovňového vysvětlení. Pojďme si tedy hlavní funkci popsat vícekrát. Pokaždé s vyšší obtížností a hlubším vysvětlením. Nakonec si naznačíme, aplikaci typu eRouška vytvořit.

Level obtížnosti 1, vysvětlení pro děti

Téměř každý má dnes chytrý telefon. A tenhle přístroj můžeme použít i ke zjištění, s kým jsme se setkali. Stačí když na pozadí poběží eRouška. Ta si povídá s ostatními eRouškami, a když později některá zjistí, kdo je nakažený, řekne to ostatním.

Level obtížnosti 2, vysvětlení pro středoškoláka

eRouška, ale i další podobné aplikace, používá systém Exposure Notification API. Systém, v překladu nazývaný „Oznámení o expozici“, je navržen tak, že odešle oznámení, pokud jste byli v kontaktu s osobou, která byla pozitivně diagnostikována na COVID-19.

Detailní popis na příkladu, jak to funguje:

  1. Dva lidé, Tomáš Tumáš a Janek Jánechci nakupují ve stejném obchodě v úterý odpoledne. Tomáš má iPhone a Janek Android, každý používají zdravotnickou aplikaci, která používá Exposure Notification API. Nemusí to být nutně eRouška, každá země má jinou aplikaci (v budoucnu by spolu měly umět spolupracovat, viz níže Propojení API napříč státy).
  2. V obchodě je jen jedna prodavačka a fronta je dlouhá. Tomáš a Janek stojí v řadě za sebou a stráví takhle společných 10 minut, a navíc, eRouška časy sčítá. Takže se už mohli potkat u řezníka, kde za sebou stáli taky. Tomáš si doma zapomněl roušku a Janek ji má špatně nasazenou, vypadl mu z ní nos. Nepromluvili spolu a nejspíš si sebe ani nevšimli, ale došlo u nich k neviditelnému kontaktu. Vlastně dvěma, jak se dozvíme později. Během toho času si jejich telefony mezi sebou jako majáky vyměňovaly anonymní identifikátory. Jejich telefony tak ví, že spolu Tomáš a Janek byli v kontaktu. Tuhle informaci si telefony pro sebe uložily, nikam ji dále neodesílají, zůstane anonymně uložena ve dvou přístrojích.
  3. O týden později Tomáš zjistí, že má teplotu nad 37,3 °C, suchý kašel, dušnost, zažívací obtíže a že ztratil chuť a čich. To jsou příznaky, které pokud se nedají vysvětlit jinak, znamenají vysokou pravděpodobnost, že je nakažený onemocněním COVID-19. Tomáš zavolá svému obvodnímu lékaři nebo hygieně, aby zjistil, co dál. Poté, co je objednán na test a potvrdí se, že je COVID-19 pozitivní, přijde mu, dnes už plně automatizovaně, v SMS speciální ověřovací kód. Tenhle speciální kód z něj dělá budoucího hrdinu. V rámci aplikace může (ale nemusí) všem ostatním eRouškám říci, že byl nakažený, ať si zkontrolují, jestli s ním nebyli v kontaktu.
  4. Později toho samého dne si Jankův telefon na pozadí stáhne seznam všech anonymních identifikátorů, které v posledních 14 dnech patřily lidem, u kterých se teď prokázalo, že jsou nakažení. Jankův telefon začne porovnávat stažený seznam se seznamem, který sám nasbíral a má ho interně uložený. Ha, shoda! Musím Janka upozornit notifikací.
  5. Janek nevěřícně zírá na notifikaci, přece byl jen s Lenkou a Májou a ty jsou určitě zdravé. To musí být omyl. Jenže Janek pořádně nikdy nevěděl o Tomášovi, který za ním stál před deseti dny v obchodě. A telefon mu nemůže říci, kdo byl nakažený, protože ani sám telefon to neví. Telefon ale ví, že v minulých dnech byl ve vzdálenosti tak blízké, že dokázal zaznamenat signál Bluetooth a ví, že to trvalo alespoň 15 minut (to je nastavení české eRoušky, API umožňuje i větší citlivost, tedy 10 minut).
  6. Jankovi to nedá a zavolá svému lékaři, který jej objedná na test.
  7. Když se později zjistí, že i Janek je nakažený, celý proces se opakuje. Janek ale být nakažený nemusí, pouhá přítomnost v okolí nakaženého automaticky neznamená, že dojde k nákaze.

Level obtížnosti 3, vysvětlení pro studenta

Exposure Notification API používá po 10 minutách se generující identifikátory, které nenesou žádné identifikovatelné informace spojitelné s majitelem, a které telefon vysílá do okolí. Po dobu 14 dní se na každý telefon s aplikací sloužící ke sledování kontaktů ukládají identifikátory, které telefon každých deset minut vygeneruje, a stejně tak všechny identifikátory, které Bluetooth přijme z okolí.

Seznam uložených identifikátorů bez vědomí uživatele nikdy neopouští telefon. Je nutný souhlas uživatele. Uživatelé nemůžou být jakkoli identifikováni ostatním uživatelům, ani společnostmi Apple nebo Google. Veškeré porovnávání identifikátorů se provádí na zařízení. Identifikátory starší než 14 dní se mažou.

Level obtížnosti 4, zjednodušené vysvětlení pro experta

Upozornění: pokud Vám tento popis přijde příliš složitý, přeskočte do další sekce.

Generování klíčů

Telefon průběžně generuje a pomocí Bluetooth vysílá pseudonáhodné identifikátory, označované jako Rolling Proximity Identifier (dále jen RPI, do češtiny přeložitelné jako Pohyblivý identifikátor blízkosti). Každý z nich je odvozený z klíče označovaného Rolling Proximity Identifier Key (dále jen RPIK) a ten je derivátem z Temporary Exposure Key (dále jen TEK, do češtiny přeložitelné jako Dočasný klíč o expozici), který ale zároveň nese reprezentaci času.

RPI se mění ve stejný čas jako randomizovaná Bluetooth adresa, aby se zamezilo zpětné detekci a bezdrátovému sledování útočníkem. Associated Encrypted Metadata (dále jen AEM, přeložitelné jako Přidružená šifrovaná metadata) přímo souvisí s RPI. Data jsou zašifrovaná a můžou být v budoucnu dešifrována za předpokladu pozitivního testu.

Čas je ukládán jako ENIntervalNumber v desetiminutových intervalech, výpočet vychází z Unixového času a umožňuje zpětnou konverzi.

TEKRollingPeriod určuje, jak dlouho zůstane TEK validní, perioda jako taková je definována jako 144, a tedy s 10minutovými intervaly umožňuje klíči zůstat validní po 24 hodin.

Každý TEK je náhodně vygenerovaný za pomocí 128bitové AES šifry. A všechna zařízení generují TEK ve stejnou dobu.

Pozitivní diagnóza

V případě, že dojde k pozitivnímu testu a diagnóze, omezený počet TEK klíčů (v současnosti 14 dnů, ale to se může v budoucnu změnit) a jejich přidružené ENIntervalNumber se nahraje na diagnostický server. Oba klíče se dále nazývají jako Diagnosis keys (dále jen DK, do češtiny přeložitelné jako Diagnostické klíče). TEK tedy neopouští uživatelovo zařízení, jen a pouze v případě pozitivní diagnózy.

Aby bylo možné zjistit expozici, každé zařízení si periodicky stahuje seznam nových DK. Zařízení pak za pomocí diagnostických klíčů získá 144 RPI začínajících od ENIntervalNumber (14denní interval). Klientské zařízení páruje takto získaná RPI spolu s RPI, které si uložilo v minulosti pomocí Bluetooth skenování okolí. V současné chvíli existuje +/- dvouhodinová tolerance mezi RPI z DK a mezi RPI na zařízení. (Pozn. autora: zjišťoval jsem proč, a předpokládá se, že člověk, který jde na test, se nenakazí 2 hodiny před ním, ale teoreticky k tomu může docházet. Vnímám to jako možnou zranitelnost systému.)

Zašifrovaná data AEM se dešifrují jen pokud dojde ke shodě.

Level obtížnosti 5, úplná specifikace

Nemá smysl přepisovat dokumentaci, jednotlivé části jsou specificky popsány v následujících PDF souborech:

Co říká dokumentace o soukromí a o ochraně osobních údajů

  • Žádné identifikační údaje — Vaše jméno, email či další informace nejsou nikdy sdíleny ani přidruženy k aplikacím, které používají rozhraní API pro sledování expozice.
  • Žádná data o poloze — Systém neshromažďuje, nepoužívá ani nesdílí údaje o poloze. Oznámení o expozici neslouží ke sledování, kde se lidé nacházejí, nýbrž k určení, zda osoba byla v blízkosti jiné osoby.
  • Náhodné identifikátory — Vašemu telefonu je přiřazen náhodný rotující identifikátor (řetězec čísel), který je přenášen pomocí Bluetooth do dalších zařízení v okolí. Identifikátory se mění každých 10 minut.
  • Provoz v zařízení — Váš telefon si ukládá cizí identifikátory, které přijímal aspoň 10 minut. Cizí telefony si uloží váš identifikátor, pokud jej přijaly aspoň 10 minut po sobě. Tím se vyloučí letmé kontakty (potkání se na chodníku). Identifikátory zůstanou uloženy v patřičném telefonu a bez souhlasu se nikam jinam nenahrávají.
  • Sdílení založené na souhlasu — Pokud budete mít pozitivní test na COVID-19, lidé, s nimiž jste byli v kontaktu, neobdrží upozornění bez vašeho výslovného souhlasu.
  • Shoda identifikátorů v zařízení — Pokud se setkáte s COVID-19 a souhlasíte se sdílením těchto informací, seznam vašich identifikátorů z posledních dvou týdnů se nahraje na centrální server. Seznam mohou ostatní zařízení zkontrolovat a identifikovat shodu na svých zařízeních.
  • Opt-in — Oznámení o expozici je zcela opt-in, tj. nic se neinstaluje a nespustí, dokud k tomu nedáte pokyn stažením aplikace, která používá API. Taky to nebude fungovat, pokud vypnete možnost Oznámení expozice v aplikaci Nastavení.
  • Sdílení dat s Apple / Google — Apple a Google neobdrží identifikační informace o uživatelích, údaje o poloze, ani o žádném jiném zařízení, se kterým byl uživatel v blízkosti.
  • Monetizace dat — Apple a Google nebudou monetizovat projekt oznámení expozice.
  • Pouze ověřené aplikace pro zdraví — API mohou používat pouze orgány veřejného zdraví po celém světě. Aplikace musí splňovat konkrétní kritéria týkající se ochrany soukromí, zabezpečení a kontroly dat. Aplikace mohou přistupovat k seznamu identifikátorů poskytovaných uživateli pozitivně otestovanými na COVID-19, kteří povolili sdílení. Ke sdílení osobních identifikačních údajů nedochází nikdy.
  • Deaktivace oznámení o expozici — Apple a Google mohou systém oznámení o expozici deaktivovat na regionální úrovni, když již není potřeba.
lidé se koukají ze svých domovů a tvoří jeden velký koncert

Balkonové koncerty. Obrázek vytvořila Catherine Cordasco v rámci iniciativy OSN – kreativci pomáhají zastavit šíření COVID-19. Obrázek pochází z https://unsplash.com/photos/gMPsl1ez-Ts

Pojďme si vyrobit aplikaci pro trasování kontaktů

Cílem tohoto článku není vyrobit kompletní trasovací aplikaci, pojďme se tedy zaměřit jenom na klíčové body.

Existují dva referenční návrhy, od Googlu pro Android zařízení a od Apple pro iOS zařízení.

Protože nejvíce čtenářů bude nejspíš zajímat přímo kód eRoušky, přikládám k jednotlivým sekcím ukázku kódu z aplikace pro Android.

Krok první: autorizace API

Hned po instalaci musí aplikace ověřit, že se uživatel rozhodl využívat Exposure Notification API. Stejně tak musí docházet k pravidelné kontrole, že aplikaci zůstala autorizace (jde ji vypnout v nastavení).

Odkaz na kód: LocalNotificationsHelper

Nezapomeňte se připomenout!

A samozřejmě, je třeba uživateli repetitivně připomínat, aby si eRoušku zase zapnul. Ale jen mezi 9. a 19. hodinou 😅

val hour = Calendar.getInstance(Locale.getDefault()).get(Calendar.HOUR_OF_DAY)
if (hour in 9..19) {
    if (!exposureNotificationsRepository.isEnabled()) {
        LocalNotificationsHelper.showErouskaPausedNotification(context)
    }
}

Odkaz na kód: SelfCheckerWorker

Krok druhý: sdílení diagnostických dat se serverem

Uživatel s pozitivní diagnózou COVID-19 musí mít možnost nahrát diagnostické klíče na server. Naopak aplikace musí pravidelně stahovat cizí diagnostické klíče ze serveru, aby mohla prohledávat lokálně uložené identifikátory a hledat shody.

Před tím, než se diagnostické klíče nahrají na server, aplikace musí uživatele požádat o svolení. Plus konkrétně v případě eRoušky musí existovat UI, které řeší zadávání ověřovacího kódu z hygieny před sdílením diagnózy, ale tuto část zde přeskočme.

Krok třetí: stahování diagnostických klíčů

Aplikace pravidelně stahuje diagnostické klíče (uživatelů diagnostikovaných na COVID-19) ze serveru, začíná se vždycky prvními klíči, které ještě nebyly staženy. Design aplikace by měl být navržen tak, aby se každý diagnostický klíč stahoval pouze jednou.

Odkaz na kód: DownloadKeysWorkerAnalytics

Krok čtvrtý: úloha na pozadí, která kontroluje expozici

Aplikace používá úlohy na pozadí k pravidelné kontrole, zda uživatel mohl být vystaven jednotlivci s COVID-19. Operační systém zajišťuje automatické spouštění úloh a přiděluje jí dostatek času na pozadí na porovnání nových identifikátorů s diagnostickými klíči a nahlášení případné shody.

Odkaz na kód: Receiver → funkce checkExposure

Krok pátý: výpočet odhadu rizika

Aplikace porovnává lokálně uložená data Bluetooth interakcí s diagnostickými klíči ze serveru. Když rozhraní najde shodu, spočítá „rizikové skóre“ pro tuto interakci. V úvahu se bere řada různých faktorů, například kdy došlo k interakci, jak dlouho byla zařízení ve vzájemné blízkosti a jaká byla přibližně vzdálenost (z útlumu Bluetooth signálu).

Ukázka dat pro odhad rizika

Teoretická ukázka dat přijatých ze serveru, která se používají k odhadu rizika.

{
  "minimumRiskScore": 0,
  "attenuationDurationThresholds": [50, 70],
  "attenuationLevelValues": [1, 2, 3, 4, 5, 6, 7, 8],
  "daysSinceLastExposureLevelValues": [1, 2, 3, 4, 5, 6, 7, 8],
  "durationLevelValues": [1, 2, 3, 4, 5, 6, 7, 8],
  "transmissionRiskLevelValues": [1, 2, 3, 4, 5, 6, 7, 8]
}

Odkaz na kód: AppConfig

Kam se podělo generování klíčů a komunikace s ostatními Bluetooth telefony?

Možná se ptáte, kam se podělo generování klíčů a vyřizování komunikace s ostatními Bluetooth telefony. Toto už oproti první verzi dělá operační systém (resp. Exposure Notification API) sám o sobě. Aplikace pouze zajišťují ukládání dat, kontrolu, odhad rizika a odesílání dat.

různé dveře do různých domovů, zůstávají sice zavřené, ale ani to nebrání touze pomáhat

Laskavost. Obrázek vytvořil Joystick Interactive v rámci iniciativy OSN – kreativci pomáhají zastavit šíření COVID-19 ve spolupráci s Talenthouse. Obrázek pochází z https://unsplash.com/photos/DIijTuIOYvA

Limity technologie

Bez certifikátu to nejde

Kdybyste si chtěli udělat svůj vlastní build eRoušky, rychle zjistíte, že to bez certifikátu nepůjde. Jasně, bylo by supr, kdyby bylo možné, aby si každý, kdo chce, udělal svou vlastní aplikaci. Bohužel je nutná existence centrálního serveru. Bez něj to nejde, protože by lidé mohli posílat falešná hlášení o své pozitivitě, což by položilo celý systém.

Navíc aby aplikace mohla používat Exposure Notification systém, musí být schválena Applem a Googlem s tím, že musí dodržovat přísná pravidla, kde se mimo jiné dočtete, že pro jednu zemi může existovat právě jedna aplikace.

Generování falešné pozitivity

Narůstající popularitě aplikací pro trasování kontaktů si všimla vědecká oblast. 30. září se objevil vědecký článek testující aplikace v reálném nasazení.

Experiment se zaměřil na testování v jedoucí tramvaji a byly použity švýcarské, německé a italské aplikace pro trasování kontaktů, všechny využívající Google/Apple Exposure Notification API ve verzi 1.3.2.

Závěry nebyly pro API zrovna přívětivé. Studie nalezla jen velmi nízkou korelaci mezi přijatou sílou signálu a vzdáleností mezi přístroji. Důvodem byl pravděpodobně odraz kovových stěn, stropu a podlahy tramvaje. Po celou dobu studie švýcarská a italská aplikace nezaznamenala žádné oznámení o expozici. Zato italská u mobilů ve vzdálenosti do 2 metrů měla 50 % falešně pozitivních, což je asi jako hodit si mincí.

Z výzkumu je zřejmé, že pro některé případy (jízda tramvají či vlakem), je stále třeba najít lepší data pro odhad rizika. Sebelepší aplikace ale nemůže poznat, zda mají kontakty na sobě roušky, zda došlo k přímému dotyku a jestli si dotyční předtím umyli ruce.

Odkaz na studii: https://doi.org/10.1371/journal.pone.0239943

Propojení API napříč státy

Ke dni vydání tohoto článku stále není hotové propojení aplikací napříč státy. To možná není tak výrazný problém v USA, ale v zemích EU už to přináší jisté komplikace. Každá země má svůj vlastní server, který spravuje diagnostické klíče a servery jednotlivých zemí mezi sebou nekomunikují. Existuje však iniciativa k propojení těchto aktivit.

Užitečné odkazy a zdroje

Poděkování

Tento článek byl konzultován s Davidem Vávrou a Michalem Krskem, členy týmu eRouška a také s Radimem Štefanem, technickým nadšencem. Tímto všem moc děkuji za přečtení prvních verzí článku.

sestřičky a doktoři děkují, že dodržujete doporučení

Děkujeme. Obrázek vytvořila Vanessa Santos v rámci iniciativy OSN – kreativci pomáhají zastavit šíření COVID-19. Obrázek pochází z https://unsplash.com/photos/EJrK0J8Jr7U

Komentáře: 9

Přehled komentářů

Doli
hawran.diskuse Re:
Jan Šablatura Re:
hawran.diskuse
hawran.diskuse
Karel Novotný Objem dat
Martin Hassman Re: Objem dat
Roman Daniel
John_Pitralon Je tohle vůbec legální?
Zdroj: https://www.zdrojak.cz/?p=24063