X-Content-Type-Options ir MIME tipo „uostymas“
Naršyklės kartais suabejoja failo tipu, kurį deklaruoja jūsų serveris, patikrina turinį ir pačios nusprendžia, kas jis iš tikrųjų yra. Toks naudingai skambantis elgesys, vadinamas MIME uostymu, gali nekaltai atrodantį įkeltą failą paversti vykdomu kodu. Viena maža antraštė jį išjungia.
Trumpai
Siųskite X-Content-Type-Options: nosniff su kiekvienu atsaku. Ji nurodo naršyklėms pasitikėti jūsų deklaruotu Content-Type, o ne spėlioti, ir taip užkerta kelią visai klasei atakų, kai failas pateikiamas kaip vienas tipas, o vykdomas kaip kitas. Ar jūsų svetainė ją siunčia, patikrinsite mūsų antraščių tikrinimu.
Kas yra MIME uostymas
Kiekvienas jūsų serverio siunčiamas atsakas turi Content-Type antraštę — MIME tipą — kuri nurodo, kas yra kūnas: text/html, image/png, application/json ir taip toliau. Istoriškai kai kurie serveriai buvo netinkamai sukonfigūruoti ir siuntė neteisingą tipą, todėl naršyklės pridėjo atsarginį variantą: jei deklaruotas tipas atrodė neteisingas, jos žvilgtelėdavo į tikruosius baitus ir „uostydavo“ tikrąjį tipą. Jei failas, teigęs esąs paprastas tekstas, iš tikrųjų prasidėdavo <script>, naršyklė galėdavo nuspręsti, kad tai HTML, ir jį atvaizduoti.
Patogu sugedusiems serveriams, pavojinga visiems. Naršyklė dabar nepaiso jūsų ketinimo remdamasi užpuoliko valdomu turiniu.
Kodėl tai pavojinga
Įsivaizduokite svetainę, kuri leidžia vartotojams įkelti failus — avatarą, dokumentą, priedą. Tarkime, užpuolikas įkelia failą, pateikiamą su nekenksmingu Content-Type, pvz., text/plain, bet kurio turinys iš tikrųjų yra galiojantis HTML su įterptu scenarijumi. Be apsaugos naršyklė, uostanti turinį, gali nuspręsti, kad failas yra HTML, jį atvaizduoti ir paleisti scenarijų jūsų domeno kontekste. Tai yra išsaugoto kenkėjiškų scenarijų įterpimo ataka, pristatoma per jūsų pačių failų saugyklą.
Ta pati rizika galioja bet kuriam galiniam taškui, kur deklaruotas tipas ir tikrieji baitai gali išsiskirti — vartotojų įkelti failai, generuoti atsisiuntimai arba turinys, pateikiamas iš kelio, kuriam užpuolikas gali daryti įtaką.
Antra, tylesnė problema yra išteklių tipų painiava. Jei naršyklė yra pasiryžusi paleisti atsaką kaip scenarijų, nors jis pažymėtas kaip kažkas kita, užpuolikas, galintis valdyti dalį atsako kūno, gali sugebėti prakišti vykdomą kodą pro patikras, kurios tikrino tik deklaruotą tipą. Uostymas praplečia atotrūkį tarp to, ką jūsų serveris sako failą esant, ir to, kuo naršyklė yra pasirengusi jį laikyti, o kiekviena to atotrūkio dalis yra vieta, kur užpuolikas gali dirbti.
Vienos eilutės sprendimas
X-Content-Type-Options: nosniff
Su nustatytu nosniff naršyklė nustoja spėlioti. Ji traktuoja kiekvieną atsaką griežtai kaip jūsų deklaruotą Content-Type. Failas, pateiktas kaip text/plain, rodomas kaip tekstas ir niekada nevykdomas kaip HTML. Antraštė taip pat priverčia naršykles atsisakyti įkelti scenarijus ir stiliaus lapus, kurių deklaruotas tipas neatitinka to, kas buvo tikimasi, ir taip uždaro susijusį kelią.
| Scenarijus | Be nosniff | Su nosniff |
|---|---|---|
| Įkeltas failas, pažymėtas kaip tekstas, bet turintis HTML | Gali atvaizduoti ir paleisti scenarijus | Pateikiamas kaip inertiškas tekstas |
| Scenarijus, pateiktas su ne scenarijaus MIME tipu | Vis tiek gali įsivykdyti | Užblokuotas vykdymas |
Nustatymas visur
Kadangi rizika slypi atskiruose atsakuose, taikykite antraštę visuotinai, kad nieko nepraleistumėte. Apache serveryje Header always set X-Content-Type-Options "nosniff"; Nginx — add_header X-Content-Type-Options "nosniff" always;. Reikšmė visada yra būtent nosniff — kitų nustatomų parinkčių nėra.
Kur ji dera
Tai vienas pigiausių, mažiausios rizikos punktų saugumo antraščių kontroliniame sąraše: fiksuota reikšmė be jokių trūkumų teisingai sukonfigūruotai svetainei. Ji natūraliai dera su stipria Content Security Policy, kuri neleidžia įterptiems scenarijams pasileisti, net jei vienas prasprūstų. Nustatę atlikite patikrą, kad įsitikintumėte, jog antraštė yra jūsų atsakuose.
Dažniausiai užduodami klausimai
Ar yra kokių nors reikšmių, be nosniff?
Ne. nosniff yra vienintelė prasminga reikšmė, kurią antraštė priima. Arba ją siunčiate, arba ne.
Ar nosniff galėtų ką nors sugadinti mano svetainėje?
Tik jei jūsų serveris jau siunčia neteisingus MIME tipus — pavyzdžiui, JavaScript failą pažymi kaip paprastą tekstą. Teisingas sprendimas yra siųsti tinkamą Content-Type, po ko nosniff yra visiškai saugus.
Ar man jos reikia, jei jau turiu CSP?
Taip, jos apima skirtingą riziką. CSP valdo, iš kur gali kilti scenarijai; nosniff neleidžia naršyklei apskritai klaidingai interpretuoti failo tipo. Naudokite abi.
Susiję vadovai
HTTP saugumo antraštės: pilnas kontrolinis sąrašas
Visos svarbios HTTP saugumo antraštės, nuo ko jos apsaugo ir paruošta pradinė konfigūracija.
Skaityti →HTTP saugumo antraštėsHSTS paaiškinimas: Strict-Transport-Security teisingai
Kaip HSTS priverčia naudoti HTTPS, ką reiškia „preload“ sąrašas ir kaip jį įdiegti neužsirakinant.
Skaityti →HTTP saugumo antraštėsTurinio saugumo politika (CSP) pradedantiesiems
Kaip CSP stabdo kenkėjiškus scenarijus (XSS), kodėl ją sunku suderinti ir saugus būdas įdiegti pirmąją politiką.
Skaityti →Patikrinkite savo svetainę pagal šį vadovą
Atlikite nemokamą ScanOpsPro patikrą ir pažiūrėkite, kaip jūsų svetainė tvarkosi su pagrindais.
Atlikti nemokamą patikrą