發(fā)布于:2020-12-30 15:01:17
0
817
0
上周,我們告訴您有關(guān)一項(xiàng)研究的發(fā)現(xiàn),這些研究在Stack Overflow答案中發(fā)現(xiàn)了一些C ++代碼片段中的安全漏洞,以及其中的某些漏洞是如何遷移到實(shí)際的,實(shí)時(shí)的Github項(xiàng)目中的。今天,我們跟蹤研究中突出顯示的前八種錯(cuò)誤類型,并提出避免發(fā)生相同錯(cuò)誤的方法。
為了獲得這些答案,我們檢查了通用弱點(diǎn)枚舉數(shù)據(jù)庫(kù)中Verdi等人在其研究中發(fā)布的數(shù)字。我們只針對(duì)涉及特定弱點(diǎn)而不是類別的CWE編號(hào),因?yàn)樵陂_(kāi)始解決這些弱點(diǎn)之前,它們需要一些更多的信息。
盡管研究專門(mén)在C ++代碼段中發(fā)現(xiàn)了這些漏洞,但下面提到的CWE可以在多種編程語(yǔ)言中發(fā)生。其他編程語(yǔ)言可能更傾向于其他CWE,因此請(qǐng)不要將此作為安全性檢查清單。
事不宜遲,如果您遇到問(wèn)題,喲,我會(huì)解決。
CWE-754 錯(cuò)誤檢查異?;虍惓G闆r
此漏洞的發(fā)生是基于以下假設(shè):事件或特定情況不會(huì)發(fā)生,例如內(nèi)存不足,無(wú)法訪問(wèn)資源。
在給定的程序中,您可能能夠控制大多數(shù)數(shù)據(jù)流,因此可以假定所有函數(shù)返回值都在期望值之內(nèi)。但是罕見(jiàn)的事件仍然可能發(fā)生。更糟糕的是,有時(shí)聰明的攻擊者會(huì)觸發(fā)這些事件并給您的系統(tǒng)造成破壞。
您可以通過(guò)假設(shè)總是在需要時(shí)成功分配內(nèi)存,文件或字符串具有特定大小,或者數(shù)據(jù)庫(kù)或輸入調(diào)用將返回非NULL的內(nèi)容來(lái)暴露此弱點(diǎn)。在許多情況下,意外數(shù)據(jù)將使進(jìn)程崩潰。也許您的代碼可以優(yōu)雅地處理此問(wèn)題?;蛘?,系統(tǒng)可能會(huì)繼續(xù)處于意外狀態(tài),從而使系統(tǒng)容易受到攻擊者的欺騙。
最近,一個(gè)以太網(wǎng)/串行RTU模塊暴露了這一弱點(diǎn)。盡管該漏洞可能已得到修補(bǔ),但以前,攻擊者可以通過(guò)將截?cái)嗟腟NMP數(shù)據(jù)包發(fā)送到特定的UDP端口來(lái)發(fā)起拒絕服務(wù)攻擊,或者通過(guò)另一個(gè)端口上的大量數(shù)據(jù)包斷開(kāi)連接來(lái)斷開(kāi)所有連接。
某些語(yǔ)言可能能夠在造成危害之前捕獲這些異常。但是對(duì)于沒(méi)有的低級(jí)語(yǔ)言,您可以執(zhí)行以下操作:
每次檢查您的返回值
假設(shè)所有輸入都是惡意的,并且僅接受某些值
計(jì)劃低資源條件
失敗的建筑師
異常和失敗管理并不能解決所有問(wèn)題。過(guò)于冗長(zhǎng)和特定的異常會(huì)為攻擊者提供有關(guān)如何在代碼中查找其他漏洞的線索。
CWE-20 輸入驗(yàn)證不正確
當(dāng)軟件無(wú)法正確驗(yàn)證輸入時(shí),攻擊者便能夠以應(yīng)用程序其余部分所不希望的形式編寫(xiě)輸入。
俗話說(shuō)“垃圾進(jìn),垃圾出”。如果您的輸入不正確,則可能會(huì)導(dǎo)致某些不良結(jié)果。這有點(diǎn)像惡作劇,在那兒您咬咬了您認(rèn)為是Lindor松露中的一種,但實(shí)際上是巧克力包裹的抱子甘藍(lán)。惡意攻擊者將試圖向您提供一些比抱子甘藍(lán)更糟糕的輸入。
這種弱點(diǎn)與上一個(gè)弱點(diǎn)有一個(gè)共同點(diǎn),即開(kāi)發(fā)人員假定沒(méi)有人可以訪問(wèn)其功能中的輸入。錯(cuò)誤的開(kāi)發(fā)者名單很 長(zhǎng)。
某些版本的MS Excel(所有版本都已使用10年或以上)允許用戶在加載電子表格后在系統(tǒng)上執(zhí)行任意代碼。惡意電子表格中嵌入的各種對(duì)象都訪問(wèn)了VBA性能緩存,該緩存在運(yùn)行時(shí)未進(jìn)行清理,因此其行為異常。
尤其是在具有數(shù)據(jù)庫(kù)驅(qū)動(dòng)的后端的網(wǎng)絡(luò)應(yīng)用程序中,軟件具有大量矢量,用于不受信任的輸入。您可能會(huì)認(rèn)為,每次都可以通過(guò)清潔輸入來(lái)克服此弱點(diǎn),但是還有很多其他安全措施可采取:
檢查客戶端和服務(wù)器上的輸入值
對(duì)于來(lái)自多個(gè)來(lái)源的任何輸入值組合,請(qǐng)驗(yàn)證組合值以及輸入
注意跨語(yǔ)言的代碼,例如在本機(jī)虛擬機(jī)上運(yùn)行的解釋語(yǔ)言中會(huì)發(fā)生這種情況
明確將您的輸入轉(zhuǎn)換為預(yù)期的數(shù)據(jù)類型
驗(yàn)證之前,請(qǐng)確保所有數(shù)據(jù)都在規(guī)范字符編碼方案中
使用靜態(tài)分析
CWE-252 未檢查的返回值
方法或函數(shù)不檢查返回值,這可能會(huì)導(dǎo)致意外狀態(tài)。
您可能現(xiàn)在已經(jīng)注意到一個(gè)主題:在破壞自己之前先檢查一下自己。或者,更簡(jiǎn)單地說(shuō),驗(yàn)證所有數(shù)據(jù)以確保它是您想要的。如果您查看某個(gè)函數(shù)并認(rèn)為它永遠(yuǎn)不會(huì)失敗,或者認(rèn)為它是否失敗都沒(méi)有關(guān)系,那么您將自己暴露于此漏洞中。
與以前的弱點(diǎn)類似,此弱點(diǎn)可能會(huì)使系統(tǒng)處于意外狀態(tài),從而導(dǎo)致崩潰或其他異常,包括執(zhí)行任意代碼。這就是2007年許多Linux實(shí)施中發(fā)生的情況。攻擊者可能將TLV數(shù)據(jù)包偽造為BGP數(shù)據(jù)包,從而使他們可以執(zhí)行所需的操作。這特別危險(xiǎn),因?yàn)锽GP數(shù)據(jù)包通常由自治系統(tǒng)傳遞以共享路由信息。
緩解這個(gè)問(wèn)題很簡(jiǎn)單:檢查您的返回值,確保它們?cè)陬A(yù)期范圍內(nèi),如果不是,則拋出異常。
CWE-477 使用作廢功能
該代碼使用了不推薦使用或過(guò)時(shí)的功能,這表明該代碼尚未得到積極的審查或維護(hù)。
隨著漏洞的發(fā)現(xiàn)和軟件實(shí)踐的改變,語(yǔ)言和軟件可能會(huì)過(guò)時(shí)地淘汰某些功能。盡管您可以繼續(xù)使用已棄用的功能,但這樣做可能會(huì)出現(xiàn)安全問(wèn)題。而且某些函數(shù)(例如rand())對(duì)于嚴(yán)肅的代碼可能已經(jīng)過(guò)時(shí)了。
該弱點(diǎn)可能表明的一個(gè)更嚴(yán)重的問(wèn)題是,有關(guān)軟件沒(méi)有得到維護(hù)或更新。如果沒(méi)有人跟上軟件和系統(tǒng)的變化,過(guò)時(shí)的功能可能會(huì)持續(xù)存在。在未維護(hù)的系統(tǒng)中,安全漏洞會(huì)隨著軟件的老化而滾滾滾滾。問(wèn)題有時(shí)會(huì)得到新的答案,但是對(duì)于多年前發(fā)布在Stack Overflow上的代碼段,沒(méi)有人維護(hù)(也不應(yīng)該維護(hù)),因此要確保所有內(nèi)容仍然安全。
在2018年的NUUO CMS中,過(guò)時(shí)的軟件組件使用戶可以隨意執(zhí)行代碼。在具有大量依賴關(guān)系的復(fù)雜軟件中,甚至不需要您的代碼就具有安全性弱點(diǎn)即可將其暴露于威脅中。
即使沒(méi)有實(shí)現(xiàn),緩解此缺陷的方法也很簡(jiǎn)單:重構(gòu)代碼以避免過(guò)時(shí)或過(guò)時(shí)的功能。如果需要使用這些功能,請(qǐng)確保您了解安全隱患并制定相應(yīng)的計(jì)劃。
CWE-789 不受控制的內(nèi)存分配
根據(jù)無(wú)效大小分配內(nèi)存,從而可以分配任意數(shù)量的內(nèi)存。
內(nèi)存分配是一個(gè)非常常見(jiàn)的功能,尤其是在低級(jí)語(yǔ)言中。但是,如果代碼分配了大量的內(nèi)存,則可能導(dǎo)致系統(tǒng)變慢或崩潰。盡管系統(tǒng)故障已足夠嚴(yán)重,但在靈活的云系統(tǒng)上,過(guò)度分配可能會(huì)非常昂貴。
這是CWE-20(輸入驗(yàn)證不正確)的表象,因?yàn)樾枰?yàn)證的輸入正提供給內(nèi)存分配功能。內(nèi)存可能越來(lái)越便宜,但仍然有限。如果攻擊者可以占用您硬件上的所有內(nèi)存,則不僅可能使您的程序崩潰,而且可能使該系統(tǒng)上運(yùn)行的任何其他程序崩潰。
在2008年,IBM solidDB沒(méi)有驗(yàn)證設(shè)置要分配的內(nèi)存量的字段。因此,只要在此字段中提供較大的值,任何傳入的數(shù)據(jù)包都可能使系統(tǒng)崩潰。由于solidDB已嵌入許多網(wǎng)絡(luò)和電信設(shè)備中,因此此弱點(diǎn)可能會(huì)對(duì)Internet的基礎(chǔ)結(jié)構(gòu)造成很多破壞。
緩解這個(gè)問(wèn)題的方法與上面的CWE-20相同,另外還要確保您沒(méi)有超出系統(tǒng)的內(nèi)存限制。
CWE-158 空字節(jié)或空字符的不正確中和
輸入是從上游組件接收的,但是當(dāng)空字節(jié)發(fā)送到下游組件時(shí),它不會(huì)中和或錯(cuò)誤地中和。
在C ++中,字符串以null字符終止。在大多數(shù)情況下,這可以提供很大的靈活性,因?yàn)樽址梢允侨我忾L(zhǎng)度。但是用戶可以輸入任意數(shù)量的字符作為輸入,包括在字符串中間的空字符。在這種情況下,字符串將被截?cái)酁樵搉ull。
在大多數(shù)情況下,這無(wú)關(guān)緊要。但是,如果將該字符串作為一個(gè)較長(zhǎng)的字符串(例如URL或用戶名)的一部分進(jìn)行組合,則他們可能能夠使程序放棄超出預(yù)期的范圍。雖然這個(gè)問(wèn)題是關(guān)于PHP的,但是技術(shù)是相同的。輸入中的空字符可以取消附加到該字符串的所有內(nèi)容,包括使該文件名成為文件擴(kuò)展名的文件擴(kuò)展名。借助一些巧妙的腳本,惡意代理即可遍歷Web目錄并獲取所需的任何文件。
這是許多早期的Web服務(wù)器中發(fā)生的情況。攻擊者可以在URL末尾添加一個(gè)空值并列出目錄,讀取源代碼,并且通常繞過(guò)所有訪問(wèn)限制。然后,這些源文件將提供有關(guān)可被利用的系統(tǒng)的許多其他信息。
在嘗試捕獲這些攻擊時(shí),您的代碼應(yīng)假定有人輸入的內(nèi)容為空。這是保護(hù)代碼的幾種方法:
刪除輸入中的空字符
使用規(guī)范方法顯式編碼輸入
結(jié)合使用白名單和黑名單來(lái)指定有效值并阻止無(wú)效值
CWE-134 使用外部控制的格式字符串
該軟件使用的函數(shù)接受格式字符串作為參數(shù),但是格式字符串源自外部源。
諸如printf()之類的格式函數(shù)采用具有格式函數(shù)的String并將其轉(zhuǎn)換為常規(guī)String。格式參數(shù)看起來(lái)像%x,它將處理函數(shù)中的參數(shù),并將其添加到返回值中。但是,如果String是由外部控制的(即,作為輸入或從文件/數(shù)據(jù)位置讀?。?,并且未正確驗(yàn)證,則攻擊者可能會(huì)將自己的參數(shù)放入函數(shù)中。
一些參數(shù)允許從存儲(chǔ)器堆?;蜻^(guò)程存儲(chǔ)器讀取和寫(xiě)入。允許來(lái)自任意用戶輸入的數(shù)據(jù)是一個(gè)非常糟糕的主意。攻擊者可以從內(nèi)存中讀取信息或執(zhí)行任意代碼,具體取決于格式字符串中的內(nèi)容。
2006年,Dia(一種基于GTK +的圖表工具)在嘗試連續(xù)打開(kāi)一個(gè)以一堆%s命名的bmp文件時(shí),允許拒絕服務(wù)攻擊(并可能執(zhí)行代碼)。該軟件將嘗試顯示帶有文件名的警告消息,但是由于它正在處理格式參數(shù),因此它顯示的是敏感信息。
解決方案非常簡(jiǎn)單:確保傳遞給格式函數(shù)的所有Strings都是靜態(tài)的并且在控件內(nèi)。有時(shí),編譯器警告會(huì)指出存在問(wèn)題的區(qū)域,因此請(qǐng)不要忽略它們。
CWE-476 空指針引用
當(dāng)應(yīng)用程序取消引用它期望是有效的但為NULL的指針時(shí),就會(huì)發(fā)生NULL指針取消引用,這通常會(huì)導(dǎo)致崩潰或退出。
當(dāng)一半的問(wèn)題是由于空指針異常(或取消引用)而導(dǎo)致的,我仔細(xì)閱讀了發(fā)行說(shuō)明。盡管許多空指針可能會(huì)使系統(tǒng)崩潰或?qū)е鲁绦蛞馔馔顺觯袝r(shí)它們會(huì)使系統(tǒng)處于意外狀態(tài),即奇怪,不可復(fù)制的怪癖或從其他內(nèi)存地址提取數(shù)據(jù)。當(dāng)攻擊者可靠地找到在系統(tǒng)中誘發(fā)空值的途徑時(shí),它將成為安全問(wèn)題。
盡管許多空指針是由于草率的編程而發(fā)生的,但在異步系統(tǒng)中,空指針可能來(lái)自競(jìng)爭(zhēng)條件。這是兩個(gè)異步進(jìn)程讀取和寫(xiě)入相同變量的地方。這些操作可能會(huì)無(wú)序發(fā)生,因此,當(dāng)一個(gè)進(jìn)程移動(dòng)得更快并且在另一個(gè)進(jìn)程有機(jī)會(huì)對(duì)其進(jìn)行設(shè)置之前讀取該變量時(shí),繁榮起來(lái)!空指針取消引用。
在2004年,OpenSSL進(jìn)行了空指針取消引用,這使攻擊者可以制定特定的SSL / TLS握手協(xié)議,使服務(wù)崩潰,從而有效地造成了拒絕服務(wù)攻擊。
通過(guò)檢查從Stack Overflow復(fù)制的代碼中的這些常見(jiàn)錯(cuò)誤,可以避免很多嚴(yán)重的安全風(fēng)險(xiǎn)。分享一些知識(shí),找出一些答案,并在那里保持安全。
作者介紹
熱門(mén)博客推薦