根除不良軟件 解決惡意軟件
不良軟件、或是惡意軟件哪個更糟糕呢?事實上,它們有區(qū)別么?不幸的是,不良軟件與惡意軟件經(jīng)常被混淆在一起——有時甚至年長的安全老手也會犯這樣的錯誤。在本文中我會把它們兩個分開來,并且闡述它們之間共生的關(guān)系。
好消息是消滅不良軟件會有助于控制惡意軟件問題。
不良軟件
現(xiàn)如今每個人都明白軟件的缺點導(dǎo)致絕大多數(shù)的安全問題。對不良軟件“漏洞掃描”的快速檢查可以顯示我們聽說的所有問題:“緩沖區(qū)溢出、競爭條件、跨站點腳本(cross-site scripting,簡稱XSS)、SQL注入、跨站點請求偽造(cross-site request forgery,簡稱CSRF),以及上千不出名的bug(參見CWE的頂級不良軟件列表)。并且不要忘記軟件缺陷的設(shè)計問題,它占到其余50%的嚴(yán)重軟件安全缺點。
本文最重要的事情是介紹明白這些bug和缺陷很可能是由于開發(fā)人員和軟件架構(gòu)師的疏忽、馬虎或是普遍的安全愚昧等原因造成的。盡管過去幾年中,我們已經(jīng)對數(shù)以千計的開發(fā)人員培訓(xùn)了軟件安全的基礎(chǔ)知識,比起那些已經(jīng)參與過一個課程、或是閱讀軟件安全書籍的開發(fā)人員來說,還有更多的編程人員根本沒有參加過任何安全培訓(xùn)。
好的消息是開發(fā)人員們討厭bug、軟件架構(gòu)師們也討厭缺陷。所以如果我們不斷地教育他們這些缺點的本質(zhì)。他們可能會不再編寫出新的缺陷。再加之越來越多的靜態(tài)分析工具用于評審代碼、架構(gòu)性風(fēng)險分析工具用于發(fā)現(xiàn)缺陷,以及其它的軟件安全接觸點,你可以看到我們正在取得一些進(jìn)展。
這是我的主要觀點:大多數(shù)的bug不是由決心毀滅整個世界的邪惡開發(fā)人員編寫蹩腳的軟件故意放到軟件中。它們是錯誤、意外事故、或是不良后果的問題,但不是由邪惡意圖所導(dǎo)致的。
惡意軟件
病毒、蠕蟲、木馬、間諜軟件、廣告軟件、rootkits等高級持續(xù)威脅(advanced persistent threats,簡稱APT)都是各種類型的惡意軟件。惡意軟件是那些按照編寫它的人的目的,故意設(shè)計用來做壞事的代碼。這是值得重復(fù)說的,惡意軟件在許多方面都不同于不良軟件,并且首要的區(qū)別是編寫該軟件的人的意圖。
許多病毒和蠕蟲(但不是所有的)利用它們攻擊的系統(tǒng)的缺點。Ed Felten和我在90年代中期撰文寫的Java安全問題(不良軟件)被攻擊者用于編寫exploit代碼(惡意軟件)。Zeus木馬同時利用瀏覽器的特定bug和其設(shè)計上的缺陷來感染目標(biāo)機器的瀏覽器,并且執(zhí)行陰險的中間人攻擊(大多數(shù)是瞄準(zhǔn)金融服務(wù)機構(gòu))。Zeus木馬屬于惡意軟件。問題在于它為不良軟件確立了立足點。Stuxnet蠕蟲是惡意軟件。它故意用來攻擊伊朗的控制離心分離機的過程控制系統(tǒng)。Stuxnet蠕蟲利用了西門子可編程邏輯控制器設(shè)計中的不安全因素(不良軟件)。值得注意的是西門子不是開發(fā)惡意軟件的公司,而且它一直致力于提高軟件安全。
#p#
不良軟件成為惡意軟件的Vector
Vector是一個具有許多含意的詞語中。在數(shù)學(xué)上,Vector是帶有大小和方向的一條線。在傳染病學(xué)中,Vector是將傳染病從一個宿主到傳輸另外一個上的有機體。使用第2種定義,我們能夠?qū)④浖秉c(以及造成的不良軟件)概念化為用于惡意代碼傳播的途徑。
為什么這個如此重要?因為惡意軟件問題追根到底必然涉及不良軟件。這就是傳染病學(xué)的101軍規(guī),根除傳播途徑。知道為什么消滅蚊子對于戰(zhàn)勝瘧疾至關(guān)重要么?因為蚊子是一種vector。殺完蚊子接著你能直接影響瘧疾的傳播。我們所有為提高軟件安全所作的事情都是針對不良軟件。因為解決它也有助于控制惡意軟件問題。
當(dāng)不良軟件成為惡意軟件,或是邪惡的開發(fā)人員無法無天
你認(rèn)為我們已經(jīng)做得足夠了。但是這是計算機安全,所以當(dāng)然有一些特殊的情況需要考慮,假設(shè)我們“以壞人的方式”去思考。比如:想象下某個懷著邪惡意圖的開發(fā)人員有目的地在他編寫的軟件中安放bug,以便他可以在產(chǎn)品上架后售賣零日漏洞給歹徒。還有:想象一下某個邪惡的開發(fā)人員將時間炸彈木馬植入到他編寫的代碼中,并且隨后使用這個時間炸彈來敲詐依賴這些代碼進(jìn)行必要業(yè)務(wù)過程的公司。再有:想象一下邪惡的開發(fā)人員故意地編寫代碼來耗盡所有可用的計算機資源,所以運行該程序的計算機緩慢直到癱瘓。再來一個現(xiàn)代版超級精英的例子:想象一下某個開發(fā)人員為移動手機編寫了一個簡單的游戲應(yīng)用,該應(yīng)用看起來毫無害處還有趣,但是實際上將用戶的數(shù)據(jù)從手機上導(dǎo)出并且發(fā)送給攻擊者。這些問題的可能性是無窮無盡的。
我們是否可以做一些事情,來尋找木馬、以及解決像這樣故意在源代碼中放置bug的問題呢?我們能夠戰(zhàn)勝邪惡的開發(fā)人員么?或許會有些希望。
首要的事情:在一些情形下,了解是否能夠信任開發(fā)人員是至關(guān)重要的,在安全策略中應(yīng)該制定這點。例如,美國的NSA已經(jīng)發(fā)布了“解決惡意代碼風(fēng)險指導(dǎo)意見”來應(yīng)對這個問題。還有大型的跨國銀行有類似技術(shù)的規(guī)定。Cigital公司的顧問Marina Khainson一直在探索偵測她稱之為“惡意設(shè)計的要素”的思路,使用的是標(biāo)準(zhǔn)問題靜態(tài)分析技術(shù)。她最近在OWASP上討論的“惡意代碼偵測:突破靜態(tài)分析”一書介紹了使用靜態(tài)分析技術(shù)偵測惡意代碼的前期工作,并拿安卓移動手機應(yīng)用的木馬功能為例。
這兒的基本思路是什么?尋找確定的可能是可疑的靜態(tài)字符串,例如“chmod 777”或是一塊高熵數(shù)據(jù)(可能意味著是經(jīng)過加密的東西)。提防看起來不需要的奇怪的打包文件,或是高權(quán)限的系統(tǒng)調(diào)用。這些請求中的一些可以是自動化的(例如,運行對于二進(jìn)制的字符串檢查能夠產(chǎn)生有意思的東西)。其它可能需要人工的分析。結(jié)果令人振奮。
同不良軟件的戰(zhàn)斗無處不在
比起討論沒有盡頭的安全bug、討論惡意軟件或許更加有趣和令人愉快,但是如果打算戰(zhàn)勝惡意軟件,我們必須從不良軟件開始。不管怎么樣,大多數(shù)的開發(fā)人員不是邪惡的,是吧!?