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