周誠等
摘 要: 目前代碼安全審查和白盒安全測試被廣泛用于分析源代碼并檢測安全漏洞。這里描述一種基于安全特性參照樹的更高效的代碼安全審查方法,其中安全特性提取于源代碼中所有可操作的內容。這種方法只在源代碼層面進行安全檢查,可以大大減少錯誤代碼行為,并為自動化安全審查提供了有效的解決方案。
關鍵詞: 代碼安全檢測; 漏洞檢測; 代碼審查; 參考樹
中圖分類號: TN915.08?34; TP393 文獻標識碼: A 文章編號: 1004?373X(2015)05?0083?04
An efficient code audit method to detect source code security vulnerability
ZHOU Cheng, ZHANG Tao, MA Yuan?yuan, LI Wei?wei
(Nanjing Branch, China Electric Power Research Institute, Nanjing 211100, China)
Abstract: The code security audit and white box security testing is widely used to analyze source code and detect security vulnerabilities. In this paper, a more efficient code audit method based on security feature reference tree is described, in which security features are extracted from all operable contents in the source code. This method only checks the security in the source code. It can greatly reduce the error code behavior and provide an effective solution for automate security audit.
Keywords: code safety detection; vulnerability detection; code audit; reference tree
0 引 言
軟件漏洞是當今信息系統絕大多數安全漏洞的來源。軟件漏洞是軟件中存在的一些缺陷,這些缺陷可以被第三方或程序利用來進行未經授權的資源訪問,或改變控制權限來執行其他操作。軟件漏洞輕則造成相應的經濟或財產損失(如敏感信息被盜,不可用的服務),重則導致嚴重的災難,尤其是發生在被人類生活和生計所依賴的關鍵基礎設施的軟件系統上(如核,生物,化學實驗室,電網,水處理和分配系統,空中交通控制和交通信號系統)。
與代碼審計有關的前期工作[1?5]多聚焦于緩沖區溢出漏洞。D.Wagner等提出了一種用于發現C語言代碼中潛在緩沖區溢出的關鍵安全性問題的方法[6]。該方法將緩沖區溢出檢測轉化為一個整數約束問題,并使用一些簡單的圖論技術構建了一個整數約束求解的有效算法。最后利用安全知識設計一個可以捕捉有可能會在實際程序中出現的安全相關性漏洞的啟發式。Vinod Ganapathy等提出了一種將C字符的操作建模為一種線性規劃,并根據線性規劃的相關文獻來確定緩沖區范圍的方法[7],來了解并消除源代碼中存在的緩沖區溢出漏洞。
1 源代碼安全漏洞的檢測過程
代碼安全審查的對象是實踐于應用中的源代碼。這些審計的主要目的是發現安全漏洞和缺陷,然后準確地識別與修復。事實上,安全漏洞的概念被引入到軟件主要是由于大多數軟件及其功能無法在未知情況下保持正常運行。一般來說,攻擊者有兩個渠道來利用軟件的缺陷:一是通過軟件的輸入;二是通過軟件與其他應用層實例之間的接口。
幾乎所有的可利用安全漏洞都可以被用于執行非預期的操作,特殊的輸入、接口或環境入口會觸發這些安全漏洞從而對系統造成破壞。例如,黑客總是構造一些精心設計的字符串作為應用程序的輸入來使其崩潰,或改變它的控制流來做其他惡意操作(如拒絕服務攻擊,SQL注入和跨站點腳本攻擊)。可利用安全漏洞總是與外部輸入、接口或其他環境入口相關,所以檢測到它們最有效的方式是從外部對操作入口進行性跟蹤(如本地輸入、網絡輸入、臨時文件或其他輸入,接口或其他環境入口,等),通過此方法找到所有可利用安全漏洞。檢測源代碼安全漏洞過程如圖1所示。
第一步,檢測和定位源代碼中所有的操作入口。這些操作入口包括但不限于用戶輸入,網絡輸入項,I/O輸入項等。而可以用來檢測這些操作入口的方法是找到所有用于獲取外界輸入、用于與接口和其他環境入口做交互的API(Application Programming Interface,應用程序編程接口)。
第二步,為每個在第一步中定位的操作入口建立一個參考樹。每個引用或引申的參考項可以追溯到的節點應該包含在樹中。記錄和保持原有的安全屬性對進一步操作參考樹來說是十分必要的,其中安全屬性指的是程式化安全規則(FSR)。FSR可以定義不同樹的安全性能,它是一種可被機器識別的自動處理過程。FSR包括但不限于正則表達式,ACL,等。
第三步,對參考樹的遍歷,即遍歷樹的節點,利用安全屬性來檢查是否有可利用安全漏洞的存在。該安全漏洞檢測方法可以是但不限于,檢查父親的FSR和孩子的FSR之間的矛盾等。
第四步,根據在第三步檢測到的安全漏洞來產生告警提示,并提供基于第三步分析的修正建議。
最后,開發人員可以在建議的基礎上修改其源代碼,并再次執行此過程,以保證修正過程中不會引入任何新的漏洞。
2 一種高效檢測源代碼安全漏洞的代碼審查方法
一種高效檢測源代碼安全漏洞的代碼審查方法總共包括四個模塊:操作入口定位器,解析引擎,漏洞檢測器和告警修復模塊,系統結構如圖2所示。
(1) 操作入口定位器
操作入口定位器可以實現(但不限于)通過搜索所有用于接收諸如scanf(),getchar(),getwindowstext,socket輸入等外部輸入的API(不同的程序語言可能有不同的API)。
(2) 解析引擎
解析引擎利用的是編譯器技術,它可以找到所有可以追溯到操作入口的代碼塊。它可以在句法分析中自動分配一些FSR規則。最后,該引擎將產生源代碼參考樹,如圖3所示。
(3) 漏洞檢測器
漏洞檢測器將根據源代碼參考樹進行處理。它會對參考樹節點的FSR進行檢查,分析是否有任何安全漏洞。
(4) 告警修復
告警修復模塊將提供安全漏洞的警告信息,以及修復被探測器探測到的安全漏洞的建議。分析模塊將從根節點開始遍歷參考樹,并與每個節點的孩子節點比較FSR。當它檢測到任何安全漏洞,分析模塊會產生警告,并給出修復建議。用于實施該方法的偽代碼如下:
BuildTree(Father)
{
Searching Relevant Child
For Each Relevant Child
{
Generate Its Formulated Security Restriction(FSR);
Record Its FSR and Position Info;
Insert It into the Tree as Child?Node of Father;
BuildTree(ThisChild);
}
}
Main( )
{
Searching All Manipulable Entries
For Each Entry
{
Generate Its Formulated Security Restriction(FSR);
Record Its FSR and Position Info;
Insert It into the Tree as Root of Father;
BuildTree(ThisEntry);
}
For Each Built Tree
{
Post?order Traversal All Nodes of Tree from LeafNode;
Detect Where Child.FSR is Stricter than Father.FSR;
Generate Warning;
Indicate Suggested Father.FSR to Follow Strictest Child.FSR;
}
For Each Entry
{
Post?order Traversal All Nodes of Tree from Root;
Detect Where Child.FSR is Stricter than Father.FSR;
Generate Warning;
Indicate Suggested Those Child.FSR to Follow Father.FSR;
}
}
3 應 用
3.1 情景一:代碼注入漏洞
代碼注入指的是外部代碼被直接插入到程序或腳本中被執行。一般可執行代碼被注入前先插入到非可執行的文本串中,然后再提交給應用程序,
代碼注入是通過在本應該不可執行的文本字符串中嵌入可執行代碼引起的。有兩種方法來定義的FSR:一個是定義的字符串的屬性為非可執行;另一種方法是指出不應該包含在文本中的字符串,包括任何可執行的“關鍵字”,或表達式中的字符串(如腳本標簽出現,或SQL請求中出現單引號?(′)或雙破折號(——))。在這里,選擇了第二種方法,其可以指定FSR的格式為[FSR:限制規則]。
內容限制可以通過正則表達式來執行。例如,“^.$”可以表示所有可能的字符串,這可以表示所有外部原始輸入。在將外部輸入命令轉化為SQL查詢命令時,可以設定此內容限制,即不包含SQL特定字符,具體命令格式如下:
圖4所示的是通過解析引擎建立的參考樹。所有節點都將被編號為n.n,這體現了父節點和子節點之間的關系。同時,該節點的FSR和位置信息也將被記錄下來。安全性分析模塊將通過檢查每個子節點的FSR是否與其父節點一致來處理參考樹。一種解決方案是從參考書中的葉節點開始遍歷,比較它們與父節點的FSR。例如,在圖3中,節點1.2.2是一個節點1.2的子節點,其FSR中的“的”意味著不應該包含任何SQL相關的特定字符,但它的父節點(節點1.2)的FSR為“”,這意味著它可能包含所有可能的字符,包括SQL相關的特定字符。所以在這里發現了一個安全漏洞,系統的告警和修復模塊會產生警告,并產生諸如“節點1.2需添加字符串驗證”這樣的修復建議。
3.2 情景二:緩沖區溢出漏洞
一般來說,當一個數據塊B寫入緩沖器A時,若B的大小大于A的合法分配的大小就會發生緩沖區溢出。緩沖器溢出的另一種形式是整數溢出,這是程序的一種潛在問題,即程序中保存的數據大小是通過以字節為單位的數據類型限制的。在這里指定FSR的格式為{FSR:."^{length}$"}。
圖5展示了它通過解析引擎建立的一棵參考樹。所有節點都將被編號為n.n,這體現了父節點和子節點之間的關系。同時,該節點的FSR和位置信息也將被記錄下來。安全性分析模塊將通過檢查每個子節點的FSR是否與其父節點一致來處理參考樹。一種解決方案是從參考書中的葉節點開始遍歷,比較它們與父節點的FSR。例如,在圖6中,節點1.2有兩個子節點,子節點1.2.1和1.2.2,他們允許的最大緩沖區長度為30和20。因為它們的父節點(節點1.2)的允許長度為50,所以當子節點到父節點之間可能會發生溢出。于是在這里發現了一個安全漏洞,系統的告警和修復模塊會產生警告,并產生相關修復建議如“建議修改節點1.2的最大緩沖區長度為20”,如圖6所示。
3.3 情景三:特權提升漏洞
特權提升漏洞允許攻擊者或代碼獲取其本不應有的更高水平的權限。這里的特權可能不僅代表用戶(如管理員,超級用戶或訪客)的特權,也代表代碼(如內核或用戶模式)的特權。因此,可以使用訪問控制列表(ACL)來分類處理這樣的的漏洞。
3.4 情景四:信息泄露或數據篡改漏洞
信息泄露和數據篡改漏洞允許非法用戶或代碼修改系統內的數據,以實現惡意攻擊或將受保護的數據暴露給到沒有權限訪問該數據的用戶。對于這些漏洞的FSR規則也在ACL中有描述。
4 結 語
本文中所描述的方法可以大大降低誤報率,并且提供了一種有效的、僅通過檢測可利用的安全流量對源碼進行自動化安全審計的解決方案。這種方法避免了檢測攻擊者無法通過輸入操作、接口或者其他環境條件進入的不可利用性安全流量,從而可以減少源代碼審計分析的開銷,尤其是對于大型應用程序。基于參考樹的FSR信息,該方法也可以對修改有漏洞的源碼提供精確的指導。
參考文獻
[1] 徐有福,文偉平,萬正蘇.基于漏洞模型檢測的安全漏洞挖掘方法研究[J].信息網絡安全,2011(8):72?75.
[2] DHURJATI D, ADVE V S. Backwards?compatible array bounds checking for C with very low overhead [C]// Proceedings of the 28th International Conference on Software Engineering. Shanghai, China: [s.n.], 2006: 162?171.
[3] 趙國亮,蔣勇,孔令兵.用代碼分析技術檢測軟件缺陷[J].計算機工程與設計,2011(8):2741?2744.
[4] 戴凌宸,張朕榮,黎豐澤.傳統的軟件測試方法淺析[J].科技風,2011(16):53?55.
[5] 陳曉芳.幾種常見軟件可靠性測試方法綜述及應用對比[J].科技信息,2007(17):6?8.
[6] 董潔,孫惠娟.軟件測試方法及面向對象軟件的測試[J].河南科技,2011(17):22?23.
[7] WAGNER D, FOSTER J, BREWER E, et al. A first step towards automated detection of buffer overrun vulnerabilities [C]// Proceedings of ISOC Network and Distributed System Security Symposium. [S.l.]: ISOC, 2000: 1?15.
[8] GANAPATHY Vinod, JHA Somesh, CHANDLER David, et al. Buffer overrun detection using linear programming and static analysis [C]// 10th ACM Conference on Computer and Communications Security. [S.l.]: ACM, 2003: 1?19.