我明白了二进制文件可以位于不同的地方。我不明白的是为什么当我运行时whereis
,which
它type
说vim
是 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 将按该顺序在每个路径中查找命令名称。
例如,PATH
Debian 安装的基本内容如下所示:
/usr/local/bin:/usr/bin:/bin
在这种情况下,您首先找到,如和/usr/bin/vim
的输出所示。which vim
type 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/bin
vim
/bin/vim
/usr/bin/vim
您可以PATH
使用检查您的电流echo $PATH
。您可以使用 来检查您sudo
的。如果您的管理员设置了仅允许的白名单,那么您可以进入并运行该命令。PATH
sudo env | grep PATH
vim
sudo vim
:echo $PATH
您应该能够通过指定绝对路径来解决它,即sudo /usr/bin/vim
.
为什么secure_path
存在?
至于为什么 sudo
设置不同的路径,考虑这种攻击场景:
你的PATH
只是一个环境变量。它可以通过多种不同的方式进行设置,可能对用户来说是不可见的。您可能有不安全的目录,允许任何人写入它们。如果有人创建了一个名为 之类的恶意可执行文件ls
,那么当您运行时,ls
您将执行该文件而不是真正的ls
.
但损害仅限于您的帐户有权访问的内容。现在,假设您运行sudo ls
- 如果是PATH
从当前获取PATH
而不是重置,那么您现在已经运行了具有 root 权限的恶意可执行文件 - 权限升级攻击。比仅以您自己的用户身份运行可能造成的损害要大得多。
现在,您可以争辩说,能够将文件放入您的文件PATH
或以其他方式修改您的文件的攻击者PATH
已经可以造成很大的损害。你可能是对的。关于 的用处,双方都有自己的看法secure_path
,这里就不多说了。