X Window System中的一个旧漏洞。它是如何工作的?

6
我今天看到一篇文章,其中提到了以下内容:

"We've found many errors over the years. One of the absolute best was the following in the X Window System:

     if(getuid() != 0 && geteuid == 0) {
       ErrorF("Only root");
       exit(1);
     }

It allowed any local user to get root access. (The tautological check geteuid == 0 was intended to be geteuid() == 0. In its current form, it compress the address of geteuid to 0; given that the function exists, its address is never 0)."

这篇文章解释了代码的问题所在,但我想知道:“允许任何本地用户获得root访问权限”是什么意思。虽然我不是C语言方面的专家,但可以有人给出具体情境,在这种漏洞中攻击者将如何操作?特别是,如果我们假设这段代码存在,那么假设我是本地用户,我将如何获得root访问权限?
对于任何感兴趣阅读完整文章的人,以下是链接:A Few Billion Lines of Code Later: Using Static Analysis to Find Bugs in Real World

引用的文章来自Coverity的《几十亿行代码后:使用静态分析在现实世界中查找错误》。为什么不给一个参考呢? - Wei Hu
@Wei Hu:感谢您的建议。已添加链接。 - Legend
4个回答

5
本文意味着在if之后的代码只有在用户被验证为root时才会执行,但实际上任何人都可以执行它。要利用它,您需要查找代码中使用测试来检查用户身份的分支(本文负责地没有提供:您需要自己动手),并安排它被执行。
“允许获取root访问权限”是一个省略,用于描述原始代码中if之后发生的事情。与测试相关的这个词组并没有特别的意义,因为它描述的是测试之后发生的事情。
换句话说,测试本身并不能使您成为root。它之后的代码才能让您成为root。此外,请记住,X服务器通常必须以root所有者和setuid位设置进行安装,这就是其代码中有缺陷逻辑的危险原因。
这不是关于C语言的问题。这是关于Unix安全模型的问题,它非常二元(尤其是在旧版本中):您必须成为root才能做任何事情,因此大量程序具有root所有者和setuid位(有点夸张)。

2
您如何获得访问权限直接取决于代码中的漏洞位置。如果您确切地知道了这个代码在哪里,您可以探索能够带您到此代码行的代码路径,然后在检查该代码的后果后执行利用错误安全级别检查的操作。然而,在这种情况下,特定测试似乎很难被利用。它只是(错误地)检查根访问权限,如果用户没有,则以错误条件退出。随后的代码必须经过审核,以确定非根用户执行代码是否可以被利用。

谢谢解释。不过,我还在寻找有关X安装时设置setuid位的那个额外要点。 - Legend

0

我认为这意味着对于root访问权限的检查不正确,导致了root级别的处理继续进行。你如何被提升权限并不清楚。


0

检查语句geteuid == 0总是错误的,因为geteuid是一个函数名,在这个上下文中它会被解释成一个非空指针。正确的写法应该是geteuid() == 0,请注意括号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接