在 POSIX 系统上,不可执行且只读的文件(也就是模式 444)是否有可能在机器上运行恶意代码?
如果是这样,你能解释一下它是如何做到的吗?
在 POSIX 系统上,不可执行且只读的文件(也就是模式 444)是否有可能在机器上运行恶意代码?
如果是这样,你能解释一下它是如何做到的吗?
是的,只需要执行它。X 标志向 shell 提示它可以直接执行,但是如果其他程序知道如何执行,这不会阻止其他程序执行它。
例如,如果你有一个a.sh
不能被 shell 执行的文件,你可以通过调用来执行它bash a.sh
(它bash
明确地告诉执行它)。如果你有一个不可执行的文件a.py
,你可以通过调用来执行它python a.py
。我想还有一种方法可以告诉操作系统执行二进制 ELF 文件,但我不知道该命令。
还有一整类事情不需要你做任何特别的事情来让它执行恶意代码。特别是 PDF 和 Adobe Flash 文件有一些众所周知的漏洞,这些漏洞允许读取文件的简单行为来执行恶意代码。还有一些文件在特定位置会自动执行(尤其是在 Windows 上)。此外,如果文件被压缩,它可能包含用于解压缩器的缓冲区溢出病毒。该文件也可能更加恶意,利用文件系统中的一个未知错误或其他非常低级别的东西。
底线:保证某些东西不会感染您的计算机的唯一方法是永远不要对任何东西做任何事情。
假设您的文件 myscript 包含以下内容:
#!/bin/bash
echo "Hello, World!"
如果你使这个文件可执行并使用 ./myscript 运行它,那么内核将看到前两个字节是#!,这意味着它是一个脚本文件。然后内核将使用该行的其余部分作为解释器,并将文件作为其第一个参数传递。所以,它运行:
/bin/bash myscript
bash 读取文件并执行其中包含的命令。另一种在没有设置执行位的情况下执行文件的方法是:
#. myscript
一个点后跟一个空格,然后是文件名。
因此,对于 bash(或您的脚本所需的任何解释器)来“执行”脚本,它只需要能够读取文件。
因此,对于脚本来说,执行位只是让执行起来更方便一些。只要 bash 是可执行的,您始终可以使用脚本文件作为参数运行 bash
这不仅适用于所有答案中显示的其他示例的脚本。基本上,如果读取文件的软件有错误,那么每个文件都是恶意代码执行的载体,使用了相当广泛的技术(溢出、内存损坏、任意软件执行......)。例子:
文件本身可能只是坐在那里并不危险。但是根据程序会尝试读取它,它可能会导致问题。同样,如果可以读取文件,则可以复制它。因此可以将其复制并重命名为可执行文件。
假设您使用的是 DOS/Windows,并且您有一个文件 something.txt,然后您将其复制到一个名为 something.bat 的文件中,您现在可以执行它。
如果您说一个 HTML 文件(或 html 内容),您可以在浏览器中加载它,如果您的浏览器存在 Javascript 漏洞,该程序可能会造成伤害。
从理论上讲,如果文件只是坐在那里,它可能仍然很危险,如果文件系统的文件分配表 (FAT) 有一些问题,并且正在执行一个程序,那么由于不正确的碎片它可能会跳转到你的恶意文件是并运行这样的代码。某些操作系统上的此类操作可以通过缓冲区溢出来完成。