從我成立IT咨詢公司以來的十年時間,我和全球成千上萬的軟件開發員打過交道,也見過各種不同的安全故障。經常會有人問我:什么是最糟糕的軟件安全錯誤?
當然,我不會像“OWASP Top 10”(OWASP:開放式web應用程序安全項目)那樣做一個具體的列表來告訴你答案,因為在我看來,安全問題的發生最主要來源于兩大方面:一是軟件開發人員過于專注軟件的功能規格,另一個則是過于信任軟件的安全系數。
我遇見過的軟件開發人員大多數都很聰明、很上進,而他們總是在壓力極大的環境下工作,總是在看似不可能完工的最后期限內將產品做出來。在這樣的情況下,開發人員往往只關注產品的功能,而對其他方面,比如安全,則欠缺考慮。因為“客戶需要什么樣的功能”的問題顯然比“哪里可能出岔子”或“攻擊者如何誘騙軟件出現異常行為”來得更為迫切。
另一方面,開發人員普遍低估了軟件隱藏的安全威脅。因為開發人員往往過于信任用戶及用戶在代碼中所使用的應用編程接口(API)。
一旦開發人員一味注重開發功能,而不事先做足準備來防止潛在攻擊,那么軟件經常出現故障,也是理所當然的事了。
當然,功能的開發也相當重要,但是防止代碼出現異常的準備是必不可少的。然而,做好這點并非易事。
兩件事情或許對于做好這點有所幫助。首先,積極主動地通過應用軟件對數據進行編排處理。前期要嚴格驗證數據的輸入,后期則要確保數據的輸出不會給預期環境造成任何破壞。第二,預測異常情況,并采取合理的處理措施。只要有可能,就要積極驗證所有輸入的數據。比如,如果你要求的數據是整數,那么不是整數的任何數字都將是危險的,這被稱為積極驗證;有別于消極驗證,消極驗證是指通過尋找已知的危險的輸入內容,并阻止那些內容輸入。但我建議最好避免采用消極驗證,因為我已看到過無數個消極驗證失敗的例子。
接下來,在輸出數據時,你需要編排處理該數據,防止數據在你輸出時的任何地方引起問題。比如,要是輸出上下文是XML格式化的,那么你的用戶數據絕對不能含有“<”或“>”之類的元素。倘若沒有做到這一點,每次輸入都會受到攻擊。
對于專業人員來說,軟件就好比是小孩,安全人員則是第一看護人,他們會注意到潛伏的危險,并習慣于最先考慮哪些方面會出岔子;開發人員則更像第二看護人,他們盡量不在交通高峰期帶孩子出去散步,盡量避免出岔子。安全人員和開發人員如果能卓有成效地協同工作,大家就能夠從中受益。
最近,我與一群軟件開發人員進行合作,他們接受了我的這些建議,并且很快便心領神會。事后,我的客戶告訴我,在這個項目完工后的一天內,他數次接到了開發人員和安全團隊提出的請求,要求探討兩個部門如何能夠更好地協同工作。(編譯沈建苗)