一旦攻击者拥有外壳程序作为您的sudoer用户(或仅足以破坏本地进程),他/她就可以使用多种特权升级工具中的一种甚至自动将其自身放置为aptroot调用的其他一些处理程序,以获得root的访问权限(另请参阅在这种情况下攻击者可以做什么?(不可写的bashrc,配置文件等)。)

sudo的目的是什么,然后才阻止较小的有效负载或使其变得更难?似乎应该将重点放在SELinux等上。

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

评论

“ ...他/她可以使用众多特权升级工具中的一种...”-您似乎假设这些工具是通用工具,肯定可以在目标系统上使用。但是这些工具依赖未修复的错误或配置错误。它们将无法在正确更新和正确配置的系统上工作。基本上,您是在问sudo是否对所有系统都坏了没用。但是这个基本假设已经是错误的。

很好(很好的答案),但这是假设用户调用sudo而不是/ usr / bin / sudo。当然,大多数用户都会这样做。

对于它的价值,可以将sudo配置为授予比“对所有内容都具有root用户访问权限”更精细的权限。不过大多数人都不使用该功能。

您在这里只有一个问题。真正的问题是“与什么相比,sudo几乎没有用?”。 sudo在安全性方面绝对比su更好,而这两个方面都比始终以root用户身份登录要好得多。除了su / sudo / root登录(您认为比sudo更好)之外,您是否还有其他方法可让合法用户访问管理功能同时阻止未经授权的访问?如果没有,那么至少这是这三个选项中的“最少没用”。

没有sudo,您将如何找人做三明治?

#1 楼

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功能。要真正分离特权,您应该在完全独立的帐户上运行管理内容。

评论


@EliahKagan这不会使sudo变得无用-它使许多系统配置不正确。不要将用户的错误归咎于该工具。

– SnakeDoc
20 Jun 9'23:20



我为用户提供了不受限制的root访问权限,然后是的,它对劫持该帐户的攻击者无济于事,但是您可以设置sudo远比它更精细。使用固定的命令(如果您对环境小心的话),可以允许LOB用户执行特权操作,并且攻击者也将受到限制。典型的示例是启动或停止业务应用程序的守护程序/服务(尽管如今systemctl可以使用policykit来实现)

–eckes
20年10月10日在10:44

请注意,fake_sudo示例正在捕获单个用户帐户的密码,您已经对该帐户进行了充分折衷以写入其主目录。尽管绝对不好,但与其他方法相比,它还不错:用户直接以root用户身份登录,而您破坏了该主目录;或用户定期使用su升级,而您使用类似的fake_su捕获根密码。至少通过这种方式,系统管理员可以找到有关哪个帐户被盗的线索。

–IMSoP
20 Jun 10'在22:01



按照这种逻辑,所有安全软件和对策都“对恶意第三方没有真正的安全目的”,因为是的,一旦让用户在任何环境中运行任何可执行文件,就很可能会出现错误或一种从那里获取根访问权限的狡猾方法。关键是要使其更加困难。 sudo将在几乎所有情况下有效地防御/减慢恶意攻击,即使在您自己的示例中,对于标准台式机用户而言,调用sudo可能很容易就需要数周时间。

–user2979044
20年6月10日在22:55

是的,如果攻击者已经获得了完整的帐户和系统访问权限,并且具有执行任意代码的能力,那么伪装系统的其余部分就变得微不足道了。在其他新闻中,天空是蓝色的。

– SnakeDoc
20 Jun 12'在2:45



#2 楼

我是sudo的合著者。它是在80年代初期编写的,专门针对保护共享资源(运行BSD UNIX的VAX-11 / 750,运行BSD UNIX)免受其用户(纽约州立大学/布法罗市CS系的教师)的需求而编写。当时,唯一的其他选择是“ su”,要求每个人都共享一个密码。如果发生灾难,很难或不可能筛查法医并确定谁是胖手指的肇事者...

我认为sudo的持久效用就是提醒命令行用户他们将要做的事情可能会在打字之前确定结果。当然,在某些实现中(例如主要的树莓派发行版),无需输入密码,它只是充当橡皮图章。因此,去吧。

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

评论


您有什么方法可以验证您是sudo的共同作者吗? sudo.ws/contributors.html中未提及您的名字

–阴影
20年6月10日在4:01

@Shadow sudo.ws/contributors.html仅列出了自1993年以来的贡献者,当时Todd C. Miller开始维护sudo。您要查找的页面是sudo.ws/history.html,其中提到:“ Sudo最初是由Bob Coggeshall和Cliff Spencer于1980年前后在纽约州立大学/布法罗分校的计算机科学系构思和实现的。”

– Eliah Kagan
20年6月10日在4:34

今天仍然以这种方式使用。许多企业客户将sudo与远程日志记录结合在一起,以跟踪谁在做什么。您也可以执行su + auditd,但这要复杂一些。

–汤姆
20年10月10日在5:16

这正是我的公司让管理员使用“ sudo”的原因。 (并更改了root密码,以使'su'不能用于root访问)。如果某件事停止工作,则会有sudo日志,因此我们可以看到是谁做的以及他们做了什么。

– AndyB
20年6月10日在20:13

@Shadow:“您没有写sudo”,Bob:“ sudo我做了”,Shadow:“好的,您做了”

–工作流
20年6月11日在14:44

#3 楼

不,sudo并非没有用。

作为用户(目标)

通常,当您在Linux上时,您是作为非root用户使用的。很多事情,例如使用apt安装软件包,都需要使用root / sudo权限。使用sudo二进制文件可以授予普通用户使用rootapt install级操作的权限。

您不应该一直像root那样一直使用Linux。这是因为如果您受到攻击,攻击者将可以访问您的系统,这意味着他们可以在您的系统上执行几乎所有操作。相反,您以非root用户身份运行Linux,因此,即使您的帐户遭到破坏,攻击者也无法立即获得root访问权限。

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

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

sudo是一种保护措施。它使您仅在需要时才运行根级程序。这样一来,即使始终保持打开状态(始终以root用户身份运行)更方便,您有时也只会打开TOP SECRET房间的门,而不是始终保持打开状态。

合法用户,您每次要使用sudo操作时都不会运行特权升级脚本,而要使用sudo

作为攻击者

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

每个额外的程序都可能带来一些额外的漏洞。运行tomcat将使系统受到tomcat攻击。 vi可能只是您可以在利用中使用的另一个程序。

此外,您如何看待那些方便的特权升级脚本/工具来获得root访问权限?他们很多人以一种或另一种方式使用USERNAME

评论


今天,扎根真的很容易(@reed举了一个简单的例子)。几乎没有安全的锁将其锁定。只是在容易找到的盒子里。

–晚上
20年6月8日在15:37

@Wernight给出了芦苇的示例,它更像是如果您具有用户访问权限并将用户交给您,则很容易获得root用户权限。是的,当然,如果您具有用户级别的访问权限,那么获得root权限将变得非常容易。如果您包括与用户的交互(并且该用户恰好为您提供了他们的root密码,因为他们想要执行需要该操作的操作)或不在乎他们的机器突然要求它)。

–弗兰克·霍普金斯
20年6月8日在16:25



#4 楼

Sudo绝不是无用的。

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

自然地,如果将其与SELinux进行比较,则sudo的性能和功能将黯然失色,尽管实现和配置(和维护)的成本很高。 >
相反,从攻击者的角度来看,他们可能会很幸运并获得具有sudo特权的帐户或利用错误配置的优势。从具有sudo特权的标准用户升级到root的工作量仍然很大。另一方面,这两个问题都不是由sudo本身引起的。

其有效性完全取决于配置。如果允许一个受威胁的标准帐户在没有密码的情况下运行任何东西,例如root,则对主机进行特权是很简单的,如果允许它运行某些可以操纵的命令,则更加困难,但相当可行,并且如果仅精心选择的二进制文件则相当困难。并且情境允许以root执行。

sudo还可用于以root以外的用户身份启用正在运行的命令,因此这是另一种使用sudo的方式,可能不会导致整个系统受损。 br />

评论


我认为对于标准Linux用户而言,升级非常容易。我一直在做sudo apt update等同的更新。尽管我不认为大多数台式机用户都可以设置日志记录,并且一旦攻击者获得root权限,该人便可以删除日志(尽管这很难,我同意),但管理员还是很公平的。到目前为止,从未进行过设置。

–晚上
20年6月8日15:57



那完全取决于sudo配置。如果允许用户以root身份运行任何东西,这是微不足道的,这是比较困难的,但如果允许运行某些可以被操纵的命令则是相当可行的,而如果只允许精心选择的二进制文件和情境以root身份运行,则是相当困难的。 。 sudo还可用于以root以外的用户身份运行命令,因此这是使用sudo的另一种方法,它不是直接进入root的路由。

– Pedro
20年6月8日在15:59

即使利用起来很简单,它也取决于用户与系统进行交互(通过键入sudo命令并提供其密码)。取决于系统,这可能是一个很大的障碍,尤其是在攻击者的目标是时间敏感的情况下。

– jpaugh
20年6月8日在17:26



我认为该线程对于系统管理员维护园区或公司计算机非常有用。这种设置允许记录日志,并且可以将本地sudoer操作限制为仅特定的二进制文件。我不认为大多数个人计算机用户都是这种情况(或发行默认设置)。在公司案例中仍然是非常好的观点。

–晚上
20年6月8日在17:49



@Wernight-我无法与其他发行版交流,但是Debian的默认sudo配置确实包括登录到/var/log/auth.log。当然,普通家庭用户是否会实际检查这些日志完全是另一个问题……

–戴夫·谢罗曼(Dave Sherohman)
20年9月9日在10:41

#5 楼


sudosu之类的流行替代品一样安全或不安全。

sudo最受欢迎的替代品是允许部分或所有用户使用su提升其特权。最常见的是,所有用户都可以这样做,只要他们知道目标用户的密码即可。与sudo几乎总是设置为需要用户自己的密码(并且仅限于受信任的用户)不同,su需要目标用户的密码。

有人认为这使得susudo更安全,但事实并非如此。 su遭受与sudo相同的攻击。假设您是一个有时运行su成为root用户的用户。进一步假设,一个不知道root用户密码并且仍无法以root用户身份执行操作的攻击者仍然设法以您的非root用户身份执行任意代码。就像此攻击者可以做到的那样,以便当您运行sudo时您正在运行他们的恶意命令,而此攻击者也可以做到这一点,因此当您运行su时您正在运行他们的恶意命令。

也就是说,reed的答案中的技术也可以有效地引入一个伪造的su命令,该命令捕获目标用户的密码(当使用su来管理系统时,该密码通常是root用户)。

但是有可能做得更好,或者减轻风险。

一旦有人可以像您一样运行任何命令,他们通常可以对您的shell行为进行任意更改,从而造假sudosudoas或任何其他特权提升命令。

但是,只要您避免与假的登录屏幕进行交互,就可以通过使用单独的管理用户帐户和非管理用户帐户来缓解这种情况。这听起来不像是一个新主意,当然不是。但是令人惊讶的是,真正做到这一点的机会很少。

您的管理帐户可以只是根帐户。但是,如果您想要不以root用户身份登录的好处,其中包括登录(以便找出在非恶意错​​误的情况下出了什么问题)和能够运行非root用户身份运行程序的功能(大多数图形界面),则可以有两个非根帐户,其中一个用于管理(根据需要运行sudosu),而另一个则不是。

此当然,该帐户应该不与非管理帐户共享访问凭据。它们不应具有相同或相似的密码,并且应具有单独的密钥对。此外,出于相同的原因,也不得将非管理帐户从非管理帐户提升到根目录。

如果这样做,甚至可以

在此设置中,sudosudo有一个好处,尽管这不是决定性的好处。您可以避免使用错误的帐户来管理系统,避免使用错误的帐户(该帐户用于所有其他可能导致更大风险的其他非管理性东西)来管理系统,因为它只是一个普通的受限用户帐户在su文件中未列出且不是任何组的成员。

但是您也可以通过行使适当的自律并确保自己处于/etc/sudoers来实现此目标切勿从您设计为非管理性的帐户访问su-或通过使用su阻止指定为非管理性的帐户提升特权。 (在GNU / Linux系统上,实现这一目标的一种方法是使用AppArmor,这是Ubuntu如何阻止来宾帐户成功使用su的一种方式-在以前启用了来宾帐户功能的Ubuntu版本中)。 />
照常使用susudo的风险对您来说可能是可以接受的。

话虽如此,我并不是说您一定需要这样做。

对于许多人来说,使用同一帐户来(a)从su扎根的风险(或类似的机制,例如Polkit)或sudo(或类似的机制,例如su)用于(b)非管理任务(例如运行Web浏览器)可能是一种可以接受的权衡取舍。

评论


+1记录谁做了什么。这对于以后的取证非常方便,即使完全内部化也是如此。

–松脆
20年6月10日,0:19

#6 楼

sudo的目的不是要很难提升特权。实际上,这是完全相反的:关键是使提升特权变得容易。

通过在需要时容易地提升特权,用户没有动力去运行它。始终总是提升特权。

如果很难提升特权,用户将一直以q43​​12079q身份登录。通过轻松地“即时”提升特权,鼓励用户以非特权用户身份登录,并且仅在该进程的持续时间内提升单个进程的特权,而不是始终以提升的特权运行。 br />
root从根本上说是一种可用性工具,而不是安全工具。 sudo的安全性影响是可用性影响的二阶结果。在无法使用时,安全性没有用。

在这种情况下,sudo大致等同于Windows Vista +中的UAC,它常常被误认为是一种防止特权提升的工具,而实际上却是一种使特权提升更加容易的工具。在引入UAC之前,对于Windows用户而言,总是始终以管理特权登录帐户是完全正常的,这仅仅是因为对于基本办公用途而言,Windows无法使用。

还有一个附加功能sudo优于sudo或以su登录,这是因为root可以配置为留下哪个用户在何时发布哪个特权命令的审核记录。

评论


这很好地总结了一下。

–烧烤
20年6月10日在16:23

#7 楼

像信息安全中的所有内容一样,sudo是一个折衷。

让我们探索替代方法:


更改系统,以便您将sudo用于以下命令: t需要root级权限
以root身份登录以获得那些必需的访问权限
使用su切换到root shell
使命令本身以root身份运行,而不管是谁执行的

无需赘述,我希望您同意所有这些替代方法都比sudo更糟糕。它并不完美,可以受到攻击-但它是这些替代品中最好的。

关于SELinux,请不要忘记它进入展会的时间相对较晚。我不记得是哪一年了(我当时在那儿,我的名字在SELinux凭据中),但是sudo早于SELinux。

毫无疑问SELinux的功能更强大,更安全的替代方法是,大多数sysadmin管理员都无法编写正确的SELinux安全策略。

因此,在很多相当糟糕的选择中,sudo在许多情况下都是最不糟糕的选择。总比没有好或没有它好,这就是足够好的理由。无论如何,安全性是不完美的。

说,企业中sudo的主要用途不是安全性而是问责制。如果管理员必须使用个人帐户登录,然后使用sudo进行日常工作,那么跟踪谁做了什么就很简单了。并且当他们使用su时,也可以使用auditd跟踪它们。

#8 楼

这取决于您配置sudo的方式:

在不同人员使用的计算机上,可以配置sudo的方式使某些用户可以使用sudo来访问某些命令:

您可能以某些用户可以使用sudo执行某条命令(例如ip)的方式配置sudo-但不能执行任何其他命令。

另一件事是,应该以您正在使用的方式配置sudo要求输入密码。即使攻击者可以访问控制台,如果他输入sudo example command,也会要求他输入密码。

您还可以通过某些命令(例如sudo)不需要密码的方式配置ip。所有其他命令都需要输入密码。

还可以通过配置sudo所需的密码与登录密码不同的方式来配置sudo

在这种情况下,即使您的登录密码也无法帮助攻击者...

但是,如果以一种可以执行所有命令的方式配置sudo,则系统不会要求您输入密码,那么sudo不提供任何安全性。

#9 楼

大部分没有安全注意密钥的东西都是“几乎无用的”。

Reed给出了一个很好的答案,说明为什么sudo(或其至少密码功能)对安全性几乎没有用处。但是,不仅仅是sudobash甚至整个Unix环境中的错误。使用密码获得更高的特权而不使用某种技术来避免假登录提示是一个普遍的问题。

zshfish甚至Windows命令提示符开始,您都可以自定义运行哪个命令,因此,切换到其他Shell不会阻止攻击者用fake_sudo代替sudo

这不仅仅是Unix环境。想象一下,如果说Windows,则转到“开始”>“更改配置文件”,然后键入管理员密码。抱歉,攻击者已将Explorer.exe替换为fake_Explorer.exe,这并不是您按下的真正“开始”按钮。攻击者再次具有您的管理员密码。

出于这些目的,有时会使用安全注意密钥。有时您可能会看到Windows登录屏幕上显示“按Ctrl-Alt-Del”进行登录。这是因为Ctrl-Alt-Del直接进入操作系统,并且不能被伪造的登录外壳所伪造。因为Ctrl-Alt-Del可以用于安全地引起操作系统的注意,所以它称为安全注意密钥。

安全注意密钥有一些替代方法。例如,您可以选择登录时希望看到的图像。最好不要将该图像存储在非特权进程可以读取的位置,也不要将其显示在非特权进程可以对其进行屏幕快照的位置。因此,这仍然需要使用sudo之类的工具将登录屏幕与无特权的常规工作帐户分开。

评论


鉴于在企业环境中,管理员将远程完成99%的工作,无论是否拥有密钥都没有任何区别。

–汤姆
20年6月10日在5:13

我想,但是在远程工作时,我将使用SSH密钥进行身份验证,而不是使用sudo密码。我已经说得更清楚了,我只在谈论密码认证。

– gmatht
20年6月10日在9:13

Linux已经具有SAK(安全注意密钥)作为Alt + SysRq + K(除非被发行版禁用)。但是,该实现几乎无法正常使用,这就是为什么实际上不使用它的原因。此外,sudo经常与远程主机一起使用,并且根据定义,您不能在那里使用SAK。当您访问远程系统时,一切都取决于您提供的任何输入来信任远程系统。如果您在任何输入中输入密码,则系统必须是安全的。

– Mikko Rantalainen
20年7月1日在8:43

#10 楼

到目前为止,没有提到的是sudo(通过PAM)可以使用除密码之外的其他机制和/或使用2因子身份验证。虽然这不能解决帐户遭到入侵的问题,但确实使伪造提示变得更加困难。

此外,sudo的用途仅是提供完全的root用户访问权限,它可以用于允许特定用户运行特定的命令,并且没有其他用户以root身份,甚至没有其他用户身份。我不确定SELinux对于该用例是否易于配置。

#11 楼

我曾经有一个问题,那就是通过SSH密钥登录服务器并忘记了与sudo一起使用的密码,这提示了这个想法:

我想如果存在受损的SSH凭据,例如可以从未擦除的硬盘中恢复驱动器插入垃圾提示中,然后sudo可能会有所帮助,因为需要密码才能执行管理员功能。我没有证据,但我怀疑许多SSH密钥都没有密码。

sudo问题更现实的攻击媒介是Github上保留了SSH密钥。