1. 程式人生 > >程式碼審計--17--Fortify SCA詳細(下)

程式碼審計--17--Fortify SCA詳細(下)

1.2 使用Fortify SCA

1、掃描 Java 專案

“Scan Java Project(掃描 Java 專案)”嚮導將轉換階段和分析階段合併為一個簡單的步驟。使用此功能可以掃描源那些程式碼位於單個目錄中的小型 Java 專案。

使用步驟 詳細描述
掃描新的 Java 專案 開啟 Audit Workbench。
系統會顯示開始頁面 在“New Projects(新專案)”中,單擊 Scan Java Project(掃描 Java 專案)。
系統會顯示 Browse for Folder(瀏覽資料夾)對話方塊 選擇包含所有需要分析的原始碼的資料夾,然後單擊 OK(確定)。 注意:Fortify SCA 將 Build ID 設為資料夾名稱。
系統會顯示 AuditGuide Wizard(AuditGuide 嚮導) 為需要審計的問題型別選擇相關設定,然後單擊 Run Scan(執行掃描)。
如果 Fortify SCA 在掃描原始碼時遇到任何問題,即會顯示 Warning(警告)對話方塊 單擊 OK(確定) 繼續。Fortify SCA 會分析原始碼。完成該過程之後,Audit Workbench 會顯示 FPR 檔案。

2、掃描其他專案

您可以使用“Advanced Scan(高階掃描)”嚮導轉換和分析 Java、JavaScript、PHP、ASP、.NET 和 SQL 專案。對於原始碼位於多個目錄中、具有特殊轉換或構建條件,或包含需要從專案中排除的檔案的 Java 專案,應使用“Advanced Scan(高階掃描)”嚮導。

使用步驟 詳細描述
掃描新專案 開啟 Audit Workbench。
系統會顯示開始頁面 在“New Projects(新專案)”中,單擊 Advanced Scan(高階掃描)。
系統會顯示 Browse for Folder(瀏覽資料夾)對話方塊 選擇專案所在的根目錄,然後單擊 OK(確定)。
會顯示 Commandline Builder(命令列構建器)對話方塊。該向導會自動包含所有在掃描中支援的檔案 另外,還可以新增其他目錄中的檔案:單擊 Add Directory(新增目錄)。

命令列構建器

在這裡插入圖片描述

系統會顯示 Browse to Folder(瀏覽至資料夾)對話方塊:

選擇包含希望新增進行掃描的檔案所在的資料夾。 單擊 OK(確定)。

導航面板中將會顯示該目錄,並會自動新增所有受支援的檔案以進行掃描。要刪除該目錄,右鍵單擊相應的資料夾,然後選擇 Remove Root(刪除根):

另外,可排除檔案或目錄,例如測試原始碼: 選擇所需檔案或目錄。 右鍵單擊並選擇 Exclude(排除)。

該資料夾會變成灰色:

對於 Java 專案,設定以下內容: 選擇包含類檔案的資料夾,然後單擊 Classpath Directory(類路徑目錄)。

在 Fortify SCA 轉換階段,該資料夾會變成藍色,且檔案會新增到類路徑中:

選擇專案的 Java 版本。 輸入 Build ID。預設情況下,Build ID 為根目錄。 輸入 Fortify SCA 在分析階段生成的 FPR 的路徑和檔名。 單擊 Next(下一步)。 系統會顯示“Commandline Builder(命令列構建器)”對話方塊。

命令構建器

在這裡插入圖片描述

要跳過某一階段,請取消勾選 Enable Clean(啟用清除)、Enable Translation(啟用轉換)或 Enable Scan(啟用掃描)複選框。

根據需要,修改每個 Fortify SCA 階段的命令列選項:

Enable Clean(啟用清除):刪除所有Fortify SCA與您在“Select Source(選擇源)”對話方塊中設定的 Build ID 相關聯的中間檔案和內部版本記錄。要更改 Build ID,請單擊兩次 Back(返回)。 Enable Translation(啟用轉換):建立Fortify SCA 中間檔案併為專案指定 Build ID。 Enable Scan(啟用掃描):分析原始碼並建立可以在其中新增審計資訊的 FPR 檔案。

另外,還可以單擊 Manage Rulepacks(管理規則包)以使用自定義規則包分析原始碼,或者禁用某個安全編碼規則包。系統會顯示 AuditGuide Wizard(審計指南向導)。

審計指南向導

在這裡插入圖片描述

為希望進行審計的問題型別選擇相關引數,然後單擊 Next(下一步)。 單擊 Run Scan(執行掃描)。

如果 Fortify SCA 在掃描原始碼時遇到任何問題,會顯示 Warning(警告) 對話方塊:

單擊 OK(確定)繼續。 Audit Workbench 會顯示 FPR 檔案。

1.3 審計分析結果

1、導航並檢視分析結果

在您開啟一個用來檢視 Fortify Source Code Analyzer (Fortify SCA) 所檢測到的問題的 Audit Workbench 專案之後,您可以在 Summary(摘要)面板中審計這些問題,以反映這些問題的嚴重級別,以及對該問題執行的安全分析狀態。

系統會按審計結果的嚴重性以及準確性,對審計結果進行分組,並在預設情況下將問題識別為位於“Issues(問題)”面板中的 Hot(嚴重)列表內。單擊 Warning(警告)和 Info(資訊),檢視分組在這些列表中的問題。 每個列表中的問題數量顯示在相關按鈕下面。

要檢驗與 Issues(問題)面板中所列問題相關的程式碼,選中該問題。原始碼部分包含顯示在原始碼檢視器面板中的問題,並在面板的標題中顯示檔案所包含問題的名稱。

2、審計結果分析

本練習將會引導您瀏覽一下在練習 3 中使用 Fortify SCA 分析小程式產生的結果。請您檢查 Fortify SCA 中各種不同分析器所發現的問題,並比較 Fortify SCA 生成的各種不同輸出格式。

請考慮 UserServ.java 的內容:

在這裡插入圖片描述

檢查語義問題:

下圖突出顯示了在練習 3 中的 UserServ.java 中檢測出來的 password management 問題的各個要素。

在這裡插入圖片描述

唯一識別符:開頭的十六進位制數(在此文字中以雜湊標記 (#) 代替)是一個全域性性唯一識別符,也稱為例項識別符。這些識別符以分析器找到問題的路徑、漏洞型別以及其他一些不受細小的程式碼變動影響的因素為基礎而計算得出。例如,唯一識別符不依賴於程式碼行數。除了唯一性,例項識別符還提供了其他十分有價值的功能,它們可以標識出在多次分析中或不同程式碼版本之間的相同問題,因此可以被用來追蹤審計過的問題。

嚴重性:因為這個問題可以使得任何具有訪問原始碼或者位元組碼許可權的人都可以操作資料庫,所以 Fortify SCA 把它的嚴重級別設為 high。

漏洞類別/漏洞子類別:Password Management 類中的問題都與潛在地不安全使用密碼和其他證書有關。在這個例子中,問題歸為 Hardcoded Password 子類別,是由於這裡用來連線資料庫的密碼直接出現在了原始碼中。

分析器:問題由 semantic 分析器報告。semantic 分析器以與編譯器十分相似的方式、以它定義的語義分析規則來檢查程式碼。有關分析器的更多資訊,請檢視《Fortify Source Code Analyzer 使用者指南》。

檔名/行號:雖然密碼本身出現在 UserServ.java 檔案的第 18 行,但問題被報告在第 16 行,因為使用密碼的函式在此被呼叫。

易受攻擊的方法:hardcoded password 被傳遞給了DriverManager 類中的 getConnection() 方法。 檢查資料流問題。

使用下列圖示來理解 SQL injection 問題

在這裡插入圖片描述

請注意這裡有許多欄位和上面的語義問題相同。這些欄位的含意在資料流問題(和在下面要討論的其他型別的問題)中是相同的。在這裡,您將更加關注那些沒有在語義問題中出現的欄位。資料流問題比語義問題更復雜,因為它們牽涉到原始碼中的多個地方。這是一個 SQL injection 問題,它發生在攻擊者控制的資料被用來構造 SQL 查詢時。資料流分析器將會跟蹤那些潛在的惡意輸入資料,從資料被輸入到程式中一直到它被用來作為攻擊的一部分。

Sink:sink 的檔名、行號以及方法名指出了攻擊者控制的查詢在何處傳遞到資料庫。緊隨在行號之後而在類名和方法名之前的右箭頭 (->) 指出了被感染的資料流入了 Statement.executeUpdate()。方法名後括號內的數字是這個方法的引數編號。數字 0 表示攻擊者可以控制 executeUpdate() 的第一個引數(SQL 查詢字串)。

Pass-Through:pass through 的檔名、行號以及變數名指出了將受感染的資料傳遞給 sink 的變數。雙向箭頭 (<=>) 指出了受感染的資料流入、並且流出該方法的變數 this.query。

Source:source 的檔名、行號以及方法名指出了攻擊者控制的資料第一次進入程式的位置。緊隨在行號之後而在類名和方法名之前的左箭頭 (<-) 指出 ServletRequest.getParameter() 引入了被感染的資料。方法名後括號中的單詞 return 表示是該方法的返回值持有被感染的資料。 檢查控制流問題。

使用下列圖示來理解 unreleased resource 問題

在這裡插入圖片描述

控制流問題看上去類似於資料流問題,因為它們通常包含多個結點,不同點在於這些結點所代表的操作步驟是不安全的。Control flow 漏洞被表述為一系列狀態的轉換。

開始狀態/結束狀態:第一個狀態轉換項顯示了從start狀態到connection狀態的轉換髮生在第16行。第二個狀態轉換項顯示了從connection狀態到end_of_scope狀態的轉換髮生在第44行。

轉換表示式:轉換表示式緊跟在 start 和 end 狀態名稱之後。它給出了觸發轉換的程式碼構成。從 start 到 connection 的轉換由呼叫 getConnection() 引起。從 connection 到 end_of_scope 的轉換由變數 conn 到達其域的終止處引起。

控制流分析器在程式碼中找到了一個路徑,該路徑因為沒有呼叫 conn.close() 而導致資料庫連線洩漏。雖然 conn.close() 在第 37 行進行了呼叫,但是由於第 35 行呼叫 stmt.close()有可能會丟擲異常,所以該方法並不能保證對 conn.close()的呼叫總會執行。 檢查第二種結構問題。

考慮以下 member field race condition 問題

在這裡插入圖片描述

雖然結構問題可能只是報告了一行原始碼,但是有時候它們會包含一些與程式結構相關的上下文,以便精確地指出錯誤。在這個問題中,分析器考慮了成員變數在一個繼承於 HttpServlet 的類中進行宣告的情況。 生成 Fortify Project Results (FPR) 檔案

Fortify SCA 不但能夠生成可以直接被審計員閱讀的輸出,也能夠生成一個 FPR 檔案,此檔案可以用 Audit Workbench 或者其他工具進行檢視。

再次執行 Fortify SCA,但是這一次生成 FPR 輸出。使用 -f 選項將輸出傳送給 FPR 檔案,如下所示:

sourceanalyzer -f results.fpr UserServ.java

1.4 記憶體注意事項

預設情況下,Fortify SCA 最多可使用 600 MB 的記憶體。如果該記憶體仍不能滿足分析某個特定程式碼庫的需要,您可能需要在掃描階段提供更多的記憶體。這可以通過在 sourceanalyzer 命令中使用 -Xmx 選項來實現。

例如,要讓 Fortify SCA 可用的記憶體達到 1000 MB ,可在命令中包含 -Xmx1000M 選項。

注意:為 Fortify SCA 分配的記憶體不應高於計算機本身的可用記憶體,因為這樣會降低效能。指導原則是在沒有執行其他記憶體密集型程式的情況下,分配的記憶體不能超過 2/3 的可用實體記憶體。