据我了解,文件扩展名根本不会真正影响其中包含的数据。它们只是向您的计算机提示数据是什么、其结构如何,然后您的计算机会找到处理该特定文件类型的最佳程序。
所以我的问题是:如果你可以将自定义数据写入,例如,一个.png
实际上包含与普通文件不同的值的.png
文件,然后让一个程序打开它,你能让它做一些恶意的事情吗?
据我了解,文件扩展名根本不会真正影响其中包含的数据。它们只是向您的计算机提示数据是什么、其结构如何,然后您的计算机会找到处理该特定文件类型的最佳程序。
所以我的问题是:如果你可以将自定义数据写入,例如,一个.png
实际上包含与普通文件不同的值的.png
文件,然后让一个程序打开它,你能让它做一些恶意的事情吗?
文件扩展名实际上与文件中的数据或数据的结构完全无关。Windows 喜欢让您认为扩展名具有某种魔力——它不是,它只是文件名的一部分,并告诉 Windows 在您打开文件时启动哪个程序。(Linux/Android 和 MacOS/iOS 仍然使用文件扩展名,但与 Windows 使用的程度不同。)
你完全正确,你可以将一些数据转储到一个文件中,调用它virus.png
,它会被图像查看器打开。调用它virus.docx
,它会被 MS Word 打开。
如果您采用一个编写良好的程序并为其提供包含它不期望的数据的文件,那么不会发生任何令人兴奋的事情。该程序应该给出关于“损坏的文件”或类似内容的错误并继续其生命。当程序写得不好时就会出现问题 - 通常是由于一些小错误,例如程序员忘记检查数组的边界,忘记检查空指针,或者忘记{
}
在if
语句上放置大括号。
即使有错误,99.999...% 的格式错误的数据都会得到“损坏的文件”错误。只有非常仔细地构建数据,才会发生恶意事件。有关具体示例,请参阅下面的 StageFright 部分。
(感谢@octern 对此的评论)。
是的,您所描述的实际上是一种常见的攻击媒介——因此人们普遍担心打开未知的电子邮件附件。
作为攻击者,如果您知道特定程序中存在漏洞,例如默认的 Windows 图像查看器,那么您可以构建一个旨在利用此漏洞的恶意文件。通常这意味着您知道查看器中的某行代码不会检查数组的边界,因此您构建了一个.png
专门设计用于执行缓冲区溢出攻击的畸形代码,并让程序运行您插入的代码。
例如,这里有一份关于开源库 libpng [CVE-2004-0597]的漏洞报告。
libpng 1.2.5 及更早版本中的多个缓冲区溢出,如在多个产品中使用的那样,允许远程攻击者通过格式错误的 PNG 图像执行任意代码,其中 (1) png_handle_tRNS 函数无法正确验证透明度块 (tRNS) 数据的长度,或者 (2) png_handle_sBIT 或 (3) png_handle_hIST 函数没有执行足够的边界检查。
另外:常见漏洞和暴露 (CVE) 是一种跟踪公共软件中已知漏洞的方法。可在此处搜索已知漏洞列表:https ://cve.mitre.org/cve/cve.html
如果您在 CVE 中搜索“png”,您会发现数百个漏洞和攻击,就像您在问题中想象的那样。
2015年4月的StageFright Android漏洞非常相似:Android核心多媒体库中存在缓冲区溢出漏洞,攻击者通过MMS(多媒体信息)发送格式错误的音频/视频文件,可以完全控制手机。
此漏洞的原始利用是攻击者发送一个看起来像有效的音频/视频文件的3GPP音频/视频文件,只是元数据中的一个整数字段异常大,导致整数溢出。如果这个大“整数”中真的包含可执行代码,这可能最终会在手机上运行,这就是为什么这种漏洞被称为“任意代码执行漏洞”的原因。
如果你在 CVE 中搜索“pdf”或“word”,你会发现一大堆任意代码执行漏洞,人们已经能够利用这些文件类型来利用这些漏洞(哇——Word 也有许多最近的漏洞,整洁)。这就是为什么.pdf
并且.docx
通常用作带有病毒的电子邮件附件。
嗯,这个问题相当广泛。但简而言之:
相当多的病毒只是利用/-ed windows 隐藏文件扩展名的强大功能。例如,该文件someimg.jpg.exe
将向someimg.jpg
用户显示,用户会在不知道他执行恶意代码的情况下打开它。
已经有(可能有)一些路过病毒,它利用了 Windows 图像库中的一个错误,该错误能够执行隐藏在 jpg 中的代码。众所周知,Flash 也容易受到缓冲区溢出攻击。通过插入大于指定的帧,可能会导致允许代码执行的缓冲区溢出。adobe 上的 PDF 文件允许嵌入 javascript 代码,这也可以被恶意使用,并且 AdobeReader 有一个错误,允许从 pdf 文件中执行嵌入的可执行文件。该列表可以无休止地进行。
这些类型的黑客需要对特定软件及其弱点的精确知识。但是没有选项可以简单地将 a 重命名.exe
为.jpg
并希望 image-lib 会执行它,或者类似的东西。