您将如何分析图像以找出其中是否嵌入了脚本或可能的恶意软件?使用什么工具/方法?
您将如何分析图像以确定其中是否嵌入了脚本?
我假设您将接受用户上传的图像文件并通过 Web 应用程序将它们提供给其他用户。在这种情况下,这里有两种不同的攻击向量。
(1) 可以解释为图像和另一种类型的文件。
这包括:
(1a) 带有嵌入 HTML 标签的文件,然后可以通过执行内容嗅探的浏览器将其加载为 HTML,并在您的域的安全上下文中执行脚本内容,从而导致传统的 JavaScript XSS。
(1b) 可以被解释为插件数据的文件,尤其是 Java(GIFAR 攻击)。仅仅托管这些可能会让您受到 XSS 的影响,因为 Java 和 Flash 中的同源策略基于托管文件的位置,而不是包含页面。
此类文件通常可以是预期类型的有效图像,也可以用作易受攻击的目标类型。
您可以通过处理提交的图像、加载它们并重新保存它们来使这些攻击变得困难。无论如何,您可能会这样做以进行裁剪、调整大小或质量级别的更改。
原则上,有人可以提交一张图像,当使用您使用的任何算法进行压缩时,会弹出包含<script>
或其他不良内容的图像,但这在现实中可能非常不切实际。
无论哪种方式,您都应该通过从无法编写脚本或与主网站域共享 cookie 的单独域中提供任何用户提交的文件来缓解这种攻击。(只要在任何共享的祖先域上没有任何服务,它就可以是子域。)
(2) 利用浏览器图像解码器中的错误导致任意代码执行的畸形图像。这些在今天并不常见,但过去曾出现过图像解码器错误,并且可能会出现更多错误。
这也可以通过加载和重新保存图像来解决;即使只是在加载时没有出错通常也是一个好兆头。但是,可以想象您自己的图像解码器中可能存在错误,这会使您的服务器端容易受到完全相同的问题的影响。
因此,请确保您的服务器端图像处理组件是最新的,并尽可能限制接受的输入格式的数量,以减少攻击面。如果这可能对您的应用程序构成威胁,您可能还希望考虑在较低权限的进程 (privsep) 中运行图像处理。
加载图像进行处理还存在通过非常大的图像(大小和/或压缩炸弹)进行服务器端拒绝服务攻击的风险。在尝试加载之前,检查图像文件头中的文件大小和分辨率。
根据您的应用程序是什么,检测格式错误的图像漏洞利用可能会带来有限的好处,因为(除了它们的罕见性)攻击者通常很容易将它们托管在其他地方并将图像或指向它的链接发布到其他用户提交的内容中.
除了@bobince 的回答,您还应该注意嵌入在图像元数据中的脚本。例如,如果您要显示来自用户提交的图像的 EXIF 数据,则存在风险。(我在一个流行的图片库中发现了几个基于这种注入方法的 XSS 漏洞。)
许多工具/库将向您显示图像元数据。Exiv2是一个方便的工具,用于查看和操作 EXIF 和 IPTC 图像元数据。
为了防止 Internet Explorer >=8 从 MIME 嗅探远离声明的内容类型的响应,您可以添加值为nosniff的X-Content-Type-Options标头。请参阅http://blogs.msdn.com/b/ie/archive/2008/09/02/ie8-security-part-vi-beta-2-update.aspx
大多数病毒扫描程序使用基于签名的检测可以找出任何文件中嵌入的恶意软件。
但是,如果它是真实图像(文件扩展名),则这些恶意软件很少被执行,该图像是使用正确的程序显示的,该程序不会尝试“执行”图像。