源代碼分析工具的關鍵及應避免的特征
一、源代碼分析工具的關鍵特征
一個有用且成本效率好的源代碼分析工具必須具備6種關鍵特征。
1.基于安全而設計。
軟件安全可能是軟件質量的一個子集,但是軟件安全需要像壞人一樣的思維能力。利用軟件的弱點并不是常規QA中的一種練習。
在功能測試過程中揭示的軟件缺點的處理方式可能僅僅解決了功能問題,但是安全缺點依然存在,并且通過某種出乎意料的執行路徑時就會現問題,而在功能測試過程中根本不會考慮到這種執行路徑。
不言而喻的是,軟件安全風險傾向于比常規軟件風險造成更巨大的商業影響。安全影響的代價是根據所造成商業數據損失、客戶信任和品牌忠誠度損失、停工期和不能執行商業交易的損失,以及其他的無形損失來衡量的。
簡單地說,對于健壯性而言,軟件質量工具可能有些用處,但是軟件安全工具中內置了更重要的安全知識。內置在工具內的知識庫是一個基本的決定因素。
2.支持多層模型。
很少有現代軟件應用程序是用一種編程語言編寫,或者僅針對一個平臺的。大多數企業關鍵應用程序都是高度分布式的,具有多層結構,每一層都用不同的編程語言編寫,并且在不同的平臺中執行。
自動化的安全分析軟件必須支持所程序使用的每一種語言和平臺,以及正確地在各層內和各層之間進行協商。只能分析僅僅一種或者兩種語言的工具并不能滿足現代軟件的要求。
3.具有可擴展性。
與陸地上的物種一樣,安全問題也不斷進化、成長和成熟。沒有任何一種技術或者規則集可以永遠有效地檢測所有的安全弱點。好的工具需要模塊化體系結構,支持多種類型的分析技術。
這樣,當開發出新的攻擊和防御技術時,工具就能進行擴展以包含新的技術。類似地,用戶也應該能夠增加他們自己的安全規則。每一個機構都有自己的一套集團安全政策,因此,解決安全問題的一成不變的“通用”方法是注定要失敗的。
4.對安全分析人員有用,也對開發人員有用。
安全分析是復雜和困難的。即使是最好的分析工具也不能自動地修改安全問題,就像調試器不能神奇地調試你的代碼一樣。最好的自動化工具使得分析人員可以將他們的注意力集中在最重要的問題上。
好的工具不但為分析人員提供支持,而且也為可憐的開發人員提供幫助,他們必須解決工具所揭示出來的問題。好的工具能夠使用戶盡可能有效率地找到并解決安全問題。如果使用正確,源代碼分析工具是很好的教學工具。使用它們,(幾乎是通過潛移默化)開發人員就能學到軟件安全的許多知識。
5.支持現有的開發過程。
與建造過程和IDE的無縫集成是任何軟件工具應該具備的基本特性。要使一種源代碼分析工具被接受,成為應用程序開發團隊的工具集的一部分,這個工具就必須與現有的用于不同平臺的編譯器適當地集成起來,并且支持make和ant之類的流行建造工具。
好的工具既應該集成到現有的建造過程中,也應該支持人們熟悉的開發工具,并與它們共存無礙。
6.對不同職位的人有意義。
軟件都是為了某種理由而建造的——通常是某種商業理由。安全工具需要對商業有所幫助。對大多數機構來說,關注面向安全的開發都是一種新思維。
原注:當越來越多的普通質量工具不能用來查明安全問題時,老練的審核人員卻可以用它們在代碼模塊的復雜、內聚、耦合和努力/數量關系中確定一些“跡象”——這是確定可能的安全弱點的很好的起點。在許多情形中,來自于脆弱的編碼的安全錯誤在其他正確的代碼中并不顯眼。
它們經常是更大的、更普遍的疏忽所導致的結果,從更廣義的角度,可以將它們看成一種質量錯誤。不要依賴質量衡量參數來確定安全問題,但是應該注意質量差的模塊。缺點都傾向于結伴出現。
當然,軟件安全并不是一種產品;而是一種正在進行的過程,這個過程需要整個機構的許多人的力量。但是好的自動化工具有助于將軟件安全計劃從所選擇的幾個部門擴展到整個開發公司中。
可以使用相關的衡量參數來比較發布經理、開發經理,甚至公司主管人員的看法,而且他們的觀點能為軟件發布決策提供支持,有助于控制修改軟件的費用,以及提供對軟件管理最需要的數據。
二、源代碼分析工具應該避免的三種特征
源代碼分析并不容易,而且早期的方法(包括ITS4)受到大量不利因素的困擾。一些這樣的問題仍然存在于現在的源代碼分析工具中。小心以下這些特征。
1.太多的假陽性。
早期的靜態分析方法的一個常見問題是,它們的假陽性比例太高。實際工作人員似乎覺得提供的假陽性比例小于40%的工具就能用。有時ITS4產生的假陽性比例大于90%甚至更高,使得它很難使用。美化的grep機器就有極低的信噪比。包含數據流分析能力的現代方法極大地降低了假陽性,使得源代碼分析更為有效。
2.在與IDE集成方面存在缺陷。
Emacs可能很棒,但是它并不適用于所有的人。開發人員已經有了他們喜歡的IDE,在進行安全分析時,不應該要求他們切換到其他的界面。在這方面已經進行了足夠的討論,不再贅述。
3.一根筋地只支持C語言。
典型的安全缺陷在C語言中很普遍。但是,現在的軟件都是用多種語言來建造的,并且支持多種平臺。如果你的系統不是僅僅用C語言建造的,當你審核代碼時,應該確保沒有忽略那些“非C語言”的代碼。
【編輯推薦】