今天我在阅读一篇文章时提到了以下内容:
“我们发现了很多错误 年份。绝对最好的之一是 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
答案 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
。注意括号。