1. 程式人生 > >Fortify SCA快速入門以及常見問題解決方法

Fortify SCA快速入門以及常見問題解決方法

本篇將透過HP_Fortify_SCA_and_Apps_3.80從實用主義的角度入手,使讀者能夠快速的對該工具進行使用和對一些可能出現的常見問題進行處理,從而完成一個完整流程的原始碼安全性靜態掃描測試。

快速入門

  • 規則庫匯入:
    所有的掃描都是基於規則庫進行的,因此,建立掃描任務的前提條件就是你需要把檢查規則拷貝到HP_Fortify\HP_Fortify_SCA_and_Apps_3.80\Core\config\rules資料夾下,拷貝後便為掃描建立了預設的規則庫。另外,你也可以自定義規則,這些內容將會在以後逐一介紹。

  • 建立和執行掃描任務:
    我們分別通過Java、.Net C#和C/C++三類不同程式語言專案來介紹如何快速建立和執行掃描任務:
    Java專案:


    Fortify SCA對於Java專案的支援是做得最好的,建立掃描入口的路徑選擇非常多,常用的方法是直接執行HP_Fortify\HP_Fortify_SCA_and_Apps_3.80\bin\auditworkbench.cmd,啟動審計工作臺就可以直接對Java專案進行靜態掃描;另外也可以使用Fortify SCA外掛,整合嵌入Eclipse來完成開發過程中的實時掃描;當然,你也可以使用原生的命令列工具完成全部工作,我們這裡介紹一個通用的方法,即利用ScanWizard工具匯入你的原始碼專案,通過一系列設定後,會生成一個批處理指令碼檔案,通過批處理代替手工輸入執行命令進行測試。
    使用HP_Fortify\HP_Fortify_SCA_and_Apps_3.80\bin\ScanWizard.cmd啟動ScanWizard工具:
    這裡寫圖片描述

    通過該頁面可以選擇你待掃描的Java專案根目錄,如下圖:
    這裡寫圖片描述
    通過該頁面你可以Review由Fortify幫你候選好的待掃描檔案的情況,並通過人工對其進行調整,以滿足你自己的掃描需求;
    這裡寫圖片描述
    另外,也會列出所有你已經選擇的待掃描檔案的檔案型別(Fortify所支援的程式語言),你可以通過勾選選擇你要掃描的型別。
    這裡寫圖片描述
    這裡寫圖片描述
    對於Java專案,通過該頁面你可以Review由Fortify幫你候選好的ClassPath,即你專案中引用的所有Jar包,一旦存在引用缺失,它會清晰的對你有如下提示:
    這裡寫圖片描述
    這樣就有助你把所有Jar檔案找到並設定對應的ClassPath,像如下方式通過勾選設定:
    這裡寫圖片描述
    這裡寫圖片描述

    對指令碼的生成環境、指令碼檔案的生成路徑、名稱進行配置;
    對掃描階段進行引數項的配置:
    這裡寫圖片描述
    最終將按配置生成一個批處理或Shell指令碼,執行即可完成測試。
    .Net C#專案:
    對於.Net C#專案我們同樣以ScanWizard工具為例進行說明,與Java專案的區別是Fortify SCA需要依賴.Net SDK和VisualStudio環境, 因此,需要安裝對應版本的相關軟體產品。
    另外,就是通過如下介面設定原始碼內部所依賴的所有動態連結庫(DLL)的路徑:
    這裡寫圖片描述
    當然,除了以上方法,你也可以通過使用Fortify SCA的VisualStudio外掛,來完成開發過程中的實時掃描。
    C/C++專案:
    最後說說C/C++專案,C專案的掃描依賴C/C++編譯器,比如Linux上的gcc、g++編譯器,Windows上的CL編譯器等。在此,我們主要以Linux作業系統下的C專案為例進行介紹,我們完全依靠命令列工具進行掃描,主要的方法是轉換過程需要藉助C原始碼專案中Makefile,主要過程如下:
    (1)cmdmake clean
    (2)cmdsourceanalyzer -b <build_id> touchless make 建立轉換過程
    (3)cmdsourceanalyzer -b <build_id> -scan -f result.fpr進行原始碼掃描,並輸出結果

  • 結果審計:
    掃描的執行很簡單,關鍵是對掃描結果進行review和audit,甄別出真正存在安全風險的程式碼,這類工具誤報率都是很大的,通過執行HP_Fortify\HP_Fortify_SCA_and_Apps_3.80\bin\auditworkbench.cmd,使用審計工作臺完成對原始結果的審計,最終可以匯出安全報告和開發者報告。

常見問題解決方法

記憶體不足問題

在應用Fortify SCA實施原始碼掃描過程中記憶體不足是分析器(sourceanalyzer)經常報出的一類問題,如下:
掃描過程中:

com.fortify.sca.analyzer.AbortedException: There is not enough memory available
to complete analysis.  For details on making more memory available, please consult the user manual.

結果過程中:

There were 3 problems with insufficient memory. Results may be incomplete. Consider allocating more memory.

因此,我們必須對JVM引數進行調整,增加虛擬器記憶體大小。
(1)確認安裝64位的Fortify SCA程式;(這是一個眾所周知的JVM問題,32為虛擬機器記憶體大小及其有限);
(2)安裝一個64位的jre,並將其替換HP_Fortify\HP_Fortify_SCA_and_Apps_3.80\的jre目錄(就算你安裝了64位的Fortify SCA程式,該程式預設的jre仍然是32位的);
(3)調整掃描引數,如下所示:

sourceanalyzer  -64 -Xmx4096M -Xms4096M -Xss24M ......

或通過修改ScanWizard工具所生成的指令碼檔案:

set MEMORY=-64 -Xmx4096M -Xms4096M -Xss24M

這樣,我們就解決了記憶體不足的問題。

.Net環境匹配問題

由於Fortify SCA版本對於支援.Net環境的版本有限,比如最大支援到Microsoft SDK 7.0A
版本的SDK,如下指令碼:

echo Searching VS Version....
reg QUERY "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" 2>NUL >NUL
IF %ERRORLEVEL%==0 (
set LAUNCHERSWITCHES=-vsversion 10.0 %LAUNCHERSWITCHES%
echo Found .NET 4.0 setting to VS version 10.0
GOTO VSSELECTED
)

通過Windows登錄檔中的SDK資訊設定掃描依賴版本;
而且,由於Windows版本和.Net Framework版本的差異,環境上往往需要自己增加許多配置項,最常見的配置如下:
(1)SDK版本設定:
比如是8.1版本的,我們可以修改指令碼檔案:

reg QUERY "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v8.1A" 2>NUL >NUL

(2)ildasm路徑設定
Unable to locate ildasm是一個常見問題,在轉換中沒有尋找到ildasm程式,可以通過以下方法設定:
1、fortify-sca.properties檔案增加一行com.fortify.sca.IldasmPath=C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm(一定是雙斜槓)
2、指令碼中的Translating過程中增加一行,如:

echo Translating files
echo %SOURCEANALYZER% %MEMORY% %LAUNCHERSWITCHES% -b %BUILDID% @%ARGFILE%
%SOURCEANALYZER% %MEMORY% %LAUNCHERSWITCHES% -b %BUILDID% @%ARGFILE% -Dcom.fortify.sca.IldasmPath="C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm"
IF %ERRORLEVEL%==1 (
echo Sourceanalyzer failed, exiting
GOTO :FINISHED
)

(3)依賴DLL的設定
在通過ScanWizard設定原始碼內部所依賴的所有動態連結庫(DLL)的路徑過程中,不會像Java專案一樣報出哪些庫未正確引用,只有當執行掃描時才會進行警告,因此,需要返回來通過警告資訊進行設定,為“-libdirs”設定正確的路徑,主要的引用目錄路徑為:
C:\Windows\Microsoft.NET\Framework和C:\Windows\Microsoft.NET\Framework64。