Sånn jobba utviklerne i fagrådet til Smittestopp-appen

Johannes Brodwall om kryptografiske diskusjoner. - Imponert over hvor åpent det har vært!

Helse- og omsorgsminister Bent Høie (H) med den nye Smittestopp-appen.
📸: Ørn E. Borgen / NTB Scanpix
Helse- og omsorgsminister Bent Høie (H) med den nye Smittestopp-appen. 📸: Ørn E. Borgen / NTB Scanpix Vis mer

Den 16. april, 2020 annonserte den norske statsministeren smittesporings-appen Smittestopp (heretter “Smittestopp 1.0”).

Jeg var blant de tidlige kritikerne av appens innsamling av sensitive persondata og lite transparente utviklingsløp.

Smittestopp 1.0 hadde et kort og turbulent liv. I juni ble den til slutt rangert av Amnesty International som en av de tre mest personverns-inngripende appene i verden (sammen med Bahrain og Kuwait), Datatilsynet nedla forbud mot innsamling og stortinget krevde at appen ble splittet.

Så kom sommeren med lave smittetall og alt var stille.

I oktober annonserte Folkehelseinstituttet (FHI) at de skulle bygge en ny smittesporings-app. Denne gangen med personvern i fokus.

Jeg er glad for at jeg fikk delta i appens (pro-bono) fagråd, se hva som ble laget og komme med råd og innspill underveis.

Det viktigste med Smittestopp 2.0 er at den ikke samler inn data utover det som trengs for å spore smitte. Men det som imponerte meg mest med prosjektet var hvor stort fokus FHI la på åpenhet i prosessen og produktet.

I denne artikkelen deler jeg en spennende teknisk utfordring jeg og flere kunne ta på oss som et resultat av åpenheten.

I starten av arbeidet, foreslo kryptologene Tjerand Silde ved NTNU og Martin Strand ved FFI en forbedring av anonymiteten i appen gjennom snedig bruk av kryptografi. Hold deg fast, dette blir en krevende forklaring!

Bind for øynene

En smittesporings-app skal kunne advare deg om at du kan ha vært utsatt for smitte uten å eksponere personlige data om deg.

Selv myndighetene bør hindres fra å kunne granske dine kontakt- og bevegelsesdata.

I Singapore har pressen nå annonsert at politiet kan granske kontaktdata for personer de mistenker for lovbrudd. Dette undergraver tilliten til løsningen, til myndighetene og er ikke forenelig med appens formål.

Samtidig ønsker vi å sikre at det kun er smittede personer som varsler andre om smitte slik at bøller ikke kan lage falske smittevarsler.

«Forslaget til Silde og Strand bruker avansert matematikk for å sikre FHI blinder seg selv fra å vite hvilken person et sett med kontaktdata stammer fra.»

Forslaget til Silde og Strand bruker avansert matematikk for å sikre FHI blinder seg selv fra å vite hvilken person et sett med kontaktdata stammer fra.

Dette fungerer ved at appen genererer et tilfeldig tall (et “token seed”) som den sender til den serveren som autentiserer brukeren mot ID-porten og sjekker smittestatus i MSIS (Meldingssystemet for smittsomme sykdommer).

Serveren signerer denne “seeden” kryptografisk, og sender den signerte verdien til appen. Appen obfuskerer denne verdien før den benytter den til å autorisere API-kallet som laster opp brukerens kontaktinformasjon. På denne måten kan backenden verifisere at brukeren er en person som er smittet med COVID-19, men det er ikke mulig å spore den randomiserte token tilbake til “token seed”, så brukeren kan ikke re-identifiseres med tokenen. (Det finnes fortsatt en risiko for reidentifisering via trafikk-analyse, men det er en separat problemstilling).

Løsningen er beskrevet i detalj på Github-repository som implementere protokollen i C#.

"Forslag er velkomne"

Diskusjonen rundt forslaget var veldig interessant, både når det gjelder teknologi og personvern.

Når fagrådet først foreslo løsningen for FHI var det stor aksept for at det i prinsippet er bedre om FHI kan unngå å besitte informasjon om hvem kontaktinformasjon fra appen tilhører.

Fagrådet tok med Tjerand og Martins forslag til det ukentlige arkitekturmøtet som FHI hadde invitert oss til. På møtet ble “vi”, det vil si fagrådet, Tjerand, Martin og hvem vi kunne oppdrive, oppfordret til å sende en pull-request med de nødvendige endringene. Martin og Tjerand ble også invitert til fremtidige tekniske møter.

«Til slutt var det jeg som måtte ta koden over målstreken.»

Et åpent samarbeid

Uheldigvis er Smittestopp skrevet i et språk der verken Tjerand eller Martin har erfaring, og der jeg selv er rusten.

Heldigvis rakk Henrik Walker Moe i Bekk hånden i været og hjalp Martin og Tjerand å oversette demokoden deres for anonyme tokens fra Go til C#. Og publiserte det som en NuGet-pakke.

Sammen med FHI-arkitekt Sindre Møgster Braaten startet Henrik å integrere koden inn i appen og de to server-komponentene. Uheldigvis gikk Henrik tom for tid før han kom i mål med alt.

Til slutt var det jeg som måtte ta koden over målstreken og integrasjonsteste pull requester for de tre komponentene. Det tok et par sene kvelder, og jeg måtte installere Visual Studio for første gang på et par år, men det var også veldig artig.

FHI har opprettet en Slack-gruppe for alle som har lyst til å følge utviklingen av Smittestopp og her fikk jeg hjelp av Martin, Tjerand og Henrik som frivillige, Sindre fra FHI, samt flere av NetCompany sine utviklere som leverer appen.

Her kan du se en video av løsningen der jeg varsler smitte og bruker den kryptografiske koden for å anonymisere brukeren etter pålogging med ID-porten. Videoen er rimelig teknisk og jeg tok den opp klokken ett på natten, så ikke ha for store forhåpninger om kvaliteten:

Verdien av transparens

Ved å bygge Smittestopp som en open source-applikasjon så har FHI gjort det mulig for alle å se hva som lages. Du kan selv se koden på github.com/folkehelseinstituttet.

I tillegg til dette tillater åpenheten bidrag fra utsiden både når det gjelder idéer og kode. Det betyr at ønsket vårt om høyere personvern kunne innfris, selv om dette ikke nådde opp til toppen av FHI sine prioriteringer.

Koden som vi utviklet for Smittestopp er også åpen for andre som vil bruke anonyme tokens i forbindelse med smittesporing eller andre formål.

Som en sideeffekt av å implementere funksjonalitet som spenner over hele løsningen fikk jeg sjansen til å utforske mye av koden i Smittestopp. Som med ethvert prosjekt var det ting jeg hadde lyst til å endre, men i det store og hele var jeg fornøyd med det jeg så.

Jeg er imponert over hvor åpent Smittestopp-teamet har vært. Ikke bare har de publisert kildekoden, men koden på Github er faktisk den som teamet jobber med selv.

Oppgavene til NetCompany utføres som pull requests som er synlige for alle. Byggserveren som brukes til interne bygg verifiserte også mine commits på mine pull requests og når NetCompany teamet merget min pull request kom det inn i kodenbasen der de jobber.

Tilsvarende har prosjektstyringen i Smittestopp vært åpen. Ikke bare har FHI rekruttert et uavhengig fagråd, men de har også publisert møtereferatene åpent på fhi.no. Ikke bare har de involvert fagrådet, men de har opprettet en Slack workspace der alle som ønsker kan bli invitert og komme med innspill, feedback og bekymringer.

Transparens på dette nivået krever innsats. Men som FHI selv har bemerket: Å håndtere innsynsbegjæringer og negativt offentlig falkeblikk har også en kostnad. Ved å være proaktivt åpen bytter man ut negativ oppmerksomhet med positiv oppmerksomhet.

Et nyttårsønske

Smittestopp ble tilfeldigvis lansert på bursdagen min.

Å få leke med kildekoden og forhåpentligvis se at mange i Norge laster ned appen er en kjempefin bursdagsgave.

Har du lastet ned appen ennå? Hvis ikke håper jeg du vil gjøre det nå.