您所在的位置: 首頁(yè) >
新聞資訊 >
技術(shù)前沿 >
軟件安全知識(shí)之??檢測(cè)漏洞
檢測(cè)漏洞
對(duì)于無(wú)法完全防止引入一類漏洞的現(xiàn)有源代碼,例如,由于編程語(yǔ)言和/或API的選擇是由其他因素決定的,應(yīng)用技術(shù)來(lái)檢測(cè)是有用的在軟件的開發(fā)、測(cè)試和/或維護(hù)階段,代碼中存在漏洞。
檢測(cè)漏洞的技術(shù)必須在檢測(cè)技術(shù)可以具有的以下兩個(gè)良好屬性之間進(jìn)行權(quán)衡:
? 如果檢測(cè)技術(shù)可以正確得出結(jié)論,給定程序沒(méi)有該類別的漏洞,則檢測(cè)技術(shù)對(duì)于給定類別的漏洞是合理的。另一方面,不健全的檢測(cè)技術(shù)可能有假陰性,即檢測(cè)技術(shù)無(wú)法發(fā)現(xiàn)的實(shí)際漏洞。
? 對(duì)于給定類別的漏洞,如果檢測(cè)到的任何漏洞是實(shí)際漏洞,則檢測(cè)技術(shù)是完整的。另一方面,不完整的檢測(cè)技術(shù)可能存在誤報(bào),即它可能會(huì)檢測(cè)到并非實(shí)際漏洞的問(wèn)題。
權(quán)衡是必要的,因?yàn)楦鶕?jù)賴斯定理(對(duì)于非平凡的漏洞類別)沒(méi)有一種檢測(cè)技術(shù)既健全又完整。
實(shí)現(xiàn)健全性需要對(duì)程序的所有執(zhí)行進(jìn)行推理(通常是無(wú)限多個(gè))。這通常是通過(guò)對(duì)程序代碼進(jìn)行靜態(tài)檢查來(lái)完成的,同時(shí)對(duì)執(zhí)行進(jìn)行適當(dāng)?shù)某橄笠允狗治鼋K止。
通過(guò)執(zhí)行程序的實(shí)際、具體執(zhí)行來(lái)實(shí)現(xiàn)完整性,該程序見證了報(bào)告的任何漏洞。這通常是通過(guò)動(dòng)態(tài)檢測(cè)完成的,其中分析技術(shù)必須為觸發(fā)漏洞的程序提供具體的輸入。一種非常常見的動(dòng)態(tài)方法是軟件測(cè)試,其中測(cè)試人員編寫具有具體輸入的測(cè)試用例,并對(duì)相應(yīng)的輸出進(jìn)行特定檢查。
在實(shí)踐中,檢測(cè)工具可以使用靜態(tài)和動(dòng)態(tài)分析技術(shù)的混合組合,以實(shí)現(xiàn)健全性和完整性之間的良好權(quán)衡。
然而,必須指出的是,一些檢測(cè)技術(shù)本質(zhì)上是啟發(fā)式的,因此沒(méi)有為它們精確定義健全性和完整性的概念。例如,檢測(cè)違反安全編碼實(shí)踐的啟發(fā)式技術(shù)(如2.3中所述)正在檢查是否符合非正式定義的規(guī)則和建議,并且并不總是能夠明確定義誤報(bào)。或假陰性。此外,這些方法可能會(huì)突出“漏洞”,這些漏洞目前可能無(wú)法利用,但仍然應(yīng)該修復(fù),因?yàn)樗鼈兪恰安铧c(diǎn)錯(cuò)過(guò)”,即將來(lái)的維護(hù)錯(cuò)誤可能很容易被利用。
靜態(tài)和動(dòng)態(tài)程序分析技術(shù)在計(jì)算機(jī)科學(xué)的其他領(lǐng)域被廣泛研究。本主題重點(diǎn)介紹與軟件安全最相關(guān)的分析技術(shù)。
檢測(cè)漏洞的另一種重要方法是執(zhí)行手動(dòng)代碼審查和審核。這些技術(shù)在安全軟件生命周期CyBOKKnowl邊緣領(lǐng)域[1]中有所介紹。使用工具支持的靜態(tài)檢測(cè)時(shí),調(diào)整此類后續(xù)代碼審查和其他驗(yàn)證活動(dòng)是有意義的。例如,如果靜態(tài)檢測(cè)對(duì)于給定類別的漏洞是合理的,那么可以考慮在以后的階段不審查或測(cè)試該類別的漏洞。
靜態(tài)檢測(cè)
靜態(tài)檢測(cè)技術(shù)分析程序代碼(源代碼或二進(jìn)制代碼)以查找漏洞。與動(dòng)態(tài)技術(shù)相反,靜態(tài)技術(shù)的優(yōu)點(diǎn)是它們可以對(duì)(尚)不可執(zhí)行的不完整代碼進(jìn)行操作,并且可以在單個(gè)分析中進(jìn)行操作。運(yùn)行它們嘗試涵蓋所有可能的程序執(zhí)行。粗略地說(shuō),人們可以區(qū)分兩類重要的技術(shù),它們的主要目標(biāo)不同。
啟發(fā)式靜態(tài)檢測(cè)
首先,有一些靜態(tài)分析技術(shù)可以檢測(cè)違反規(guī)則的情況,這些規(guī)則是安全編程實(shí)踐啟發(fā)式的正式編碼。靜態(tài)分析技術(shù)構(gòu)建了程序的語(yǔ)義模型,例如,包括抽象語(yǔ)法樹,以及程序中數(shù)據(jù)流和控制流的抽象?;诖四P停摷夹g(shù)可以標(biāo)記違反簡(jiǎn)單語(yǔ)法規(guī)則的行為,例如,不要使用此危險(xiǎn)的API函數(shù),或者僅將此API函數(shù)與常量字符串一起使用。參數(shù)。
漏洞存在的一個(gè)重要指標(biāo)是(可能是惡意的)程序輸入可能會(huì)影響風(fēng)險(xiǎn)操作中使用的值(例如,索引到數(shù)組中,或連接字符串以創(chuàng)建SQL查詢)。污點(diǎn)分析(有時(shí)也稱為流分析)是一種分析技術(shù),用于確定值是否來(lái)自程序輸入(或更一般地來(lái)自指定的污點(diǎn)源))可以影響此類風(fēng)險(xiǎn)操作中使用的值(或者更一般地說(shuō),影響流入受限接收器的值)。相同的分析還可用于檢測(cè)程序中的機(jī)密或敏感信息流向公共輸出通道的情況。
存在許多靜態(tài)污點(diǎn)分析的變體。重要的變化包括(1)代碼的牽引力,例如,路徑敏感與路徑不敏感,或上下文敏感與上下文不敏感分析,以及(2)是否由程序控制流而不是程序引起的影響考慮數(shù)據(jù)流(通常通過(guò)使用術(shù)語(yǔ)污點(diǎn)分析與信息流分析來(lái)區(qū)分)。
為了減少誤報(bào)的數(shù)量,污點(diǎn)分析可以考慮程序執(zhí)行的清理。由指定的清理功能處理的污染值(假設(shè)用于驗(yàn)證這些值對(duì)進(jìn)一步處理無(wú)害)將刪除其污點(diǎn)。
一個(gè)重要的挑戰(zhàn)是,必須為污點(diǎn)分析配置正確的源、水槽和消毒劑。在實(shí)踐中,這種配置目前經(jīng)常手動(dòng)進(jìn)行,盡管最近的一些工作增加了工具輔助,例如,機(jī)器學(xué)習(xí)用于支持安全分析師完成這項(xiàng)任務(wù)。
聲音靜態(tài)驗(yàn)證
其次,有一些靜態(tài)分析技術(shù)旨在針對(duì)明確定義的漏洞類別保持合理性(但通常在實(shí)踐中仍然會(huì)做出妥協(xié)并放棄對(duì)漏洞的合理性某種程度上)。對(duì)于可以理解為違反規(guī)范或合同的漏洞類別,主要挑戰(zhàn)是正式表達(dá)此底層規(guī)范。完成此操作后,在計(jì)算機(jī)科學(xué)其他領(lǐng)域開發(fā)的大量靜態(tài)分析和程序驗(yàn)證知識(shí)可用于檢查是否符合規(guī)范。三種主要的相關(guān)技術(shù)是程序驗(yàn)證、抽象解釋和模型檢查。
程序驗(yàn)證使用程序邏輯來(lái)表達(dá)程序規(guī)范,并依賴于程序員/驗(yàn)證器以以下形式提供程序的充分抽象:歸納循環(huán)不變量或函數(shù)前置和后置條件,以便能夠構(gòu)造涵蓋所有程序執(zhí)行的證明。對(duì)于具有動(dòng)態(tài)內(nèi)存分配的命令式語(yǔ)言,分離邏輯[26]是一種程序邏輯,可以表示不存在內(nèi)存管理和競(jìng)爭(zhēng)條件漏洞(對(duì)于存儲(chǔ)單元上的數(shù)據(jù)爭(zhēng)用),以及符合程序員提供了程序API的合同。檢查是否符合分離邏輯規(guī)范通常不是自動(dòng)的:它通過(guò)交互式程序驗(yàn)證完成,其中程序注釋用于提供不變量、前置條件和后置條件。但是,如果一個(gè)人只對(duì)沒(méi)有內(nèi)存管理漏洞感興趣,有時(shí)可以推斷出這些注釋,使該技術(shù)自動(dòng)進(jìn)行。此外,避免使用某些語(yǔ)言功能(例如指針),并堅(jiān)持適合驗(yàn)證的編碼風(fēng)格,有助于使驗(yàn)證自動(dòng)化。
抽象解釋是一種自動(dòng)技術(shù),通過(guò)將程序操作的運(yùn)行時(shí)值映射到足夠的有限抽象域,從具體程序進(jìn)行抽象。對(duì)于不使用動(dòng)態(tài)分配或遞歸的命令式程序,抽象解釋是一種成功的技術(shù),可以自動(dòng)有效地證明不存在內(nèi)存管理漏洞。
模型檢查是一種自動(dòng)技術(shù),它詳盡地探索程序的所有可訪問(wèn)狀態(tài),以檢查是否沒(méi)有狀態(tài)違反給定規(guī)范。由于狀態(tài)爆炸問(wèn)題,模型檢查只能窮盡地探索非常小的程序,在實(shí)踐中需要使用綁定探索的技術(shù),例如,通過(guò)限制程序循環(huán)的次數(shù)執(zhí)行。有界模型檢查不再合理,但仍能發(fā)現(xiàn)許多漏洞。
這些分析技術(shù)的大多數(shù)實(shí)際實(shí)現(xiàn)在某種程度上放棄了合理性。為了既合理又終止,靜態(tài)分析必須過(guò)度近似它所分析的程序的可能行為。過(guò)度逼近會(huì)導(dǎo)致誤報(bào)。真正的編程語(yǔ)言具有很難在不導(dǎo)致不可接受的誤報(bào)數(shù)量的情況下過(guò)度近似的功能。因此,實(shí)際實(shí)現(xiàn)必須進(jìn)行工程權(quán)衡,并且會(huì)低估某些語(yǔ)言功能。這使得實(shí)現(xiàn)不合理,但在減少誤報(bào)數(shù)的意義上更有用。這些工程權(quán)衡在“聲音宣言”中得到了很好的總結(jié)[27]。
動(dòng)態(tài)檢測(cè)
動(dòng)態(tài)檢測(cè)技術(shù)執(zhí)行程序并監(jiān)視執(zhí)行以檢測(cè)漏洞。因此,如果足夠高效,它們也可用于實(shí)時(shí)漏洞緩解(請(qǐng)參閱主題4)。動(dòng)態(tài)檢測(cè)有兩個(gè)重要且相對(duì)獨(dú)立的方面:(1)應(yīng)該如何監(jiān)視執(zhí)行以檢測(cè)到漏洞,以及(2)執(zhí)行多少程序以及執(zhí)行哪些程序(3)即應(yīng)該監(jiān)控哪些輸入值?
監(jiān)測(cè)
對(duì)于可理解為違反單個(gè)執(zhí)行的指定屬性的漏洞類別(請(qǐng)參閱主題1.6),可以通過(guò)監(jiān)視違反該規(guī)范來(lái)執(zhí)行完整檢測(cè)。對(duì)于其他類別的漏洞,或者當(dāng)監(jiān)視違反規(guī)范的成本太高時(shí),可以定義近似監(jiān)視器。
對(duì)內(nèi)存管理漏洞的監(jiān)視已經(jīng)進(jìn)行了深入研究。原則上,可以構(gòu)建完整的監(jiān)視器,但通常需要花費(fèi)大量的時(shí)間和內(nèi)存。因此,現(xiàn)有工具探索了執(zhí)行速度、內(nèi)存使用和完整性方面的各種權(quán)衡?,F(xiàn)代C編譯器包括用于生成代碼以監(jiān)視內(nèi)存管理漏洞的選項(xiàng)。在動(dòng)態(tài)分析是近似分析的情況下(如靜態(tài)分析),它也可能生成誤報(bào)或漏報(bào),盡管它對(duì)具體的執(zhí)行跟蹤進(jìn)行操作。
對(duì)于結(jié)構(gòu)化輸出生成漏洞,一個(gè)挑戰(zhàn)是生成的輸出的預(yù)期結(jié)構(gòu)通常是隱式的,因此沒(méi)有可以監(jiān)視的顯式規(guī)范。因此,監(jiān)視依賴于合理的啟發(fā)式方法。例如,監(jiān)視器可以使用細(xì)粒度的動(dòng)態(tài)污點(diǎn)分析[25]來(lái)跟蹤不受信任的輸入字符串的流,然后在不受信任的輸入對(duì)生成的解析樹產(chǎn)生影響時(shí)標(biāo)記違規(guī)。輸出。
軟件構(gòu)建的合同設(shè)計(jì)方法[18,c3]支持的斷言,前置條件和后置條件可以編譯到代碼中,以便在測(cè)試時(shí)提供API漏洞的監(jiān)視器,即使這些編譯的運(yùn)行時(shí)檢查的成本可能太高而無(wú)法在生產(chǎn)代碼中使用它們。
監(jiān)控競(jìng)爭(zhēng)條件很困難,但存在一些用于監(jiān)控共享內(nèi)存單元上數(shù)據(jù)爭(zhēng)用的方法,例如,通過(guò)監(jiān)視所有共享內(nèi)存訪問(wèn)是否遵循一致的鎖定規(guī)則。
生成相關(guān)執(zhí)行
動(dòng)態(tài)檢測(cè)技術(shù)的一個(gè)重要挑戰(zhàn)是沿著導(dǎo)致發(fā)現(xiàn)新漏洞的路徑生成程序的執(zhí)行。這個(gè)問(wèn)題是軟件測(cè)試中系統(tǒng)地為被測(cè)程序選擇適當(dāng)輸入的一般問(wèn)題的一個(gè)例子[18,c4]。這些技術(shù)通常由模糊測(cè)試或模糊測(cè)試的總稱描述,可分為:
? 黑盒模糊測(cè)試,其中輸入值的生成僅取決于被測(cè)試程序的輸入/輸出行為,而不取決于其內(nèi)部結(jié)構(gòu)。已經(jīng)提出了許多不同的黑盒模糊測(cè)試變體,包括(1)純隨機(jī)測(cè)試,其中輸入值從適當(dāng)?shù)闹涤蛑须S機(jī)采樣,(2)模型基于模糊測(cè)試,其中在生成輸入值期間考慮輸入值的預(yù)期格式(通常以語(yǔ)法形式)的模型,以及(3)基于突變的模糊測(cè)試,其中模糊器提供一個(gè)或多個(gè)典型輸入值,并通過(guò)對(duì)提供的輸入執(zhí)行小突變來(lái)生成新的輸入值值。
? 白盒模糊測(cè)試,分析程序的內(nèi)部結(jié)構(gòu)以幫助生成適當(dāng)?shù)妮斎胫怠V饕南到y(tǒng)白盒模糊測(cè)試技術(shù)是動(dòng)態(tài)符號(hào)執(zhí)行。動(dòng)態(tài)符號(hào)執(zhí)行執(zhí)行具有具體輸入值的程序,并同時(shí)構(gòu)建路徑條件,這是一個(gè)邏輯表達(dá)式,用于指定程序采用此特定執(zhí)行路徑必須滿足的那些輸入值的約束。通過(guò)求解不滿足當(dāng)前執(zhí)行路徑條件的輸入值,模糊器可以確保這些輸入值將程序驅(qū)動(dòng)到不同的執(zhí)行路徑,從而提高覆蓋率。
來(lái)源: 河南等級(jí)保護(hù)測(cè)評(píng)