Upravljavska poddomena ne ustavi CSRF: štiri preverjanja pred objavo
Novo ime gostitelja je nov izvor, pogosto ista stran, zato same-site piškotki in preprosti obrazci prehajajo čezenj. Preverite žetone, vrata in avtorizacijo.
Premik upravljavskega vmesnika na admin.example.com je resnična izboljšava: piškotke za upravljanje drži stran od javnih strani, obema aplikacijama da ločene predpomnilnike in omogoča, da strožjo omrežno politiko usmerite na eno ime gostitelja. A to ni nadzor proti CSRF in ne naredi kode javne strani varne za puščanje odprte pred prijavljenim skrbnikom. Ločitev spremeni, kaj brskalnik šteje za mejo, ne tega, kar preverja strežnik, zato opravite ta štiri preverjanja, preden rečete, da je končano.
Beri izvor in stran kot dve različni besedi
Izvor je shema, gostitelj in vrata, zato sta https://www.example.com in https://admin.example.com različna izvora. Stran v smislu SameSite je shema plus registrirana domena, zato sta ti dve imeni gostitelja običajno ista stran. Ta razlika je vsa past: atribut SameSite vam ne bo pomagal med sestrskimi poddomenami, ker brskalnik zahteve sploh ne šteje za medstranično. Usmerite upravljavski vmesnik na resnično drugo registrirano domeno, na primer admin-example.net, in zahteva res postane medstranična, in tam SameSite=Lax ali Strict začne opravljati delo, na katerega se lahko zanesete.
Preizkusite v brskalniku, namesto da o tem razmišljate.
Naložite javno stran, odprite razvojna orodja in poglejte, katere piškotke brskalnik priloži zahtevi na upravljavskega gostitelja. Če piškotek nima atributa Domain, velja le za gostitelja in ostane na svojem imenu; če nosi Domain=example.com, potuje k vsaki sestri, in nova poddomena vam za ta piškotek ni prinesla ničesar.
Ločite branje odgovora od pošiljanja zahteve
Politika istega izvora omejuje branje odgovorov med izvori. Ne ustavi pošiljanja zahteve in ne prepreči obrazcu, da bi nosil poverilnice, ki jih brskalnik že ima. Preprosta zahteva, s tipom vsebine obrazca ali običajnim GET, se dostavi brez predhodnega preverjanja; nato CORS odloči, ali sme klicoča skripta brati odgovor. CSRF živi v celoti na strani pošiljanja.
Zato strežnik potrebuje izrecno preverjanje za operacije, ki spreminjajo stanje. Žeton za sinhronizacijo, vezan na sejo, ali piškotek dvojnega pošiljanja, ki se primerja na strežniku, pokrije ta primer; primerjava Origin ali Referer si zasluži mesto drugega vrat, ne pa edinih, ker vsaka zahteva ne nosi glave in vsak posrednik je ne ohrani. OWASP smernice za preprečevanje CSRF obravnavajo SameSite kot eno plast med več prav zato.
Odločite, kaj omrežna vrata res dokazujejo
Seznam dovoljenih izhodov VPN pred upravljavskim gostiteljem je dober nadzor in šibka trditev o identiteti. Dokazuje, da je zahteva prišla z naslova, ki ga dodeli VPN, ki si ga lahko delijo vsi na tem izhodu, in ne pove nič o tem, kdo ali katera naprava stoji za njim. Obravnavajte ga kot vhodni filter, ne kot preverjanje pristnosti.
Naj bo neodvisen od preverjanj na ravni zahteve. Če je seznam edina stvar med napadalcem in končno točko, ki spreminja stanje, ena napačno nastavljena pot, en odjemalec split-tunnel ali en izposojen prenosnik nadzor povsem odstrani.
Beležite tudi zavrnitve zunaj pričakovanih razponov. Njihov izbruh je najbolj koristen signal, da nekdo preizkuša mejo, ki ste jo pravkar zgradili, tišina pa signal, da filter sploh ni dosežen.
Ohranite piškotke, prijavo in avtorizacijo izrecne
Obseg piškotka odloči večino izida. Piškotek nadrejene domene se pošlje upravljavskemu gostitelju, zato lahko vstavljanje skripta na javni strani deluje s sejo skrbnika; piškotek samo za gostitelja ne more. Raje izberite obliko samo za gostitelja, dodajte atribut Secure in uporabite predpono __Host- tam, kjer jo platforma podpira, saj ta predpona zahteva Secure, Path=/ in brez atributa Domain. Berite glavo odgovora, ne kozarca s piškotki: Set-Cookie: __Host-admin_session=...; Secure; Path=/; HttpOnly; SameSite=Lax, brez atributa Domain. Brskalnik zavrže piškotek __Host- z Domain, zato je piškotek, ki se še vedno pojavlja na sestrskih gostiteljih, dokaz, da predpona ni bila nikoli uporabljena.
Nato držite avtorizacijo na strežniku, za vsako zahtevo, na vsaki upravljavski končni točki, ne le ob prijavi. Zahteva iz dovoljenega omrežja mora biti še vedno overjena in pooblaščena za operacijo, ki jo zahteva; ime gostitelja ni akter. Če si javna in upravljavska aplikacija delita prijavni tok ali shrambo sej, zapišite to razmerje, ker je to najkrajša pot od napake na javni strani do upravljavskega dejanja.
Znova preverite mejo po ločitvi
Zaženite negativne teste, ne le srečne poti: medstranični obrazec brez žetona mora biti zavrnjen, žeton iz druge seje mora biti zavrnjen in noben GET ne sme spremeniti stanja. Preverite atribute piškotkov v razvojnih orodjih, potrdite, da se preverjanje Origin sproži pri neustrezni zahtevi, in poskusite upravljavskega gostitelja zunaj obsega VPN, da vidite filter pri delu.
Nič od tega ne odpravi napake XSS znotraj same upravljavske aplikacije. Ločeno ime gostitelja je meja izolacije na strani brskalnika z resnično vrednostjo in ni nadomestilo za preprečevanje nevarnega izvajanja kode ali za zaščito zahtev na strani strežnika. Po ločitvi je seznam krajši, kot izgleda: ločen izvor, piškotki samo za gostitelja, žeton ob vsaki spremembi, vhodni filter, ki mu ne zaupate kot identiteti, in avtorizacija, odločena za vsako zahtevo.