竞争状态是一种异常行为,是由对事件相对节奏依赖关系的破坏而引发的。竞争条件属于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权限的超级管理员。
Copyright 2011-2020 © MallocFree. All rights reserved.