2017-08-31 53 views
0

我試圖做一個c程序觸發CVE-2017-10661CVE-2017-10661觸發

據我瞭解,因爲might_cancel機制,它沒有得到適當的保護,如果你對文件描述符進行並行操作,你可能會導致崩潰。

我相信這些並行操作是讀取,輪詢等權利?

目前我寫了這段代碼。

#include <sys/timerfd.h> 
#include <sys/poll.h> 
#include <sys/epoll.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <strings.h> 
#include <unistd.h> 

int main(int ac, char *av[]) 
{ 
    int timerfd; 
    int epollfd; 
    struct itimerspec timerValue; 
    uint64_t exp; 
    ssize_t s; 

/* set timerfd */ 
timerfd = timerfd_create(CLOCK_MONOTONIC, 0); 
if (timerfd < 0) { 
    printf("failed to create timer fd\n"); 
    exit(1); 
} 
bzero(&timerValue, sizeof(timerValue)); 
timerValue.it_value.tv_sec = 1; 
timerValue.it_value.tv_nsec = 0; 
timerValue.it_interval.tv_sec = 1; 
timerValue.it_interval.tv_nsec = 0; 

/* start timer */ 
if (timerfd_settime(timerfd, 0, &timerValue, NULL) < 0) { 
    printf("could not start timer\n"); 
    exit(1); 
} 
    s = read(timerfd, &exp, sizeof(uint64_t)); 
    exit(0); 
} 

正如你可以看到我設置了一個計時器,然後我只做一個閱讀操作。有沒有辦法通過多讀取或輪詢來觸發錯誤?

回答

1

競賽條件由timerfd_settime()timerfd_setup_cancel()timerfd_setup_cancel()觸發。所以你應該使用多個線程來做timerfd_settime,標記爲TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET

這是我在網上找到的POC

+0

謝謝!這真的很有幫助!我正在使用多線程,但使用'read'。我現在就試試 –

+0

那麼,這個POC是否應該觸發這個bug呢? –

+1

是的,它應該。這個bug是由syzkaller自動生成的這個POC發現的。 – FatMinMin