X Window系统中的一个旧缺陷.它是如何工作的?

Leg*_*end 6 c unix security static-analysis

今天我在阅读一篇文章时提到了以下内容:

"多年来我们发现了许多错误.在X Window系统中,以下是最好的错误之一:

     if(getuid() != 0 && geteuid == 0) {
       ErrorF("Only root");
       exit(1);
     }
Run Code Online (Sandbox Code Playgroud)

它允许任何本地用户获得root访问权限.(重言式检查geteuid == 0意图是geteuid()== 0.在当前形式中,它将geteuid的地址压缩为0;假设该函数存在,则其地址永远不为0)."

这篇文章解释了代码的错误,但我想知道"它允许任何本地用户获得root访问权"意味着什么.我不是C的专家,但有人可以给我一个确切的背景,这个漏洞可以使用吗?具体来说,我的意思是,假设我是本地用户,如果我们假设这个代码存在于某个地方,我将如何获得root访问权限?

对于有兴趣阅读完整文章的人,这里是链接:

几十亿行代码:使用静态分析查找现实世界中的错误

Pas*_*uoq 5

该文章意味着,if只有在验证用户是root的情况下才打算执行的代码实际上可以由任何人执行.要利用它,您需要在代码中查找分支,在该代码中使用测试来检查用户的身份(文章负责任地不提供:您必须工作一点)并且您安排它进行执行.

"允许获取root权限"是一个省略号,用于描述if原始代码之后发生的情况.它与测试相关并没有特别的意义,因为它描述了在它之后发生的事情.

换句话说,测试本身不会让你成为根.它之后的代码使你成为root用户.另外,请记住,X服务器通常必须安装root owner和setuid bit set,这就是为什么代码中的有缺陷的逻辑很危险的原因.

这不是关于C的问题.这是一个关于Unix安全模型的问题,它是非常二元的(特别是在较旧的实现中):你必须是root用户才能做任何事情,因此大量的程序都有root所有者和setuid位(讽刺一点).