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ą.

ScenarijusBe nosniffSu nosniff
Įkeltas failas, pažymėtas kaip tekstas, bet turintis HTMLGali atvaizduoti ir paleisti scenarijusPateikiamas kaip inertiškas tekstas
Scenarijus, pateiktas su ne scenarijaus MIME tipuVis tiek gali įsivykdytiUž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.

nosniff daro prielaidą, kad jūsų Content-Type antraštės teisingos. Uostymo išjungimas reiškia, kad naršyklė visiškai pasitiki tuo, ką deklaruojate, todėl tikrai neteisingai pažymėtas failas dabar gali nebeįsikelti. Prieš diegdami įsitikinkite, kad jūsų serveris siunčia tikslius MIME tipus — sprendimas yra teisingai pažymėti turinį, o ne palikti uostymą įjungtą kaip ramentą.

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

Patikrinkite savo svetainę pagal šį vadovą

Atlikite nemokamą ScanOpsPro patikrą ir pažiūrėkite, kaip jūsų svetainė tvarkosi su pagrindais.

Atlikti nemokamą patikrą