在 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
Run Code Online (Sandbox Code Playgroud)
(有人质疑这个问题的相关性还有的是。有的谈了有关Windows的一些可执行文件安装的是很容易受到类似的攻击:在默认情况下的可执行文件将在DLL的搜索.
,所以通过种植一个邪恶的DLL中说Downloads
,你得到code exec,通常作为管理员。这是一个“不学习历史的人注定要重蹈覆辙”的时刻。)
小智 11
找到关于这个决定的“历史文件”并非易事,但引用 StackExchange 伞中的另一个答案,你会发现我也认为是你问题的最合适的答案:避免“sh##发生”的情况:
题:
多年来,在类 UNIX 系统上(与我最相关的是 Linux),我注意到 . 默认情况下,(当前目录)从不在 $PATH 中。为什么是这样?我记得几年前读到这是一个安全问题,但我读过的文章并没有解释到底是什么问题。是否因为有人可能在目录中留下恶意版本的“ls”或“cp”,而我最终会在没有意识到它存在的情况下运行它?
回答:
您正确回答了自己的问题,这正是 dot 不在路径中的原因:防止幼稚的病毒或诚实的错误。
当然,这是一个非常蹩脚和无用的杀毒措施,没有什么能阻止你自己在路径上加点。
在这个链接上,你可以找到一个额外的例子,为什么把点放在你的$PATH
.
一个极端的例子是一个普通用户创建了一个shell脚本如
rm -r /
,该脚本将删除系统中该用户具有写入权限的所有文件和目录,并将该脚本命名为ls
。如果系统管理员导航到此脚本所在的目录并尝试运行标准ls
命令以查看该目录的内容,shell 将改为运行具有相同名称的脚本,从而删除所有当前安装在计算机上的分区!
此外, PATH 的目的是以这样的方式完成命令的路径,您无需记住或键入二进制文件的完整路径。无需为您所在目录的命令建立索引。如果您知道这些程序的存储位置,则根本没有用。
但是,经过一番研究,我发现搜索路径背后的想法来自Multics,但局限性在于它只搜索内部/bin
. Unix v3是第一个在没有这个单目录限制的情况下实现它的。并查看以下手册的安全页面,他们已经显示了.
在 PATH 变量中使用时的问题。这不仅适用于su
并且加强了在环境中注入恶意代码的安全问题。
引用第 13 页:
在莫里斯和弗雷德格兰普讲述的正在进行的游戏中发现了特洛伊木马的技巧和对策。请注意,例如,删除
login(1)
第 8 章并侵入 (Grampp, v8)/etc/
的概要su
。这些馅饼打败了老栗子,即让程序命名login
或散布su
以希望捕获粗心的系统管理员键入的密码。 现代的其他微妙特征su
: dot 被排除在 shell 搜索路径之外,并且窃贼最喜欢的 shell 变量IFS
被重置。
从概念开始,如果使用点作为$PATH
.