Админ поддомен не зауставља CSRF: четири провере пре пуштања
Ново име хоста је нови origin, често исти сајт, па same-site колачићи и једноставне форме га прелазе. Проверите токене, капију и ауторизацију.
Премештање административног интерфејса на admin.example.com је стварно побољшање: држи административне колачиће далеко од јавних страница, даје двема апликацијама одвојене кешеве и омогућава да се строжа мрежна политика усмери на једно име хоста. Али то није контрола против CSRF-а и не чини код јавног сајта безбедним за држање отвореним пред пријављеним администратором. Раздвајање мења оно што прегледач сматра границом, а не оно што сервер проверава, зато урадите ове четири провере пре него што кажете да је готово.
Читајте origin и сајт као две различите речи
Origin је шема, хост и порт, па су https://www.example.com и https://admin.example.com различити origin-и. Сајт у смислу SameSite је шема плус регистрована домена, па су та два имена хоста обично исти сајт. Та разлика је цела замка: атрибут SameSite вам неће помоћи између сестринских поддомена, јер прегледач захтев уопште не сматра унакрсним. Усмерите административни интерфејс на стварно другу регистровану домену, попут admin-example.net, и захтев заиста постаје унакрсни, и ту SameSite=Lax или Strict почиње да ради посао на који можете да се ослоните.
Тестирајте то у прегледачу уместо да о томе расуђујете.
Учитајте јавни сајт, отворите развојне алате и погледајте које колачиће прегледач придружује захтеву према административном хосту. Ако колачић нема атрибут Domain, он је само за хост и остаје на свом имену; ако носи Domain=example.com, путује до сваке сестре, и нова поддомена вам за тај колачић није донела ништа.
Одвојите читање одговора од слања захтева
Политика истог origin-а ограничава читање одговора између origin-а. Не зауставља слање захтева и не спречава форму да носи акредитиве које прегледач већ има. Једноставан захтев, са типом садржаја форме или обичним GET-ом, доставља се без претходне провере; CORS затим одлучује сме ли скрипта која позива да прочита одговор. CSRF у потпуности живи на страни слања.
Зато серверу треба експлицитна провера за операције које мењају стање. Токен за синхронизацију везан за сесију, или колачић двоструког слања који се пореди на серверу, покрива тај случај; поређење Origin или Referer вреди додати као другу капију, али не као једину, јер не носи сваки захтев заглавље и не чува га сваки прокси. OWASP-ове смернице за спречавање CSRF-а третирају SameSite као један слој међу неколико управо зато.
Одлучите шта мрежна капија заиста доказује
Листа дозвољених VPN излаза испред административног хоста је добра контрола и слаба тврдња о идентитету. Доказује да је захтев дошао са адресе коју VPN даје, коју могу да деле сви на том излазу, и не говори ништа о томе која особа или уређај стоји иза њега. Третирајте је као улазни филтер, не као аутентикацију.
Држите је независном од провера на нивоу захтева. Ако је листа једина ствар између нападача и крајње тачке која мења стање, једна погрешно конфигурисана рута, један split-tunnel клијент или један позајмљени лаптоп уклања контролу у потпуности.
Бележите и одбијања изван очекиваних опсега. Њихов налет је најкориснији сигнал да неко испитује границу коју сте управо изградили, а тишина је сигнал да се филтер уопште не достиже.
Држите колачиће, пријаву и ауторизацију експлицитним
Обим колачића одлучује већину исхода. Колачић родитељске домене шаље се административном хосту, па скрипта убачена на јавни сајт може да делује са сесијом администратора; колачић само за хост не може. Преферирајте облик само за хост, додајте атрибут Secure и користите префикс __Host- где га платформа подржава, јер тај префикс захтева Secure, Path=/ и без атрибута Domain. Читајте заглавље одговора, а не теглу колачића: Set-Cookie: __Host-admin_session=...; Secure; Path=/; HttpOnly; SameSite=Lax, без атрибута Domain. Прегледач одбацује __Host- колачић који носи Domain, па колачић који се још види на сестринским хостовима је доказ да префикс никада није примењен.
Затим држите ауторизацију на серверу, по захтеву, на свакој административној крајњој тачки, не само при пријави. Захтев са дозвољене мреже још мора бити аутентификован и ауторизован за операцију коју тражи; име хоста није актер. Ако јавна и административна апликација деле ток пријаве или складиште сесија, запишите тај однос, јер је то најкраћи пут од грешке на јавном сајту до административне акције.
Поново проверите границу након раздвајања
Покрените негативне тестове, не само срећан пут: унакрсна форма без токена мора бити одбијена, токен из друге сесије мора бити одбијен и ниједан GET не сме да мења стање. Проверите атрибуте колачића у развојним алатима, потврдите да се провера Origin активира на неусклађен захтев и покушајте административни хост изван VPN опсега да видите филтер на делу.
Ништа од овога не уклања XSS грешку унутар саме административне апликације. Одвојено име хоста је граница изолације на страни прегледача са стварном вредношћу и није замена за спречавање небезбедног извршавања кода или за заштиту захтева на страни сервера. Након раздвајања листа је краћа него што изгледа: различит origin, колачићи само за хост, токен на сваку промену, улазни филтер коме не верујете као идентитету и ауторизација одлучена по захтеву.