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. 缺乏對駭客的問責現實是上面沒有一條能很快解決。但是軟體出現漏洞就其本身而言,真不是什麼大問題。說它脆弱是因為這些軟體在面對惡意攻擊的時候毫無抵擋之力。除
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. 缺乏對駭客的問責現實是上面沒有一條能很快解決。但是軟體出現漏洞就其本身而言,真不是什麼大問題。說它脆弱是因為這些軟體在面對惡意攻擊的時候毫無抵擋之力。除