Admin subdomeni CSRF-i dayandırmır: işə salmadan əvvəl dörd yoxlama
Yeni host adı yeni mənbədir, çox vaxt eyni sayt, ona görə same-site kukilər və sadə form göndərişləri onu keçir. Tokenləri, giriş qapısını və icazəni yoxlayın.
Admin interfeysini admin.example.com-a köçürmək həqiqi yaxşılaşmadır: admin kukilərini ictimai səhifələrdən uzaq saxlayır, iki tətbiqə ayrı keşlər verir və bir host adına daha sərt şəbəkə siyasəti yönəltməyə imkan tanıyır. Lakin bu CSRF nəzarəti deyil və ictimai saytın kodu daxil olmuş administrator üçün açıq qalmağa təhlükəsiz deyil. Ayrıma brauzerin sərhəd saydığını dəyişir, serverin yoxladığını yox, ona görə işi bitmiş saymadan əvvəl bu dörd yoxlamanı edin.
Mənbəni və saytı iki ayrı söz kimi oxuyun
Mənbə sxem, host və portdur, yəni https://www.example.com və https://admin.example.com ayrı mənbələrdir. Sayt, SameSite mənasında, sxem üstəgəl qeydə alına bilən domendir, yəni həmin iki host adı adətən eyni saytdır. Bu fərq bütün tələdir: SameSite atributu qardaş subdomenlər arasında sizə kömək etməyəcək, çünki brauzer sorğunu ümumiyyətlə saytlararası saymır. Admin interfeysini həqiqətən fərqli qeydə alına bilən domendə, məsələn admin-example.net-də yerləşdirin, onda sorğu həqiqətən saytlararası olur və SameSite=Lax və ya Strict güvənə biləcəyiniz işi orada görməyə başlayır.
Bunu mülahizə yürütməklə deyil, brauzerdə yoxlayın.
İctimai saytı açın, tərtibatçı alətlərini açın və brauzerin admin hostuna yönələn sorğuya hansı kukiləri qoşduğuna baxın. Kukinin Domain atributu yoxdursa, o yalnız hosta aiddir və öz host adında qalır; Domain=example.com daşıyırsa, hər qardaşa gedir və yeni subdomen həmin kuki üçün sizə heç nə qazandırmır.
Cavabı oxumağı sorğu göndərməkdən ayırın
Eyni mənbə siyasəti cavabların mənbələr arasında oxunmasını məhdudlaşdırır. Sorğunun göndərilməsini dayandırmır və brauzerin artıq saxladığı etimadnamələri form göndərişinin daşımasını dayandırmır. Sadə sorğu, yəni form məzmun tipi və ya adi GET ilə olan, ilkin yoxlama olmadan çatdırılır; CORS sonra çağıran skriptin cavabı oxuya biləcəyini həll edir. CSRF tamamilə göndərmə tərəfində yaşayır.
Ona görə serverə vəziyyəti dəyişən əməliyyatlar üçün açıq yoxlama lazımdır. Sessiyaya bağlanmış sinxronizasiya tokeni və ya serverdə müqayisə olunan ikiqat göndəriş kukisi bu halı əhatə edir; Origin və ya Referer müqayisəsi ikinci qapı kimi əlavə etməyə dəyər, amma yeganə deyil, çünki hər sorğu başlığı daşımır və hər proksi onu saxlamır. OWASP-ın CSRF qarşısının alınması təlimatı SameSite-i məhz bu səbəbdən bir neçə qatdan biri sayır.
Şəbəkə qapısının həqiqətən nə sübut etdiyini qərar verin
Admin hostunun qarşısında VPN çıxış icazə siyahısı yaxşı nəzarət və zəif kimlik iddiasıdır. Sorğunun VPN-in verdiyi ünvandan gəldiyini sübut edir, bu ünvanı həmin çıxışdakı hər kəs paylaşa bilər, və arxasında hansı şəxsin və ya cihazın olduğunu demir. Ona giriş filtri kimi yanaşın, autentifikasiya kimi yox.
Onu sorğu səviyyəsindəki yoxlamalardan asılı olmayan saxlayın. Əgər icazə siyahısı hücumçu ilə vəziyyəti dəyişən son nöqtə arasında yeganə şeydirsə, bir səhv konfiqurasiya edilmiş marşrut, bir split-tunnel müştərisi və ya bir borc götürülmüş noutbuk nəzarəti tamamilə aradan qaldırır.
Gözlənilən diapazondan kənar rəddləri də qeyd edin. Onların partlayışı kiminsə indicə qurduğunuz sərhədi yoxladığının ən faydalı siqnalıdır, sükut isə filtrə ümumiyyətlə çatılmadığının siqnalıdır.
Kukiləri, girişi və icazəni açıq saxlayın
Kuki əhatəsi nəticənin çoxunu həll edir. Ana domen kukisi admin hostuna göndərilir, yəni ictimai saytda skript inyeksiyası administratorun sessiyası ilə hərəkət edə bilər; yalnız hosta aid kuki isə bilməz. Yalnız host formasına üstünlük verin, Secure atributunu əlavə edin və platforma dəstəkləyirsə __Host- prefiksini istifadə edin, çünki bu prefiks Secure, Path=/ və Domain atributunun olmamasını tələb edir. Kuki qabından deyil, cavab başlığından oxuyun: Set-Cookie: __Host-admin_session=...; Secure; Path=/; HttpOnly; SameSite=Lax, Domain atributu olmadan. Brauzer Domain daşıyan __Host- kukisini atır, yəni qardaş hostlarda hələ də görünən kuki prefiksin heç vaxt tətbiq olunmadığının sübutudur.
Sonra icazəni serverdə, hər sorğuda, hər admin son nöqtəsində saxlayın, yalnız girişdə deyil. İcazə verilmiş şəbəkədən gələn sorğu yenə autentifikasiya olunmalı və istədiyi əməliyyat üçün icazələndirilməlidir; host adı aktyor deyil. Əgər ictimai və admin tətbiqləri giriş axınını və ya sessiya anbarını paylaşırsa, bu əlaqəni yazın, çünki ictimai sayt xətasından admin əməliyyatına ən qısa yol budur.
Ayrımdan sonra sərhədi yenidən yoxlayın
Mənfi testləri işə salın, yalnız xoşbəxt yolu deyil: tokensiz saytlararası form göndərişi rədd edilməli, başqa sessiyanın tokeni rədd edilməli və heç bir GET vəziyyəti dəyişməməlidir. Tərtibatçı alətlərində kuki atributlarını yoxlayın, uyğun olmayan sorğuda Origin yoxlamasının işə düşdüyünü təsdiqləyin və filtrin işlədiyini görmək üçün admin hostunu VPN diapazonundan kənardan sınayın.
Bunların heç biri admin tətbiqinin içindəki XSS qüsurunu aradan qaldırmır. Ayrı host adı real dəyəri olan brauzer tərəfli təcrid sərhədidir və təhlükəli kod icrasının qarşısını almağın və ya server tərəfli sorğu müdafiəsinin əvəzi deyil. Ayrımdan sonra yoxlama siyahısı göründüyündən qısadır: fərqli mənbə, yalnız host kukiləri, hər dəyişiklikdə token, kimlik kimi etibar etmədiyiniz giriş filtri və hər sorğuda qərar verilən icazə.