我听说“以 root 身份运行”的 Linux 程序(在本例中为二进制文件)中的漏洞是危险的,因为例如,如果某些网络/Web 服务器“以 root 身份运行”,则在例如前线数据包解析器,这可能会让攻击者比不“以 root 身份运行”的程序更严重地危害机器。
我熟悉setuid
二进制文件,其中setuid
设置了位,这意味着即使二进制文件由用户 A 运行,它也会在不同用户的上下文中运行。但我想我的困惑在于措辞——程序如何“以 root 身份运行?”它本身是否process
采用机器上的根用户身份?为什么process
以 root 身份运行的进程更危险?我如何才能准确地知道哪些进程在我的 Linux 系统上以 root 身份运行?我看到例如一些可执行文件是拥有的由root
用户或组,但这是否意味着本质上,当它们被程序加载器加载到内存中时,它们总是“以 root 身份运行”?
答案1
程序不“以 root 身份运行“!
当程序是……程序时,root(在此上下文中)是用户。
- 根用户以 root(用户)身份运行程序。
- 非root用户以(如果他们是)root(用户)身份运行程序。
在这种情况下,用户(无论其真实身份) 被认为具有与 root 用户相同的权限。
因此,该程序将能够杀死/更改root拥有的进程的优先级,相对于root的访问权限访问文件/目录/设备节点,并利用更有利的安全限制。
如果出现以下情况,可能会出现这种情况:
- 该程序是 root 拥有的可执行文件,其执行时设置用户 ID放,
- 如果某个用户使用启动该程序
sudo
, - 当然,如果 root 用户启动了该程序。
a 的第一列ps -ef
将告诉您有效的系统上运行的所有进程的所有者。如果你能读懂根然后,该进程代表具有 root 权限的用户运行。
由于上面列出的功能,这具有潜在的危险。如果该程序有错误或者任何类型的程序成功地利用了它的某些漏洞,那么它很可能会不恰当地使用 root 的权限。
另请注意,如果使用 root 权限启动的程序可以删除它们setuid
系统调用并最终使用以下命令在某个时刻重新获得这些特权seteuid
系统调用。
因此,进程的所有者在进程的整个生命周期中不一定是固定的。
答案2
当人们说“以 root 身份运行”时,他们指的是以下任何或所有情况:
- 分配有 setuid 位的程序由用户 A 运行。
- 由操作系统设置为守护进程运行的程序。
- 通过隐藏在检测范围内的内核 root 工具包以 root 身份运行的程序。
最常见的情况可能是守护进程,使用可利用的代码。例如 OpenSSH 守护程序或 Apache 等其他服务器中的漏洞。