Premeštanje administrativnog interfejsa na admin.example.com je stvarno poboljšanje: drži administrativne kolačiće dalje od javnih stranica, daje dvema aplikacijama odvojene keševe i omogućava da se stroža mrežna politika usmeri 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 menja ono što pregledač smatra granicom, a ne ono što server proverava, zato uradite ove četiri provere pre nego što kažete da je gotovo.

Čitajte origin i sajt kao dve različite reč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 cela zamka: atribut SameSite vam neće pomoći između sestrinskih poddomena, jer pregledač zahtev uopšte ne smatra unakrsnim. Usmerite administrativni interfejs na stvarno drugu registrovanu domenu, poput admin-example.net, i zahtev zaista postaje unakrsni, i tu SameSite=Lax ili Strict počinje da radi posao na koji možete da se oslonite.

Testirajte to u pregledaču umesto da o tome rasuđujete.

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

Odvojite može da pročita odgovor od može da pošalje zahtev

Politika istog origina ograničava čitanje odgovora između origina. Ne zaustavlja slanje zahteva i ne sprečava formu da nosi akreditive koje pregledač već ima. Jednostavan zahtev, sa tipom sadržaja forme ili običnim GET-om, dostavlja se bez prethodne provere; CORS zatim odlučuje sme li skripta koja poziva da pročita odgovor. CSRF u potpunosti živi na strani slanja.

Zato serveru treba eksplicitna provera za operacije koje menjaju 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 vredi dodati kao drugu kapiju, ali ne kao jedinu, jer ne nosi svaki zahtev zaglavlje i ne čuva ga svaki proksi. OWASP-ove smernice za spreč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 zahtev došao sa adrese koju VPN daje, koju mogu da dele 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 provera na nivou zahteva. Ako je lista jedina stvar između napadača i krajnje tačke koja menja stanje, jedna pogrešno konfigurisana ruta, jedan split-tunnel klijent ili jedan pozajmljeni laptop uklanja kontrolu u potpunosti.

Beležite i odbijanja izvan očekivanih opsega. 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 ubačena na javni sajt može da deluje sa sesijom administratora; kolačić samo za host ne može. Preferirajte oblik samo za host, dodajte atribut Secure i koristite prefiks __Host- gde ga platforma podržava, jer taj prefiks zahteva 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. Pregledač odbacuje __Host- kolačić koji nosi Domain, pa kolačić koji se još vidi na sestrinskim hostovima je dokaz da prefiks nikada nije primenjen.

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

Ponovo proverite granicu nakon razdvajanja

Pokrenite negativne testove, ne samo srećan put: unakrsna forma bez tokena mora biti odbijena, token iz druge sesije mora biti odbijen i nijedan GET ne sme da menja stanje. Proverite atribute kolačića u razvojnim alatima, potvrdite da se provera Origin aktivira na neusklađen zahtev i pokušajte administrativni host izvan VPN opsega da vidite filter na delu.

Ništa od ovoga ne uklanja XSS grešku unutar same administrativne aplikacije. Odvojeno ime hosta je granica izolacije na strani pregledača sa stvarnom vrednošću i nije zamena za sprečavanje nesigurnog izvršavanja koda ili za zaštitu zahteva na strani servera. Nakon razdvajanja lista je kraća nego što izgleda: različit origin, kolačići samo za host, token na svaku promenu, ulazni filter kome ne verujete kao identitetu i autorizacija odlučena po zahtevu.

Povezani članci