标题:竞争条件


竞争状态是一种异常行为,是由对事件相对节奏依赖关系的破坏而引发的。竞争条件属于time-of-check-to-time-of-use漏洞的一种。即,程序先检查对象的某个特性,然后的动作是在假设这些特性一直保持的情况下作出的。但这时该特性可能不具备了。

 

一般来说,进程不是以原子方式运行的。一个进程可以在任意两条指令之间中断正在运行的另一个进程。如果一个进程对这样的中断没有适当的处理措施,其它进程就可能干扰程序的进行,甚至引起安全问题。

 

竞争条件漏洞的发生,要具备以下条件:

有两个或两个以上的事件发生,两个事件间有一定的间隔。两个事件间有一定的关系,即第二个事件(及其后的事件)依赖于第一个事件。

攻击者能够改变第一个事件所产生的,为第二个事件所依赖的假设。

 

下面的这个程序,表面上看起来似乎没有任何问题,但实际上它具有竞争漏洞。

//vulp.c

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#define DELAY 10000

int main()

{

     char * fn = "/tmp/XYZ";

     char buffer[160];

     FILE *fp;

     long int  i;

 

     //get user input

     scanf("0s", buffer );

     if(!access(fn, W_OK))

     {

     //simulating delay

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

}

 

这个程序为什么具有竞争条件漏洞呢?

 

首先这是一个这是一个Set-UID Root程序。所谓Set-UID程序,就是当用户在执行该程序的时候,就拥有了与程序拥有者一样的权限。例如,如果程序的拥有者是root,那么任何人运行这个程序时都会获得程序拥有者的权限。

 

这段程序是以root权限运行,那么会调用函数access()仔细的核查真正的使用者是否具有写这个文件的权限,如果使用者有这个权限,那么它会允许用户向/tmp/XYZ中追加输入的数据。但因为在核查权限(access)和打开文件(fopen)之间存在一段时间,那么就会存在一种可能:核实的文件和打开的文件已经不是同一个文件了,虽然它们有相同的/tmp/XYZ符号链接。如果一个恶意攻击者在这段时间差之内通过另外一个进程(2者竞争)把/tmp/XYZ符号链接到/etc/shadow,那么它就会导致向/etc/shadow中写入数据(因为这段程序是以root权限运行的,所以它可以改写任何文件),甚至添加具有root权限的超级管理员。

 

更多竞争条件漏洞的利用原理,请参考:链接1链接2


看文字不过瘾?点击我,进入腾讯课堂视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注