首先,让我提一下,我假设当前 Linux 桌面发行版(例如 Debian、Fedora)设置的配置。我确信有一些方法,如果实施,可以缓解这里描述的问题。我感兴趣的是“开箱即用”的安全性。
在我看来,shell 执行诸如~/.profileor之类的文件~/.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 上登录。