為什麼總有無數的Bug困擾著程式設計師

edithfang發表於2014-09-27
在程式碼上耗費的時間和資金越多,程式防禦力就越強——但是黑客們總有辦法找到其中的漏洞。

又是整整一個月,整整一個月忙著安裝補丁——迴環往復、無窮無盡,一想起來就頭大。

我們的軟體編碼工具有著預設的內建安全防禦措施,我們的程式語言是安全的,我們的程式設計師使用的是SDL(securitydevelopmentlifecycle)編碼工具和技術,我們的作業系統有著不斷升級的安全設定,供應商也一直不斷地偵查和攻擊自己的軟體意圖找到漏洞,甚至還有的公司花費幾十億美元用於消除軟體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.缺乏對黑客的問責

現實是上面沒有一條能很快解決。但是軟體出現漏洞就其本身而言,真不是什麼大問題。說它脆弱是因為這些軟體在面對惡意攻擊的時候毫無抵擋之力。除非我們能制止黑客的猖獗行徑,否則惡意軟體將會一直困擾著我們。
但是我依然深信,將來有一天我們的網際網路會有更好的普遍標準出臺,我們能在現實中及時地將那些損害大家利益的傢伙繩之以法。不過在此之前,我們還是得不斷地寫補丁,在黑客的狂轟濫炸下苟延殘喘。

英文原文:5 reasons why software bugs still plague us

翻譯作者:碼農網 – 小峰
來自:碼農網
評論(4)

相關文章