楊 嘉,曾慶凱
(1.南京大學(xué) 計算機軟件新技術(shù)國家重點實驗室,江蘇 南京210093;2.南京大學(xué) 計算機科學(xué)與技術(shù)系,江蘇 南京210093)
2001年NSA發(fā)布了安全增強的Linux系統(tǒng)――SELinux[1]。在SELinux策略中起主導(dǎo)作用的是TE模型,即系統(tǒng)實體根據(jù)其安全特性被標(biāo)記為相應(yīng)的類型(type)。策略以類型為對象設(shè)定訪問規(guī)則。但是由于SELinux的類型空間龐大,出現(xiàn)不安全訪問授權(quán)的可能性很大。并且目前在Linux系統(tǒng)中有30-40個應(yīng)用程序需要相應(yīng)的訪問權(quán)限來處理不同敏感等級的數(shù)據(jù)。直接信任這些程序可能造成安全隱患,尤其是在程序被攻破的情況下,攻擊者有足夠的權(quán)限造成機密數(shù)據(jù)泄露。相反的,直接移除相應(yīng)的權(quán)限又會影響程序的可用性。
針對上述情況,本文提出了基于信息流分析的權(quán)限控制方法。本文將程序執(zhí)行過程中是否已訪問高敏感等級的數(shù)據(jù)作為當(dāng)前運行時權(quán)限的一個決定因素。同時,針對訪問控制只能在系統(tǒng)與程序的接口層實施系統(tǒng)資源管理的局限性,本文采用靜態(tài)分析的方法,跟蹤輸入數(shù)據(jù)在程序內(nèi)部的流動情況,一直到達數(shù)據(jù)的輸出接口,由此定位到訪問權(quán)限實際產(chǎn)生效用的程序點。通過插裝代碼標(biāo)記的方式實現(xiàn)對程序權(quán)限的準(zhǔn)確控制。
本文主要有以下幾個方面的貢獻:提出了一種基于策略信息流的主體安全狀態(tài)劃分方法,對主體權(quán)限的管理提供了更精確的控制;采用靜態(tài)分析的方法,跟蹤程序內(nèi)部的信息流,確定了可能造成信息泄露的程序點,減少了狀態(tài)切換的次數(shù);修改SELinux安全服務(wù)器,實現(xiàn)了運行時動態(tài)切換進程安全狀態(tài)的功能。
表1中列出了主要的策略規(guī)則種類和其在策略文件中的數(shù)量。類型定義規(guī)則申明了系統(tǒng)中所有的實體類型,主體的類型又稱作域(Domain)。該規(guī)則還支持對類型添加別名,并設(shè)定其所在的屬性。屬性是若干類型構(gòu)成的集合,集合內(nèi)的所有類型有共同的性質(zhì),這對理解類型的安全特性有很大幫助。例如,domain就是通過屬性規(guī)則來定義的,以及node_type屬性表示網(wǎng)絡(luò)節(jié)點和主機的類型等。訪問向量是TE策略的主體部分,它規(guī)定了source_t域中的主體是否對target_t類型的客體有permission的權(quán)限。class表示客體的種類,permission是定義在class上的操作,class和permission反應(yīng)了訪問規(guī)則在系統(tǒng)中能控制的操作語義。SELinux中默認的子進程繼承父進程的域,新文件繼承父目錄的類型,類型遷移定義了主客體類型動態(tài)變化的規(guī)則。當(dāng)class為process時表示域遷移規(guī)則,source_t下的進程通過執(zhí)行target_t類型的可執(zhí)行文件,可轉(zhuǎn)移到new_t域。SELinux的策略只支持在裝載新的可執(zhí)行程序時改變進程主體的域,這種機制忽略了信息流因素對于主體權(quán)限的影響,這也是本文工作的改進內(nèi)容之一。類似的,當(dāng)class為其它種類時,source_t下的進程在target_t類型的目錄下生成是新文件將是new_t類型。
表1 策略語法和統(tǒng)計
表1中第3列顯示了相應(yīng)類型的規(guī)則在policy.24版本的targeted策略中的數(shù)量。隨著應(yīng)用程序的增加和拓展,策略文件的規(guī)模和復(fù)雜性呈上升的趨勢。舉例來說,Linux的日志轉(zhuǎn)儲程序logrotate,需要對自己的配置文件進行訪問,完成對不同類型的日志文件的處理,記錄執(zhí)行狀態(tài),同時還有壓縮和電郵指定日志的功能。logrotate_t的訪問規(guī)則向量就有374條,另有134條類型轉(zhuǎn)換規(guī)則。這些策略規(guī)則直接定義了底層資源訪問的規(guī)則,缺乏對高抽象層次安全性質(zhì)的表述和驗證方法。配置策略很可能包含錯誤的訪問授權(quán)。
根據(jù)范疇不同,信息流分為兩種:一種是系統(tǒng)實體之間的信息流,從策略配置中提取,作為影響主體權(quán)限的附加因素,用來標(biāo)記進程主體當(dāng)前的安全狀態(tài);另一種是程序內(nèi)部的信息流,從編程語言的語義中提取,這一部分的信息流體現(xiàn)系統(tǒng)資源在程序內(nèi)部的使用和傳遞。兩者的結(jié)合構(gòu)建了完整的信息流圖景:程序內(nèi)部的信息流信息彌補了訪問控制的盲點,避免了盲目信任應(yīng)用程序;系統(tǒng)實體之間的信息流則補充了靜態(tài)分析技術(shù)固有的缺陷,附加的影響因素使得對主體的授權(quán)更加準(zhǔn)確。
資源的訪問本質(zhì)上就具有信息流動的特征,所以系統(tǒng)的許多安全需求可以通過策略信息流的方式來表達。訪問規(guī)則中的某些permission就隱含著主客體之間的信息流動。如果該permission引發(fā)了從source_t到target_t的信息流,就將其劃歸modPerm類的權(quán)限,例如,file類資源的write權(quán)限;反之,劃歸obsPerm類,例如,file資源上的read權(quán)限。
在機密性保護方面,“高敏感等級實體中的信息不能流向低敏感等級的實體”是滿足BLP模型的基本要求。該安全需求轉(zhuǎn)換成策略信息流的形式就是:
SecFlow={<o(jì),o’> | obs Perm(s,o)∧mod Perm(s,o’)∧SL(o)≤SL(o’)},其中SL(e)表示系統(tǒng)實體e的安全等級。
在更高的抽象層次上分析系統(tǒng)的安全特性,安全管理員不需要詳細了解每一個類型含義。只要對高敏感客體集合(HighType)和不可信客體集合(LowType)進行規(guī)定,通過策略信息流分析就能確定引起非法信息流動的相關(guān)主體和權(quán)限。
來自HighType客體的信息經(jīng)過一次或者以上的流動傳遞可能到達LowType的客體中,造成信息泄露,圖1顯示了這樣一條信息流。這里定義從app_t向LowType輸出信息的Perm2為不安全的訪問權(quán)限Punsafe。針對這種情況管理員可以直接將有威脅的權(quán)限移除,這樣做會影響程序的正常功能。本文認為進程主體在其生命周期內(nèi)并不一定會使用所有靜態(tài)配置的權(quán)限,也就是說進出app_t的信息流不一定存在必然的關(guān)聯(lián)。本質(zhì)上,是否能夠滿足安全要求的關(guān)鍵是權(quán)限所引起的信息流動而不是權(quán)限本身。因此,將主體的權(quán)限依據(jù)信息流的因素劃分成不同的狀態(tài),并在運行時由信息流觸發(fā)狀態(tài)轉(zhuǎn)換是一個合理的選擇。為此構(gòu)建了一個新的域,app_sec_t,將其權(quán)限設(shè)定為:
Perm(app_sec_t)=Perm(app_t)-Punsafe
Role(app_sec_t)=Role(app_t)
Attribute(app_sec_t)=Attribute(app_t)
新生成的域app_sec_t,角色分配規(guī)則以及屬性都與app_t保持一致。區(qū)別是它失去了向低等級客體輸出信息的能力。在app_sec_t中運行的進程主體不可能造成HighType客體中信息的泄露,故稱之為主體的安全狀態(tài)。
圖1 非法信息流路徑
機密性保護的基本方法是監(jiān)控敏感信息的流動。靜態(tài)分析方法不需要執(zhí)行程序,從源代碼中抽取語法和語義信息,通過對程序意圖的理解,完成追蹤和鑒別數(shù)據(jù)的來源、傳遞及其使用的任務(wù)。因此,本文采用該方法來跟蹤程序內(nèi)部的信息流動。
信息流是信息從一個實體流向另一實體的有效途徑,本文將信息流定義為R,是信息流識別對象集W及其上的二元關(guān)系→。
本文定義R=(W,→),且→={<src,dest> |src,dest∈W}。
程序?qū)ο蠹疻包括程序中的變量集、常量集,以及函數(shù)調(diào)用和返回語句等在內(nèi)的程序行為實體集合?!鷦t由信息流源對象src和目的對象dest組成,多條信息流可以構(gòu)成信息流集合IFs。根據(jù)程序控制結(jié)構(gòu)和語法特征,總結(jié)有以下的信息流生成規(guī)則。
(1)賦值語句:
v0=v1;IFs={<v1,v0>}(v0,v1都不是指針變量)
v0=v1;IFs={<v1,v0>,<v0,v1> }(v0,v1都是指針變量)
v0= & v1;IFs={<v1,v0>,<v0,v1> }
v0=a[i1]...[in];IFs={<a[i1]...[in],v0>,…,<i1,v0>,<in,v0> }(a為N維數(shù)組元素)
v0=⊙(v1,…,vN);IFs={<v1,v0>,…,<vN,v0> }(⊙是N元運算符)
(2)函數(shù)調(diào)用語句:
fun(v1,…,vN);IFs={<v1,fun|1>,…,<vN,fun|N>}(fun是調(diào)用的函數(shù)名,表示調(diào)用點實參到形參的信息流。參數(shù)是指針則添加<fun|1,v1>到IFs)
(3)返回語句:
return v0;IFs={<v0,*> }(*是當(dāng)前函數(shù)的調(diào)用者)
(4)控制語句:
if(v0==k){v1=…}else{v2=…}IFs={<v0,v1>,<v0,v2>}
switch(v0){casei:{v1=…}……default:{vN=…}}IFs={<v0,v1>,…,<v0,vN> }
while(v0==k){v1=…}IFs={<v0,v1>}
上述規(guī)則定義了由程序語義引起的原子信息流。在計算信息流傳遞的時,加入輸入輸出接口作為src和dest的篩選條件,就可以得到以輸入信息為導(dǎo)向的程序切片。輸出接口將使用相應(yīng)的授權(quán)來完成操作。
上一節(jié)提到的安全狀態(tài)劃分,可以有效的從程序整體的層次上阻塞敏感信息向低等級客體的通道。但是在程序中,并不是每一處系統(tǒng)操作的執(zhí)行都會使用有安全隱患的權(quán)限。運用靜態(tài)分析的目的就是篩選出有潛在威脅的輸出操作。在這些程序插裝標(biāo)記提示安全服務(wù)器切換程序的安全狀態(tài),達到限制程序權(quán)限的效果。這樣在程序代碼的子集上實施的權(quán)限控制,一方面可以盡可能減少出于安全考慮對程序功能的影響,另一方面可以減少安全狀態(tài)切換的次數(shù),降低運行時的開銷。
在SELinux環(huán)境下,進程生命周期內(nèi)只在裝載新的執(zhí)行鏡像時發(fā)生域遷移。本文為了更加準(zhǔn)確的控制主體的權(quán)限,在SELinux安全服務(wù)器中實現(xiàn)了狀態(tài)轉(zhuǎn)換機制。同一個主體在不同的安全狀態(tài)下?lián)碛胁煌脑L問權(quán)限。兩個條件可以觸發(fā)安全狀態(tài)的轉(zhuǎn)變:一是主體讀取了高敏感等級的信息,二是主體試圖向客體輸出信息。前者發(fā)生在相應(yīng)的訪問規(guī)則觸發(fā)之時,后者通過靜態(tài)分析插裝的標(biāo)記觸發(fā)。整個程序運行周期的安全上下文狀態(tài)可以由圖2來表示。我們將程序的運行劃分成3個安全狀態(tài)。
圖2 安全狀態(tài)轉(zhuǎn)換
(1)常規(guī)狀態(tài)(app_t):程序運行的初始狀態(tài),擁有初始策略配置的所有權(quán)限。
(2)中間狀態(tài)(app_mid_t):當(dāng)程序接收了敏感數(shù)據(jù)之后進入該狀態(tài),其擁有和常規(guī)狀態(tài)同樣的權(quán)限。該狀態(tài)只是為了標(biāo)記程序是否具有高敏感等級的信息,并不對權(quán)限進行限制。
(3)安全狀態(tài)(app_sec_t):當(dāng)程序試圖執(zhí)行數(shù)據(jù)輸出操作時,切換到該狀態(tài)執(zhí)行。該狀態(tài)可以阻止主體向低敏感等級的客體輸出數(shù)據(jù),但不會限制其它操作。此處的狀態(tài)切換用插裝在程序中的標(biāo)記觸發(fā)。
本文基于上一節(jié)的方法實現(xiàn)了程序運行環(huán)境,工作流如圖3所示。
圖3 原型系統(tǒng)工作流程
策略分析模塊對modPerm和obsPerm操作的設(shè)定,引用了開源工具apol[2]中的配置。該模塊讀入策略文件policy.conf,生成原子信息流矩陣。從HighType出發(fā),用深度優(yōu)先的策略搜索到達LowType的非法信息流路徑。本文將中間傳遞次數(shù)上限設(shè)定為最多途徑2個主體域節(jié)點,因為通過兩個以上惡意程序之間配合完成信息泄露是比較難實現(xiàn)的。在傳遞路徑上造成第二次信息流動的權(quán)限即為Punsafe。然后模塊自動生成app_mid_t和app_sec_t兩個域和相應(yīng)的授權(quán),添加到策略文件中。
靜態(tài)分析在gcc編譯器的優(yōu)化框架下實現(xiàn),利用了gcc生成的語法樹、調(diào)用圖等結(jié)構(gòu)完成過程內(nèi)和過程間的信息流分析。輸入輸出接口的設(shè)定主要依據(jù)系統(tǒng)操作的語義。例如,read從指定的文件讀取數(shù)據(jù)到程序內(nèi)存空間的緩沖區(qū)中,mmap可以直接將文件的內(nèi)容映射到程序的地址的空間,故被定義為輸入接口。本文也對相關(guān)操作的執(zhí)行進行了跟蹤。read和mmap在執(zhí)行時確實會觸發(fā)關(guān)于對文件讀取的訪問控制檢查。
程序的安全狀態(tài)對應(yīng)與程序的3個域,程序被裝載時由依照原來的策略規(guī)則進入app_t域運行。本文的工作在安全決策函數(shù)avc_has_perm()中添加了對源數(shù)據(jù)類型的檢查,來判斷是否有HighType類型的信息流入,而程序中插裝的標(biāo)記通過添加新的系統(tǒng)調(diào)用實現(xiàn)從應(yīng)用程序向內(nèi)核的通信。
本文設(shè)定用戶登錄日志/var/log/wtmp文件的類型wtmp_t為Hightype,同時設(shè)定node_type,port_type,etc_t等具有公共安全屬性的類型為LowType。經(jīng)過分析發(fā)現(xiàn)Linux下的日志轉(zhuǎn)儲程序(logrotate_t)通過上百條策略規(guī)則的配置獲得了大量的訪問權(quán)限,其中一部分是由程序自身的功能需求決定的。該程序需要根絕配置文件(etc_t),處理多種服務(wù)程序產(chǎn)生的日志(wtmp_t等),同時具備執(zhí)行腳本和電郵日志的功能。因為程序需要訪問的客體類型眾多,所以其策略配置也相對復(fù)雜。下面是一部分策略片段。
allow logrotate_t etc_t:file{read write open}
allow logrotate wtmp_t:file{read write open execute link unlink}
allow logrotate_t logrotate_tmp_t:file{read write open link unlink}
allow logrotate_t node_t:node{tcp_recv tcp_send}
allow logrotate_t logrotate_mail_t:process transition
可以看到經(jīng)過logrotate_t的傳遞有從wtmp_t流向etc_t,node_t的信息流。因為logrotate不需要和socket進行通信,所以本文將于node_t相關(guān)的訪問權(quán)限直接移除。然后定義logrotate_sec_t類型作為信息流安全的域,并賦予其受限制的訪問權(quán)限。
對logrotate源程序?qū)嵤╈o態(tài)信息流分析,本文找出了表2所示的輸入和輸出接口之間的關(guān)系。表2中的后兩項,程序在執(zhí)行了dup2將打開的文件描述符重定位到標(biāo)準(zhǔn)輸入之后,又通過execlp()調(diào)用了其它程序,例如,調(diào)用mailx來將mailInput的內(nèi)容發(fā)送到指定的郵箱地址。本文選擇在這一步插裝標(biāo)記來阻止進程主體的域遷移。首先,以只讀的方式打開一個文件會產(chǎn)生從客體到主體的信息流,因為在進程空間的文件描述符也具有其對應(yīng)文件的安全屬性;其次,將域遷移權(quán)限從logrotate_sec_t中去除限制了敏感信息的擴散,也避免了對更多的程序進行分析和插裝。
表2 logrotate程序靜態(tài)分析結(jié)果
用信息流來表示主客體的安全屬性,學(xué)術(shù)界已經(jīng)有一些這方面的研究。UMIP[3]是一種具有高可用性的訪問控制模型,它的主要目的是為了保護系統(tǒng)的完整性免受網(wǎng)絡(luò)攻擊。從網(wǎng)絡(luò)下載的服務(wù)和應(yīng)用程序會帶有相應(yīng)的標(biāo)簽,從而限制這些程序在本地運行的權(quán)限。IFEDAC[4-5]將 MAC的信息流屬性結(jié)合在DAC的訪問控制上,用 “污染源”的概念來表示主客體的完整性等級。既保證了安全性,又保留了DAC的易用性。本文借鑒了這方面工作的思想,在SELinux的框架上實現(xiàn)了準(zhǔn)確有效的機密性保護機制。
此外,單純的訪問控制技術(shù)不能完全滿足系統(tǒng)安全性要求,B.Hicks等人[6]的工作也都試圖利用靜態(tài)分析技術(shù)將程序和系統(tǒng)的策略統(tǒng)一起來。他們利用類型安全語言Jif[7]能夠?qū)嵤┬畔⒘鞑呗缘奶匦裕紫闰炞C程序策略與系統(tǒng)策略的一致性[8],再通過特殊的系統(tǒng)服務(wù)以用戶請求的安全等級啟動應(yīng)用程序。該方法的缺陷是必須在類型安全語言上開展工作,而且由于程序和系統(tǒng)策略的差異,在策略一致性驗證方面存在很大的困難。而本文的靜態(tài)分析工作是在通用語言上進行的,具有更好的適用性。
對于程序運行是權(quán)限的劃分可以有兩種方式實現(xiàn),一種是直接的代碼切片,另一種就是變換程序的安全屬性。D.Brumley等人的工作屬于前者,Privtrans工具[10]可以根據(jù)開發(fā)人員提供的敏感變量的標(biāo)簽,通過靜態(tài)分析其傳播路徑,將程序切分成兩個部分在不同的進程以及權(quán)限下運行。這種方法可以達到很好的隔離效果,但是需要對程序語義有深入的了解。而本文中對于輸入輸出接口的定義來自標(biāo)準(zhǔn)庫函數(shù),具有更好的可用性。U.Shankar等人構(gòu)建的滿足CW-Lite模型[10]的系統(tǒng)采用的后面一種方式,但是其對于需要特殊權(quán)限的過濾接口(filtering interface)的設(shè)定同樣面臨前者的問題。
SELinux作為一種應(yīng)用廣泛的強制訪問控制模型,能夠提供靈活的,細粒度的策略配置。但其策略的復(fù)雜性也容易導(dǎo)致不安全的授權(quán),對系統(tǒng)造成威脅。本文提出了以信息流為基礎(chǔ)的方法,能夠分析不合理的策略配置,定位到引起非法信息流的特權(quán),將主體的訪問授權(quán)劃分成不同的安全狀態(tài)。針對存在安全隱患的程序,本文采用靜態(tài)分析的方法,在程序的數(shù)據(jù)輸出點插裝標(biāo)記防止非法的信息流輸出。策略分析和程序分析兩者結(jié)合從時間和空間上對程序的權(quán)限提供了更加準(zhǔn)確的控制。
[1]Zhai G,Ma W,Tian M,et al.Design and implementation of a tool for analyzing SELinux secure policy[C]//Proceedings of ICIS,New York,NY,USA,ACM,2009:446-451.
[2]Tresys.Setools—policy analysis tools for SELinux[EB/OL].[2012-04-20].http://oss.tresys.com/projects/setools.
[3]Li N,Mao Z,Chen H.Usable mandatory integrity protection for operating systems[C]//Proceedings of IEEE Symposium on Security and Privacy.Washington,DC,USA:IEEE Computer Society,2007:164-178.
[4]Mao Z,Li N,Chen H,Jiang X.Combining discretionary policy with mandatory information flow in operating systems[J].ACM Trans Inf Syst Secur,2011,3(14):24-24.
[5]Mao Z,Li N,Chen H,et al.Trojan horse resistant discretionary access control[C]//Proceedings of SACMAT.New York,NY,USA:ACM,2009:237-246.
[6]Hicks B,Rueda S,Jaeger T,et al.From trusted to secure:Building and executing applications that enforce system security[C]//Proceedings of USENIX Annual Technical Conference.Berkeley,CA,USA:USENIX Association,2007:205-218.
[7]Myers A C,Nystrom N,Zheng L,et al.Jif:Java+information flow[EB/OL].[2012-04-15].http://www.cs.cornell.edu/jif/.
[8]Rueda S,King D,Jaeger T.Verifying compliance of trusted programs[C]//Proceedings of USENIX Security Symposium.Berkeley,CA,USA:USENIX Association,2008:321-334.
[9]Bapat D,Butler K,McDaniel P.Towards automated privilege separation[C]//Lecture Notes in Computer Science 4812:Proceedings of the 3rd International Conference on Information Systems Security,2007:272-276.
[10]Shankar U,Jaeger T,Sailer R.Toward automated information-flow integrity verification for security-critical applications[C]//Proceedings of 13th Annual Network and Distributed System Security Symposium.San Diego,California:Internet Society,2006.