發(fā)布于:2021-01-07 10:27:10
0
302
0
我們知道堆棧溢出是許多開發(fā)人員生活中的日常工作。我從很多人那里聽說,他們每天都來這里(如果不是經(jīng)常的話)來回答他們的問題。有時,關(guān)于代碼問題的答案是一大堆代碼。有時,該代碼會將其納入生產(chǎn)應(yīng)用程序,因為它完美地回答了這個問題。
一組研究人員調(diào)查了這些代碼段,以查看它們的安全性,以及所引入的安全漏洞是否仍在項目中易受攻擊。設(shè)拉子大學(xué)(Shiraz University)副教授Ashkan Sami,蒙特利爾理工大學(xué)(PolytechniqueMontréal)副教授Foutse Khomh和現(xiàn)為加拿大銀行高級數(shù)據(jù)科學(xué)家Gias Uddin研究了Stack Overflow上的C ++代碼段,以回答這一確切問題。(編者提示:我們之前曾與Khomh和Uddin談過他們從Stack Overflow問題和評論中獲取意見的工作。)
這些研究人員一直在研究開發(fā)人員在2018年在瑞典的一次會議上見面時如何并行使用StackOverflow。Khomh一直在研究Stack Overflow代碼中的許可問題,這使安全專家Sami懷疑該代碼是否存在可能暴露的缺陷。復(fù)制者不僅侵犯版權(quán)。
復(fù)制代碼本身并不總是一件壞事。代碼重用可以提高軟件開發(fā)的效率;為什么要解決已經(jīng)解決好的問題?但是,當開發(fā)人員使用示例代碼而不試圖理解其含義時,就會出現(xiàn)問題。“他們真的在乎對漏洞進行審查,還是只是使用現(xiàn)成的代碼,” Khomh問?!叭绻@樣做的話,這個問題還會蔓延嗎?”
研究過程
Sami和公司不是最早檢查發(fā)布到Stack Overflow的代碼中的漏洞的研究人員。在回顧現(xiàn)有文獻時,他們發(fā)現(xiàn)沒有論文討論第四流行語言C ++的Stack Overflow代碼。“我們希望專注于C ++,以更好地了解漏洞如何演變以及漏洞遷移實際上是否從Stack Overflow遷移到GitHub?!?薩米說。
他們下載了SOTorrent 數(shù)據(jù)集,其中包含了十年的堆棧溢出歷史記錄。第一次自動通過發(fā)現(xiàn)了12萬條標記為代碼段的文本。通過重復(fù)數(shù)據(jù)刪除流程和手動檢查,他們將集合簡化為2560個唯一的代碼段?,F(xiàn)在,艱苦的工作開始了。
其中三位研究人員復(fù)查了這些摘要中的每一個,以尋找經(jīng)過多輪復(fù)查的漏洞。在每個回合之后,他們必須辯護為什么每個易受攻擊的摘要都會受到整個研究小組的攻擊?!斑@是一項詳盡的工作,”薩米說。“但是他們發(fā)現(xiàn)的漏洞實際上是漏洞。經(jīng)過幾輪審查,他們歸結(jié)為69個漏洞,我們可以肯定地說它們是脆弱的?!?/span>
這69個易受攻擊的代碼段屬于29個常見弱點枚舉(CWE)類別之一。盡管69個項目看起來并不多,但他們發(fā)現(xiàn)那些脆弱的代碼段已遷移到2800多個項目中。我們不是在談?wù)搶W(xué)校項目;這些是實際的現(xiàn)場項目。公開可見的Github存儲庫中的生產(chǎn)代碼。
在發(fā)布結(jié)果之前,他們確保與所有回購所有者聯(lián)系,并告知他們代碼中的缺陷。少數(shù)人回答并解決了問題,但是有很多未回答或悄悄關(guān)閉的問題。而且那里可能還有更多?!拔覀儗嶋H標記的漏洞,我認為這是實際交換的一部分,” Khomh說。
不懂復(fù)制
團隊發(fā)現(xiàn)的許多問題都是基本的安全錯誤。但這并不意味著它們并不普遍。較常見的缺陷之一是不檢查返回值。當您不檢查C ++中的返回值時,就會冒著可怕的空指針取消引用的風(fēng)險。該錯誤立即導(dǎo)致分段錯誤并使進程崩潰。
這個錯誤很容易防范。驗證返回值為!NULL。但是事實如此普遍指出了更大的問題。Khomh說:“如果借用東西而您不了解所借內(nèi)容的內(nèi)容,那么就會陷入重用具有潛在漏洞的代碼的陷阱。然后,您只是在散布這些東西?!?如果要重用代碼,則需要了解該代碼。
這些漏洞可能使軟件向惡意行為者開放。另一個流行的缺陷是輸入驗證。像返回驗證錯誤一樣,當函數(shù)處理輸入而沒有確保它是期望的東西時,也會出現(xiàn)此缺陷。在某些情況下,這可能會導(dǎo)致堆棧溢出錯誤(即我們的名字),并可能導(dǎo)致程序?qū)⑤斎胱鳛槿我獯a執(zhí)行。Uddin說:“即使在去年,也有一些黑客活動專門針對代碼庫中的堆棧溢出漏洞。這樣一來,就可以未經(jīng)授權(quán)地訪問數(shù)百萬個用戶信息?!?/span>
薩米(Sami)和霍姆(Khomh)都是教授,因此他們遇到了學(xué)生作業(yè),并一直在重復(fù)使用代碼。通過適當?shù)臍w因和對代碼實際功能的理解,復(fù)制的代碼實際上可以幫助學(xué)生學(xué)習(xí)。但是,在大多數(shù)情況下,在不了解其工作原理的情況下復(fù)制代碼。最好的方法仍然是自己做?!袄硐肭闆r下,他們應(yīng)該創(chuàng)建解決方案并獲得滿分”,Khomh說?!叭缓笏麄儗W(xué)習(xí)了這個概念,他們實際上可以從中構(gòu)筑一些東西?!?/span>
但是,如果必須使用復(fù)制的代碼,則必須進行歸因和盡職調(diào)查。薩米說:“他們應(yīng)該相信在哪里得到的?!?再次,他們應(yīng)該檢查該組件是否可以正確地與另一個組件集成。只是一個例子,但是在阿麗亞娜五號中發(fā)生并炸毀整個航天器的問題是因為它們有整數(shù)問題。64位數(shù)字被寫入16位?!?他們重用了先前任務(wù)中的代碼,而沒有檢查它是否仍可以在新系統(tǒng)上使用。
堆??梢宰鍪裁?/span>
研究人員明確指出,這不是Stack Overflow特有的問題。任何共享代碼片段的站點都將面臨此問題。作為研究的一部分,他們創(chuàng)建了瀏覽器擴展,用于識別易受攻擊的代碼。
但是社區(qū)還有其他可以幫助的事情。首先,最重要的是要了解作為示例發(fā)布的代碼片段不是可用于生產(chǎn)的代碼。在不理解代碼并對其進行測試之前,請勿將其復(fù)制到項目中。通過擴展,您可以了解研究人員標記為有風(fēng)險的摘要,但始終會添加新的答案。
他們還建議利用社區(qū)中的安全專家。Uddin說:“現(xiàn)在,作為一個整體的Stack Overflow社區(qū),對于開發(fā)人員來說,他們印象非常深刻?!?“他們彼此之間非?;?。如果我們能夠激勵安全專家提高認識并教育用戶社區(qū),我們不僅將使代碼更安全,還將向?qū)⒁褂迷摯a的用戶提供更多信息?!?/span>
因為最終,這些研究人員也是教育者。他們認為堆棧溢出可以幫助教育好奇的提問者有關(guān)安全性和編程技術(shù)的知識。正如薩米教授所說:“不僅提供答案,而且還提供有關(guān)代碼是否安全的見解。”