Global Sources
電子工程專輯
 
電子工程專輯 > 嵌入式技術
 
 
嵌入式技術  

利用靜態分析工具尋找網際網路應用漏洞

上網時間: 2007年05月30日     打印版  Bookmark and Share  字型大小:  

關鍵字:原始程式碼  靜態分析  分析器 

在程式執行期間,靜態原始程式碼分析器會試圖找出可能導致緩衝器溢出、資源泄漏或其他安全與可靠性方面問題的程式碼序列。原始程式碼分析器能有效查找某些類型的漏洞,包括無法在標準建構期間透過編譯器檢測出的漏洞;以及通常無法在執行時測試期間發現的漏洞。最近,在數種廣泛用於網際網路通訊的開放原始碼應用中,均己採用Green Hills Software的原始程式碼分析器查找漏洞。

原始程式碼分析器通常作為獨立的工具使用,與用於建構應用程式碼的編譯器無關。但有時分析器會內建在用於建構量產程式碼的相同編譯器中。

這種分析器運用編譯器的資料流程演算法優勢執行其查錯任務。對編譯與分析而言,使用單一工具的優勢之一是僅需進行一次原始程式碼分析,而非兩次。此外,當檢測出漏洞時,原始分析可被配置並提示‘建構錯誤’,以便開發人員迅速發現和修改錯誤。

標準的編譯器會針對基本程式碼問題發出警告和錯誤資訊,如違反語言標準,或使用依實作定義(implementation-defined)的構造。相較之下,分析器可執行完整的程式分析,發現由各段程式碼之間複雜相互作用引起的作用,即使這些程式碼並不在相同的原始檔案中。

這種分析器會確定所有可能的程式碼執行路徑,包括進入和越過副程式呼叫的路徑,以及程式物件的值,如聚合內的獨立變數或欄位如何在這些路徑上變化。這些物件值可以儲存在記憶體或計算機的暫存器中。

分析器可查找各種類型的漏洞。它會查找並未產生錯誤警示,但被正常編譯的錯誤。以下面為分析器可檢測出的常見錯誤:

無效的引用指針(NULL pointer dereferences);

超過分配區域的存取範圍(如陣列或動態分配緩衝器),又稱為緩衝器溢出;

可能寫入唯讀記憶體;

可能讀取未初始化物件;

資源泄漏(如記憶體泄漏和檔案描述器泄漏);

使用已被解除配置的記憶體;

超出記憶體使用範圍(如從副程式返回一個自動變數的位址);

無法設定副程式的返回值;

緩衝器和陣列下溢。

分析器瞭解許多標準的執行時副程式庫行為,它知道副程式(如free)應該將指標傳遞給由副程式(如malloc)分配的記憶體。分析器會利用此一資訊(或利用某個呼叫的結果)來檢測這些副程式碼中的錯誤。

減少誤報

該分析器還可以學習由用戶定義的副程式特性。舉例來說,若客戶使用定製記憶體分配系統,分析器可學習查找該系統的誤用情況。

透過教導分析器瞭解副程式特性,用戶能減少誤報(false positives)次數。誤報是一種可能不會發生在程式實際執行期間、但可透過分析器識別的潛在漏洞。原始程式碼的主要設計目標之一是減少誤報次數,讓開發人員將檢查時間減至最少。

若分析器產生太多誤報資訊,就會產生反效果,因為工程師會逐漸不再重視它提供的結果。在減少誤報方面,這種分析器優於傳統的Lint等Unix編程工具。然而,由於分析器無法理解全部程式語義,因此無法完全消除誤報。

在部份情況下,分析器發現的漏洞也許不會引發致命的程式錯誤,但可能會顯示一個應該修改的可疑結構,如寫入一個未來不會再讀取的變數,從而提高程式碼的清晰度。

複雜性的控制

目前已經有許多關於在副程式級降低複雜性所帶來之優勢的文章發佈。將一個軟體模組劃分為若干較小的副程式,將使每個副程式都更容易理解、維護和測試。透過計算複雜性的基準,並在複雜性超出基準時產生‘建構時錯誤’的提示,將能輕易地在建構階段實現降低編碼規則的複雜性。

原始碼分析器還能隨意檢查程式碼複雜性。由於分析器已穿越程式碼樹,因此它無需花費大量時間進行簡單的複雜性運算,如通用的McCabe複雜性基準。透過配置,一些分析器可產生‘建構錯誤’的提示,以指出引發問題的副程式。

因此,開發人員不會意外地製作出違反規則的程式碼。通常,一個好的分析器可協助執行編碼標準,否則就需透過人工或非整合的第三方產品來反覆檢查。

分析器的輸出結果

各種分析器的輸出格式均不相同,但它們都透過一個共同的機制產生直觀易讀的網頁,並由一個整合的網路伺服器管理。用戶可瀏覽分析器對所查找出漏洞的高階摘要,然後點選超連結進入特定問題分析。在特定問題的顯示視窗中,漏洞會以符合其周圍環境程式碼的形式顯示,讓用戶更容易瞭解。

函數名稱和其他物件均以超連結形式顯示,以便瀏覽原始程式碼。由於網頁執行於網路伺服器下,因此開發團隊的成員均可輕易透過網路瀏覽。

分析時間

顯然,分析時間是這些工具被廣泛採納的主要因素之一。我們利用Green Hills編譯器和原始程式碼分析器進行了建構和分析時間的比較,以判斷在正常情況下使用分析器是否會增加額外的開銷。

使用執行Linux的單機桌上型電腦,Apache Web伺服器的建構時間是1.5分鐘。在同一台電腦上,原始程式碼分析時間是3.5分鐘。使用分散式PC的建構時間是30秒。

而採用Green Hills分散式建構系統,在網路中的各台PC上,原始程式碼處理是自動平行化的。系統只使用具有空閒週期的PC。我們在測試環境中配置了15台PC作為工作電腦,其中約有10台可在任意時間內進行建構。

使用分散式處理的原始程式碼分析時間是1分鐘,顯著小於採用一台專用PC所需的標準編譯時間。

非常明確的是,當使用常見的PC資源能在1分鐘內分析200,000行程式碼時,就沒有理由不讓所有的開發人員採用這些工具。

Green Hills原始程式碼分析器已為最近問世的Apache、OpenSSL和sendmail等三種重要開放原始碼工具查找出了一些漏洞。

據apache.org網站資料顯示,Apache開放原始碼HTTP伺服器是全球最通行的網路伺服器,有70%以上的網站採用。鑒於Apache的普及和全球對網際網路的依賴,Apache的可靠性和安全性已成為眾所矚目的問題。Apache網路伺服器包含了近200,000行程式碼,80,000條獨立的可執行敘述以及2,000個函數。此次測試版本為2.2.3版。

OpenSSL是SSL和傳輸層安全(TLS)的一種開放原始碼實現方案。TLS則是SSL的最新實現方法,但SSL經常作為涵蓋兩種協議的通用術語。事實上,SSL已成為網際網路上安全通訊的主要基礎。例如,SSL能讓用戶把隱秘的信用卡資訊安全地從自己的瀏覽器發送到遠端商務伺服器中。OpenSSL包含約175,000行程式碼,85,000條獨立的可執行敘述及5,000個函數。此次測試版本為0.9.8b版。

據wikipedia.org資料顯示,sendmail是網際網路上最通用的電子郵件伺服器軟體。自1980年代初期開始,Sendmail就一直是Unix(現為Linux)系統郵件發送代理的實際標準。Sendmail包含約70,000行程式碼,32,000條獨立的可執行敘述,以及750個函數。此次測試版本為8.13.8版。

查找出的漏洞

在上述三個測試系統中,分析器所能發現的最常見漏洞為無效的引用指針(NULL pointer dereferences)。在某些情況下,在某些情況下,這與呼叫一些跟隨返回指針存取,但並未事先針對NULL返回進行檢查的記憶體分配副程式有關。這是程式的強韌性問題。理論上,所有的記憶體分配失效情況都可獲得良好的解決。

如果出現暫時的記憶體耗盡情況,服務可能出現不暢通的現象,但不會終止。這一點對Apache和sendmail等伺服器程式尤其重要。此時可導入演算法,以防止在過載條件下(如因惡意攻擊造成)服務被拒絕的現象。

Apache Web伺服器、sendmail和OpenSSL都充分利用了C的執行時資料庫動態記憶體分配。與Java自動執行垃圾收集不同,採用標準C執行時的記憶體分配需要應用程式來處理記憶體耗盡問題。如果記憶體分配呼叫失敗並返回一個NULL指標,則隨後在未防備情況下引用結果指標(result pointer),幾乎都會引起致命性的崩潰。

緩衝器下溢的定義是在緩衝器或陣列被分配前,就試圖存取記憶體。如同緩衝器溢出,緩衝器下溢也會因記憶體的意外崩潰導致許多潛在問題。目前已在sendmail和OpenSSL上發現了這類漏洞。此外,OpenSSL還被發現具有記憶體泄漏問題。

繼續尋找漏洞

還有什麼應用會比當前通行的開放原始碼網際網路通訊更能展現自動原始碼分析器的重要性呢?這種採用開放原始碼的軟體,代表著它可望具有極高的程式碼品質。

不幸的是,在Apache等複雜的軟體應用程式中,並無法透過手動檢查發現漏洞。目前有許多機制可協助改善軟體,包括改良的測試和設計範例。

但自動化的原始程式碼分析器是最被看好的技術之一。原始程式碼分析器應該成為每一個軟體團隊在開發過程中的必要設備。它不僅能有效確認異常狀況,也幾乎不影響建構時間,而且很容易與通用軟體發展環境整合。

作者:

David N. Kleidermacher

工程副總裁

Green Hills Software




投票數:   加入我的最愛
我來評論 - 利用靜態分析工具尋找網際網路應用漏洞
評論:  
*  您還能輸入[0]個字
*驗證碼:
 
論壇熱門主題 熱門下載
 •   將邁入40歲的你...存款多少了  •  深入電容觸控技術就從這個問題開始
 •  我有一個數位電源的專利...  •  磷酸鋰鐵電池一問
 •   關於設備商公司的工程師(廠商)薪資前景  •  計算諧振轉換器的同步整流MOSFET功耗損失
 •   Touch sensor & MEMS controller  •  針對智慧電表PLC通訊應用的線路驅動器
 •   下週 深圳 llC 2012 關於PCB免費工具的研討會  •  邏輯閘的應用


EE人生人氣排行
 
返回頁首