【 摘 要 】 隨著計(jì)算機(jī)網(wǎng)絡(luò)的快速發(fā)展,有關(guān)于軟件的安全性問(wèn)題越發(fā)的突顯出來(lái)。源代碼安全漏洞檢測(cè)正是基于計(jì)算機(jī)軟件安全為出發(fā)點(diǎn)研發(fā)出來(lái)的相關(guān)技術(shù)。論文分析了源代碼安全漏洞的幾種常見(jiàn)檢測(cè)方法,并對(duì)這些方法的優(yōu)缺點(diǎn)進(jìn)行了比較,以期能為計(jì)算機(jī)網(wǎng)絡(luò)安全提供一些參考意見(jiàn)。
【 關(guān)鍵詞 】 源代碼;漏洞;安全檢測(cè)方法
【 中圖分類號(hào) 】 TP309.2
【 文獻(xiàn)標(biāo)識(shí)碼 】 A
Discussion on Detection Method of Source Code Security Vulnerabilities
Ma Hong-zhe
(Institute of Electric Power Research,Guangxi Power Grid Company Limited GuangxiNanning 530023)
【 Abstract 】 With the rapid development of computer network, there are more and more prominent on the security of software. Source code security vulnerability detection is based on the computer software security as the starting point of the research and development of related technologies. This paper analyzes several common detection methods of source code security vulnerabilities, and compares the advantages and disadvantages of these methods in order to provide some reference for computer network security.
【 Keywords 】 source code; vulnerability; security detection method
1 引言
身處于現(xiàn)代信息時(shí)代,網(wǎng)絡(luò)的安全問(wèn)題已成為全社會(huì)關(guān)注的熱點(diǎn)問(wèn)題。計(jì)算機(jī)系統(tǒng)中的任何漏洞都可能造成包括經(jīng)濟(jì)、政治、軍事、社會(huì)、科技等多方面的嚴(yán)重安全隱患。只有從本質(zhì)上解決計(jì)算機(jī)軟件的安全漏洞問(wèn)題,才能從根本上確保網(wǎng)絡(luò)信息的安全。然而軟件安全漏洞有極大的隱藏特性,如不形成對(duì)它的觸發(fā),很難注意到它的存在。
因此,目前世界各國(guó)都投入了大量精力,用于源代碼安全漏洞檢測(cè)方法的開(kāi)發(fā)研究。
2 源代碼漏洞的形成原因和具體表現(xiàn)
源代碼漏洞是指在程序設(shè)計(jì)之初,由于考慮不周等問(wèn)題,導(dǎo)致寫(xiě)代碼的時(shí)候,一些代碼寫(xiě)的不完善,由此留下了可以被侵入的后門(mén),從而產(chǎn)生的可能會(huì)對(duì)程序本身、系統(tǒng)或數(shù)據(jù)帶來(lái)潛在危害的代碼問(wèn)題。源代碼問(wèn)題一旦被不法分子發(fā)現(xiàn)、利用,所造成的危害不可估量。代碼漏洞可以表現(xiàn)在很多方面,算法本身或者代碼本身的問(wèn)題都可能會(huì)造成代碼漏洞。
代碼漏洞的具體表現(xiàn)主要包括幾個(gè)方面。
對(duì)輸入的數(shù)據(jù)沒(méi)有進(jìn)行有效的檢查。或者是進(jìn)行過(guò)檢查但是檢查不周,也可能是處理不當(dāng),此類問(wèn)題最常造成緩沖區(qū)漏洞的出現(xiàn)。比如在對(duì)某賬號(hào)進(jìn)行密碼的設(shè)置輸入時(shí),如果程序未對(duì)密碼的長(zhǎng)度進(jìn)行限制,用戶則可能出于安全考慮輸入超長(zhǎng)的密碼,由此可能會(huì)導(dǎo)致存儲(chǔ)密碼時(shí)對(duì)其它的數(shù)據(jù)進(jìn)行覆蓋,引發(fā)一系列的問(wèn)題。
代碼邏輯設(shè)計(jì)缺陷或錯(cuò)誤。這類問(wèn)題一般是由程序員的疏忽大意造成的。比如判斷時(shí)因考慮不周而少漏條件,當(dāng)遇到特殊數(shù)據(jù)和情況時(shí),導(dǎo)致程序出現(xiàn)不可預(yù)估的錯(cuò)誤。
算法本身的漏洞。實(shí)現(xiàn)源代碼的安全無(wú)漏洞,首先應(yīng)確保在寫(xiě)代碼時(shí)進(jìn)行嚴(yán)密的算法,算法本身出現(xiàn)了漏洞,則必然導(dǎo)致諸多問(wèn)題的存在。比如采用比較簡(jiǎn)單的加密算法,會(huì)為信息泄漏留下操作的可能性。
3 常見(jiàn)的源代碼安全檢測(cè)方法
3.1 抽象解釋
抽象解釋是把程序代碼的執(zhí)行過(guò)程看成各種抽象狀態(tài)的遷移過(guò)程,并通過(guò)對(duì)抽象狀態(tài)進(jìn)行分析來(lái)確定程序的性質(zhì)。初始抽象狀態(tài)必須是初始實(shí)際狀態(tài)的安全近似,而且每次狀態(tài)遷移需要保持正確的關(guān)系,這樣才能保證分析結(jié)果的正確。理論上,正確的抽象能夠找出程序中所有可能的緩沖區(qū)溢出漏洞。但也相應(yīng)的帶來(lái)較多的誤報(bào)。在實(shí)際使用中,為降低誤報(bào)率,用戶應(yīng)當(dāng)根據(jù)被測(cè)程序的特性,選擇合適的解釋函數(shù)和抽象域等。
3.2 詞法分析
詞法分析是最早被用來(lái)進(jìn)行緩沖區(qū)溢出漏洞檢測(cè)的方法之一。這種方法是對(duì)軟件源程序進(jìn)行掃描分析,同時(shí)與特征庫(kù)進(jìn)行匹配,當(dāng)發(fā)現(xiàn)某個(gè)片與“危險(xiǎn)片段庫(kù)中的數(shù)據(jù)”匹配時(shí),則可找出軟件程序中可能存在的溢出漏洞。這種方法的局限性在于容易產(chǎn)生漏報(bào)或誤報(bào),并且它也不能理解軟件程序的語(yǔ)義。因此需要進(jìn)一步的進(jìn)行上下文分析。
3.3 規(guī)則檢查
安全性一直是程序編程過(guò)程中必需考慮的部分,因此在編程時(shí)就會(huì)從安全性的角度設(shè)定一些必須遵循的規(guī)則。而通過(guò)對(duì)這種規(guī)則的檢查,就能找到源代碼中的某些漏洞。規(guī)則檢查在進(jìn)行大規(guī)模的程序安全檢測(cè)時(shí),可以通過(guò)選取相關(guān)的規(guī)則對(duì)某一類型的安全問(wèn)題進(jìn)行快速分析,但正是受這種檢查法自身特點(diǎn)的束縛,使得它只能對(duì)特定類型的問(wèn)題進(jìn)行檢查,無(wú)法實(shí)現(xiàn)全面的源代碼漏洞檢測(cè)。
3.4 類型推導(dǎo)
如果將安全屬性看成一種類型,那么通過(guò)類型推導(dǎo)檢查,就能找出源代碼中的不安全漏洞類型。這種方法忽略了代碼執(zhí)行條件和順序,只是利用定型規(guī)則確定代碼中部件的的類型,所以在進(jìn)行源代碼漏洞檢測(cè)時(shí)處理速度很快。
一般情況下,類型推導(dǎo)可分為三個(gè)階段:首先是定型斷言,確定變量的初始類型;其次是推導(dǎo)規(guī)則,即進(jìn)行推論系統(tǒng)規(guī)則集的建構(gòu);最后是檢查規(guī)則,即判斷推論結(jié)果是否具有“危害性”。
類型推導(dǎo)法對(duì)于軟件安全漏洞的快速檢測(cè)量方面具有很大的優(yōu)勢(shì),能進(jìn)行大規(guī)模程序的安全性分析,但由于約束變量取值為無(wú)窮,所以這種方法也只能用來(lái)檢測(cè)特定類型的源代碼漏洞。
3.5 數(shù)據(jù)流分析
數(shù)據(jù)流分析在源代碼的安全檢測(cè)中,用途比較廣泛。這種方法從對(duì)源代碼的語(yǔ)義信息進(jìn)行構(gòu)造變量切入,采用代數(shù)方法對(duì)變量進(jìn)行定義和使用的確定。
數(shù)據(jù)流分析方法基于這樣一個(gè)事實(shí),數(shù)據(jù)流沿程序控制圖傳播。當(dāng)所有程序點(diǎn)的分析狀態(tài)達(dá)到不動(dòng)點(diǎn)時(shí),傳播停止,同時(shí)得到程序性質(zhì)的解。但是數(shù)據(jù)流分析方法不能精確跟蹤指令的控制條件,所以這種檢測(cè)方法得到的結(jié)果不夠精確。
3.6 約束分析
通過(guò)產(chǎn)生、求解程序的約束條件,約束分析即可確定程序的性質(zhì)。約束分析方法建立的局部化約束產(chǎn)生的規(guī)則能清楚的描述指令副作用乃至控制條件。
約束分析檢測(cè)分為約束產(chǎn)生和約束求解兩個(gè)階段。約束產(chǎn)生階段是進(jìn)行包括變量類型和分析狀態(tài)在內(nèi)的約束系統(tǒng)的構(gòu)建,對(duì)這個(gè)系統(tǒng)進(jìn)行求解的過(guò)程即為了約束求解階段。
這種檢測(cè)法常用于可能造成緩沖區(qū)溢出的字符串操作的檢測(cè)。但是,這種方法不容易處理精確循環(huán):程序中存在循環(huán),且循環(huán)控制條件之間存在依賴關(guān)系時(shí),則建立的約束條件可能無(wú)解。
3.7 符號(hào)執(zhí)行
符號(hào)執(zhí)行是通過(guò)采用抽象符號(hào)代替變量,對(duì)路徑敏感的程序控制流進(jìn)行模擬,在約束求解中對(duì)可能發(fā)生的錯(cuò)誤解進(jìn)行檢測(cè)的方法。在檢測(cè)中,如果出現(xiàn)象一組抽象符號(hào)的解滿足,則可判定程序中存在錯(cuò)誤。符號(hào)執(zhí)行法的檢測(cè)能力完全取決于求解工具的約束條件和求解能力。雖然這種方法的檢測(cè)時(shí)間較長(zhǎng),但它的優(yōu)點(diǎn)是可以進(jìn)行比較精準(zhǔn)的檢測(cè),程序中很多細(xì)微的邏輯錯(cuò)誤都能被找到,對(duì)于某些特定問(wèn)題的檢測(cè)很有必要。
3.8 模型檢測(cè)
作為形式化的驗(yàn)證技術(shù)的一種,模型檢測(cè)采用的是通過(guò)狀態(tài)遷移描述程序的行為。這種方法用時(shí)序邏輯和計(jì)算樹(shù)邏輯等來(lái)表示程序系統(tǒng)的性質(zhì),將系統(tǒng)屬性(安全與否)的檢驗(yàn)問(wèn)題變換為搜索不符合邏輯公式的狀態(tài)問(wèn)題。首先,進(jìn)行抽象模型的構(gòu)建,這里必需注意,只有有限狀態(tài)的程序才能進(jìn)行模型構(gòu)建;然后模型驗(yàn)證要遍歷程序的所有狀態(tài)空間進(jìn)行驗(yàn)證。這種檢測(cè)有兩種常見(jiàn)的方法:符號(hào)化模型檢測(cè)和模型轉(zhuǎn)換自動(dòng)機(jī),兩者均為并發(fā)系統(tǒng)方法。符號(hào)化模型檢測(cè)是通過(guò)將抽象模型中的狀態(tài)轉(zhuǎn)變?yōu)檎Z(yǔ)法樹(shù)描述的邏輯公式,對(duì)公式進(jìn)行可滿足性驗(yàn)證,而模型轉(zhuǎn)換自動(dòng)機(jī)則是通過(guò)在安全時(shí)序的基礎(chǔ)上,構(gòu)建一個(gè)新的自動(dòng)機(jī)進(jìn)行驗(yàn)證。
在協(xié)議驗(yàn)證和硬件檢測(cè)領(lǐng)域,模型檢測(cè)的應(yīng)用較為常見(jiàn)。模型檢驗(yàn)?zāi)軌虬l(fā)現(xiàn)程序中存在復(fù)雜語(yǔ)義上的錯(cuò)誤,從而準(zhǔn)確發(fā)現(xiàn)程序中潛在的安全性漏洞,但現(xiàn)存的模型檢驗(yàn)工具普遍分析源程序的形式化的表示(數(shù)學(xué)描述),而不是以源程序作為輸入,如需要源程序的數(shù)學(xué)模型。通??梢酝ㄟ^(guò)程序分析(數(shù)據(jù)流分析,控制流分析,程序切片工具)來(lái)自動(dòng)完成源程序的模型的生成。程序切片提取程序的精簡(jiǎn)了的模型,其中程序分析是基礎(chǔ),除了語(yǔ)法分析之外,更需要涉及語(yǔ)義的分析,包括控制流分析和數(shù)據(jù)流分析。
由于程序的復(fù)雜性導(dǎo)致了模型過(guò)于龐大的問(wèn)題,因此模型檢測(cè)除了只能分析那些有限狀態(tài)的系統(tǒng),還有只能針對(duì)程序中的某一個(gè)屬性構(gòu)造抽象模型的弱點(diǎn),有較大的局限性。
4 各種檢測(cè)方法的比較分析
以上介紹的幾種源代碼安全漏洞檢測(cè)法,既有區(qū)別又存在內(nèi)在的聯(lián)系。比如抽象解釋就是其他方法的理論基礎(chǔ)。這些方法都有各自的優(yōu)缺點(diǎn),不可能處理所有的源代碼安全漏洞檢測(cè)問(wèn)題,因此需要對(duì)這些方法的特征有一個(gè)綜合的了解,在實(shí)際應(yīng)用時(shí),合理的采取幾種方法的綜合檢測(cè),能更好地完成源代碼安全漏洞檢測(cè)工作。關(guān)于這些方法的優(yōu)缺點(diǎn),如表1所示。
參考文獻(xiàn)
[1] 周誠(chéng),張濤,馬媛媛,李偉偉.一種高效檢測(cè)源代碼安全漏洞的代碼審查方法[J].現(xiàn)代電子技術(shù),2015,05:83-86.
[2] 時(shí)志偉,趙亮.一種關(guān)于PHP源代碼安全漏洞的靜態(tài)檢測(cè)方法[J].信息安全與通信保密,2011,11:80-82.
[3] 朱圣才,徐御,王火劍.常見(jiàn)源代碼安全漏洞分析與研究[J].信息網(wǎng)絡(luò)安全,2014,02:48-52.
作者簡(jiǎn)介:
馬虹哲(1987-),女,漢族,研究生,碩士,工程師;主要研究方向和關(guān)注領(lǐng)域:信息安全。