首先,让我提一下,我假设当前 Linux 桌面发行版(例如 Debian、Fedora)设置的配置。我确信有一些方法,如果实施,可以缓解这里描述的问题。我感兴趣的是“开箱即用”的安全性。
在我看来,shell 执行诸如~/.profile
or之类的文件~/.bashrc
,这些文件允许完全操纵用户的执行环境并归用户所有,这一事实破坏了任何希望像这样的程序sudo
可以安全运行的希望。问题是,任何以用户身份运行的恶意程序都可以编辑这些文件,例如,修改PATH
环境变量以包含伪造的sudo
可执行文件,例如PATH="$HOME/.evil:$PATH"
恶意程序也在其中创建了一个文件$HOME/.evil/sudo
。然后,下次用户sudo
在 shell 中键入时,sudo
将运行 fake 并记录键入的密码。因此,即使原始恶意程序只有用户权限,伪造sudo
者也可以获得权限。root
事实上,.profile
我安装的 Ubuntu 创建的默认文件包括以下几行:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
所以甚至不需要修改.profile
- 只需创建$HOME/bin/sudo
它就已经是第一个了PATH
!
我的观点并不是说当任意恶意代码运行时已经“为时已晚”,或者这种攻击可能会被用户注意到(我想它类似于网络钓鱼攻击)。我希望以用户身份运行的恶意程序可以做任何用户可以做的事情。然而,我没想到的是,它可以做的不仅仅是那个用户(root
权限)。
我的问题本质上是:
sudo
是否可以通过这种方式绕过系统可执行文件?- 为什么桌面 Linux 系统默认设置为如此容易被利用的方式?调用的默认方式不应该
sudo
确保它实际上是系统提供的可执行文件(没有人会/usr/bin/sudo
每次都键入)?由于sudo
执行系统关键的安全操作,使用变量来隐藏其位置的可能性PATH
似乎带来了很多风险而收益甚微。在这样的环境中,使用似乎sudo
从根本上来说是不安全的,最好启用登录身份root
并在单独的 TTY 上登录。