安全圈 | 专注于最新网络信息安全讯息新闻

首页

cve–2017–16943 exim–uaf漏洞分析

作者 galluppi 时间 2020-03-04
all

CVE–2017–16943 Exim–UAF漏洞分析

2017-12-15 18:29

0x00背景介紹

Exim是劍橋大學開發的一款基於GPL協定的開放原始程式碼軟件,其主要用於連接互聯網Unix系統的消息傳輸代理(MTA)服務器。

2017年11月25日,Exim官方修復了一處use-after-free的漏洞,由臺灣安全公司DEVCORE的研究人員Meh發現,CVE編號為:CVE-2017-16943,並公佈了一份POC,但是根據我們的分析跟進,該POC必須將設定檔中的dkim開啟才能達到控制EIP,造成行程崩潰的效果。

2017年12月11日,Meh在DEVCORE官網公佈該漏洞的具體細節和默認配寘下的POC。

360 CERT對此進行驗證,證明可以造成遠程程式碼執行,影響範圍廣,危害嚴重。

0x01漏洞攻擊面影響

影響面

根據360CERT全網資產檢索平臺,截止2017年12月15日檢索的結果表明全球有超過一百萬臺服務器上運行著Exim,全球的影響分佈圖如下:

影響版本

該漏洞影響開啟chunk設定的4.88和4.89版本

修復版本

360 CERT建議相關用戶及時下載官方的修復補丁,關閉chunk設定或者更新到4.90版本。

0x02漏洞詳情

開啟dkim配寘下控制rip

exim一共管理著三種堆,定義成枚舉類型的全域變數:

POOL_MAIN:表示主要的分配的堆塊,可以被釋放,消息的處理會在該堆池中分配。

POOL_PERM:表示分配的記憶體是永久的,直到行程結束才會被釋放,保存一些需要共亯的資訊,例如配寘資訊,host資訊,在使用這塊堆池分配前會將store_pool改為POOL_PERM,再調用store_get()。

POOL_SEARCH:保存蒐索的數據,在search_tidyup、search_open、internal_search_find函數中被使用。

Exim會迴圈讀取消息,並動態分配記憶體,申請記憶體的函數包括:expand_string()、store_get()、string_xxx(),store_get_perm()會使用perm pool。

將設定檔/usr/exim/configure中的“control = dkim_disable_verify”注釋,可以觸發行程崩潰,進而控制rip,分析原因如下:

在receive_msg函數中會判斷是否開啟dkim,如果開啟就會進入dkim_exim_verify_init函數:

dkim_exim_verify_init函數裏在perm pool中申請記憶體:

使得在堆中分配一塊記憶體,同時不改變current_block[0]中的值,後續對消息處理時會在main pool中分配堆塊,分配一塊0x2010大小的堆塊,釋放後,由於之前perm pool分配的堆塊,使得釋放的堆塊不和top chunk合併,變成一個unsorted bin,此時fd和bk指向main arena區域。再進一次store extend後,通過store_get會獲得指向main arena的指針,之後memcpy對main arena進行寫操作,後續的free操作會造成崩潰,RIP會變成填充的數據。

具體的細節如下圖:

默認配寘下控制rip

在devcore公司公佈具體細節後,我們對默認配寘下如何控制rip進行了分析。其實原理和開啟dkim配寘類似,需要在top_chunk前分配一塊在使用的堆塊,防止後面釋放的堆塊和top_chunk合併,作者的poc是利用DATA來發送一個足够大的數據來擴展堆塊,迴圈多次後,期間釋放了之前的堆塊,變成了一個大的unsorted bin塊供後續分配。此時top_chunk之前就有了正在使用的堆塊,再利用BDAT命令達到控制rip的目的。

具體控制rip的流程如下:

0x03漏洞利用驗證

我們根據meh的poc和思路編寫了exp,通過控制rip跳轉到fflush(stdout),並覆蓋_IO_FILE結構覆蓋成攻擊程式碼,將_IO_jump_t虛錶結構體中的(_IO_sync_t,__sync)覆蓋成system函數地址,來執行攻擊程式碼。

Exp攻擊效果圖:

0x04官方補丁

官方補丁判斷要釋放的堆塊是否為最後一個堆塊,如果不是的話,就不能釋放,這樣就達不到UAF的條件,無法觸發漏洞。

0x05時間線

2017-11-23 Meh公佈開啟dkim配寘的poc

2017-11-25 Exim官方修復UAF漏洞

2017-12-11 Meh公佈默認配寘下的漏洞細節及poc

2017-12-15 360CERT完成對漏洞的分析和利用

0x06參攷連結

1、https://bugs.exim.org/show_bug.cgi?id=2199

2、https://github.com/LetUsFsck/PoC-Exploit-Mirror/blob/master/CVE-2017-16944/poc.py

3、https://xorl.wordpress.com/2017/11/26/cve-2017-16943-exim-use-after-free/

4、https://thehackernews.com/2017/11/exim-internet-mailer-flaws.html

5、https://devco.re/blog/2017/12/11/Exim-RCE-advisory-CVE-2017-16943-en/

0x07報告下載

報告下載:CVE-2017-16943 Exim-UAF漏洞分析報告.pdf