X-Content-Type-Options 真的可以防止内容嗅探攻击吗?

信息安全 应用安全 Web应用程序 攻击 上传文件
2021-08-22 16:15:58

在纠结的网络中,Michal Zalewski 说:

避免使用 Content-Type: application/octet-stream 并改用 application/binary,尤其是对于未知的文档类型。避免返回 Content-Type: text/plain。

例如,任何代码托管平台在将可执行文件或源存档作为应用程序/八位字节流返回时都必须谨慎,因为它们可能会被误解为 HTML 并内联显示。

随后在 Internet Explorer 和 Safari 中实现的 text/plain 逻辑以在这种情况下检测 HTML 确实是个坏消息:它剥夺了 Web 开发人员安全使用这种 MIME 类型来生成用户特定的纯文本文档的能力,并且没有提供其他选择. 这导致了大量的 Web 应用程序漏洞,但时至今日,Internet Explorer 开发人员似乎并不后悔,也没有改变他们代码的默认行为。

网站使用X-Content-Type-Options:nosniff作者对这个标题说了以下内容:

强烈建议使用此标头 [X-Content-Type-Options];不幸的是,对它的支持 [...] 在其他浏览器中只得到有限的支持。换句话说,它不能作为抵御内容嗅探的唯一防御措施。

哪些内容嗅探攻击X-Content-Type-Options:nosniff无法阻止?什么Content-Type应该返回给用户而不是text/plain

3个回答

背景。 X-Content-Type-Options:是一个旨在防御MIME 内容嗅探攻击的标头如果您允许用户将内容(例如,图像、文档、其他文件)上传到您的网站,其他用户可以在该网站上下载这些内容,则 MIME 内容嗅探攻击是一种风险。

正如@Rook 所说,这与窃听/捕获网络流量无关。

它不能防止哪些攻击?因为X-Content-Type-Options:仅在某些浏览器上受支持,所以它不能保护对使用其他浏览器的用户的攻击。特别是,它应该在 IE、Chrome 和Firefox 50上运行。另请参阅让用户将内容上传到我的网站有哪些安全风险?对于其他一些攻击,它不会阻止,例如上传恶意软件或令人讨厌的内容,上传利用用户浏览器漏洞的内容等。

应该返回什么内容类型?您应该为该文件返回适当的内容类型。您不应允许用户上传具有危险内容类型的不受信任的内容。有关详细信息,请参阅以下问题的答案:

  1. 仅在白名单 MIME 内容类型下提供任何用户上传的文件是否安全?

  2. 存储和重放用户提供的 mime 类型是否安全?

  3. MIME 嗅探保护

  4. 为什么要限制上传到我网站的文件的内容类型?

  5. 让用户将内容上传到我的网站有哪些安全风险?

  6. 如何保护我免受图片漏洞的影响?

  7. 使用文件扩展名和 MIME 类型(作为文件 -i -b 的输出)组合来确定不安全的文件?

该主题已在本网站的其他地方进行了广泛讨论和记录,因此我不会尝试重复在那里找到的所有有用建议。


更新:我刚刚了解到,适当地设置Content-TypeandX-Content-Type-Options标头不足以保证安全。显然,Flash 忽略了 Content-Type 标头,这可能允许加载恶意 SWF,然后它可以执行您使用 XSS 执行的所有操作。(叹气,愚蠢的 Flash。)不幸的是,再多的文件内容类型白名单也无法阻止这种攻击。因此,似乎唯一安全的解决方案是将用户上传的内容托管在单独的域上。

以下是通过电子邮件收到的 Michal Zalewski 的答复:

简短的回答是它在 MSIE 中有效,并且仅在某些特定情况下有效。它不会保护您免受大多数其他浏览器的嗅探(更不用说热心了);但更重要的是,不会阻止插件做诸如上面概述的 crossdomain.xml 风险之类的事情;并且不一定会阻止 MIME 类型不匹配的子资源加载(即,通过 <embed> 将图像加载为 application/x-shockwave-flash)。

X-Content-Type-Options:nosniff 不能阻止哪些嗅探攻击?

通过不知道的工具嗅探X-Content-Type-Options:一些浏览器和可以获取网络资源的插件。(例如历史上的 Java GIFAR、Flash loadPolicyFile...)

应该向用户返回什么 Content-Type 而不是 text/plain?

对此没有很好的答案,因此如果您需要托管不受信任的文本文件,您应该采取通常的缓解措施,将它们托管在单独的主机名(最好是 IP 地址)上。

替代方案:HTML 编码,添加 a<pre>并用作text/html.