Ang paglipat ng admin interface sa admin.example.com ay tunay na pagbuti: inilalayo nito ang admin cookies sa mga pampublikong pahina, binibigyan ang dalawang aplikasyon ng hiwalay na cache at hinahayaan kang ituro ang mas mahigpit na patakaran ng network sa isang hostname. Ngunit hindi ito kontrol sa CSRF, at hindi nito ginagawang ligtas ang code ng pampublikong site na iwanang bukas sa harap ng naka-log in na admin. Binabago ng paghihiwalay ang itinuturing na hangganan ng browser, hindi ang sinusuri ng server, kaya gawin ang apat na pagsusuring ito bago sabihing tapos na.

Basahin ang pinagmulan at site bilang dalawang magkaibang salita

Ang pinagmulan ay scheme, host at port, kaya ang https://www.example.com at https://admin.example.com ay magkaibang pinagmulan. Ang site sa kahulugan ng SameSite ay scheme kasama ang rehistradong domain, kaya ang dalawang hostname na iyon ay karaniwang isang site. Ang pagkakaibang iyon ang buong bitag: hindi ka tutulungan ng SameSite attribute sa pagitan ng kapatid na subdomain, dahil hindi itinuturing ng browser ang kahilingan bilang cross-site. Ituro ang admin interface sa tunay na ibang rehistradong domain, tulad ng admin-example.net, at ang kahilingan ay tunay na nagiging cross-site, at doon nagsisimulang gumawa ng trabahong maaasahan ang SameSite=Lax o Strict.

Subukan ito sa browser sa halip na mangatuwiran tungkol dito.

I-load ang pampublikong site, buksan ang developer tools at tingnan kung aling cookies ang ikinakabit ng browser sa kahilingan patungo sa admin host. Kung walang Domain attribute ang cookie, para lamang ito sa host at nananatili sa sarili nitong pangalan; kung may Domain=example.com, naglalakbay ito sa bawat kapatid, at wala kang nakuha mula sa bagong subdomain para sa cookie na iyon.

Ihiwalay ang pagbasa ng tugon sa pagpapadala ng kahilingan

Nililimitahan ng patakaran ng parehong pinagmulan ang pagbasa ng mga tugon sa pagitan ng mga pinagmulan. Hindi nito pinipigilan ang kahilingang maipadala, at hindi nito pinipigilan ang form na magdala ng mga kredensyal na taglay na ng browser. Ang simpleng kahilingan, may uri ng nilalaman ng form o simpleng GET, ay naihahatid nang walang paunang pagsusuri; pagkatapos ay nagpapasya ang CORS kung maaaring basahin ng tumatawag na script ang tugon. Ang CSRF ay naninirahan nang buo sa panig ng pagpapadala.

Kaya kailangan ng server ng tahasang pagsusuri para sa mga operasyong nagbabago ng estado. Ang token ng sinkronisasyon na nakatali sa session, o cookie na dobleng pagsusumite na inihahambing sa server, ay sumasaklaw sa kaso; ang paghahambing ng Origin o Referer ay sulit idagdag bilang ikalawang gate ngunit hindi bilang nag-iisa, dahil hindi bawat kahilingan ay nagdadala ng header at hindi bawat proxy ay nag-iingat nito. Ang gabay ng OWASP sa pagpigil ng CSRF ay itinuturing na SameSite bilang isang patong sa ilang, dahil na rin dito.

Magpasya kung ano talaga ang pinatutunayan ng network gate

Ang listahan ng pinapayagang VPN exit sa harap ng admin host ay mabuting kontrol at mahinang pag-aangkin ng pagkakakilanlan. Pinatutunayan nitong galing ang kahilingan sa address na ibinibigay ng VPN, na maaaring ibahagi ng lahat sa exit na iyon, at wala itong sinasabi tungkol sa kung sinong tao o device ang nasa likod. Ituring itong filter ng pagpasok, hindi bilang pagpapatunay.

Panatilihin itong malaya sa mga pagsusuri sa antas ng kahilingan. Kung ang listahan ang tanging bagay sa pagitan ng attacker at ng endpoint na nagbabago ng estado, isang maling naka-configure na ruta, isang split-tunnel client o isang hiniram na laptop ang nag-aalis ng kontrol nang buo.

I-log din ang mga pagtanggi mula sa labas ng inaasahang saklaw. Ang pagsabog ng mga ito ang pinakakapaki-pakinabang na hudyat na may sumusuri sa hangganang kababuo mo lang, at ang katahimikan ang hudyat na hindi man lang naaabot ang filter.

Panatilihing tahasan ang cookies, pag-log in at awtorisasyon

Ang saklaw ng cookie ang nagpapasya sa karamihan ng resulta. Ang cookie ng parent domain ay ipinapadala sa admin host, kaya ang script injection sa pampublikong site ay maaaring gumawa gamit ang session ng admin; ang cookie na para lamang sa host ay hindi kaya. Piliin ang anyong para lamang sa host, idagdag ang Secure attribute at gamitin ang __Host- prefix kung saan sinusuportahan ito ng platform, dahil ang prefix na iyon ay nangangailangan ng Secure, Path=/ at walang Domain attribute. Basahin ang response header at hindi ang cookie jar: Set-Cookie: __Host-admin_session=...; Secure; Path=/; HttpOnly; SameSite=Lax, walang Domain attribute. Itinatapon ng browser ang __Host- cookie na may Domain, kaya ang cookie na nakikita pa rin sa mga kapatid na host ay patunay na hindi kailanman inilapat ang prefix.

Pagkatapos, panatilihin ang awtorisasyon sa server, sa bawat kahilingan, sa bawat admin endpoint, hindi lamang sa pag-log in. Ang kahilingan mula sa pinapayagang network ay kailangan pa ring mapatunayan at mabigyan ng awtorisasyon para sa operasyong hinihiling nito; ang hostname ay hindi aktor. Kung ang pampubliko at admin na aplikasyon ay nagbabahagi ng login flow o session store, isulat ang kaugnayang iyon, dahil iyon ang pinakamaikling daan mula sa bug sa pampublikong site patungo sa aksyong admin.

Suriin muli ang hangganan pagkatapos ng paghihiwalay

Patakbuhin ang mga negatibong pagsubok, hindi lamang ang masayang landas: ang cross-site form na walang token ay dapat tanggihan, ang token mula sa ibang session ay dapat tanggihan, at walang GET ang dapat magbago ng estado. Suriin ang mga attribute ng cookie sa developer tools, tiyakin na umiiral ang Origin check sa hindi tugmang kahilingan, at subukan ang admin host mula sa labas ng saklaw ng VPN upang makita ang filter na gumagana.

Wala sa mga ito ang nag-aalis ng XSS defect sa loob ng admin application mismo. Ang hiwalay na hostname ay hangganan ng paghihiwalay sa panig ng browser na may tunay na halaga, at hindi ito kapalit ng pagpigil sa hindi ligtas na pagpapatupad ng code o ng pagprotekta sa mga kahilingan sa panig ng server. Pagkatapos ng paghihiwalay ang listahan ay mas maikli kaysa sa hitsura nito: hiwalay na pinagmulan, cookies na para lamang sa host, token sa bawat pagbabago, filter ng pagpasok na hindi mo pinagkakatiwalaan bilang pagkakakilanlan, at awtorisasyong pinagpapasyahan sa bawat kahilingan.

Kaugnay na mga artikulo