`sudo` 几乎没用吗?

信息安全 特权升级 须藤
2021-08-24 02:03:03

一旦攻击者拥有一个 shell 作为您的 sudoer 用户(或者只是破坏了一个足够的本地进程),他/她可以使用许多特权升级工具之一,甚至自动将自己设置为例如apt或其他一些被调用的进程root以获得root访问权限(另请参阅在这种情况下攻击者可以做什么?(不可写的 bashrc、配置文件等))。

sudo那么除了阻止较小的有效载荷或使其变得更难之外,还有什么意义呢?看来应该把重点放在 SELinux 上。

编辑:这个问题有两个方面(我应该更具体)。首先,我最初的意思是,对于标准的 Linux 桌面用户。对于由其他人管理的机器,可能会给出完全不同的答案。

4个回答

Sudo 对恶意第三方没有真正的安全目的。所以是的,对于这个目的它基本上是无用的。过去我认为它实际上是一种安全控制,可以防止特权升级并使攻击更加困难,因为有些人坚持认为它也有这个目​​的,但这实际上是错误的。事实上,目前你的问题只有一个答案,而那个答案正在传播这个神话。的唯一目的sudo是保护您免受自己的伤害,即避免错误地弄乱您的系统。一键或一键获得所有权限可能很危险,但sudo至少会迫使您有意识地输入密码。如果您(或程序或脚本)最终错误地触摸了系统文件或其他用户的文件,而没有有意识地使用sudo,您将收到“权限被拒绝”通知。所以说到底,它只是一个管理工具,实际上并不是一个旨在保护您免受攻击的安全控制。

这是一个非常基本的示例,说明为什么sudo没有提供针对恶意代码的真正保护:

# Create payload: replace sudo with an alias
payload='
    fake_sudo() {
        # Simulate a sudo prompt
        echo -n "[sudo] password for ${USER}: "
        read -s password
        echo
        # Run your command so you are happy
        echo "$password" | sudo -S "$@"
        # Do my evil stuff with your password
        echo "Done with your command, now I could use $password to do what I want"
    }
    alias sudo=fake_sudo
'

# Write the payload to the bashrc config file
echo "$payload" >> ~/.bashrc

这是攻击者可以在您的机器上运行的一个非常基本的代码示例。它并不完美,它甚至不能处理所有情况(如果您输入错误的密码将无法正常工作),但它只是向您展示了sudo可以被攻击者替换。如果您运行该脚本,下次打开终端并运行时,sudo您实际上将运行fake_sudo. 攻击者可以用别名替换您的程序,或替换二进制文件(将恶意版本放入~/bin或在您的路径中可以执行的任何位置)等。

这甚至不是真正的“权限提升”,因为可以运行sudo成为 root 的用户已经拥有所有权限。真正的非特权用户不应该有sudo能力。要真正分离权限,您应该在完全独立的帐户上运行管理内容。

我是 sudo 的合著者。它是在 80 年代初专门为解决保护共享资源(运行 BSD UNIX 的 VAX-11/750)完整性的需要而编写的,其用户(纽约州立大学/布法罗分校计算机系的教员)。当时,唯一的其他选项是“su”,它要求每个人共享一个密码。如果发生灾难,将很难或不可能通过法医筛选并确定胖手指的肇事者是谁......

我认为 sudo 明显的持久效用在于它提醒命令行用户他们即将做一些可能值得在输入之前确定结果的事情。当然,在某些实现中,例如主要的树莓派发行版,没有提示输入密码,它仅用作橡皮图章。所以去图吧。

我仍然相信在源自 UNIX 的操作系统下实现应用程序的最佳实践要求您在非根 ID 下运行它们。如果您需要root,则应在受控情况下。将 sudo 视为在受控情况下授予命令行用户 root 访问权限的方式。仅此而已。

不,sudo不是没用

作为用户(目标)

通常,当您在 Linux 上时,您是以非 root 用户的身份行事。很多东西,比如用 安装包apt,需要root/sudo权限才能使用。sudo二进制文件用于授予普通用户使用root级别操作的权限,例如apt install.

不应该一直使用 Linux作为root. 这是因为如果您受到威胁,攻击者将可以root访问您的系统,这意味着他们可以在您的系统上做几乎任何事情。相反,您以非 root 用户身份运行 Linux,因此即使您的帐户遭到入侵,攻击者也无法立即获得root访问权限。

当然,没有一个系统是完全安全的,系统中的某些地方可以被利用。如上所述,使用sudoers帐户而不是保护您的系统的一个步骤。root

如果您说“黑客无论如何都会进入并获得root权限,我为什么要使用sudo?”,这就像说“如果有人进入我的房子,他们无论如何都能够(以某种方式)获得我的珠宝。为什么我应该使用保险箱还是锁?”。这是额外的保护层。我们不是在寻找“一种可以保护一切的锁”,而是“许多锁以提供额外的安全性,以防其中一些被破坏”

sudo是一种保障。它允许您仅在需要时运行根级程序。所以你只是偶尔打开你的绝密房间的门,而不是总是让它打开,即使它总是打开(总是以 root 身份运行)更方便。

此外,当您是合法用户时,您不会在每次想要使用sudo操作时都运行权限提升脚本,而是使用sudo.

作为攻击者

sudo可以利用二进制文件来获取一些信息,甚至获得访问root权限。有时,用户的sudoers文件中可能有类似的东西MY_USER ALL=(ALL) NOPASSWD: ALL,在这种情况下,如果您可以作为用户访问MY_USER,您可以运行任何和所有sudo/root命令而无需密码。运行sudo -l还可以为您提供信息,例如即使没有密码也可以以 root 身份运行哪些命令。此类错误配置的一个示例是USERNAME ALL=(ALL) NOPASSWD: /bin/vi,它允许您以viroot 身份运行,而无需以 user 身份输入密码USERNAME这是手动提升权限的一种方法。

每个额外的程序都可能存在一些额外的漏洞。让 tomcat 运行会将系统引入 tomcat 漏洞利用。sudo可能只是您可以在开发中使用的另一个程序。

此外,您认为那些方便的权限提升脚本/工具如何让您获得 root 访问权限?他们中的许多人使用sudo一种或另一种方式。

Sudo 远非无用。

管理员可以灵活、精细地分配权限,并拥有问责选项(体面的日志记录)。这是使用组的更好的解决方案。

自然,如果您将其与EclipseSELinux的性能和功能进行比较sudo,尽管实施和配置(和维护)的成本很高。

相反,从攻击者的角度来看,他们可能会很幸运并获得具有sudo特权的帐户或利用错误配置。从具有 root 权限的标准用户升级到 root 用户所付出的努力仍然sudo是巨大的。另一方面,这些问题都不是由sudo自身引起的。

然而,它的有效性完全取决于配置。如果允许受损的标准帐户在root没有密码的情况下运行任何东西,那么对主机进行私有化是微不足道的,如果允许它运行某些可以被操纵的命令会更加困难但相当可行,如果只仔细选择二进制文件和情况允许执行为root.

sudo可用于启用以除 之外的用户身份运行的命令root,因此这是另一种sudo可能不会导致整个系统妥协的使用方式。