【发布时间】:2012-05-19 18:43:16
【问题描述】:
我指的是以下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);
现在,当程序休眠时,我 rm arg[1](使用另一个终端)是文件名,然后为同一文件创建符号链接。当我按照文章中所述执行时,我正在写入链接指向的文件。
然后我使用 strace 传递了相同的参数,它给了我“无法打开”,这意味着我无权访问作为 arg[1] 传递的文件。但是当我正常执行时情况并非如此 strace 是如何检测到这个的? 任何帮助都非常有价值。
我正在编写自己的应用程序,使用 ptrace 来检测此类攻击。我尝试使用 inode 编号来检测这一点,但我的应用程序仍在引用我正在传递的文件的 inode 编号。
【问题讨论】:
-
您是否对可执行文件执行了某种 suid/sgid 位?
-
@ChristopherCreutzig:程序使用
stat (filename)获取权限。但在可执行文件中我没有篡改。 -
我的意思是:程序在编译后是否作为 suid 二进制文件运行? IIRC,strace 会忽略这一点。
-
经过一番谷歌搜索后,我得到了
chmod +s a.out表示以 suid 二进制文件运行。是的,我正在这样做。那么这是否意味着 strace 就像我没有执行该命令一样工作? -
我相信是的。只需使用 shell 作为它将运行的用户并在 strace 下启动它。 (我将把它放在下面的答案中,只是为了让大家看到问题已在概述列表中得到回答。)
标签: c system-calls ptrace strace