Võltspäringurünne ja kaitse selle vastu

Näitame autentimisteenuse TARA näitel OpenID Connect (aga samuti OAuth 2.0) protokollis võimalikku võltspäringurünnet (cross-site request forgery, CSRF) ja kaitset selle vastu.

Joonisel on esitatud: 1) autentimisteenus TARA tara.ria.ee; 2) autententimisteenust TARA kasutav e-teenus (serveri osa); 3) ründaja sirvik (punane); 4) ohvri sirvik; 5) ründaja (punane); 6) ohver.

TL;DR Võltspäringutõke tuleb siduda sessiooniga, muidu pole sellest kasu.

Normaalprotsess

Näitame kõigepealt, kuidas ründaja saab normaalse autentimisprotsessi läbi teha. (Hiljem, ründamisel, ta katkestab protsessi ja “söödab” oma vahetulemused ette ohvrile).

1a Kasutaja vajutab nupule “Logi sisse” vms. Selle toimel saadab sirvija serverisse päringu

HTTP GET https://asutus.ee/Login.

1b Server saadab päringule vastuseks ümbersuunamiskorralduse (redirect) autentimisteenusesse. HTTP vastuse staatusekood on 302. Vastuses on OpenID Connect protokolli kohased elemendid, nende seas võltspäringutõke state.

302 Found
Location: https://tara.ria.ee/authorize?
redirect_uri=https%3A%2F%2Fasutus.ee%2F
Callback&scope=openid&
state=hkMVY7vjuN7xyLl5&response_type=code&
client_id=asutus

2a Kasutaja sirvik teeb päringu ümbersuunamis-URL-le:

HTTP GET https://tara.ria.ee/authorize?
redirect_uri=https%3A%2F%2Fasutus.ee%2F
Callback&scope=openid&
state=hkMVY7vjuN7xyLl5&response_type=code&
client_id=asutus

2b Kasutaja autentimise järel saadab autentimisteenus sirvikust tulnud päringule vastuse. Vastuses sisaldub ümbersuunamiskorraldus, volituskood code ja võltspäringutõke state.

302 Found
Location: https://asutus.ee/Callback?
code=71ed5797c3d957817d31&
state=hkMVY7vjuN7xyLl5

3a Sirvija täidab ümbersuunamiskorralduse, tehes päringu:

HTTP GET https://asutus.ee/Callback?
code=71ed5797c3d957817d31&
state=hkMVY7vjuN7xyLl5

3b Server teeb nüüd päringu autentimisteenuse otspunkti /Token ja saab volituskoodi vastu identsustõendi (ID token). Identsustõendis on autenditud kasutaja isikukood, nimi jm autentimisandmed. Server saadab sirvikusse vastuse, milles on seansiidentifikaatori või fikseerib autentimise tulemuse muul viisil.

Sellega on autentimisprotsess lõppenud.

Rünne

Ründaja laeb klientrakenduse oma sirvikusse. Vajutab “Logi sisse” ja teeb autentimisteenuses läbi autentimise. Püüab kinni autentimisteenuse vastuse 2b ja tõkestab selles sisalduva ümbersuunamiskorralduse täitmist. See tähendab, et päring 3a sirvikust välja ei lähegi.

Selle asemel moodustab võltspärigu ja pettuse abil paneb ohvri sirviku võltspäringut serverile saatma. Näiteks saates ohvrile näiliselt süütu veebilehe aadressi; veebilehel on aga võltspäringut käivitav peidetud element

<img src="https://asutus.ee/Callback?
code=71ed5797c3d957817d31&state=hkMVY7vjuN7xyLl5">

Kui selline päring jõuab serverisse ja server ei suuda aru saada, et 1a ja 3a tulevad erinevatest sirvikutest (aga kust ta peaks aru saama?), siis ta pahaaimamatult täidab päringu. Tulemusena logitakse ründaja ohvri sirvikus klientrakendusse sisse.

Kaitse

Võltspäringuründe vastu pakub kaitset tõkestav element state. Kuid state peab olema sirvijaga seotud. Korrektne kaitseprotseduur on järgmine:

Vastuse 1b saatmisel paneb server kaasa küpsise, milles sisaldub seansiidentifikaator (session ID):

Set-Cookie: SessionID=2h5ft6; HttpOnly

Seansiidentifikaator (näites 2h5ft6) on juhustring. Tõkestava elemendi state moodustab sirvik, arvutades seansiidentifikaatori räsi: state = hash(2h5ft6).

Nii seotakse state konkreetse sirvikuga. Kuid seansiidentifikaator ei ole räsi põhjal arvutatav.

Sirvik talletab saadud küpsise. Autentimisteenusest tagasipöördumisel paneb sirvik küpsise päringusse 3a kaasa.

Server saab päringust 3a kätte nii tõkestava elemendi state kui ka küpsises hoitud seansiidentifikaatori. Server PEAB kontrollima, et saadud state = hash(2h5ft6).

Kui selline kaitse on rakendatud, siis ründaja võib oma sirvikus küll seansiküpsise kätte saada, kuid tal ei ole lihtsat võimalust küpsise paigaldamiseks ohvri arvutisse. Kuna ohvri arvutis vajalikku küpsist ei ole (või on seal teine küpsis, teise seansiidentifikaatoriga), siis võltspäringu saatmine ei õnnestu - eeldusel, et klientrakenduses on state kontroll õigesti teostatud.

Riigi Infosüsteemi Amet · 2017-2021 · https://github.com/e-gov/TARA-Doku