Premještanje administrativnog interfejsa na admin.example.com je stvarno poboljšanje: drži administrativne kolačiće dalje od javnih stranica, daje dvjema aplikacijama odvojene keševe i omogućava da se stroža mrežna politika usmjeri na jedno ime hosta. Ali to nije kontrola protiv CSRF-a i ne čini kod javnog sajta sigurnim za držanje otvorenim pred prijavljenim administratorom. Razdvajanje mijenja ono što preglednik smatra granicom, a ne ono što server provjerava, zato uradite ove četiri provjere prije nego što kažete da je gotovo.

Čitajte origin i sajt kao dvije različite riječi

Origin je šema, host i port, pa su https://www.example.com i https://admin.example.com različiti origini. Sajt, u smislu SameSite, je šema plus registrovana domena, pa su ta dva imena hosta obično isti sajt. Ta razlika je cijela zamka: atribut SameSite vam neće pomoći između sestrinskih poddomena, jer preglednik zahtjev uopšte ne smatra unakrsnim. Usmjerite administrativni interfejs na stvarno drugu registrovanu domenu, poput admin-example.net, i zahtjev zaista postaje unakrsni, i tu SameSite=Lax ili Strict počinje raditi posao na koji se možete osloniti.

Testirajte to u pregledniku umjesto da rasuđujete.

Učitajte javni sajt, otvorite razvojne alate i pogledajte koje kolačiće preglednik pridružuje zahtjevu prema administrativnom hostu. Ako kolačić nema atribut Domain, on je samo za host i ostaje na svom imenu hosta; ako nosi Domain=example.com, putuje do svake sestre, i nova poddomena vam za taj kolačić nije donijela ništa.

Odvojite može pročitati odgovor od može poslati zahtjev

Politika istog origina ograničava čitanje odgovora između origina. Ne zaustavlja slanje zahtjeva i ne sprječava formu da nosi akreditive koje preglednik već ima. Jednostavan zahtjev, s tipom sadržaja forme ili običnim GET-om, dostavlja se bez prethodne provjere; CORS zatim odlučuje smije li skripta koja poziva pročitati odgovor. CSRF u potpunosti živi na strani slanja.

Zato serveru treba eksplicitna provjera za operacije koje mijenjaju stanje. Token za sinhronizaciju vezan za sesiju, ili kolačić dvostrukog slanja koji se poredi na serveru, pokriva taj slučaj; poređenje Origin ili Referer vrijedi dodati kao drugu kapiju, ali ne kao jedinu, jer ne nosi svaki zahtjev zaglavlje i ne čuva ga svaki proksi. OWASP-ove smjernice za sprječavanje CSRF-a tretiraju SameSite kao jedan sloj među nekoliko upravo zato.

Odlučite šta mrežna kapija zaista dokazuje

Lista dozvoljenih VPN izlaza ispred administrativnog hosta je dobra kontrola i slaba tvrdnja o identitetu. Dokazuje da je zahtjev došao s adrese koju VPN daje, koju mogu dijeliti svi na tom izlazu, i ne govori ništa o tome koja osoba ili uređaj stoji iza njega. Tretirajte je kao ulazni filter, ne kao autentikaciju.

Držite je nezavisnom od provjera na nivou zahtjeva. Ako je lista jedina stvar između napadača i krajnje točke koja mijenja stanje, jedna pogrešno konfigurisana ruta, jedan split-tunnel klijent ili jedan pozajmljeni laptop uklanja kontrolu u potpunosti.

Bilježite i odbijanja izvan očekivanih raspona. Njihov nalet je najkorisniji signal da neko ispituje granicu koju ste upravo izgradili, a tišina je signal da se filter uopšte ne doseže.

Držite kolačiće, prijavu i autorizaciju eksplicitnim

Opseg kolačića odlučuje većinu ishoda. Kolačić roditeljske domene šalje se administrativnom hostu, pa skripta ubrizgana na javni sajt može djelovati sa sesijom administratora; kolačić samo za host ne može. Preferirajte oblik samo za host, dodajte atribut Secure i koristite prefiks __Host- gdje ga platforma podržava, jer taj prefiks zahtijeva Secure, Path=/ i bez atributa Domain. Čitajte zaglavlje odgovora, a ne teglu kolačića: Set-Cookie: __Host-admin_session=...; Secure; Path=/; HttpOnly; SameSite=Lax, bez atributa Domain. Preglednik odbacuje __Host- kolačić koji nosi Domain, pa kolačić koji se još vidi na sestrinskim hostovima dokaz je da prefiks nikada nije primijenjen.

Zatim držite autorizaciju na serveru, po zahtjevu, na svakoj administrativnoj krajnjoj točki, ne samo pri prijavi. Zahtjev s dozvoljene mreže još mora biti autentificiran i autorizovan za operaciju koju traži; ime hosta nije akter. Ako javna i administrativna aplikacija dijele tok prijave ili spremište sesija, zapišite taj odnos, jer je to najkraći put od greške na javnom sajtu do administrativne akcije.

Ponovno provjerite granicu nakon razdvajanja

Pokrenite negativne testove, ne samo sretan put: unakrsna forma bez tokena mora biti odbijena, token iz druge sesije mora biti odbijen i nijedan GET ne smije mijenjati stanje. Provjerite atribute kolačića u razvojnim alatima, potvrdite da se provjera Origin aktivira na neusklađen zahtjev i pokušajte administrativni host izvan VPN raspona da vidite filter na djelu.

Ništa od ovoga ne uklanja XSS grešku unutar same administrativne aplikacije. Odvojeno ime hosta je granica izolacije na strani preglednika sa stvarnom vrijednošću i nije zamjena za sprječavanje nesigurnog izvršavanja koda ili za zaštitu zahtjeva na strani servera. Nakon razdvajanja lista je kraća nego što izgleda: različit origin, kolačići samo za host, token na svaku promjenu, ulazni filter kojem ne vjerujete kao identitetu i autorizacija odlučena po zahtjevu.

Povezani članci