0

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

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);

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

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

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

4

1 回答 1

2

如上所述,二进制文件以 suid 标志 ( chmod u+s a.out) 开始。由于strace需要监视进程,并且如果它以其他用户身份运行则不能这样做,它会默默地忽略 s-bits。

解决方案:在运行程序的 shell 窗口中,使用无需 strace 即可使用的登录名/用户 ID——假设您只是chmod u+s a.out以该用户身份进行操作,那么可以安全地假设您可以使用该帐户登录。

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

于 2012-05-11T07:11:48.703 回答