![UNIX 的历史记录不包括 $PATH 中的当前目录](https://linux22.com/image/81128/UNIX%20%E7%9A%84%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E4%B8%8D%E5%8C%85%E6%8B%AC%20%24PATH%20%E4%B8%AD%E7%9A%84%E5%BD%93%E5%89%8D%E7%9B%AE%E5%BD%95.png)
在 UNIX 世界中,众所周知,您需要在当前目录中为二进制文件添加前缀才能./
运行它们:默认情况下.
不存在$PATH
。这是为了避免邪恶的二进制文件覆盖系统实用程序(例如ls
并获取代码执行)。
我想了解这个决定的历史。它从一开始就在 UNIX 中吗?某些贝壳?
我想澄清:我不是在寻找一般原因为何实施;我明白这些。我正在寻找导致它的事件,或者至少是在进行更改时发生的事件。
引用将不胜感激。
有趣的是,看起来bash
实际上打算包含.
,至少这是我对此来源的阅读(来自config-top.h
):
/* The default value of the PATH variable. */
#ifndef DEFAULT_PATH_VALUE
#define DEFAULT_PATH_VALUE \
"/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
#endif
(有些人质疑这个问题的相关性。有一些谈话关于 Windows 上的许多可执行安装程序都容易受到类似的攻击:默认情况下,可执行文件将在 中搜索 DLL .
,因此通过在 中植入一个邪恶的 DLL Downloads
,您将获得代码 exec,通常以管理员身份执行。这是一个“不学习历史的人注定会重蹈覆辙”的时刻。)
答案1
找到关于这个决定的“历史文件”并不是一件容易的事,但是引用 StackExchange 伞下的另一个答案,你会发现我也认为是对你的问题最合适的答案:避免“sh##发生”情况:
问题:
多年来,在类 UNIX 系统(与我最相关的是 Linux)上,我注意到 .默认情况下,(当前目录)永远不会出现在 $PATH 中。为什么是这样?我记得几年前读过,这是一个安全问题,但我读过的文章没有解释问题到底是什么。是否因为有人可能在目录中留下恶意版本的“ls”或“cp”,而我最终会在没有意识到它存在的情况下运行它?
回答:
您正确地回答了自己的问题,这就是为什么点不在路径中的原因:为了防止幼稚的病毒或诚实的错误。
当然,这是一种非常蹩脚且无用的防病毒措施,没有什么可以阻止您自己在路径中添加点。
继续这个链接,您可以找到另一个示例,说明为什么将点放在您的$PATH
.
脚注:
一个极端的例子是,普通用户创建了一个 shell 脚本,例如
rm -r /
,该脚本将删除系统中该用户具有写入权限的所有文件和目录,并将该脚本命名为ls
。如果系统管理员导航到该脚本所在的目录并尝试运行标准ls
命令以查看该目录的内容,shell 将改为运行具有相同名称的脚本,从而删除所有目录的内容计算机上当前安装的分区!
此外,PATH 的目的是以您不需要记住或键入二进制文件的完整路径的方式完成命令的路径。无需索引您所在目录的命令。如果您知道这些程序的存储位置,则根本没有用处。
编辑:
然而,经过一些研究,我发现搜索路径背后的想法来自多路系统但限制是只能在内部搜索/bin
。Unix v3是第一个在没有这种单目录限制的情况下实现它的人。查看以下手册的安全页面,他们已经显示了.
在 PATH 变量中使用时存在的问题。这不仅适用于su
而且还强化了在环境中注入恶意代码的安全问题。
引用第13页:
莫里斯和弗雷德·格兰普在一场正在进行的游戏中发现了特洛伊木马技巧和对策。例如,请注意,删除了
login(1)
第 8 章并插入了 (Grampp,v8)/etc/
的概要。这些小玩意打败了让程序命名或随意放置以期捕获粗心的系统管理员输入的密码su
的老问题。login
su
现代的其他微妙功能su
:点被排除在 shell 搜索路径之外,并且窃贼最喜欢的 shell 变量IFS
被重置。
自构思以来,如果使用点作为$PATH
.