将当前目录添加到path

这是一个我似乎无法find答案的问题。

在Windows / DOS环境下,我们已经“教导”,可以使用当前目录启动程序,而不必在path前缀。

但是,Linux的默认行为是必须在当前目录中为应用程序/脚本添加前缀./。

人们说,允许程序/脚本在不加目录的前提下执行是一种不好的安全措施。 有很多“不好的安全措施”,但这个对我来说没有意义。 例如,我不打算进入/ some / unfamiliar /目录并开始执行像ls这样的程序。 我会cd(到我的主目录),然后键入ls -la / some / unfamiliar /目录。 当然,我会在糟糕的一天。

如果有人把一个名为ls的程序放在一个目录中,并且一个坏的系统pipe理员将该目录设置为该目录并以root身份运行ls,并且ls添加了一个后门用户和其他恶意的东西,我可以看到“威胁”。 精细。 但是,通常在这种情况下,用户会抱怨“哦,我不行,你可以检查吗?” 我会sudo su“用户”,并尝试ls作为他。

除非我完全错过了一些东西,否则加上“。” 到你的PATH真的那么糟糕?

编辑:

到目前为止,所有的答案都可以用来指出安全风险 – 然而,每个人都缺lessWindows的论点。 在Windows下,当前目录不在您的path中,所以无法禁用运行program.exe afaik的function。 但是,命令提示符确实接受了以。\(。\为前缀的function,但是,您应该使用\否则可能会以某种types的转义序列结束)。 在Windows下我们应该总是在命令的前面? 另外,我们是否应该联系微软,并告诉他们他们不善于植入这种预期的行为?

我的背景是Windows,所以我偏偏期待当前目录中的程序能够运行,尽pipe我知道这不是Unix世界中的方式。 这就是为什么我在那里提出这个问题。

为了扩大“坏的安全实践”(以及为什么他们在报价中)的含义,是因为我们可以引用数百万甚至数十亿的安全做法,人们应该这样做…但是我们不这样做,如果我们做了,一个人肯定会疯了。 我们是否应该减轻每个安全风险,并有可能干扰用户的体验? 我说不,但是因为我认为安全性应该对用户是透明的,但是我喜欢haus的第一句话:“和其他任何东西一样,它是一种心态。” 我想我们应该放弃这一点。

和其他任何东西一样,这是一种心态。

通过将当前目录作为path的一部分,确实会增加风险。 只是因为一个木马程序已经执行,并不意味着它不会做到人们所期望的。 换句话说,要使用你的ls的例子,特洛伊程序,除非它是由duncedevise的,否则确实会提供你所要求的目录列表,所以除非你说文件坐在那里,否则你没有理由期待出了什么问题(可能会很聪明,并决定从提供的目录列表中删除,以便进一步降低检测的机会)。

要发生这种情况,这意味着有人已经渗透到给定的系统,以至于可以将文件放到文件系统上。 因此,你已经处于一个不好的状态,但是事情还有可能变得更糟。

作为一般的做法,我不把我的当前目录放在我的linux / unix系统的path上,这不是一个很大的困难。 当我编写一个我希望经常使用的程序或脚本时,将其放入我的path中的一个文件夹中,并将写入权限限制在所述文件中。

短回答者,将当前目录添加到您的path会导致一个非特权用户的厄运,可能不会,但为什么要抓住机会呢?

对于根,不要这样做。

对于根,这是致命的。 对于其他用户的原因,我会build议不要添加“。” 到path(以及安全性)是,它会导致你的怪异和令人困惑的问题,例如searchpath的进程可能会开始花费不同的时间量或find一个不同的程序名称相同。 solaris上的/ usr / ucb例如包含ps命令的BSD版本。 创build一个新的文件系统,然后用“。”填充大量的文件。 在你的path尝试做一个bash完成“grep”。 这将需要更长时间,因为。 必须被search,那里有一百万个文件。 “” 也可能在一些非常缓慢的媒体,如非常遥远的NFS挂载或一些。 你可能会摆脱它,从来没有看到它造成的问题,但当它确实造成的问题,它可能并不明显,根本原因是什么。 在过去我看到很多性能问题会导致很长的PATH,PATH在不同的环境下不一样,等等。 我的2D:用你自己的用户在你自己的盒子上,如果这样可以让生活变得更轻松。 在生产上,保持点不在path上。

如前所述,最明显的安全风险就是在当前目录中有一些恶意代码替代现有的可执行文件。 这是否是可以利用的,取决于你对“不要运行无名目录的命令”策略的严格程度。

然而,可能出现的更微妙和更可能更严重的问题是命令的parsing不再是可预测的 。 例如,如果您runcommand通过在BASH中inputrunc<tab>来使用runcommand ,那么在大多数目录中都可以使用runcommand ,但是如果您恰好位于具有可执行runcom的目录中,则会失败。 同样,只要知道自己在做什么,就可以绕开这个问题,但按照我的经验,在五十次没有问题的情况下inputrunc<tab>五十次后,第五十一次可以很容易地被打滑。

令人讨厌的部分是它不涉及恶意的意图。 没有病毒感染你的系统,木马没有偷偷地植入你的主目录。 这只是两个不同的命令,在两个不同的目录中,它们执行两个不同的事情。 runcom可能相当合理地只需要从你的主目录中删除一半的文件,但这并不意味着你想不小心运行它。

如果你正在处理脚本,这可能会更危险。 如果你从命令行运行一个典型的shell脚本,它将采用你的$ PATHvariables。 与上面的例子类似,这意味着如果从不同的目录运行它,脚本行为可能会有所不同。 如果您使用的是/usr/bin而不是使用/usr/local/bin版本,则可能会运行任何给定命令的不同版本。 或者,也可以select可用的命令,这些命令通常会在丢失时标记出一个合法的错误 – 比一个重要脚本出乎意料的更糟糕的事情之一,就是脚本意外失败并认为它成功了。 编写良好的脚本通过设置自己的$ PATH或通过显式调用以完整path名开头的命令来解决这个问题。

并不是所有的脚本都写得很好。

很多这些问题可以通过将当前目录设置为path中最后一个parsing点而不是第一个( PATH=$PATH:.而不是PATH=.:$PATH )来处理,但是这仍然不是完美的解决scheme。 看到用./来运行本地目录版本的命令前缀显然只是一个额外的两个击键,我会坚持。

聪明的攻击,虽然可能很less,可以结合多种技术,从非​​特权环境开始,使用“。”中的假可执行文件。 当前目录path使用类似于我的问题/答案的技术将别名插入到环境中,这将跟随您进入特权环境。

  1. 非特权用户的path包含“。” – 当前目录
  2. 具有通用名称的恶意可执行文件将在用户可写目录中创build
  3. 现在有人用cd进入该目录,并执行恶意软件,认为他们正在执行自己的方便的程序
  4. 恶意可执行文件通过写入用户的~/.bashrc来为su创build一个隐藏的别名
  5. 它也会创build一个名字不太明显的恶意rc文件(我们称之为“badrc”)
  6. 有人login,从而执行别名定义,这样做alias su='sudo bash --rcfile /path/to/badrc'
  7. 用户执行su -并获得一个shell提示,并开始使用隐藏别名技术在“badrc”中使用别名的命令
  8. 利润(攻击者)

这当然是一个复杂的序列,其他的变化是可能的,但为什么让自己打开? 从你的path上省略“点”(加上对sudoer的严格控制并保持良好的习惯)为攻击者提供了一个条。

随着pwd是一个缓慢的远程文件系统来这个问题:如果。 由于某种原因不再存在,您不能再运行shell buildins以外的命令,这很令人困惑。 pwd可能已经被删除,包含它的文件系统可能已被强制卸载,或者已closures的服务器上。