王志勇 李健 孫迪
北京工業大學計算機學院 北京 100124
安全度量提供了一個信息系統安全管理體制,并能維持組織信息安全狀況的持續改進。目前國內外研究較多的信息安全度量是關于信息技術或產品的安全度量、信息安全風險分析等相關理論和方法,并已形成相應的標準與規范,如ISO/ IEC 17799,ISO/ IEC 1333521,ISO/ IEC 15408等。這些標準對信息技術的安全性評估方法、系統或資產的風險分析要素等進行了系統的描述。
科學的信息安全度量一般包括目標定義、需求分析、建立度量模型、設定安全基線、信息系統改進和安全控制等內容。
(1) 明確度量目標
度量目標就是一個組織實施信息安全度量的動機,它影響著度量所采用的指標以及相應的安全基線。信息安全度量的目標可以分為長期目標和短期目標。信息安全度量的長期目標包括:分析和判斷信息安全態勢、信息安全控制的有效性、為組織的信息安全管理和決策提供支持等。信息安全度量的短期目標包括:了解對某一項安全項目投入的效益、為調整近期的安全策略提供決策依據等。
(2) 定義信息安全需求

圖1 信息系統安全需求分析
面對復雜的網絡信息系統,全面、準確地分析其安全需求是實施度量的基礎。本文建議通過以下步驟分析信息系統的安全需求。
① 界定研究對象,明確本系統信息安全的使命、目標和功能,分析系統在國家安全、社會穩定和經濟發展中的地位和作用。
② 給出信息系統業務描述,包括本信息系統主要業務應用、業務流程和信息流程。
③ 針對本系統信息安全建設的使命、信息的重要程度、信息系統承載業務的重要程度、風險分析的結果、系統遭到攻擊破壞后造成的危害程度等因素,確定本信息系統的安全的總體需求。
④ 進一步明確系統對信息和信息系統的保密性、完整性、可用性、真實性和不可否認性等安全屬性的需求程度。
(3) 確定度量指標
根據組織的度量目標和信息系統的安全需求確定度量指標。度量指標的選取要遵循兩個原則:定性與定量相結合原則和可操作性原則。在信息安全度量過程中會涉及到諸多不確定性因素,有些度量指標可以量化,而有些則無法進行直接量化。因此,需要堅持定性與定量相結合的原則。同時,信息安全度量所建立的模型,應滿足量化計算的可行性,否則,會導致無法計算而得不到最終的評估結果。選取度量指標要以產生可計量的數據為導向,以便于比較。例如可以采用公式以便于分析,或選擇參考點以追蹤變化。百分比和平均數也是度量中常用的方法,有時也可以使用絕對數,這都取決于被考察對象的性質。
(4) 建立度量模型
建立度量模型有兩個任務:一是分析各度量指標所占的權重;二是將各度量指標通過數學模型進行合成,且要保證模型的科學性。
(5) 設定信息安全基線
“基線”是一種用于度量或在度量中用于比較的基準。“基線”的概念已經應用于信息安全標準或規范當中,如美國聯邦信息處理標準 FIPS199。本文把信息安全基線定義為特定條件下實現其安全使命和功能的基本安全需求。
信息安全基線是為了度量不同時段的安全狀況所開發出的一套指標集,它將信息系統當前的安全狀況與基線進行度量比較,可以了解當前的安全狀態。基線會隨著組織及其信息系統結構的變化而變化。如果一個組織增加了 50名新員工,或新配置了無線局域網辦公環境,組織系統的正常運行會發生新的變化。這時,就需要為系統更新或添加新的安全基線指標。
(6) 制定信息安全度量制度
建立了信息安全度量模型和基線,就可以對組織的信息系統實施安全度量了。但是,確定信息安全度量周期、建立專職隊伍、實施人員培訓、將安全度量納入組織的日常管理等等,則需要建立一套與度量目標相一致的度量制度。
前文提到,基于可信聲明的軟件行為監測離不開對軟件在用戶處運行時發生的真實行為的監測,這種監測數據一方面能夠實時的對軟件行為是否合乎聲明的內容進行監測,另一方面也能對超出聲明內容的軟件行為做出反應。根據用戶、軟件、安全要求的不同,待選的反應方式包括日志、提示、阻斷等。
隨著軟件技術的發展,軟件運行的平臺逐漸趨于多樣化、移動化和云端化,復雜的軟件運行環境使得第三方外掛的監測手段(類似傳統防火墻、殺毒軟件等)往往被開發人員有意或無意的繞開,使得其無法全面的檢測到軟件運行的真實信息。因此提出了基于安全編譯的監測方案,軟件運行的代碼在部署運行前,通過安全編譯生成最終運行的程序,同時在編譯中對代碼內容進行審核,達到從根本上對軟件行為進行監控的目的。
安全編譯是指在傳統的代碼編譯流程中,加入安全組件,完成對代碼進行安全檢測、嵌入安全監測模塊的任務。安全編譯具有兩個特點:一是具有安全檢測功能,盡早發現程序中的安全隱患;二是編譯器自身的可信性,保證程序能夠被翻譯成正確的目標代碼(如圖2)。.

圖2 安全編譯的工作內容
(1) 安全檢測
在軟件開發完成后,開發者需要撰寫與代碼相匹配的軟件為聲明,但是如何將軟件行為聲明與代碼內容進行核對以檢查代碼是否合規的工作量極大,而編譯器作為最早接觸軟件全部代碼的工具,能夠在編譯初期便對軟件代碼進行安全檢測,如果發生代碼內容超出行為聲明的范圍時,能夠及時的生成報告,確保開發者能夠修改行為聲明或軟件代碼而使二者內容真實匹配。
(2) 嵌入安全監測模塊
在軟件運行的真實環境中能夠完全檢測軟件的行為是極其困難的,因此如果能夠在編譯時對在軟件生成的代碼中嵌入安全檢測模塊,在軟件發生容易引發安全問題的關鍵行為(如IO讀取、網絡傳輸、用戶關鍵信息讀取等)時,向系統拋出信息,便于系統中的安全監測軟件接收以實時了解軟件的真實行為。
本文主要探討如何在軟件中嵌入安全模塊,由于軟件開平臺日趨復雜,千變萬化,因此主要選擇了目前流行的Microsoft .NET平臺下的單機軟件編譯過程進行探討。在探討研究完成后,可以逐漸擴展支持的語言和軟件平臺,遠期希望能夠將功能擴展至云平臺上。
面向方面編程(Aspect-Oriented Programming,AOP)是一種將函數的輔助性功能與業務邏輯相分離的編程泛型(Programming Paradigm),其目的是將橫切關注點(Cross-Cutting Concerns)分離出來,使得程序具有更高的模塊化特性。AOP是面向方面軟件開發(Aspect-Oriented Software Development)在編碼實現層面上的具體表現(面向方面軟件開發AOSD是一個囊括面向方面分析、面向方面設計和面向方面編程等一系列概念的完整工程系統)。AOP包括編程模型和具體用于實現AOP的框架兩部分。
下面對上文提到的定義進行一些解釋。
在當前大多數支持面向對象的編程語言中(例如C#等),函數是表述程序功能的最小單元,而一個函數的代碼層面往往同時含有核心業務邏輯和輔助性功能。核心業務邏輯指一個函數本身主要實現的業務功能,例如在一個在線電子商務系統中,“下訂單”函數其核心業務邏輯是“新建訂單”,而“提升會員”函數其核心業務是“提升一個會員的等級”。但是,一個函數除了核心業務代碼外,往往還會有一些輔助性功能代碼,如事務處理、緩存處理、日志記錄、異常處理等等。而這些輔助性功能一般會存在于大多數甚至所有業務函數中,即形成AOSD中所謂的橫切關注點,如圖3所示。

圖3 橫切關注點示意
一般來說,在純編譯型語言(如 C、C++)等語言中實現AOP非常困難,必須完全從編譯器角度入手。因此一般通過討論托管型語言(如 C#,Java)中 AOP的實現方式來完成對AOP的支持。AOP的主要實現方式有編譯時AOP和運行時AOP兩種:
(1) 編譯時AOP(靜態織入)
編譯時 AOP的實現思想是給語言的編譯器做擴展,使得在編譯程序的時候編譯器將相應的 Aspect代碼織入到業務代碼的指定連接點,輸出整合的結果。圖4是編譯時AOP的示意圖(以.NET平臺為例)。

圖4 編譯時AOP示意圖
如圖4所示,當使用靜態織入時,帶AOP擴展的編譯器會在編譯時將Aspect代碼織入業務函數代碼,形成整合后的IL,然后交由CLR運行。
(2) 運行時AOP(動態織入)
運行時AOP如圖5所示。

圖5 運行時AOP的示意圖
如圖5所示,運行時AOP的實現方式是將擴展添加到運行虛擬機而不是編譯器。功能點和業務代碼分別獨立編譯,而在運行時由虛擬機在必要時進行織入。

圖6 安全監測層
在安全編譯中需要將安全模塊嵌入到生成的最終代碼中,同時又不希望這些模塊影響軟件已有的功能,因此選用AOP框架在代碼中加入安全監測層來完成這一目的(圖6)。

圖7 安全編譯流程
例如在C#語言編寫的.NET平臺應用中,我們通過撰寫微軟MSBuild編譯器插件,將安全模塊嵌入的功能嵌入到標準的編譯流程中,得以在編譯器遇到特殊的代碼語句時,自動執行代碼前后加入拋出信息的語句(圖7)。這些拋出安全信息的語句不會對代碼的正常功能產生的影響討論如下:
(1) 功能影響
由于選用的安全監測語句基于標準的.NET平臺消息技術,因此理論上不會對應用原有功能產生影響。為了便于軟件開發人員對軟件進行調試,在編譯中提供了關閉安全消息通知模塊嵌入的選項,得以排除是否由嵌入安全監測模塊帶來的對軟件已有功能的影響。
(2) 性能影響
由于嵌入安全模塊是在軟件生成的最終代碼中嵌入新的語句,因此理論上一定會對軟件的性能產生影響,同時監測的粒度與軟件的性能影響本身成為一對需要平衡的矛盾,監測的粒度越大,對軟件本身產生的性能影響越大。因此在實際工程中,需要平衡這對矛盾,盡量在不影響軟件性能的情況下,提高軟件行為監測的粒度。
同時考慮到現有的軟件應用,尤其是面對最終客戶的軟件應用,計算性能本身并非軟件需要考慮的第一要素,而且現有的安全軟件(防火墻、殺毒軟件等)由于涉及到大量的跨線程、跨進程、跨內存區域的對軟件應用的訪問,會消耗更多的計算性能。而嵌入的安全模塊與軟件應用代碼處于同一內存空間,不涉及上述耗費性能的訪問工作,因此比較現有安全軟件帶來的性能營銷較小。
本文通過分析軟件可信要素的研究現狀、從可信要素的植入方法入手,對安全編譯等課題進行了研究與探討。并且從靜態、動態兩個方向討論了軟件可信要素在編譯層面的植入方法,并對其可能對軟件可信監測做出的影響進行了研究。
軟件行為的檢測層面千差萬別,切入點各異,文本中提出了統一的方法——即從編譯環節植入可信要素——對其進行檢測,同時保證不會對軟件本身已有功能、開發流程產生較大影響。
后續的研究工作包括且不限于:植入的安全要素如何與行為檢測平臺通信、如何基于軟件可信聲明等手段對軟件的行為做出反應等。
[1]劉克,單志廣,王戟等.“可信軟件基礎研究”重大研究計劃綜述[J].中國科學基金. 2009.
[2]Saint-Germain R. Information security management best practice based on ISO/IEC 17799[J]. Information Management Journal. 2005.
[3]閆強,陳鐘,段云所等.信息系統安全度量與評估模型[J].電子學報.2003.
[4]申瑞芬.高可信安全編譯器的設計與實現[D].國防科學技術大學.2007.
[5] 石丹丹,王靜,熊前興.面向方面編程模式的探討[J].武漢理工大學學報:信息與管理工程版.2005.
[6]靳小強,唐寧九,胡雪亮. .NET 平臺利用 AspectSharp實現權限驗證[J].計算機應用研究. 2006.
[7]楊帆.基于AOP技術的Web應用開發研究[J].Software Guide.2008.
[8]程虎.面向方面(aspect)的程序設計方法[J].信息技術快報.2005.