為什么總有無數的Bug困擾著程序員
在代碼上耗費的時間和資金越多,程序防御力就越強——但是黑客們總有辦法找到其中的漏洞。
又是整整一個月,整整一個月忙著安裝補丁——回環往復、無窮無盡,一想起來就頭大。
我們的軟件編碼工具有著默認的內置安全防御措施,我們的編程語言是安全的,我們的程序員使用的是SDL (security development lifecycle)編碼工具和技術,我們的操作系統有著不斷升級的安全設置,供應商也一直不斷地偵查和攻擊自己的軟件意圖找到漏洞,甚至還有的公司花費幾十億美元用于消除軟件bug。
我們一直在勤勤懇懇努力著,但是為什么還有這么多漏洞?為什么這些漏洞能逃過fuzzers和測試人員的層層抓捕?
下面就是為什么我們的軟件之所以依然充滿漏洞的5大原因:
1.人的天性
大多數——當然不是全部——軟件bug源于我們自己犯的錯誤。雖然有些是因為軟件編碼工具和編譯器發生了意外,但是大部分的錯誤得歸咎于我們自己。
無論我們受到的SDL培訓和安全工具有多么強大,只要我們還是人,我們就會犯錯。如果你想問為什么電腦軟件會有這么多的漏洞,歸根到底是因為,人的天性就是容易犯錯。
也就是說,我們在減少人為錯誤方面做得還不夠。有很多程序員因為沒有受到足夠的SDL培訓(有的甚至干脆就沒有培訓),所以根本就沒有安全編程的理 念。有時候我特別奇怪:有那么多的程序員以寫安全軟件為生,卻居然不懂如何安全地編程。別不信,我敢打賭,你正在運行的銀行安全軟件中的bug不會比它能 提供的保護措施少,搞不好甚至更多。
但是即使是那些經過嚴格訓練的程序員還是不可避免出現bug。舉個例子,前不久有個自鳴得意的家伙發明的使用HTML標記字段確定顏色的緩沖區在瀏 覽器中溢出了。不像以前還要輸入FFFFFh之類的東西,黑客甚至可以直接執行顏色域的代碼,從而導致瀏覽器過度消耗資源、緩沖區溢出。看到沒有,這就是 漏洞!而且很少會有人能預料到這種情況。
2.不斷增加的軟件復雜性
就其本質而言,軟件越復雜,就意味著代碼行數越多。只要你在編程,那么即使你有多擅長寫代碼,也一定會有錯誤和bug出現。有人曾說,如果你能做到 每50行代碼中只出現一個錯誤,那你就已經做得相當好了。大多數程序員差不多每隔5至15行就會犯錯。想象一下,這么說吧,一般性的Linux內核擁有超 過1500萬行的代碼,有多少bug你自己算吧!
即使沒有編碼錯誤,互聯網時代應用程序的整體互動性也是漏洞被攻擊的途徑。大多數程序員不得不和其他API協作,保存和檢索文件,在多種設備上正常工作。所有這些過程都會增加被成功擊破的概率。
而要防守的話,則需要寫更多的代碼,因為得抵御各種不同的攻擊渠道。這么說吧,如果有一個只有30條匯編語言指令的惡意程序,那么針對相應的防守,你可能至少得寫50000條匯編語言指令!
3. Fuzzers也是人寫出來的
新近冒出來的Fuzzers軟件主要用于掃描軟件漏洞。Fuzzers——以及其他用于尋找編碼錯誤和漏洞的任何程序——都是人寫出來的,還是這句 話,是人就會犯錯誤。例如Fuzzers是不會發現顏色屬性的緩沖區溢出這種情況的,這是因為我們在寫Fuzzers的時候沒有考慮這一方面。不過當我們 意識到這一點并對Fuzzers進行更新之后,就能做到去查找各種類似的緩沖區溢出條件的字段。簡而言之,我們要Fuzzers做什么,它才會去做什么。
4.缺乏對供應商的問責
許多安全專家抱怨,只要我們不能找到證據起訴供應商的軟件缺陷,我們就永遠不會變得更安全。我贊同這一點,增加對供應商的問責有助于降低安全風險, 但是同時卻有可能會減緩進度。不過如果軟件公司比現在更能擔當起責任來,那么我想我們能在手機上、電腦上能自由自在沖浪的感覺會更爽。
但是成功源于功能和速度,而非安全。社會現狀決定了我們必須犧牲一部分安全和保障去換取新鮮感。這不一定是壞事——因為能讓我們成功得更快。但是這樣一來我們就不得不承擔這樣做的后果。不過到目前為止,我們還是心甘情愿為了添加更酷的新鮮玩意兒而面對更多的風險。
5.缺乏對黑客的問責
現實是上面沒有一條能很快解決。但是軟件出現漏洞就其本身而言,真不是什么大問題。說它脆弱是因為這些軟件在面對惡意攻擊的時候毫無抵擋之力。除非我們能制止黑客的猖獗行徑,否則惡意軟件將會一直困擾著我們。
但是我依然深信,將來有一天我們的互聯網會有更好的普遍標準出臺,我們能在現實中及時地將那些損害大家利益的家伙繩之以法。不過在此之前,我們還是得不斷地寫補丁,在黑客的狂轟濫炸下茍延殘喘。
譯文鏈接:http://www.codeceo.com/article/5-reason-bug-plague-programmer.html
英文原文:5 reasons why software bugs still plague us
翻譯作者:碼農網 – 小峰