周誠(chéng)等
摘 要: 目前代碼安全審查和白盒安全測(cè)試被廣泛用于分析源代碼并檢測(cè)安全漏洞。這里描述一種基于安全特性參照樹的更高效的代碼安全審查方法,其中安全特性提取于源代碼中所有可操作的內(nèi)容。這種方法只在源代碼層面進(jìn)行安全檢查,可以大大減少錯(cuò)誤代碼行為,并為自動(dòng)化安全審查提供了有效的解決方案。
關(guān)鍵詞: 代碼安全檢測(cè); 漏洞檢測(cè); 代碼審查; 參考樹
中圖分類號(hào): TN915.08?34; TP393 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 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 引 言
軟件漏洞是當(dāng)今信息系統(tǒng)絕大多數(shù)安全漏洞的來(lái)源。軟件漏洞是軟件中存在的一些缺陷,這些缺陷可以被第三方或程序利用來(lái)進(jìn)行未經(jīng)授權(quán)的資源訪問(wèn),或改變控制權(quán)限來(lái)執(zhí)行其他操作。軟件漏洞輕則造成相應(yīng)的經(jīng)濟(jì)或財(cái)產(chǎn)損失(如敏感信息被盜,不可用的服務(wù)),重則導(dǎo)致嚴(yán)重的災(zāi)難,尤其是發(fā)生在被人類生活和生計(jì)所依賴的關(guān)鍵基礎(chǔ)設(shè)施的軟件系統(tǒng)上(如核,生物,化學(xué)實(shí)驗(yàn)室,電網(wǎng),水處理和分配系統(tǒng),空中交通控制和交通信號(hào)系統(tǒng))。
與代碼審計(jì)有關(guān)的前期工作[1?5]多聚焦于緩沖區(qū)溢出漏洞。D.Wagner等提出了一種用于發(fā)現(xiàn)C語(yǔ)言代碼中潛在緩沖區(qū)溢出的關(guān)鍵安全性問(wèn)題的方法[6]。該方法將緩沖區(qū)溢出檢測(cè)轉(zhuǎn)化為一個(gè)整數(shù)約束問(wèn)題,并使用一些簡(jiǎn)單的圖論技術(shù)構(gòu)建了一個(gè)整數(shù)約束求解的有效算法。最后利用安全知識(shí)設(shè)計(jì)一個(gè)可以捕捉有可能會(huì)在實(shí)際程序中出現(xiàn)的安全相關(guān)性漏洞的啟發(fā)式。Vinod Ganapathy等提出了一種將C字符的操作建模為一種線性規(guī)劃,并根據(jù)線性規(guī)劃的相關(guān)文獻(xiàn)來(lái)確定緩沖區(qū)范圍的方法[7],來(lái)了解并消除源代碼中存在的緩沖區(qū)溢出漏洞。
1 源代碼安全漏洞的檢測(cè)過(guò)程
代碼安全審查的對(duì)象是實(shí)踐于應(yīng)用中的源代碼。這些審計(jì)的主要目的是發(fā)現(xiàn)安全漏洞和缺陷,然后準(zhǔn)確地識(shí)別與修復(fù)。事實(shí)上,安全漏洞的概念被引入到軟件主要是由于大多數(shù)軟件及其功能無(wú)法在未知情況下保持正常運(yùn)行。一般來(lái)說(shuō),攻擊者有兩個(gè)渠道來(lái)利用軟件的缺陷:一是通過(guò)軟件的輸入;二是通過(guò)軟件與其他應(yīng)用層實(shí)例之間的接口。
幾乎所有的可利用安全漏洞都可以被用于執(zhí)行非預(yù)期的操作,特殊的輸入、接口或環(huán)境入口會(huì)觸發(fā)這些安全漏洞從而對(duì)系統(tǒng)造成破壞。例如,黑客總是構(gòu)造一些精心設(shè)計(jì)的字符串作為應(yīng)用程序的輸入來(lái)使其崩潰,或改變它的控制流來(lái)做其他惡意操作(如拒絕服務(wù)攻擊,SQL注入和跨站點(diǎn)腳本攻擊)??衫冒踩┒纯偸桥c外部輸入、接口或其他環(huán)境入口相關(guān),所以檢測(cè)到它們最有效的方式是從外部對(duì)操作入口進(jìn)行性跟蹤(如本地輸入、網(wǎng)絡(luò)輸入、臨時(shí)文件或其他輸入,接口或其他環(huán)境入口,等),通過(guò)此方法找到所有可利用安全漏洞。檢測(cè)源代碼安全漏洞過(guò)程如圖1所示。
第一步,檢測(cè)和定位源代碼中所有的操作入口。這些操作入口包括但不限于用戶輸入,網(wǎng)絡(luò)輸入項(xiàng),I/O輸入項(xiàng)等。而可以用來(lái)檢測(cè)這些操作入口的方法是找到所有用于獲取外界輸入、用于與接口和其他環(huán)境入口做交互的API(Application Programming Interface,應(yīng)用程序編程接口)。
第二步,為每個(gè)在第一步中定位的操作入口建立一個(gè)參考樹。每個(gè)引用或引申的參考項(xiàng)可以追溯到的節(jié)點(diǎn)應(yīng)該包含在樹中。記錄和保持原有的安全屬性對(duì)進(jìn)一步操作參考樹來(lái)說(shuō)是十分必要的,其中安全屬性指的是程式化安全規(guī)則(FSR)。FSR可以定義不同樹的安全性能,它是一種可被機(jī)器識(shí)別的自動(dòng)處理過(guò)程。FSR包括但不限于正則表達(dá)式,ACL,等。
第三步,對(duì)參考樹的遍歷,即遍歷樹的節(jié)點(diǎn),利用安全屬性來(lái)檢查是否有可利用安全漏洞的存在。該安全漏洞檢測(cè)方法可以是但不限于,檢查父親的FSR和孩子的FSR之間的矛盾等。
第四步,根據(jù)在第三步檢測(cè)到的安全漏洞來(lái)產(chǎn)生告警提示,并提供基于第三步分析的修正建議。
最后,開(kāi)發(fā)人員可以在建議的基礎(chǔ)上修改其源代碼,并再次執(zhí)行此過(guò)程,以保證修正過(guò)程中不會(huì)引入任何新的漏洞。
2 一種高效檢測(cè)源代碼安全漏洞的代碼審查方法
一種高效檢測(cè)源代碼安全漏洞的代碼審查方法總共包括四個(gè)模塊:操作入口定位器,解析引擎,漏洞檢測(cè)器和告警修復(fù)模塊,系統(tǒng)結(jié)構(gòu)如圖2所示。
(1) 操作入口定位器
操作入口定位器可以實(shí)現(xiàn)(但不限于)通過(guò)搜索所有用于接收諸如scanf(),getchar(),getwindowstext,socket輸入等外部輸入的API(不同的程序語(yǔ)言可能有不同的API)。
(2) 解析引擎
解析引擎利用的是編譯器技術(shù),它可以找到所有可以追溯到操作入口的代碼塊。它可以在句法分析中自動(dòng)分配一些FSR規(guī)則。最后,該引擎將產(chǎn)生源代碼參考樹,如圖3所示。
(3) 漏洞檢測(cè)器
漏洞檢測(cè)器將根據(jù)源代碼參考樹進(jìn)行處理。它會(huì)對(duì)參考樹節(jié)點(diǎn)的FSR進(jìn)行檢查,分析是否有任何安全漏洞。
(4) 告警修復(fù)
告警修復(fù)模塊將提供安全漏洞的警告信息,以及修復(fù)被探測(cè)器探測(cè)到的安全漏洞的建議。分析模塊將從根節(jié)點(diǎn)開(kāi)始遍歷參考樹,并與每個(gè)節(jié)點(diǎn)的孩子節(jié)點(diǎn)比較FSR。當(dāng)它檢測(cè)到任何安全漏洞,分析模塊會(huì)產(chǎn)生警告,并給出修復(fù)建議。用于實(shí)施該方法的偽代碼如下:
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 應(yīng) 用
3.1 情景一:代碼注入漏洞
代碼注入指的是外部代碼被直接插入到程序或腳本中被執(zhí)行。一般可執(zhí)行代碼被注入前先插入到非可執(zhí)行的文本串中,然后再提交給應(yīng)用程序,
代碼注入是通過(guò)在本應(yīng)該不可執(zhí)行的文本字符串中嵌入可執(zhí)行代碼引起的。有兩種方法來(lái)定義的FSR:一個(gè)是定義的字符串的屬性為非可執(zhí)行;另一種方法是指出不應(yīng)該包含在文本中的字符串,包括任何可執(zhí)行的“關(guān)鍵字”,或表達(dá)式中的字符串(如腳本標(biāo)簽出現(xiàn),或SQL請(qǐng)求中出現(xiàn)單引號(hào)?(′)或雙破折號(hào)(——))。在這里,選擇了第二種方法,其可以指定FSR的格式為[FSR:限制規(guī)則]。
內(nèi)容限制可以通過(guò)正則表達(dá)式來(lái)執(zhí)行。例如,“^.$”可以表示所有可能的字符串,這可以表示所有外部原始輸入。在將外部輸入命令轉(zhuǎn)化為SQL查詢命令時(shí),可以設(shè)定此內(nèi)容限制,即不包含SQL特定字符,具體命令格式如下:
圖4所示的是通過(guò)解析引擎建立的參考樹。所有節(jié)點(diǎn)都將被編號(hào)為n.n,這體現(xiàn)了父節(jié)點(diǎn)和子節(jié)點(diǎn)之間的關(guān)系。同時(shí),該節(jié)點(diǎn)的FSR和位置信息也將被記錄下來(lái)。安全性分析模塊將通過(guò)檢查每個(gè)子節(jié)點(diǎn)的FSR是否與其父節(jié)點(diǎn)一致來(lái)處理參考樹。一種解決方案是從參考書中的葉節(jié)點(diǎn)開(kāi)始遍歷,比較它們與父節(jié)點(diǎn)的FSR。例如,在圖3中,節(jié)點(diǎn)1.2.2是一個(gè)節(jié)點(diǎn)1.2的子節(jié)點(diǎn),其FSR中的“的”意味著不應(yīng)該包含任何SQL相關(guān)的特定字符,但它的父節(jié)點(diǎn)(節(jié)點(diǎn)1.2)的FSR為“”,這意味著它可能包含所有可能的字符,包括SQL相關(guān)的特定字符。所以在這里發(fā)現(xiàn)了一個(gè)安全漏洞,系統(tǒng)的告警和修復(fù)模塊會(huì)產(chǎn)生警告,并產(chǎn)生諸如“節(jié)點(diǎn)1.2需添加字符串驗(yàn)證”這樣的修復(fù)建議。
3.2 情景二:緩沖區(qū)溢出漏洞
一般來(lái)說(shuō),當(dāng)一個(gè)數(shù)據(jù)塊B寫入緩沖器A時(shí),若B的大小大于A的合法分配的大小就會(huì)發(fā)生緩沖區(qū)溢出。緩沖器溢出的另一種形式是整數(shù)溢出,這是程序的一種潛在問(wèn)題,即程序中保存的數(shù)據(jù)大小是通過(guò)以字節(jié)為單位的數(shù)據(jù)類型限制的。在這里指定FSR的格式為{FSR:."^{length}$"}。
圖5展示了它通過(guò)解析引擎建立的一棵參考樹。所有節(jié)點(diǎn)都將被編號(hào)為n.n,這體現(xiàn)了父節(jié)點(diǎn)和子節(jié)點(diǎn)之間的關(guān)系。同時(shí),該節(jié)點(diǎn)的FSR和位置信息也將被記錄下來(lái)。安全性分析模塊將通過(guò)檢查每個(gè)子節(jié)點(diǎn)的FSR是否與其父節(jié)點(diǎn)一致來(lái)處理參考樹。一種解決方案是從參考書中的葉節(jié)點(diǎn)開(kāi)始遍歷,比較它們與父節(jié)點(diǎn)的FSR。例如,在圖6中,節(jié)點(diǎn)1.2有兩個(gè)子節(jié)點(diǎn),子節(jié)點(diǎn)1.2.1和1.2.2,他們?cè)试S的最大緩沖區(qū)長(zhǎng)度為30和20。因?yàn)樗鼈兊母腹?jié)點(diǎn)(節(jié)點(diǎn)1.2)的允許長(zhǎng)度為50,所以當(dāng)子節(jié)點(diǎn)到父節(jié)點(diǎn)之間可能會(huì)發(fā)生溢出。于是在這里發(fā)現(xiàn)了一個(gè)安全漏洞,系統(tǒng)的告警和修復(fù)模塊會(huì)產(chǎn)生警告,并產(chǎn)生相關(guān)修復(fù)建議如“建議修改節(jié)點(diǎn)1.2的最大緩沖區(qū)長(zhǎng)度為20”,如圖6所示。
3.3 情景三:特權(quán)提升漏洞
特權(quán)提升漏洞允許攻擊者或代碼獲取其本不應(yīng)有的更高水平的權(quán)限。這里的特權(quán)可能不僅代表用戶(如管理員,超級(jí)用戶或訪客)的特權(quán),也代表代碼(如內(nèi)核或用戶模式)的特權(quán)。因此,可以使用訪問(wèn)控制列表(ACL)來(lái)分類處理這樣的的漏洞。
3.4 情景四:信息泄露或數(shù)據(jù)篡改漏洞
信息泄露和數(shù)據(jù)篡改漏洞允許非法用戶或代碼修改系統(tǒng)內(nèi)的數(shù)據(jù),以實(shí)現(xiàn)惡意攻擊或?qū)⑹鼙Wo(hù)的數(shù)據(jù)暴露給到?jīng)]有權(quán)限訪問(wèn)該數(shù)據(jù)的用戶。對(duì)于這些漏洞的FSR規(guī)則也在ACL中有描述。
4 結(jié) 語(yǔ)
本文中所描述的方法可以大大降低誤報(bào)率,并且提供了一種有效的、僅通過(guò)檢測(cè)可利用的安全流量對(duì)源碼進(jìn)行自動(dòng)化安全審計(jì)的解決方案。這種方法避免了檢測(cè)攻擊者無(wú)法通過(guò)輸入操作、接口或者其他環(huán)境條件進(jìn)入的不可利用性安全流量,從而可以減少源代碼審計(jì)分析的開(kāi)銷,尤其是對(duì)于大型應(yīng)用程序。基于參考樹的FSR信息,該方法也可以對(duì)修改有漏洞的源碼提供精確的指導(dǎo)。
參考文獻(xiàn)
[1] 徐有福,文偉平,萬(wàn)正蘇.基于漏洞模型檢測(cè)的安全漏洞挖掘方法研究[J].信息網(wǎng)絡(luò)安全,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] 趙國(guó)亮,蔣勇,孔令兵.用代碼分析技術(shù)檢測(cè)軟件缺陷[J].計(jì)算機(jī)工程與設(shè)計(jì),2011(8):2741?2744.
[4] 戴凌宸,張朕榮,黎豐澤.傳統(tǒng)的軟件測(cè)試方法淺析[J].科技風(fēng),2011(16):53?55.
[5] 陳曉芳.幾種常見(jiàn)軟件可靠性測(cè)試方法綜述及應(yīng)用對(duì)比[J].科技信息,2007(17):6?8.
[6] 董潔,孫惠娟.軟件測(cè)試方法及面向?qū)ο筌浖臏y(cè)試[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.