/usr/bin/vim 与 /bin/vim

/usr/bin/vim 与 /bin/vim

我明白了二进制文件可以位于不同的地方。我不明白的是为什么当我运行时whereiswhichtypevim是 at /usr/bin/vim,但是当我尝试使用它运行它时,sudo它说我无法运行/bin/vim

它们不是链接,而且内容是相同的。但我有权sudo执行/usr/bin/vim,这没有被称为我不知道为什么!

[user@host conf.d]$ sudo vim test.conf
[sudo] password for user: 
Sorry, user user is not allowed to execute '/bin/vim test.conf' as root on host.domain.com.br.
[user@host conf.d]$ whereis vim
vim: /usr/bin/vim /usr/share/vim /usr/share/man/man1/vim.1.gz
[user@host conf.d]$ which vim
/usr/bin/vim
[user@host conf.d]$ type vim
vim is /usr/bin/vim
[user@host conf.d]$ ll /bin/vi*
-rwxr-xr-x. 1 root root  910040 Jun 10 03:56 /bin/vi
lrwxrwxrwx. 1 root root       2 Set 30 11:38 /bin/view -> vi
-rwxr-xr-x. 1 root root 2289656 Jun 10 03:56 /bin/vim
lrwxrwxrwx. 1 root root       3 Set 30 12:14 /bin/vimdiff -> vim
-rwxr-xr-x. 1 root root    2084 Jun 10 03:56 /bin/vimtutor
[user@host conf.d]$ ll /usr/bin/vi*
-rwxr-xr-x. 1 root root  910040 Jun 10 03:56 /usr/bin/vi
lrwxrwxrwx. 1 root root       2 Set 30 11:38 /usr/bin/view -> vi
-rwxr-xr-x. 1 root root 2289656 Jun 10 03:56 /usr/bin/vim
lrwxrwxrwx. 1 root root       3 Set 30 12:14 /usr/bin/vimdiff -> vim
-rwxr-xr-x. 1 root root    2084 Jun 10 03:56 /usr/bin/vimtutor
[user@host conf.d]$ md5sum /usr/bin/vim
e5a9c498add4fa49a39a720a826f954c  /usr/bin/vim
[user@host conf.d]$ md5sum /bin/vim
e5a9c498add4fa49a39a720a826f954c  /bin/vim
[user@host conf.d]$ 

答案1

有关搜索路径的一些基础知识

当您运行不包含斜杠的命令(例如 )时vim,shell 需要知道要执行哪个文件(或 shell 内置命令/函数)。它通过遵循环境变量中定义的搜索路径来找到它PATH。该PATH变量是由冒号分隔的路径列表,shell 将按该顺序在每个路径中查找命令名称。

例如,PATHDebian 安装的基本内容如下所示:

/usr/local/bin:/usr/bin:/bin

在这种情况下,您首先找到,如和/usr/bin/vim的输出所示。which vimtype vim

sudo现在,当您通过指定env_reset和选项运行命令时secure_path,将在执行您传递的命令之前sudo将搜索路径重置为 的内容。secure_path这意味着您通过运行的命令sudo可能有一个不同的搜索路径,并且可以通过直接运行命令找到不同的可执行文件。

例如,sudo PATH来自 Debian 的基本:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

您的场景

我怀疑这里发生的是您要么指定了beforesecure_path的顺序,要么后者根本不存在。在这种情况下,shell 将查找并最终找到,因为它存在。而如果只有被列入白名单,那么前者可能不被允许运行。/bin/usr/binvim/bin/vim/usr/bin/vim

您可以PATH使用检查您的电流echo $PATH。您可以使用 来检查您sudo的。如果您的管理员设置了仅允许的白名单,那么您可以进入并运行该命令。PATHsudo env | grep PATHvimsudo vim:echo $PATH

您应该能够通过指定绝对路径来解决它,即sudo /usr/bin/vim.


为什么secure_path存在?

至于为什么 sudo设置不同的路径,考虑这种攻击场景:

你的PATH只是一个环境变量。它可以通过多种不同的方式进行设置,可能对用户来说是不可见的。您可能有不安全的目录,允许任何人写入它们。如果有人创建了一个名为 之类的恶意可执行文件ls,那么当您运行时,ls您将执行该文件而不是真正的ls.

但损害仅限于您的帐户有权访问的内容。现在,假设您运行sudo ls- 如果是PATH从当前获取PATH而不是重置,那么您现在已经运行了具有 root 权限的恶意可执行文件 - 权限升级攻击。比仅以您自己的用户身份运行可能造成的损害要大得多。

现在,您可以争辩说,能够将文件放入您的文件PATH或以其他方式修改您的文件的攻击者PATH已经可以造成很大的损害。你可能是对的。关于 的用处,双方都有自己的看法secure_path,这里就不多说了。

相关内容