为什么strace遵循不同的执行流程?

时间:2012-05-11 06:53:06

标签: c system-calls ptrace strace

我指的是以下article学习符号链接攻击:

struct stat st;
FILE * fp;
if (argc != 3) {
 fprintf (stderr, "usage : %s file message\n", argv [0]);
 exit(EXIT_FAILURE);
}

if (stat (argv [1], & st) < 0) {
 fprintf (stderr, "can't find %s\n", argv [1]);
 exit(EXIT_FAILURE);
}

if (st . st_uid != getuid ()) {
 fprintf (stderr, "not the owner of %s \n", argv [1]);
 exit(EXIT_FAILURE);
}

if (! S_ISREG (st . st_mode)) {
 fprintf (stderr, "%s is not a normal file\n", argv[1]);
 exit(EXIT_FAILURE);
}

sleep (25);

if ((fp = fopen (argv [1], "w")) == NULL) {
  fprintf (stderr, "Can't open\n");
  exit(EXIT_FAILURE);
}

fprintf (fp, "%s\n", argv [2]);
fclose (fp);
fprintf (stderr, "Write Ok\n");
exit(EXIT_SUCCESS);

现在当程序休眠I rm arg [1](使用另一个终端),这是文件名,然后为同一个文件创建一个符号链接。当我按照文章中的说法执行时,我正在写链接所指向的文件。

然后我使用strace传递相同的参数,它给我“不能打开”,这意味着我无法访问以arg [1]传递的文件。但是当我正常执行时,情况如何才能检测到这种情况? 任何帮助都非常有价值。

我正在使用ptrace编写自己的应用程序来检测此类攻击。我尝试使用inode编号来检测这个,但我的应用程序仍然指的是我传递的文件的inode编号。

1 个答案:

答案 0 :(得分:2)

如上所述,二进制文件以suid标志(chmod u+s a.out)启动。由于strace需要观察进程,并且如果它像其他用户一样运行,则无法执行此操作,因此它会默默地忽略s位。

解决方案:在运行程序的shell窗口中,使用将在没有strace的情况下使用的login / user-id - 假设您刚刚使用chmod u+s a.out作为该用户,那么应该是一个安全的假设:您可以在该帐户下登录。

为了完整性:要更改单个shell窗口的用户ID,只需使用su - otherlogin,将otherlogin替换为登录名。 (su =“切换用户”)