文/盧康杰
UniSan:防止操作系統(tǒng)內(nèi)核中由未初始化導(dǎo)致的信息泄漏
文/盧康杰
盧康杰
佐治亞理工學(xué)院一名5年級計(jì)算機(jī)科學(xué)博士生,導(dǎo)師為Wenke Lee和Taesoo Kim。他的研究興趣是發(fā)現(xiàn)并解決系統(tǒng)安全,軟件安全,及手機(jī)安全領(lǐng)域的根本性安全問題。他的研究成果頗受學(xué)術(shù)圈認(rèn)可,目前他已經(jīng)發(fā)表8篇四大頂級安全會議的文章。
個(gè)人主頁:
http://www.cc.gatech.edu/~klu38。
操作系統(tǒng)內(nèi)核作為可信計(jì)算基(TCB),其安全性是至關(guān)重要的。為保證內(nèi)核的安全性,多種安全機(jī)制已經(jīng)被普遍應(yīng)用,其中主要包括kASLR和StackGuard。然而這兩種安全機(jī)制的有效性的前提是內(nèi)核中沒有信息泄漏。換句話說,如果有信息泄漏,kASLR和StackGuard將會變得沒有意義,因?yàn)樗鼈兯蕾嚨囊恍╇S機(jī)值會被泄漏。那么問題來了,內(nèi)核中是否存在大量的信息泄露?我們通過調(diào)研分析發(fā)現(xiàn)答案是肯定的:內(nèi)核中存在大量的信息泄漏漏洞。比如,僅2013年就有近60個(gè)有CVE的Linux內(nèi)核信息漏洞。隨著進(jìn)一步研究發(fā)現(xiàn)大部分信息泄漏(大約60%)是因?yàn)樽x取未初始化內(nèi)存(uninitialized data read)導(dǎo)致,如圖1所示。
可以想象一下,如果建立一個(gè)內(nèi)存對象(memory object)但不去初始化它,那么讀取這個(gè)內(nèi)存對象所得到的數(shù)據(jù)將會是以前遺留在內(nèi)存中的一些數(shù)據(jù)。如果這些數(shù)據(jù)包含kASLR隨機(jī)過的地址,StackGuard使用的隨機(jī)canary,或者是之前用戶遺漏的密碼等重要信息,那么就會造成這些重要信息的泄漏。而導(dǎo)致讀取未初始化內(nèi)存的原因又分為兩種:程序員的疏忽和編譯器的優(yōu)化。編譯器的問題導(dǎo)致了一個(gè)嚴(yán)重且普遍的問題:即使程序員初始化一個(gè)對象中的所有成員,仍然有一些字節(jié)沒有被初始化。代碼1列出了一個(gè)例子。在這個(gè)例子中程序員初始化了內(nèi)核堆棧對象“ci”的每一個(gè)成員,然而編譯器在第二個(gè)成員“slow”之后插入的3個(gè)填充字節(jié)仍然沒有初始化,當(dāng)“copy_ to_user”把未初始化字節(jié)拷貝給用戶空間時(shí)導(dǎo)致信息泄漏。目前已經(jīng)有很多攻擊利用這樣的信息泄漏來突破kASLR和StackGuard然后實(shí)現(xiàn)iOS越獄,Android root等等攻擊。雖然這個(gè)問題這么嚴(yán)重,然而,目前并沒有有效地防止讀取未初始化內(nèi)存的方法或工具。
圖1 導(dǎo)致Linux 內(nèi)核信息泄漏原因統(tǒng)計(jì)(2013-2016年)
為了解決這個(gè)問題讀取未初始化導(dǎo)致信息安全泄漏,我們提出了一種基于LLVM編譯器的方法。簡單來說,需要通過細(xì)顆粒度的(字節(jié)級別)、跨函數(shù)的、精確的可到達(dá)性和初始化性程序分析來檢查是否存在這樣一些不安全內(nèi)存對象:存在至少一條程序路徑使得一個(gè)內(nèi)存對象在離開內(nèi)核空間的時(shí)候并沒有完全被初始化。當(dāng)檢測出這樣的內(nèi)存對象以后,我們會在內(nèi)核中插入一些代碼對這些內(nèi)存對象進(jìn)行置零初始化。在實(shí)現(xiàn)UniSan過程中,通過設(shè)計(jì)很多方法來保證程序分析的完全性(也就是沒有漏報(bào)),比如解決了找間接調(diào)用對象的問題。目前已經(jīng)基于LLVM實(shí)現(xiàn)了UniSan,并且用它來保護(hù)最新的Linux內(nèi)核和Android內(nèi)核。實(shí)驗(yàn)結(jié)果顯示UniSan保護(hù)過的內(nèi)核運(yùn)行非常穩(wěn)定,毫無問題。作為驗(yàn)證,我們發(fā)現(xiàn)UniSan能完全防止已有的信息安全漏洞并且發(fā)現(xiàn)大量的新漏洞。
代碼1 編譯器優(yōu)化插入未初始化的填充字節(jié),導(dǎo)致信息泄漏
從性能角度看,UniSan幾乎沒有引起任何性能的降低(大多數(shù)情況下,性能影響小于0.5%)。綜合這些實(shí)驗(yàn)結(jié)果,UniSan以一種有效的,高性能的,無漏報(bào)的方法解決了操作系統(tǒng)內(nèi)核中由讀取未初始化內(nèi)存導(dǎo)致的普遍的信息泄漏問題。
(注:原文發(fā)表在ACM CCS 2016,更多細(xì)節(jié)請看UniSan文章:http://www.cc.gatech.edu/~klu38/ publications/unisan-ccs16.pdf)