22. huhtikuuta 2019

Potentiaalinen tietoturvaongelma Nordean tunnuslukusovelluksessa

Havaitsin tässä hyvin mielenkiintoisen, potentiaalisen tietoturvaongelman Nordean tunnuslukusovelluksessa, joka luultavasti on myös muissa samanlaisissa, toisten pankkien tunnuslukusovelluksissa. Niissä ei nimittäin saa tietoonsa, minkä toimenpiteen tarkkaan ottaen on hyväksymässä netissä tai muussa palveluksessa tuolla sovelluksella. Esimerkiksi mobiilivarmenteessa tämän tiedon saa (tunnistuspyyntö nro XXXXX), voiden siten itse varmistaa, että todellakin on hyväksymässä juuri täsmälleen sitä asiaa, minkä netissä on klikannut hyväksyttäväksi, ks. alla.



On totta, että tunnuslukusovellus kertoo kyllä, onko kyseessä kirjautuminen vai esimerkiksi tietyn suuruisen laskun maksaminen. Mutta sovellus ei kerro, mistä ja mikä juttu esimerkiksi sisäänkirjautumisessa on kysymyksessä ja mistä se on peräisin, koska tapahtumaa ei sinällään eritellä mitenkään muista vastaavista esimerkiksi juuri tapahtumanumerolla (kuten mobiilivarmenteessa).

Huomasin tämän itse, kun puolihuolimattomasti olin kirjautumassa eräällä netin pelisivustolla sisälle (luulin kyseessä olevan tunnistautumisen, mutta ei ollutkaan) ja sain tunnuslukusovellukseeni vain hyväksymispyynnön sisäänkirjautumisesta nettipankkiini. Tosiasiassa minä en ollut kirjautumassa nettipankkiini, vaan tuo sivusto oli kirjauduttamassa minua sinne sisälle - näinhän sen ei pitäisi tietenkään mennä!

Tämän lisäksi tuli toinen ongelma: Tuosta kirjautumisyrityksestä ei tahtonut päästä millään eroon! Aina, kun avasin tunnuslukusovelluksen, se ruikutti sisäänkirjautumista. Tämä sama sisäänkirjautuminen oli siis yhä "menossa". Luonnollisestikaan en voinut itse kirjautua nyt omaan nettipankkiini, koska en olisi voinut mitenkään tietää, olenko hyväksymässä tunnuslukusovelluksessani oman sisäänkirjautumiseni nettipankkiini - vaiko nettisivuston sisäänkirjautumisyrityksen nettipankkiini!!! Lopulta pääsin ongelmasta ilmeisesti eroon, kun pysäytin tunnuslukusovelluksen ja tyhjensin sen cachen - asioita, joita tavallinen käyttäjä ei edes osaa tehdä.

Miten tätä aukkoa voisi sitten käyttää hyväksi?
  1. Käyttäjän epähuomiossa, kuten minulla meinasi käydä.
  2. Seuraamalla käyttäjän nettiliikennettä ja reagoimalla, kun käyttäjä menee itse nettipankkinsa sivuille (sisältöä ei voi selvittää salauksen vuoksi, mutta sivulla käymisen voi) ja syöttää vasta tuolloin hyökkäjän toimesta hyökkääjän kautta sisäänkirjautumisen - käyttäjä hyväksyy sen tunnuslukusovelluksessaan, luullen sen olevan hänen nettipankkinsa sisäänkirjautuminen (vaikka se onkin hyökkääjän sisäänkirjautuminen toisella puolen maapalloa). Tämä edellyttää toki, että käyttäjän nettipankkitunnusnumero on hyökkääjän tiedossa.
  3. Häirintänä käyttäjää kohtaan, aktivoimalla loputtomasti kirjautumisia tunnuslukusovelluksessa nettipankkisivujen kautta (joko satunnaisille käyttäjille jos nettipankin tunnusnumero ei ole tiedossa, tai tietylle käyttäjälle jos nettipankin tunnusnumero on tiedossa).
Tämän ei pitäisi todellakaan mennä näin.

Netissä suoritettavissa toimenpiteissä pitäisi olla tunnistenumero, joka olisi esim. tyyliin SHA256(nettisivunosoite+vuosipäivämääräkellonaikasekunnilleen+juoksevatapahtumanumero) tiivistettynä vaikkapa 5-numeroiseksi luvuksi ja tunnuslukusovelluksen kirjautumis/hyväksymisruudussa pitäisi sitten näkyä sama tunnistenumero/luku. Jos näkyy, henkilö voi olla varma, että on hyväksymässä juurikin sitä toimenpidettä, minkä on nettisivulla laittanut hyväksyttäväksi. Jos samaa lukua ei näy, henkilö voi olla varma, että on hyväksymässä nyt jotain aivan muuta ja voi hylätä ko. tunnistautumisen kokonaan. (Niin, tunnistautuminen pitäisi myös voida hylätä, eikä vain "olla hyväksymättä", ne kun ovat kaksi eri asiaa.) Toisin sanoen homman tulisi toimia aivan kuten se toimii mobiilivarmenteella tunnistauduttaessa.



PS. Pistin asiasta Nordeaan viestiä ja tägäsin heidät Twitter-postaukseeni, mutta julkaisen tuon silti  tietoturva-aukkohavainnon heti, koska vituttaa Nordean suhtautuminen kansallismielisiin ja FDL tilin sulkemiseen.

Ei kommentteja: