當前位置:
首頁 > 新聞 > Linux中create_elf_tables函數整型溢出漏洞分析(CVE-2018-14634)

Linux中create_elf_tables函數整型溢出漏洞分析(CVE-2018-14634)

在這篇文章中,我們將跟大家分析Linux平台中createelftables函數的一個整型溢出漏洞(CVE-2018-14634)。


概述


在近期的一次安全分析過程中,我們在64位Linux系統內核里的createelftables()函數中發現了一個整型溢出漏洞,本地攻擊者將可以通過一份SUID-root代碼來利用這個漏洞,並獲取到目標設備的完整root許可權。


目前,受該漏洞影響的Linux發行版有Red Hat Linux企業版、CentOS和Debian 8。


漏洞分析

150#define STACK_ROUND(sp, items)  151         (((unsigned long) (sp - items)) &~15UL) ... 165 create_elf_tables(struct linux_binprm*bprm, struct elfhdr *exec, ... 169        int argc = bprm->argc; 170        int envc = bprm->envc; 171        elf_addr_t __user *sp; ... 178        int items; ... 190        p = arch_align_stack(p); ... 287        items = (argc + 1) + (envc + 1) + 1; 288        bprm->p = STACK_ROUND(sp, items); ... 295        sp = (elf_addr_t __user *)bprm->p;

「argc」表示傳遞給execve()系統調用的命令行參數個數,個數受fs/exec.c中MAXARGSTRINGS的限制;「envc」表示傳遞給execve()的環境變數個數,個數同樣受到MAXARGSTRINGS的限制;但是由於MAXARGSTRINGS為0x7FFFFFFF,所以我們可以讓整數「items」發生溢出並讓程序失效。


此時,我們就可以以增加用戶態的棧指針,然後將用戶態棧指針指向我們的參數和環境變數字元串,最終在用戶模式執行SUID-root代碼時重寫這些字元串。


漏洞利用


在使用execve()運行SUID-root代碼時,我們的「items」值為0x80000000,參數指針的大小約為0x80000000 * sizeof(char *) = 16GB,參數字元串為16GB,環境字元串也為16GB,因此我們的漏洞利用環境「只」需要2 * 16GB = 32GB內存,而並非3 * 16GB = 48GB或者更多,因為我們使用了一些小技巧來減少內存指紋。


下面這個圖表代表了SUID-root代碼開始執行後,我們的用戶態棧結構:



-「A」(「alpha」)為createelftables()分配的棧空間大小(代碼190-287行),大約為512位元組。


-「sprand」是createelftables()分配的隨機棧空間大小(代碼190行),大小範圍在0-8192位元組之間。


-「protect」參數字元串是一個非常重要的命令行參數&選項,這個參數必須不能受到內存崩潰的影響。


-「padding」參數字元串大約需要佔用16GB棧空間。

-「protect」環境字元串是一個重要的環境變數,必須必須不能受到內存崩潰的影響。


-「scratch」環境字元串為1MB。


-「onebyte」環境字元串為256KB,其部分數據會被fname[]緩衝區覆蓋。


-「B」(「beta」)為ld.so分配的棧空間數量。


此時,ld.so會使用handleldpreload()中fname[]緩衝區的數據重寫「onebyte」環境變數中的部分數據,並讓processenvvars()中的UNSECUREECVVARS等過濾器失效。


我們的POC代碼能夠利用createelftables()中的這個整型溢出漏洞,演示樣例如下:

# gcc-O0 -o poc-suidbin poc-suidbin.c#chown root poc-suidbin#chmod 4555 poc-suidbin $ gcc-o poc-exploit poc-exploit.c$time ./poc-exploit...ERROR:ld.so: object "LD_LIBRARY_PATH=.0LD_LIBRARY_PATH=.0LD_LIBRARY_PATH=." fromLD_PRELOAD cannot be preloaded: ignored.ERROR:ld.so: object "LD_LIBRARY_PATH=.0LD_LIBRARY_PATH=." from LD_PRELOAD cannot bepreloaded: ignored.ERROR:ld.so: object "LD_LIBRARY_PATH=." from LD_PRELOAD cannot be preloaded: ignored.argc2147090419stack0x7ffbe115008f < 0x7ffbe1150188 < 0x7fffe0e50128 < 0x7ff7e11503ea <0x7ffbe102cdeagetenv0x7ffbe114d83b .0x7ffbe114d82bLD_LIBRARY_PATH=.0x7ffbe114df60LD_LIBRARY_PATH=.0x7ffbe114df72LD_LIBRARY_PATH=....0x7ffbe114e69eLD_LIBRARY_PATH=.0x7ffbe114e6b0LD_LIBRARY_PATH=.0x7ffbe114e6c2LD_LIBRARY_PATH=. real    5m38.666suser    0m0.049ssys     1m57.828s

附件



poc-suidbin.c:


https://seclists.org/fulldisclosure/2018/Sep/att-54/poc-suidbin_c.bin


poc-exploit.c:


https://seclists.org/fulldisclosure/2018/Sep/att-54/poc-exploit_c.bin


*

參考來源:seclists,FB小編Alpha_h4ck編譯,轉載請註明來自FreeBuf.COM


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

FreeBuf 2018金融行業應用安全態勢報告
智慧城市安全體系實例——智能門鎖安全嗎?

TAG:FreeBuf |