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

信息安全 开发 文件类型 上传文件
2021-09-08 04:31:14

我刚刚读过这个问题什么是损坏的图像漏洞?它是如何工作的? (GIFAR、带有 javascript 的 EXIF 数据等。)

我在问自己如何保护自己和网站的用户。

我的用户可以上传他们自己的图片(例如论坛头像、图片作为消息的一部分),这些图片会显示给相应页面的所有其他访问者。

我能做些什么来确保上传的文件是真实的、普通的图片而不是其他东西?我不是在问克服特定漏洞的方法,而是在问我如何确定该文件只包含纯图像数据?(所以我可能也会受到保护,免受“尚未发现”的漏洞)

3个回答

我有一些建议:

  1. 使用单独的域。在单独的域上托管图像,该域仅用于托管用户提供的图像。

    这将确保许多浏览器级别的攻击只能产生有限的影响。例如,假设用户的浏览器容易受到内容类型嗅探攻击,因此可以上传一些浏览器将其视为包含恶意 Javascript 的 HTML 的图像;这种防御确保恶意 Javascript 只能篡改其他用户的图像,而不能访问您网站的 cookie 或内容或其他安全敏感的东西。然而,这并不能防御利用漏洞(例如,缓冲区溢出、双重释放)并执行本机代码的代码注入攻击。

  2. 防御内容类型嗅探。 遵循我在其他地方概述的做法来防御内容类型的嗅探攻击。最重要的是Content-Type:在您提供图像的 HTTP 响应上设置正确的标头。包含标题也很有帮助X-Content-Type-Options: nosniff,以防止某些版本的 IE 尝试进行内容类型嗅探。

  3. 转换为固定格式。将输入图像转换为位图(仅保留位图数据,并丢弃所有额外的注释),然后将位图转换为所需的输出格式。一种合理的方法是先转换为 PBM 格式,然后再转换为 PNG。

    这不是阻止攻击的可靠方法,但它减少了攻击者可用的一些攻击面。例如,它可以防止攻击者附加恶意元数据,这些元数据旨在利用图像解析器中的某些漏洞。它也不让攻击者选择图像格式。为了击败这种防御,攻击者必须在读取图像像素数据的代码中找到 PNG 解码器中的漏洞。它可以防止攻击者利用解码器中的某个其他图像格式或读取元数据的 PNG 解析器部分中的漏洞。因此,虽然可能有助于降低风险,但我不认为仅此防御就足够了。

  4. 考虑随机化。 考虑在图像中插入一些随机噪声。例如,您可能会遍历所有像素,并且对于该像素的三个强度(对应于 RGB)中的每一个,随机选择加 1、减 1 或单独保留该强度值。这会在图像中引入一点点噪点,但希望不足以让观众注意到。而且,如果幸运的话,它可能会降低一些攻击成功的可能性,因为攻击者无法完全预测转换的结果。这种防御是高度启发式的,当然不能保证有效,但如果与我概述的其他防御一起使用,它可能会有所帮助,作为一种纵深防御策略. 但请理解,仅此防御可能是不够的。

根据您对这些风险的关注程度和您网站的敏感性,您不需要全部四个。如果您不担心浏览器中的代码注入漏洞,您可以只执行 #1 和 #2。如果你想部分保护浏览器中的代码注入漏洞,你可以只做#1、#2和#3。

一种可能的解决方案是在网站上显示图像之前将文件重写为简单的已知格式。例如,有人上传图像(可能带有漏洞),服务器立即以安全的方式读取图像并写入新图像。如果用于读取上传图像的程序/脚本只读取颜色数据,则新图像只能包含颜色数据。

我想这取决于视角?从最终用户的角度来看,要防止来自图像或任何其他来源(同样,利用缓冲区溢出漏洞)的漏洞利用(尤其是内存/缓冲区溢出),将受益于确保内存保护功能完全启用。在 Windows 中,使用 DEP(基于 NX/XD)和 ASLR 等机制来降低由于缓冲区溢出而导致代码执行的可能性。默认情况下,可以为所有应用程序打开 DEP,而不仅仅是选择加入,例如。

这是对使用防病毒软件、保持软件补丁和其他明显内容的通常建议的补充。

如果您可以选择沙箱化您的应用程序以限制损害(利用后),那么这也是一个可行的途径。至少,您可以利用最小特权原则(例如,在不需要的地方不使用管理帐户)。

希望有帮助。