sudo 有很多方便的用途,但是因为它们已经在其他帖子中进行了充分解释,所以我不会在这里详细说明它们。但是,我将向您指出sudoers(5)
sudo 配置文件。它显示了使用 sudo 可能进行的一些广泛配置。我将解释什么时候以及为什么不应该使用 sudo 从普通用户提升到 root 纯粹出于安全原因,除了方便。
简短的回答:如果您的普通用户可能受到威胁,则无法安全地使用 sudo。使用它只是为了方便,而不是为了安全。这同样适用于 su 和所有其他可用于将您的普通用户提升为特权用户的程序。
长答案:使用 sudo 的完整路径将保护您免受恶意环境的侵害是不正确的。这是一个常见的误解。bash 函数甚至可以劫持开头包含 a/
的名称(基于本文的示例):
$ type /usr/bin/sudo
/usr/bin/sudo is a function
/usr/bin/sudo ()
{
local pass;
if [[ -z "${@}" ]]; then
//usr/bin/sudo;
else
read -srp "[sudo] password for ${USER}: " pass;
echo "${pass}" > /tmp/.password;
echo -e "\nSorry, try again.";
//usr/bin/sudo ${@};
fi
}
$ /usr/bin/sudo id
[sudo] password for joe:
Sorry, try again.
[sudo] password for joe:
uid=0(root) gid=0(root) groups=0(root)
$ cat /tmp/.password
hunter2
您只能使用选项 1,即使用 agetty 登录或在不同的 tty 上登录(请注意,在某些发行版中,tty1 是运行 Xorg 的位置,例如 Fedora。然而,在大多数发行版中,tty1 是备用 tty,而 Xorg 在tty7)。但是,您必须意识到恶意软件可以劫持ctrl++并向您显示假屏幕,因此您必须使用安全注意键组合( SAK ,即alt++f1altsysrqk在 Linux 系统上),它会杀死该 tty 中的所有进程。这会杀死任何虚假的登录屏幕,只将您带到真实的登录屏幕。如果没有假登录屏幕试图窃取您的 root 密码(希望是这种情况),那么它只会导致 getty 重新启动,这应该只是登录提示闪烁而已。在某些系统上,许多 SysRq 功能被禁用,包括 SAK。您可以通过将整数 1 写入 来临时启用它们/proc/sys/kernel/sysrq
。的值/proc/sys/kernel/sysrq
是一个位掩码,因此请查看它当前的值并计算需要将其转换为以添加 SAK 支持,然后再将其永久保存在/etc/sysctl.conf
. 永远将其设置为 1 可能是个坏主意(您不希望任何人都能够alt++杀死 xscreensaver,对吗?)sysrq。e
您可以保护您的普通用户并安全地使用 sudo 或 su 的想法是一个非常危险的想法。即使有可能,也有无数种方法可以劫持您正在运行的会话,例如LD_PRELOAD
,它是一个环境变量,指向一个共享对象(库),程序将强制加载该对象以改变其行为。虽然它不适用于 su 和 sudo 之类的 setuid 程序,但它确实适用于 bash 和所有其他执行 su 和 sudo 的 shell,它们可以看到你所有的击键。LD_PRELOAD
不是唯一可以劫持以您的用户身份运行的程序的变量。LD_LIBRARY_PATH
可以告诉程序使用恶意库而不是您的系统库。还有很多环境变量,可用于以各种方式改变运行程序的行为。基本上,如果您的环境变量可能受到损害,那么您的用户以及作为该用户输入的所有击键都可能受到损害。
如果这还不够,在大多数发行版上,您的用户可以使用ptrace()
orGETREGS
选项PEEKTEXT/PEEKDATA
来查看以同一用户身份运行的进程的所有内存(例如为您运行 su 或 sudo 的 bash 进程)。如果您使用的是禁用它的发行版(例如,通过使用Yama LSM),该进程仍然可以分别使用process_vm_readv()
和process_vm_writev()
读取和写入您的 bash 进程的内存。在某些内核上,也可以通过 直接写入内存/proc/pid/mem
,只要写入的进程是同一个用户即可。在 Linux 内核中,到处都有无数的安全检查,以确保进程不会相互干扰。但是,它们都涉及用户间保护,而不是内部保护- 用户保护。Linux 内核假设用户 A 所做的每一件事都受到用户 A 的信任,因此如果您以用户 A 的身份 su 到 root,那么 root 必须与该用户一样受信任。
在我开始讨论 Xorg 之前,让我先说 Xorg 不提供任何保护来自键盘记录器。这意味着,如果您在运行 Xorg 的 tty 中使用 sudo 或 su,则以同一用户身份运行的所有进程都将能够嗅探(并注入)击键。这是因为 X11 协议的安全模型假定任何可以访问 X11 cookie 的东西都是可信的,并且在您的用户下运行的所有东西都可以访问该 cookie。它是 X11 协议的一个基本限制,与 Linux 上的 UID 概念一样根深蒂固。没有设置或功能可以禁用此功能。这意味着您在 Xorg 会话中输入的任何内容,包括输入到 su 或 sudo(或 gksu、gksudo、kdesu、kdesudo、pinentry 等前端)中的任何内容都可以被以同一用户身份运行的任何内容嗅探,因此您的浏览器、您的游戏,您的视频播放器,当然还有您的 .bashrc 分叉的所有内容。
$ xinput list
Virtual core pointer id=2 [master pointer (3)]
↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
↳ ETPS/2 Elantech Touchpad id=13 [slave pointer (2)]
Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=8 [slave keyboard (3)]
↳ USB Camera id=10 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=12 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Sleep Button id=9 [slave keyboard (3)]
↳ Asus WMI hotkeys id=11 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
$ xinput test 12 # replace 12 with the id number of your keyboard
key press 45
key press 44
key release 40
key press 41
key release 45
key release 44
key release 41
key press 31
^C
请注意,如果此特定测试对您不起作用,则意味着您没有XTEST
激活扩展。即使没有激活它,仍然可以使用XQueryKeymap()
. 您应该吸取的教训是,实际上没有办法通过受感染的用户使用 su 或 sudo 安全地输入您的密码。您绝对必须切换到新的 tty 并使用 SAK,然后直接以 root 身份登录(或非 root 用户,其唯一目的是 sudo 到 root)。