关于竞争条件的对策

原子操作

TOCTTOU竞争条件是由于检查操作和使用操作之间的间隔(也称窗口期)而导致的,原子操作旨在消除检查和使用操作之间的间隔,将检查和使用操作原子化,该对策需要操作系统级的支持。

 

重复检查和使用 

竞争条件漏洞能否成功被利用,取决于攻击者能否赢得检查与使用之间的窗口,即能否在检查与使用间隔期间改变程序的输出,重复检查和使用方法旨在使攻击者更加难于赢得窗口 ,参考如下代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main()
{
    struct stat stat1,stat2,stat3;
    int fd1,fd2,fd3;

    if(access("/tmp/XYZ",O_RDWR)){
        fprintf(stderr,"Permission Denied\n");
        return -1;
    }   //Window1
    else fd1=open("/tmp/XYZ",O_RDWR);
        //Window2
    if(access("/tmp/XYZ",O_RDWR)){
        fprintf(stderr,"Permission Denied\n");
        return -1;
    }    //Window3
    else fd2=open("/tmp/XYZ",O_RDWR);
        //Window4
    if(access("/tmp/XYZ",O_RDWR)){
        fprintf(stderr,"Permission Denied\n");
        return -1;
    }    //Window5
    else fd3=open("/tmp/XYZ",O_RDWR);

    fstat(fd1,&stat1);
    fstat(fd2,&stat2);
    fstat(fd3,&stat3);

    if(stat1.st_ino == stat2.st_ino &&stat2.st_ino == stat3.st_ino){
        write_to_file(fd1);
    }
    else{
        fprintf(stderr,"Race Condition Detected");
        return -1;
    }
}

该代码通过执行多次access()和open(),并且对fd1、fd2、fd3进行检查,只有三次相同才向文件写入,使得攻击者赢得竞争条件变得十分简单,因为他需要赢得5次窗口,错过任何一次都会失败。

 

粘性符号链接保护

 大多数的TOCTTOU竞争条件漏洞都与/tmp目录下的符号链接有关,所以ubuntu采取了一种内置的保护机制,阻止程序在特定条件下使用符号链接,在这种对策下,即使攻击者能够赢得窗口,也不能造成其他伤害。该对策只应用于人人可写的粘性目录,例如/tmp,在ubuntu下默认开启,可以使用如下命令开启

sudo sysctl -w kernel.yama.protected_sticky_symlinks=1

例如,在该对策下,只有当符号链接的拥有者是当前粘性目录的拥有者或者符号链接的euid,fopen函数才允许打开指定文件。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值