Defaults.Exposed

Defaults.ExposedПоправки › Защита срещу MIME-sniffing (X-Content-Type-Options)

Как да поправите Защита срещу MIME-sniffing (X-Content-Type-Options)

Еднолинейна заглавка, спираща браузърите да познаят какво реално е един файл. Без нея файл, качен на вашия сайт — или файл на собствените ви страници — може да бъде погрешно прочетен от браузъра и да се изпълни като код, което именно е начинът, по който някои атаки превръщат безвредно изглеждащо качване в начин за кражба на сесиите на клиентите ви.

Заключение за вашия бизнес: Липсващата тази заглавка е ясен, сканируем знак, че основите не са на място. Сама по себе си рядко сваля сайт, но комбинирана с формуляр за качване на файл или съдържание, генерирано от потребители, отваря път на нападателя да изпълни злонамерен код в браузърите на вашите посетители — отвличайки влезли сесии, крадейки данни за влизане или въвеждане на карта и поставяйки ви на грешната страна на разговор за нарушение на данни. Това е едно от най-евтините поправяния в сигурността: един ред, безплатно, около пет минути.

Какво може да ви струва това

Защо има значение. Браузърите, когато сървърът е неясен относно това какво е даден файл, ще опитат да познаят ('подушат') типа на съдържанието. Нападателите използват тази предположка: качват файл, кирилен от сървъра като изображение, но чийто съдържание е изработено така, че браузърът да реши, че всъщност е JavaScript — и го изпълнява. Заглавката `X-Content-Type-Options: nosniff` казва на всеки браузър да спре да предполага и да вярва на декларирания тип от сървъра, затваряйки целия клас от трикове. Тя е оценена проверка, носеща 25 точки, и е оценена с средна сериозност когато липсва.

Кратката версия за собственика

Има тихо предположение, вградено в всеки уеб браузър: когато изтегля файл от вашия сайт, той опитва да разбере какъв вид файл е. Обикновено вярва на вашия сървър. Но ако вашият сървър е неясен, браузърът ще предположи — и това предположение се казва MIME-sniffing.

Проблемът е, че нападателите могат да манипулират предположението. Те могат да изработят файл, честно вярван от вашия сървър за безвредно изображение, но при оставяне на браузъра да предполага, решен, че всъщност е парче програмен код — и след това го изпълняват, директно в браузъра на вашия клиент, на вашия домейн.

Има еднолинейна инструкция, изключваща предположението: X-Content-Type-Options: nosniff. Тя казва на всеки браузър: „не предполагай — вярвай точно на това, което сървърът ти казва.” Това е цялата поправка. Безплатна е, отнема около пет минути и на правилно изграден сайт не счупва нищо.

Тази проверка търси тази заглавка. Ако липсва, губите 25 точки и се оценява като проблем с средна сериозност — не защото самата заглавка е катастрофа, но защото нейното отсъствие е надежден знак, че основите не са заключени.

Какво може да ви струва това

Това са реалистични, бизнес-нивои сценарии — а не крайно лош театър.

Нито едно от тях не изисква сложен нападател. Злоупотребата с MIME-sniffing е добре разбрана и автоматизирана, именно поради което скенерите маркират толкова твърдо липсващата заглавка.

Какво всъщност е

Когато браузър получи файл, сървърът трябва да го маркира с тип на съдържанието (например image/png за PNG изображение или text/html за уеб страница). Исторически браузърите не са вярвали напълно на онзи маркер — частично защото някои сървъри са го грешили — така че са надникнали в реалните байтове на файла и са решили сами. Това надникване е MIME-sniffing.

Беше удобство, станало отговорност. Ако нападател може да постави файл на вашия сайт (чрез формуляр за качване, поле за коментар, импортиран документ) и да влияе върху неговото съдържание, те могат да изработят нещо, маркирано от сървъра невинно, но подушено от браузъра като изпълним скрипт. Браузърът след това го изпълнява на вашия домейн, с цялото доверие, носено от вашия домейн.

X-Content-Type-Options: nosniff премахва догадките напълно. С него зададено, на браузъра се казва: използвай декларирания тип от сървъра и нищо друго. Файл, маркиран като изображение, се третира като изображение, точка — дори съдържанието му да изглежда като скрипт. Векторът на атака се затваря.

Как изглежда „добро”: всеки отговор от вашия сайт — страници и активи еднакво — носи точно тази заглавка:

X-Content-Type-Options: nosniff

Няма друга валидна стойност и нищо за настройване. Ако вашите CDN и сървър и двата я добавят (така виждате nosniff, nosniff), това е наред и все пак се счита за преминаване.

Как да го поправите (безплатно, ~5 минути)

Предайте този раздел на когото управлява вашия уебсайт — вашия IT специалист, уеб разработчик или поддръжка на хостинг. Поправката е безплатна и бърза; няма нищо за купуване. Това, за което молите, е просто: „Добавете заглавката на отговора X-Content-Type-Options: nosniff към всяка страница и актив на сайта.”

Ето детайлите за тях, по обичайна платформа.

Cloudflare (или подобна CDN/прокси) — Често най-бързото място за направяне, обхващайки целия сайт наведнъж:

Nginx — добавете вътре в съответния блок server (или location):

add_header X-Content-Type-Options "nosniff" always;

Ключовата дума always гарантира, че се изпраща и при грешки. Презаредете Nginx след запазване.

Apache — изисква активиран mod_headers; в конфигурацията на сайта или .htaccess:

Header always set X-Content-Type-Options "nosniff"

IIS / Windows хостинг — в web.config под <system.webServer>:

<httpProtocol>
  <customHeaders>
    <add name="X-Content-Type-Options" value="nosniff" />
  </customHeaders>
</httpProtocol>

Node / Express — задайте го за всеки отговор:

app.use((req, res, next) => {
  res.setHeader('X-Content-Type-Options', 'nosniff');
  next();
});

(Или използвайте пакета helmet, задаващ това и няколко други заглавки за сигурност по подразбиране.)

Сайтове на Google Workspace / Microsoft 365: те управляват имейла и документите ви, а не публичното ви уеб хостинг, така че заглавката не се задава там — тя се задава там, където действително се обслужва уебсайтът ви (вашата CDN, уеб сървър или конструктор на сайтове). Ако използвате хостван конструктор на сайтове (Squarespace, Wix, Shopify и подобни), много я добавят автоматично за вас; проверете резултата, вместо да предполагате, и питайте тяхната поддръжка, ако липсва.

След разгръщане, проверете го. Стартирайте отново сканирането или накарайте разработчика да провери заглавките на отговора в инструментите за разработчик на браузъра (Раздел Мрежа → кликнете върху произволна заявка → Заглавки на отговора) и потвърдете, че X-Content-Type-Options: nosniff е налице. Тествайте сайта накратко, за да потвърдите, че нищо стилизирано или написано в скрипт не се е счупило — на правилно изграден сайт нищо няма.

Чести грешки

Предайте това на вашия IT специалист

Техническото резюме: тази проверка инспектира HTTP заглавките на отговора и преминава когато X-Content-Type-Options е налице и стойността му (без разлика на регистър) съдържа nosniff — включително случая с многократен-изходник nosniff, nosniff, където CDN и оригинала и двата го задават. Липсваща или каквато и да е стойност, различна от nosniff, се проваля. Тя е оценена проверка P2, носеща 25 точки, оценена като средна сериозност при провал и съответства на OWASP Top 10 A05 (Неправилна конфигурация на сигурността). Отстраняването е единична статична заглавка на отговора, приложена за всички отговори; няма параметри и валидни алтернативни стойности. Задайте я на ръба (CDN) за покриване на целия сайт или на уеб сървъра с семантиката always, така че да се излъчва и при грешки, след което потвърдете в заглавките на отговора.

ЧЗВ

Не позволяваме на никой да качва файлове. Все пак трябва ли да имаме това?

Да, и все пак си заслужава. Заглавката е защита в дълбочина: тя също спира браузъра да погрешно чете скриптове, стилови таблици и файлове с данни, обслужвани от вашия собствен сайт, което защитава срещу няколко трика за cross-site scripting дори на сайтове без формуляр за качване. Не струва нищо и никога не счупва правилно конфигуриран сайт, така че няма причина да я пропуснете.

Ще счупи ли добавянето на това нещо на нашия уебсайт?

Почти никога. `nosniff` просто кара браузърите да спазват типа на съдържанието, изпращан вече от вашия сървър. Единственият начин да причини проблеми е ако вашият сървър погрешно отбелязва файлове — например изпращайки стилова таблица или скрипт с грешен тип. Ако нещо се счупи, това е реален бъг, разкрит от `nosniff`, а не причинен от него, и си заслужава поправяне така или иначе. Тествайте веднъж след разгръщане.

Как изглежда реално 'добро'?

Единична заглавка на отговора на всяка страница и актив: `X-Content-Type-Options: nosniff`. Това е цялата правилна конфигурация — няма други валидни стойности и нищо за настройване.

Нашата CDN (Cloudflare или подобна) и нашият сървър и двата я добавят — проблем ли е?

Не. Виждането на стойността два пъти ('nosniff, nosniff'), защото и CDN, и оригинала я задават, е напълно наред и все пак преминава. Не е нужно да премахвате едно.

Поправянето на това струва ли пари?

Не. Поправката е един ред безплатна конфигурация на вашия уеб сървър или CDN. Всеки, таксуващ ви да добави единична заглавка, претаксува. Единствените неща, за които си заслужава да плащате в тази област, са текущ мониторинг, преглед на портфолио в много сайтове или официален одит — не самата поправка.

По какво се различава това от Политиката за сигурност на съдържанието (CSP)?

Те са допълващи се. CSP контролира кои скриптове и ресурси е разрешено да се зареждат изобщо; `nosniff` спира браузъра от погрешно класифициране на зареждащ се файл. Искате и двете. `nosniff` е много по-прост и по-бърз за добавяне, така че е добра първа стъпка по пътя към пълен CSP.