Administratívna subdoména nezastaví CSRF: štyri kontroly pred spustením
Nové meno hostiteľa je nový origin, často tá istá lokalita, takže same-site cookies a jednoduché formuláre ho prekročia. Skontrolujte tokeny, bránu a autorizáciu.
Presun administratívneho rozhrania na admin.example.com je skutočné zlepšenie: drží administratívne cookies mimo verejných stránok, dáva obom aplikáciám oddelené cache a umožňuje nasmerovať prísnejšiu sieťovú politiku na jedno meno hostiteľa. Nie je to však kontrola proti CSRF a nerobí kód verejnej stránky bezpečným na to, aby zostal otvorený pred prihláseným správcom. Oddelenie mení to, čo prehliadač považuje za hranicu, nie to, čo kontroluje server, preto vykonajte tieto štyri kontroly, kým to vyhlásite za hotové.
Čítajte origin a lokalitu ako dve rôzne slová
Origin je schéma, hostiteľ a port, takže https://www.example.com a https://admin.example.com sú rôzne originy. Lokalita v zmysle SameSite je schéma plus registrovaná doména, takže tieto dve mená hostiteľa sú zvyčajne tá istá lokalita. Ten rozdiel je celá pasca: atribút SameSite vám nepomôže medzi sesterskými subdoménami, pretože prehliadač žiadosť vôbec nepovažuje za medzilokalitnú. Nasmerujte administratívne rozhranie na skutočne inú registrovanú doménu, napríklad admin-example.net, a žiadosť sa skutočne stane medzilokalitnou, a práve tam začína SameSite=Lax alebo Strict robiť prácu, na ktorú sa dá spoľahnúť.
Otestujte to v prehliadači namiesto uvažovania o tom.
Načítajte verejnú stránku, otvorte vývojárske nástroje a pozrite sa, ktoré cookies prehliadač pripája k žiadosti na administratívneho hostiteľa. Ak cookie nemá atribút Domain, je len pre hostiteľa a zostáva na svojom mene; ak nesie Domain=example.com, putuje ku každej sestre, a nová subdoména vám pre tú cookie nič nepriniesla.
Oddeľte čítanie odpovede od odoslania žiadosti
Politika rovnakého originu obmedzuje čítanie odpovedí medzi originmi. Nezastavuje odoslanie žiadosti a nebráni formuláru niesť prihlasovacie údaje, ktoré prehliadač už má. Jednoduchá žiadosť, s typom obsahu formulára alebo obyčajným GET, sa doručí bez predbežnej kontroly; potom CORS rozhodne, či volajúci skript smie odpoveď čítať. CSRF žije úplne na strane odosielania.
Preto server potrebuje výslovnú kontrolu pre operácie meniace stav. Synchronizačný token viazaný na reláciu, alebo cookie dvojitého odoslania porovnávaná na serveri, pokrýva ten prípad; porovnanie Origin alebo Referer stojí za to pridať ako druhú bránu, ale nie ako jedinú, pretože nie každá žiadosť nesie hlavičku a nie každý proxy ju zachová. Usmernenia OWASP na prevenciu CSRF považujú SameSite za jednu vrstvu medzi viacerými práve preto.
Rozhodnite, čo sieťová brána skutočne dokazuje
Zoznam povolených výstupov VPN pred administratívnym hostiteľom je dobrá kontrola a slabé tvrdenie o identite. Dokazuje, že žiadosť prišla z adresy, ktorú VPN prideľuje, ktorú môžu zdieľať všetci na tom výstupe, a nič nehovorí o tom, kto za ňou stojí. Berte ju ako vstupný filter, nie ako autentifikáciu.
Udržujte ju nezávislú od kontrol na úrovni žiadosti. Ak je zoznam jediná vec medzi útočníkom a koncovým bodom meniacim stav, jedna zle nakonfigurovaná trasa, jeden klient split-tunnel alebo jeden požičaný notebook kontrolu úplne odstráni.
Zaznamenávajte aj odmietnutia mimo očakávaných rozsahov. Ich nápor je najužitočnejší signál, že niekto skúma hranicu, ktorú ste práve postavili, a ticho je signál, že filter sa vôbec nedosahuje.
Udržujte cookies, prihlásenie a autorizáciu výslovné
Rozsah cookie rozhoduje väčšinu výsledku. Cookie rodičovskej domény sa posiela administratívnemu hostiteľovi, takže vstreknutie skriptu na verejnej stránke môže konať s reláciou správcu; cookie len pre hostiteľa nemôže. Preferujte formu len pre hostiteľa, pridajte atribút Secure a použite prefix __Host- tam, kde ho platforma podporuje, pretože tento prefix vyžaduje Secure, Path=/ a žiadny atribút Domain. Čítajte hlavičku odpovede, nie pohár cookies: Set-Cookie: __Host-admin_session=...; Secure; Path=/; HttpOnly; SameSite=Lax, bez atribútu Domain. Prehliadač zahodí cookie __Host- s Domain, takže cookie, ktorá sa stále objavuje na sesterských hostiteľoch, je dôkaz, že prefix nebol nikdy použitý.
Potom držte autorizáciu na serveri, pre každú žiadosť, na každom administratívnom koncovom bode, nielen pri prihlásení. Žiadosť z povolenej siete musí byť stále autentifikovaná a autorizovaná pre operáciu, ktorú žiada; meno hostiteľa nie je aktér. Ak verejná a administratívna aplikácia zdieľajú prihlasovací tok alebo úložisko relácií, zapíšte ten vzťah, pretože je to najkratšia cesta od chyby na verejnej stránke k administratívnej akcii.
Znova skontrolujte hranicu po oddelení
Spustite negatívne testy, nielen šťastnú cestu: medzilokalitný formulár bez tokenu musí byť odmietnutý, token z inej relácie musí byť odmietnutý a žiadny GET nesmie meniť stav. Skontrolujte atribúty cookies vo vývojárskych nástrojoch, potvrďte, že kontrola Origin sa spustí pri nezodpovedajúcej žiadosti, a skúste administratívneho hostiteľa zvonku rozsahu VPN, aby ste videli filter v akcii.
Nič z toho neodstraňuje chybu XSS vnútri samotnej administratívnej aplikácie. Oddelené meno hostiteľa je hranica izolácie na strane prehliadača so skutočnou hodnotou a nie je náhradou za prevenciu nebezpečného spúšťania kódu ani za ochranu žiadostí na strane servera. Po oddelení je zoznam kratší, než vyzerá: odlišný origin, cookies len pre hostiteľa, token pri každej zmene, vstupný filter, ktorému neveríte ako identite, a autorizácia rozhodovaná pre každú žiadosť.