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

时间:2010-04-26 23:24:24

标签: c security unix static-analysis

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

  

“我们发现了很多错误   年份。绝对最好的之一是   X Window系统中的以下内容:

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

它允许任何本地用户获得root权限   访问。 (重言式检查   geteuid == 0的目的是   geteuid()== 0。目前的形式,   它将geteuid的地址压缩为   0;鉴于该功能存在,它的   地址永远不会是0)。“

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

对于有兴趣阅读完整文章的人,请点击链接:

A Few Billion Lines of Code Later: Using Static Analysis to Find Bugs in Real World

4 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:2)

如何获得访问权限与代码中的缺陷直接相关。

如果您确切知道此代码的确切位置,则可以探索可以使您访问此代码行的代码路径,然后在检查此代码的后果后,可以利用错误的安全级别检查。

然而;这个特定的测试似乎很难开发。所有这一切都是(错误地)检查root访问权限,如果用户没有,则进行保释并显示错误条件。

必须审核后续代码,以查看是否可以利用非root用户执行代码的事实。

答案 2 :(得分:0)

我认为这意味着对root访问权限的检查不正确,并允许继续进行根级别处理。你是如何升级的还不清楚。

答案 3 :(得分:0)

check geteuid == 0始终为false,因为geteuid是函数的名称,在此上下文中,它计算为非NULL的指针。应该是geteuid() == 0。注意括号。