楊 嘉,曾慶凱
(1.南京大學 計算機軟件新技術國家重點實驗室,江蘇 南京210093;2.南京大學 計算機科學與技術系,江蘇 南京210093)
2001年NSA發布了安全增強的Linux系統――SELinux[1]。在SELinux策略中起主導作用的是TE模型,即系統實體根據其安全特性被標記為相應的類型(type)。策略以類型為對象設定訪問規則。但是由于SELinux的類型空間龐大,出現不安全訪問授權的可能性很大。并且目前在Linux系統中有30-40個應用程序需要相應的訪問權限來處理不同敏感等級的數據。直接信任這些程序可能造成安全隱患,尤其是在程序被攻破的情況下,攻擊者有足夠的權限造成機密數據泄露。相反的,直接移除相應的權限又會影響程序的可用性。
針對上述情況,本文提出了基于信息流分析的權限控制方法。本文將程序執行過程中是否已訪問高敏感等級的數據作為當前運行時權限的一個決定因素。同時,針對訪問控制只能在系統與程序的接口層實施系統資源管理的局限性,本文采用靜態分析的方法,跟蹤輸入數據在程序內部的流動情況,一直到達數據的輸出接口,由此定位到訪問權限實際產生效用的程序點。通過插裝代碼標記的方式實現對程序權限的準確控制。
本文主要有以下幾個方面的貢獻:提出了一種基于策略信息流的主體安全狀態劃分方法,對主體權限的管理提供了更精確的控制;采用靜態分析的方法,跟蹤程序內部的信息流,確定了可能造成信息泄露的程序點,減少了狀態切換的次數;修改SELinux安全服務器,實現了運行時動態切換進程安全狀態的功能。
表1中列出了主要的策略規則種類和其在策略文件中的數量。類型定義規則申明了系統中所有的實體類型,主體的類型又稱作域(Domain)。該規則還支持對類型添加別名,并設定其所在的屬性。屬性是若干類型構成的集合,集合內的所有類型有共同的性質,這對理解類型的安全特性有很大幫助。例如,domain就是通過屬性規則來定義的,以及node_type屬性表示網絡節點和主機的類型等。訪問向量是TE策略的主體部分,它規定了source_t域中的主體是否對target_t類型的客體有permission的權限。class表示客體的種類,permission是定義在class上的操作,class和permission反應了訪問規則在系統中能控制的操作語義。SELinux中默認的子進程繼承父進程的域,新文件繼承父目錄的類型,類型遷移定義了主客體類型動態變化的規則。當class為process時表示域遷移規則,source_t下的進程通過執行target_t類型的可執行文件,可轉移到new_t域。SELinux的策略只支持在裝載新的可執行程序時改變進程主體的域,這種機制忽略了信息流因素對于主體權限的影響,這也是本文工作的改進內容之一。類似的,當class為其它種類時,source_t下的進程在target_t類型的目錄下生成是新文件將是new_t類型。

表1 策略語法和統計
表1中第3列顯示了相應類型的規則在policy.24版本的targeted策略中的數量。隨著應用程序的增加和拓展,策略文件的規模和復雜性呈上升的趨勢。舉例來說,Linux的日志轉儲程序logrotate,需要對自己的配置文件進行訪問,完成對不同類型的日志文件的處理,記錄執行狀態,同時還有壓縮和電郵指定日志的功能。logrotate_t的訪問規則向量就有374條,另有134條類型轉換規則。這些策略規則直接定義了底層資源訪問的規則,缺乏對高抽象層次安全性質的表述和驗證方法。配置策略很可能包含錯誤的訪問授權。
根據范疇不同,信息流分為兩種:一種是系統實體之間的信息流,從策略配置中提取,作為影響主體權限的附加因素,用來標記進程主體當前的安全狀態;另一種是程序內部的信息流,從編程語言的語義中提取,這一部分的信息流體現系統資源在程序內部的使用和傳遞。兩者的結合構建了完整的信息流圖景:程序內部的信息流信息彌補了訪問控制的盲點,避免了盲目信任應用程序;系統實體之間的信息流則補充了靜態分析技術固有的缺陷,附加的影響因素使得對主體的授權更加準確。
資源的訪問本質上就具有信息流動的特征,所以系統的許多安全需求可以通過策略信息流的方式來表達。訪問規則中的某些permission就隱含著主客體之間的信息流動。如果該permission引發了從source_t到target_t的信息流,就將其劃歸modPerm類的權限,例如,file類資源的write權限;反之,劃歸obsPerm類,例如,file資源上的read權限。
在機密性保護方面,“高敏感等級實體中的信息不能流向低敏感等級的實體”是滿足BLP模型的基本要求。該安全需求轉換成策略信息流的形式就是:
SecFlow={<o,o’> | obs Perm(s,o)∧mod Perm(s,o’)∧SL(o)≤SL(o’)},其中SL(e)表示系統實體e的安全等級。
在更高的抽象層次上分析系統的安全特性,安全管理員不需要詳細了解每一個類型含義。只要對高敏感客體集合(HighType)和不可信客體集合(LowType)進行規定,通過策略信息流分析就能確定引起非法信息流動的相關主體和權限。
來自HighType客體的信息經過一次或者以上的流動傳遞可能到達LowType的客體中,造成信息泄露,圖1顯示了這樣一條信息流。這里定義從app_t向LowType輸出信息的Perm2為不安全的訪問權限Punsafe。針對這種情況管理員可以直接將有威脅的權限移除,這樣做會影響程序的正常功能。本文認為進程主體在其生命周期內并不一定會使用所有靜態配置的權限,也就是說進出app_t的信息流不一定存在必然的關聯。本質上,是否能夠滿足安全要求的關鍵是權限所引起的信息流動而不是權限本身。因此,將主體的權限依據信息流的因素劃分成不同的狀態,并在運行時由信息流觸發狀態轉換是一個合理的選擇。為此構建了一個新的域,app_sec_t,將其權限設定為:
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,角色分配規則以及屬性都與app_t保持一致。區別是它失去了向低等級客體輸出信息的能力。在app_sec_t中運行的進程主體不可能造成HighType客體中信息的泄露,故稱之為主體的安全狀態。

圖1 非法信息流路徑
機密性保護的基本方法是監控敏感信息的流動。靜態分析方法不需要執行程序,從源代碼中抽取語法和語義信息,通過對程序意圖的理解,完成追蹤和鑒別數據的來源、傳遞及其使用的任務。因此,本文采用該方法來跟蹤程序內部的信息流動。
信息流是信息從一個實體流向另一實體的有效途徑,本文將信息流定義為R,是信息流識別對象集W及其上的二元關系→。
本文定義R=(W,→),且→={<src,dest> |src,dest∈W}。
程序對象集W包括程序中的變量集、常量集,以及函數調用和返回語句等在內的程序行為實體集合。→則由信息流源對象src和目的對象dest組成,多條信息流可以構成信息流集合IFs。根據程序控制結構和語法特征,總結有以下的信息流生成規則。
(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維數組元素)
v0=⊙(v1,…,vN);IFs={<v1,v0>,…,<vN,v0> }(⊙是N元運算符)
(2)函數調用語句:
fun(v1,…,vN);IFs={<v1,fun|1>,…,<vN,fun|N>}(fun是調用的函數名,表示調用點實參到形參的信息流。參數是指針則添加<fun|1,v1>到IFs)
(3)返回語句:
return v0;IFs={<v0,*> }(*是當前函數的調用者)
(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>}
上述規則定義了由程序語義引起的原子信息流。在計算信息流傳遞的時,加入輸入輸出接口作為src和dest的篩選條件,就可以得到以輸入信息為導向的程序切片。輸出接口將使用相應的授權來完成操作。
上一節提到的安全狀態劃分,可以有效的從程序整體的層次上阻塞敏感信息向低等級客體的通道。但是在程序中,并不是每一處系統操作的執行都會使用有安全隱患的權限。運用靜態分析的目的就是篩選出有潛在威脅的輸出操作。在這些程序插裝標記提示安全服務器切換程序的安全狀態,達到限制程序權限的效果。這樣在程序代碼的子集上實施的權限控制,一方面可以盡可能減少出于安全考慮對程序功能的影響,另一方面可以減少安全狀態切換的次數,降低運行時的開銷。
在SELinux環境下,進程生命周期內只在裝載新的執行鏡像時發生域遷移。本文為了更加準確的控制主體的權限,在SELinux安全服務器中實現了狀態轉換機制。同一個主體在不同的安全狀態下擁有不同的訪問權限。兩個條件可以觸發安全狀態的轉變:一是主體讀取了高敏感等級的信息,二是主體試圖向客體輸出信息。前者發生在相應的訪問規則觸發之時,后者通過靜態分析插裝的標記觸發。整個程序運行周期的安全上下文狀態可以由圖2來表示。我們將程序的運行劃分成3個安全狀態。

圖2 安全狀態轉換
(1)常規狀態(app_t):程序運行的初始狀態,擁有初始策略配置的所有權限。
(2)中間狀態(app_mid_t):當程序接收了敏感數據之后進入該狀態,其擁有和常規狀態同樣的權限。該狀態只是為了標記程序是否具有高敏感等級的信息,并不對權限進行限制。
(3)安全狀態(app_sec_t):當程序試圖執行數據輸出操作時,切換到該狀態執行。該狀態可以阻止主體向低敏感等級的客體輸出數據,但不會限制其它操作。此處的狀態切換用插裝在程序中的標記觸發。
本文基于上一節的方法實現了程序運行環境,工作流如圖3所示。

圖3 原型系統工作流程
策略分析模塊對modPerm和obsPerm操作的設定,引用了開源工具apol[2]中的配置。該模塊讀入策略文件policy.conf,生成原子信息流矩陣。從HighType出發,用深度優先的策略搜索到達LowType的非法信息流路徑。本文將中間傳遞次數上限設定為最多途徑2個主體域節點,因為通過兩個以上惡意程序之間配合完成信息泄露是比較難實現的。在傳遞路徑上造成第二次信息流動的權限即為Punsafe。然后模塊自動生成app_mid_t和app_sec_t兩個域和相應的授權,添加到策略文件中。
靜態分析在gcc編譯器的優化框架下實現,利用了gcc生成的語法樹、調用圖等結構完成過程內和過程間的信息流分析。輸入輸出接口的設定主要依據系統操作的語義。例如,read從指定的文件讀取數據到程序內存空間的緩沖區中,mmap可以直接將文件的內容映射到程序的地址的空間,故被定義為輸入接口。本文也對相關操作的執行進行了跟蹤。read和mmap在執行時確實會觸發關于對文件讀取的訪問控制檢查。
程序的安全狀態對應與程序的3個域,程序被裝載時由依照原來的策略規則進入app_t域運行。本文的工作在安全決策函數avc_has_perm()中添加了對源數據類型的檢查,來判斷是否有HighType類型的信息流入,而程序中插裝的標記通過添加新的系統調用實現從應用程序向內核的通信。
本文設定用戶登錄日志/var/log/wtmp文件的類型wtmp_t為Hightype,同時設定node_type,port_type,etc_t等具有公共安全屬性的類型為LowType。經過分析發現Linux下的日志轉儲程序(logrotate_t)通過上百條策略規則的配置獲得了大量的訪問權限,其中一部分是由程序自身的功能需求決定的。該程序需要根絕配置文件(etc_t),處理多種服務程序產生的日志(wtmp_t等),同時具備執行腳本和電郵日志的功能。因為程序需要訪問的客體類型眾多,所以其策略配置也相對復雜。下面是一部分策略片段。
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
可以看到經過logrotate_t的傳遞有從wtmp_t流向etc_t,node_t的信息流。因為logrotate不需要和socket進行通信,所以本文將于node_t相關的訪問權限直接移除。然后定義logrotate_sec_t類型作為信息流安全的域,并賦予其受限制的訪問權限。
對logrotate源程序實施靜態信息流分析,本文找出了表2所示的輸入和輸出接口之間的關系。表2中的后兩項,程序在執行了dup2將打開的文件描述符重定位到標準輸入之后,又通過execlp()調用了其它程序,例如,調用mailx來將mailInput的內容發送到指定的郵箱地址。本文選擇在這一步插裝標記來阻止進程主體的域遷移。首先,以只讀的方式打開一個文件會產生從客體到主體的信息流,因為在進程空間的文件描述符也具有其對應文件的安全屬性;其次,將域遷移權限從logrotate_sec_t中去除限制了敏感信息的擴散,也避免了對更多的程序進行分析和插裝。

表2 logrotate程序靜態分析結果
用信息流來表示主客體的安全屬性,學術界已經有一些這方面的研究。UMIP[3]是一種具有高可用性的訪問控制模型,它的主要目的是為了保護系統的完整性免受網絡攻擊。從網絡下載的服務和應用程序會帶有相應的標簽,從而限制這些程序在本地運行的權限。IFEDAC[4-5]將 MAC的信息流屬性結合在DAC的訪問控制上,用 “污染源”的概念來表示主客體的完整性等級。既保證了安全性,又保留了DAC的易用性。本文借鑒了這方面工作的思想,在SELinux的框架上實現了準確有效的機密性保護機制。
此外,單純的訪問控制技術不能完全滿足系統安全性要求,B.Hicks等人[6]的工作也都試圖利用靜態分析技術將程序和系統的策略統一起來。他們利用類型安全語言Jif[7]能夠實施信息流策略的特性,首先驗證程序策略與系統策略的一致性[8],再通過特殊的系統服務以用戶請求的安全等級啟動應用程序。該方法的缺陷是必須在類型安全語言上開展工作,而且由于程序和系統策略的差異,在策略一致性驗證方面存在很大的困難。而本文的靜態分析工作是在通用語言上進行的,具有更好的適用性。
對于程序運行是權限的劃分可以有兩種方式實現,一種是直接的代碼切片,另一種就是變換程序的安全屬性。D.Brumley等人的工作屬于前者,Privtrans工具[10]可以根據開發人員提供的敏感變量的標簽,通過靜態分析其傳播路徑,將程序切分成兩個部分在不同的進程以及權限下運行。這種方法可以達到很好的隔離效果,但是需要對程序語義有深入的了解。而本文中對于輸入輸出接口的定義來自標準庫函數,具有更好的可用性。U.Shankar等人構建的滿足CW-Lite模型[10]的系統采用的后面一種方式,但是其對于需要特殊權限的過濾接口(filtering interface)的設定同樣面臨前者的問題。
SELinux作為一種應用廣泛的強制訪問控制模型,能夠提供靈活的,細粒度的策略配置。但其策略的復雜性也容易導致不安全的授權,對系統造成威脅。本文提出了以信息流為基礎的方法,能夠分析不合理的策略配置,定位到引起非法信息流的特權,將主體的訪問授權劃分成不同的安全狀態。針對存在安全隱患的程序,本文采用靜態分析的方法,在程序的數據輸出點插裝標記防止非法的信息流輸出。策略分析和程序分析兩者結合從時間和空間上對程序的權限提供了更加準確的控制。
[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.