Udvikler demonstrerer elegant og automatiseret NemID-angreb
Med moderne værktøjer og lidt teknisk snilde er det nemt og hurtigt at lave en fup-hjemmeside, der kan franarre danskerne deres NemID-oplysninger. Og det kan for eksempel give en cyberkriminel adgang til at logge ind i andres navn og rette i skatteoplysninger på skat.dk, lure i sundheddata på sundhed.dk eller slet og ret afgive støtte til et borgerforslag på borgerforslag.dk
Søren Louv-Jansen, der til dagligt arbejder som softwareudvikler, har lavet en test-hjemmeside for at demonstrere, hvor let sådan et angreb kan udføres.
Angrebet udnytter en grundlæggende svaghed i NemID-designet. Nemlig at brugeren i udgangspunktet ikke har nogen mulighed for visuelt at vurdere, hvorvidt en NemID-loginboks indlejret på en hjemmeside er falsk eller ægte.
NemID optræder som bekendt i mange sammenhænge, eksempelvis på gambling-sider. Så der er som sådan ikke noget usædvanligt i, at en privat hjemmeside kan bede brugeren om at validere sig via på den måde.
Men i princippet kan det være alt fra cyberkriminelle ude efter penge til fremmede stater ude efter oplysninger, der står bag login-boksen. Uanset om det er det ene eller det andet, så kan angriberen via en falsk login-boks franarre folk NemID-brugernavn og -kodeord. Disse oplysninger sætter angriberen så i en legitim NemID-boks i eksempelvis netbanken eller på borger.dk.
Denne legitime boks svarer nu tilbage med en besked om, at brugeren skal godkende via nøglekort eller den relativt nye NemID-app.
Angriberen sender disse info videre til den intetanende bruger, der nu godkender via app eller indtaster koden fra nøglekortet på fup-sitet, hvorefter angriberen bruger dette input til at få adgang til eksempelvis brugerens netbank.
Medlemsklubben.dk
Søren Louv-Jansen står bag hjemmesiden medlemsklubben.dk, der er udstyret med en falsk NemID-boks, som demonstrerer problemet.
Hjemmesiden ser umiddelbart troværdig ud og er tilmed udstyret med en grøn hængelås i browserens adressebar. Sådan en indikerer jo som bekendt at forbindelsen er krypteret. Flere Version2-læsere ved, at en angriber sagtens kan stå bag en hjemmeside, selvom den har en grøn hængelås. Men hængelåsen vil utvivlsomt give flere brugere et indtryk af, at alt er i den skønneste orden.
»Det er jo ikke noget nyt problem, men jeg var bare irriteret over, at hver gang, jeg tastede mit brugernavn og min adgangskode ind på forskellige sites, så havde jeg ingen mulighed for at vide, om de opsnappede (red. brugernavn og adgangskode) eller ej. Så jeg følte egentlig, jeg gav mine oplysninger ud til alle og enhver, og det kan jeg ikke lide som teknisk kyndig person,« fortæller Søren Louv-Jansen.
For nyligt introducerede Google muligheden for at køre en headless Chrome-instans på Google App Engine (GAE). Det vil sige en udgave af den populære browser i skyen, der via kode kan fjernstyres til eksempelvis at udfylde data i en NemID-boks.
Og det gjorde det lige til at lave en automatiseret demonstration af angrebet på medlemsklubben.dk. Automatiseret vil her sige, at det ikke er nødvendigt med menneskelig interaktion fra angriberens side - eksempelvis i forhold til at indtaste det opsnappede kodeord i en legitim NemID-boks.
»Det gjorde det pludseligt meget nemmere at lave et angreb,« fortæller han.
Søren Louv-Jansen vurderer, det har taget ham et par timer at sætte et fungerende angreb sammen, og lidt længere tid at finpudse detaljerne.
Den danske udvikler benytter Puppeteer-værktøjet fra Google til fjernstyring af Chrome-instansen i skyen. Puppeteer kan blandt andet simulere brugerinput via et tastatur.
Så når en bruger taster data i boksen hos medlemsklubben.dk, bliver brugernavn og adgangskode fodret til den fjernstyrede Chrome-instans, der inputter login'et i NemID-boksen på borger.dk
Herefter bliver brugeren på medlemsklubben.dk bedt om sine to-faktor-oplysninger, altså nøglekort eller app, som ligeledes bliver brugt på borger.dk
Slutresultatet er, brugeren umiddelbart logger ind på medlemsklubben.dk, men reelt bliver der logget ind i baggrunden på borger.dk, hvor antallet af beskeder i den digitale postkasse bliver aflæst og præsenteret for brugeren.
Der er tydeligt skiltet med, at der er tale om en angrebs-demonstration på medlemsklubben.dk.
I det omfang, det er muligt, bestræber vi os generelt på Version2 på at efterprøve angrebsteknikker som den, medlemsklubben.dk skilter med. Det har vi ikke haft mod på i dette tilfælde, i stedet nøjes vi med Søren Louv-Jansens forklaring, som virker troværdig. Desuden er det en kendt problemstilling, at NemID kan angribes som beskrevet.
Forskel på kort og app
Det er dog her værd at bemærke, at den NemID-app, som blev udgivet tidligere i år, og som gør det muligt at validere via mobiltelefon i stedet for papkort, faktisk kan gøre det vanskeligere at fuppe brugere. Angrebet beror jo på, at det i udgangspunktet ikke er muligt for almindelige mennesker at gennemskue om en NemID-boks er falsk eller ægte.
Men når en NemID-bruger validerer sig via app'en, så kan den kontekst, brugeren er ved at logge ind i, også vises i app'en. Det vil her sige en besked om, at brugeren er ved at logge på eksempelvis borger.dk.
Og selvom brugeren befinder sig på et svindel-site som medlemsklubben.dk, dukker der stadig en besked op om login på borger.dk, hvor angriberen jo reelt forsøger at logge ind. Og det kan i princippet give et praj om, at noget er rivravruskende galt.
»Der er app'en bedre lige i det her tilfælde,« siger Søren Louv-Jansen.
Når det er sagt, så vurderer han, at flere brugere overordnet forbinder NemID med netop borger.dk. Og derfor mener Søren Louv-Jansen ikke, at NemID og borger.dk i samme sætning nødvendigvis får særligt mange til at rynke panden - uanset hvor der logges ind.
Desuden så fremgår det ved login på flere andre offentlige hjemmesider blot, at brugeren er ved at logge på Nemlog-in. Hvilket må sige ikke at være særligt sigende for konteksten.
Gængse metoder fungerede ikke
Det fremgår af koden i NemID-appen, at folkene bag er helt klarover problemstillingen. Søren Louv-Jansen er således stødt på flere kodemæssige tiltag, der skal forhindre et automatiseret angreb, som det, han gennemfører.
Eksempelvis er der i koden adskillige felter til brugernavn, men det er kun et af felterne, der fungerer og faktisk bliver vist for brugeren. Det samme gør sig gældende for feltet til kodeord. Søren Louv-Jansen forklarer, at det gør det vanskeligt at sætte eksempelvis kodeordet ind i det rigtige felt på automatiseret vis.
Udover at der er flere felter at vælge mellem, så var det slet ikke muligt at bruge en ellers gængs metode til at fjernstyre Chrome-instansen til at vælge et kodeordsfelt, så der kunne sættes data ind.
Søren Louv-Jansen fortæller, at sådan et skifte normalt ville blive lavet via kald til browserens API, eksempelvis i form af Document.querySelectorAll()
»Det er en API man bruger, når man vil have fat i et element på en side,« siger han.
Kodeordsfeltet ville så blive kaldt med:
document.querySelectorAll('input[password]')
Men Document.querySelectorAll() fungerede ikke på NemID.
Søren Louv-Jansen forklarer, at NemID-app’en overskriver flere af metoderne i browser-API'et med proxy objekter.
Det betyder, at NemID-koden kan detektere kald til eksempelvis Document.querySelectorAll() og på den måde forhindrer et automatiseret angreb via browser-API’et.
Hvis Document.querySelectorAll() bliver forsøgt anvendt til eksempelvis at vælge kodeordsfeltet, så fejler login-forsøget ifølge Søren Louv-Jansen med en besked om, at der er sket en uventet fejl.
Han fandt i stedet på at få Chrome-instansen til at simulere et tryk på tabulator-tasten. Altså fuldstændigt som kom det fra en bruger.
Et tabulator-tryk får i mange sammenhænge, som bekendt cursoren til at springe fra et element til det næste i en formular. I NemID-tilfældet fik Søren Louv-Jansen således skiftet mellem felterne for henholdsvis brugernavn og adgangskode. Og på den måde lykkedes det at omgå beskyttelsesmekanismerne og automatisere login-processen på borger.dk via de opnsappede oplysninger fra medlemsklubben.dk
Søren Louv-Jansen fortæller, han har lagt lidt forsinkelse ind i forhold til, hvordan de enkelte tegn bliver sat ind i tekstfelterne i NemID-boksen for at det ikke skal se for maskinelt ud.
I princippet er der ikke noget til hinder for, at NemID vil kunne sættes op til at registrere, at der er lusk på færde, hvis der eksempelvis altid er 50 millisekunder mellem hvert tastetryk.
Sådan en forsvarsmekanisme vil dog ifølge Søren Louv-Jansen også kunne omgås, slet og ret ved at kopiere den forsinkelse, brugeren på medlemsklubben.dk har mellem hvert tastetryk.
Advarsel på domæne
Version2 forsøger at få en kommentar fra Digitaliseringsstyrelsen, den offentlige myndighed som NemID hører under, forholde sig til den grundlæggende sikkerhedsproblemstilling, som bliver demonstreret på medlemsklubben.dk
Siden Version2 kontaktede Digitaliseringsstyrelsen første gang i relation til medlemsklubben.dk er domænet nu blevet flaget som værende et ondsindet domæne hos Google Safe Browsing. Det indebærer en gigantisk advarsel i blandt andet Firefox, når en bruger forsøger at surfe til medlemsklubben.dk
Det er ikke første gang, Version2 har gjort Digitaliseringsstyrelsen bekendt med, at det kan være svært at spotte en fup-NemID-boks.
I 2011 lavede Version2 således en lille demonstration for at anskueliggøre problemet.
Nedenfor kan du se en video, som Søren Louv-Jansen har lavet af sin automatiske angrebsteknik. Og nedenunder den video kan du se Version2’s - medgivet - mindre stømlinede og mere manuelle demonstration af samme problemstilling fra 2011.
OPDATERING Artiklen er opdateret med en pointe om, at det ved brug af NemID-app'en til login på flere offentlige hjemmesider, blot fremgår, at der er ved at blive logget på Nemlog-in. Altså ikke en videre konkret kontekst.
Det fremgik desuden tidligere af artiklen, at Digitaliseringsstyrelsen grundet en booket kalender, havde problemer med at stille op til interview. Det var den første melding fra styrelsen. Sidenhen har Digitaliseringsstyrelsen igen forsøgt at kontakte Version2. Men da medlemsklubben.dk er blevet markeret som værende ondsindet, er de øvrige mails fra styrelsen, hvor domænenavnet optræder i tråden, ikke havnet i redaktionens indbakke, men i spam-filteret. Vi håber snarligt at kunne bringe en kommentar fra Digitaliseringsstyrelsen.

...men det er dyrt at lave god journalistik. Derfor beder vi dig overveje at tegne abonnement på Version2.
Digitaliseringen buldrer derudaf, og it-folkene tegner fremtidens Danmark. Derfor er det vigtigere end nogensinde med et kvalificeret bud på, hvordan it bedst kan være med til at udvikle det danske samfund og erhvervsliv.
Og der har aldrig været mere akut brug for en kritisk vagthund, der råber op, når der tages forkerte it-beslutninger.
Den rolle har Version2 indtaget siden 2006 - og det bliver vi ved med.