使用`find -exec`有哪些安全问题和竞争条件?


14

find手册页

-exec command ;
    There are unavoidable security problems
    surrounding use of the -exec action; you should use the
    -execdir option instead.

-execdir command {} +
    Like -exec, but the specified command is run from the
    subdirectory containing the matched file, which is not
    normally the directory in which you started find.  This a much
    more secure method for invoking commands, as it avoids race
    conditions during resolution of the paths to the matched
    files.

这是什么意思?从开始目录运行它为什么会有竞争条件?这些安全风险如何?


相关:为什么遍历find的输出是不好的做法?在某些答案中涵盖了这些内容。
斯特凡Chazelas

Answers:


13

找到细节 这里

-exec操作将导致另一个程序运行。它将当时正在考虑的文件名传递给程序。被调用的程序通常将对该文件执行一些操作。同样,这里有一个可以利用的竞赛条件。我们以命令为例

 find /tmp -path /tmp/umsp/passwd -exec /bin/rm

在这个简单的示例中,我们仅识别要删除的一个文件,并调用 /bin/rm删除它。存在问题是因为在find决定需要处理该-exec动作的点与/bin/rm命令实际发出unlink()系统调用以从文件系统中删除文件的点之间存在时间间隔 。在此时间段内,攻击者可以重命名/tmp/umsp 目录,并使用的符号链接替换目录/etc。没有办法/bin/rm确定它是否正在与find想到的同一文件上工作。一旦符号链接到位,攻击者就说服了find导致了/etc/passwd文件的删除,这并不是实际调用该命令所希望的效果。

不知道有人会利用它吗?但是我想这是答案!


在上述情况下,在执行命令之前execdir首先将chdir更改/tmp/umsp为,因此从理论上讲,攻击者重新链接目录不会产生任何影响.. 如果重新链接发生在找到“决定”以进行评估-exec但在rm命令可以执行其工作之前。但是我不知道为什么会有所不同:攻击者可以在用户决定编写find命令后简单地进行重新链接。
Otheus '16

1
@RuiFRibeiro链接不是传递给命令的参数,而是中间目录。/tmp/umsp是目录,当find看到它时,但是rm运行时,被攻击者已将其更改为的符号链接/etc/tmp/umsp/passwd一直是常规文件,但不是同一文件。
吉尔(Gilles)'所以

2

我认为之所以-exec危险是因为,如果用户不指定要执行的程序的全名和路径,则可能会执行错误的程序。

例:

find /some/path -exec coolprogram

/some/path,有人创建了另一个coolprogram,然后它将您的所有数据上传到某个坏演员。

但是等等,你说,你不必执行它 ./coolprogram吗?是的,但是有些人有PATH=.:/bin:whatever,它将在当前目录中执行程序。

这可能被简化了,但我认为在某些情况下可能很危险。一旦零字节cpio出现在错误的目录中,我就不得不解决一个问题。它由于cpio在目录中运行零字节文件而无法运行而导致程序崩溃。


3
这些风险并不是孤立的find -exec。如果您已经放置.了路径,那么coolprogram无论您是否使用过find,仅在当前目录中执行就已经很危险了!
Danny Tuppeny '16

1
同意,但似乎-execdir也注意我提到的条件:The ‘-execdir’ action refuses to do anything if the current directory is included in the $PATH environment variable. This is necessary because ‘-execdir’ runs programs in the same directory in which it finds files – in general, such a directory might be writable by untrusted users. For similar reasons, ‘-execdir’ does not allow ‘{}’ to appear in the name of the command to be run.
Doug

我想这个故事的寓意在于拥有。在您的路径中也是一个坏主意,这就是为什么我确保它不在其中。
道格

有趣的是关于禁止.在路径和{}命令中的信息。也许将来Linux会完全禁止使用.,并且工具不需要实施自己的安全检查!:)
Danny Tuppeny '16

1
我认为我编写的代码中有90%只是要抓住5%出错的地方。:)
道格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.