前言
近半年手頭上的工作內容一直都是調整各種原始碼弱掃修正,最近碰上一個不是拿著別人掃好的原始碼,而是要協助產生測試報告,以前都是拿著Fortify SCA產出來的報告去改成是,這次是能夠自己來操作了。
雖然不知道為什麼,每次碰上Fortify,它的公司似乎一直換來換去,但除了checkmarx之外,這個也是很常見被拿來做原始碼掃描的軟體。
當初公司能夠開始使用Fortify掃描的時候,只有依稀記得是請人來演示如何將Fortify結合IDE工具,做到即時或者至少是很簡單的從GUI上面執行一個專案的原始碼掃描,但是後面再碰到就是看著天書一般的批次檔,說把批次檔放對位置就能跑這樣,要做的事情通常就是把一些認為是誤判或者不會有弱掃軟體預期的弱點的部分做排除,或者要讓弱點從報告上消失這樣。
環境
這次就沒有環境了,畢竟是使用公司的資源,手上也沒有序號或安裝檔之類的來做Lab環境。
連圖都不想放,免得被說嘴~XD
操作流程
前面有說到,我收到要做的事情的時候,知道的事情就只有把批次檔放在對的位置,程式碼也放在那,按下去就等它掃完結束。但如果真的這麼簡單,我就不會特別寫一篇紀錄了!
想像上的操作總是非常的簡單,批次檔打開就知道案情不單純,因為原始碼是使用dotnet作為後端、angular作為前端,但是檢視批次檔的內容,就發現條件裡面沒有寫要掃描dotnet的部分,仔細一看掃描出來的弱點,確實也只有前端的部分(雖然是誤判)。
那也沒什麼關係,就比照更早之前使用另外一台弱掃機的時候(沒錯,這已經是我第二次來用這種東西了,但是這次用的是另外一台安裝比較新版的弱掃機),重新產一下批次檔,把需要掃dotnet的部分加進去就好了吧?於是我打開了 Fortify Scan Wizard,dotnet呢?
後來發現,應該是安裝Fortify的時候,安裝了複數的版本,可能只是我開錯版本了。
客戶的資安單位曾經對我說過一句話:「我只知道按下開始掃描而已,剩下都不會,你就是幫我用到變成零風險就對了」,讓我永生難忘。
為了不要變成像那樣的人,我決定「簡單」只抓關鍵部分掃一下掃描該怎麼操作,有哪些變數可以控制或調整。稍微看過文件與大略查詢一下一些教學文章之後,大部分會教學打開Fortify Scan Wizard,接著就是一步一步做下去,但目前的問題點就在於打開之後沒有出現我想要的dotnet可以選擇。
以下就只是個人抓重點的方式,可以不用參考,最後會再整理一次執行的步驟
再來就是看到一些討論是在說,是不是沒有安裝dotnet的rule?畢竟是公司專門拿來做源碼掃描的機器,就算沒安裝我也不敢擅自安裝,要裝也是要先找好怎麼裝再說
但是怎麼想,只要號稱支援dotnet掃描的源碼掃描工具,通常都需要結合msbuild才可以進行,所以還是去檢查一下真的原廠的說明文件,確認一下操作步驟該怎麼執行
殊不知就算查了最新版本(25.2)的操作文件列表,也看不到該怎麼操作(時至2025.06.29,仍然沒有看到),因此再往回退一版(24.4)去參考想要看到的「Fortify Static Code Analyzer User Guide」,也就是Fortify SCA的操作手冊
章節目錄其實也列好了針對什麼程式語言做什麼處理,偏偏就是沒有我想知道的dotnet,不過依然有看到一線希望,當初fortify對我們公司進行一點簡單的教育訓練的時候,就是使用微軟的Visual Studio的擴充套件進行演示,也沒有看到有做什麼額外安裝rule的動作,感覺應該是預設就有裝載的功能
快速就感覺需要知道的章節掃過一輪之後,掃描一個專案要完成的事情如下
- 建立一個fority SCA的專案 (可略過)
- 開始往那個專案裡面塞要掃描的資料 (translating)
- 執行掃描 (scan)
額外還需要知道的是,該如何去排除誤判的弱點,排除的方式有幾種,但主要就是要準備好寫好規則的filter file給fortify SCA去讀取
- 直接從掃描檔案中排除 (exclude)
- 從已掃描的弱點中排除 (filter file,列出instance id)
- 從掃描的模式(pattern)中排除 (filter file,列出pattern id)
- 從掃描的規則(弱點規則名稱)中排除 (filter file,列出弱點名稱)
如果是透過 Fortify Scan Wizard 建立的batch檔案,這一步會卡很久,因為他寫在cmd的註解上,透過讀取註解去建立filter檔案,最後再執行
以上就知道要完成的事情其實沒有像Fortify Scan Wizard建立出來的batch檔案這麼複雜才對
再來整理一次本次要達成的目標
- 建立fortify SCA專案
- translating Visual Studio projects
- translating 前端檔案
- 執行掃描
額外加碼參考指令,因為需求是要使用最新的forify SCA,因此先執行了一次確認版本的指令碼
sourceanalyzer -version
會顯示當前fortify SCA的安裝版本與模組(其實早就執行過,我才確認可以跑這樣的形式XD)
清除現有專案的檔案,排除先前舊專案的影響
sourceanalyzer -b {專案名稱} -clean
執行translating,將要掃描的檔案放入fortify SCA的掃描池中
sourceanalyzer -b {專案名稱} -exclude {要排除的實體檔案} -Dcom.fortify.sca.EnableDOMModeling=true {串接msbuild的指令,指定專案}
REM 例如以下建立掃描專案Foo,排除node_modules路徑下檔案,開啟DOMModeling設定,串接msbuild建置foo.sln專案
REM sourceanalyzer -b Foo -exclude "**/node_modules/**/*.*" -Dcom.fortify.sca.EnableDOMModeling=true dotnet msbuild /t:rebuild foo.sln
※ sln方案中,部分專案已經有把前端檔案納入,但因為專案中如果有寫建置時,同步執行npm install的話,會將這些套件納入掃描,所以透過exclude參數排除(雖然我有照原廠說明下了一些參數,但還是只有直接透過路徑排除生效我就不深究了)
最後再來加碼一條顯示目前專案中要掃哪些檔案的指令
sourceanalyzer -b {專案名稱} -show-files
檢查完確認該進去的檔案就可以開始執行掃描了
sourceanalyzer -b {專案名稱} {最大使用記憶體} {最小使用記憶體} -scan -f {產出的報告fpr檔案} -filter {建立的filter檔案}
REM 例如
REM sourceanalyzer -b Foo -Xmx16G -Xms8M -scan -f c:\Foo\foo.fpr -filter "foo.filter.txt" -verbose
最後完成的指令碼
REM 顯示掃描軟體目前版本
sourceanalyzer -version
REM 清除 專案Foo的內容
sourceanalyzer -b Foo -clean
REM 執行 Translating Visual Studio project - foo.sln
sourceanalyzer -b Foo -exclude "**/node_modules/**/*.*" -Dcom.fortify.sca.EnableDOMModeling=true dotnet msbuild /t:rebuild foo.sln
REM 顯示 專案Foo要掃描的檔案
sourceanalyzer -b Foo -show-files
REM 執行 專案Foo掃描,排除foo.filter.txt的內容,產出報表檔案foo.fpr,verbose只是我想知道詳細進度
sourceanalyzer -b Foo -Xmx16G -Xms8M -scan -f c:\Foo\foo.fpr -filter "foo.filter.txt" -verbose
※順便加註,filter txt是每個專案不同的,不要想著我是從某個地方fork出來的repository可以沿用,肉身測試這絕對不行,instance和rule的id都不同啊!
結語
最近又有一句也很鬼的話,激發我想把這篇寫完,因為同一個客戶最近換了源碼掃描軟體,所以理所當然又是把一堆系統的原始碼都拿去重掃,因為中風險掃描與測試所需預算太高,修完之後回饋說怎麼可能這麼貴!因此又把commit退回到修正之前的版本,並且排除一些商用無法自行修正的套件,想要作為評估修正數量的基準,掃描之後,竟然是零風險。
那這下好了,所有修正一行都不用動,修也不用修,廠商所投入的成本人力全都沒有用。只好再請窗口問一下弱掃軟體的廠商,我們覺得疑問的點在於修正前版本(在開始執行風險修正前)和修正後又退回去先前commit的版本(開始執行風險修正前,但是排除部分盤點為商用的套件),差異怎麼可能這麼大,原本認為有風險的在一行程式碼都沒動的情況下,竟然就直接消失了,是不是掃描模式是增量或者全量的差異?再來就是經典的,弱掃軟體廠商回應說:「增量和全量是完全一樣的」,真是太棒了,那分這個模式幹嘛?把他們自己的原廠文件視若無睹,留給我們這些受害苦命工程師去讀嗎?接著就是執行掃描的資安單位表示:「我沒有辦法調整使用增量或者全量的模式進行掃描」,真是驚呆我了。
然後過了兩天,資安單位又說他們只接受全量的掃描,那不能修改模式該怎麼處理呢?
弱點掃描的本意是希望開發人員能去檢視是否有什麼風險可能被利用,但如果確認無法利用的時候,就不應該額外浪費成本與人力去修復,這種感觸尤其容易出現在被說要修正一些變數名稱的時候,例如,只要接受參數叫做password的時候,大部分的源碼掃描軟體都會說你暴露了使用者個資,但如果這一個動作就是要設定使用者密碼更新呢?還是我應該要求使用者透過紙本申請密碼變更,提交到資訊單位,由資訊單位直接進入資料庫修改嗎?就不怕中間處理這些文件申請單的人偷偷記下來嗎?這種內鬼形式的侵入比什麼風險都難防範多了。
看個原廠的操作文件沒有多難,也不需要花費多少的時間,在AI發達的現在,整篇拿去餵過之後,再來問要怎麼操作應該沒什麼問題,甚至現在Google的NotebookLM大概率就可以直接吃原廠手冊之後,再來問怎麼操作就好,真的是想不透那些高高在上的資安單位或者源碼掃描的代理商們,到底是在領什麼薪水才會說得出直接忽略平常操作軟體說明書的話呢…。
參考
- https://portal.microfocus.com/s/article/KM000016638?language=en_US
- https://community.opentext.com/cybersec/fortify/w/tips/45150/knowledge-doc-fortify-sca-22-2-2-scan-wizard-not-detecting-c-as-language-included-in-scan
- https://www.microfocus.com/zh-tw/documentation/fortify-static-code-analyzer-and-tools/2520/
- https://www.microfocus.com/documentation/fortify-static-code-analyzer-and-tools/2440/SCA_Help_24.4.0/index.htm#dotnet/trans-vs-projects.htm?TocPath=Translating%2520Visual%2520Studio%2520projects%257C_____0
- https://www.microfocus.com/documentation/fortify-static-code-analyzer-and-tools/2440/SCA_Help_24.4.0/index.htm