Fortify掃描C/C++代碼
Fortify是一款商業級的源碼掃描工具,其工作示意圖如下:
首先Fortify對(duì)源碼進(jìn)行分析(需要編譯),然後(hòu)提取出相關信息保存到某個位置,然後(hòu)加載規則進(jìn)行掃描,掃描的結果保存爲 .fpr 文件,然後(hòu)用戶使用 GUI 程序對(duì)結果進(jìn)行分析,排查漏洞。
環境搭建
本文的分析方式是在 Linux 上對(duì)源碼進(jìn)行編譯、掃描,然後(hòu)在 Windows 平台對(duì)掃描結果進(jìn)行分析,所以涉及 Windows 和 Linux 兩(liǎng)個平台的環境搭建。
環境搭建
環境搭建比較簡單,省略。
工具使用
本節涉及代碼
https://github.com/hac425xxx/sca-workshop/tree/master/fortify-example
Fortify的工作原理,首先會(huì)需要使用Fortify對(duì)目标源碼進(jìn)行分析提取源代碼中的信息,然後(hòu)使用規則從源碼信息中查詢出匹配的代碼。
首先下載代碼然後(hòu)使用 sourceanalyzer 來分析源碼
/home/HKS/sca/fortify/bin/sourceanalyzer -b fortify-example make
其中
·-b 指定這(zhè)次分析的 id
·後(hòu)面(miàn)是編譯代碼時(shí)使用的命令,這(zhè)裡(lǐ)是 make
分析完代碼後(hòu)再次執行 sourceanalyzer 對(duì)源碼進(jìn)行掃描
/home/HKS/sca/fortify/bin/sourceanalyzer -b fortify-example -scan -f fortify-example.fpr
其中
·-b 指定掃描的 id 和之前分析源碼時(shí)的 id 對(duì)應
·-scan 表示這(zhè)次是采用規則對(duì)源碼進(jìn)行掃描
·-f 指定掃描結果輸出路徑,掃描結果可以使用 auditworkbench.cmd 進(jìn)行可視化的分析。
生成(chéng) .fpr 結果後(hòu)可以使用 auditworkbench 加載分析
system命令執行檢測
本節涉及代碼
https://github.com/hac425xxx/sca-workshop/tree/master/fortify-example/system_rules
漏洞代碼如下
int call_system_example(){ char *user = get_user_input_str(); char *xx = user; system(xx); return 1;}
首先通過(guò) get_user_input_str 獲取外部輸入, 然後(hòu)傳入 system 執行。
1.RulePackID 表示這(zhè)個規則文件的 ID, 設置符合格式的唯一字符串即可
2.RuleDefinitions 裡(lǐ)面(miàn)是這(zhè)個xml文件中的所有規則,每個規則作爲RuleDefinitions的子節點存在,比如示例中的 DataflowSourceRule 節點,表示這(zhè)是一個 DataflowSource 規則,用于指定數據流跟蹤的 source
我們開(kāi)發(fā)規則實際也隻需要在 RuleDefinitions 中新增對(duì)應的規則節點即可。
Fortify 也支持污點跟蹤功能(néng),下面(miàn)就(jiù)介紹如何定義 Fortify 的污點跟蹤規則,首先我們需要定義 source ,DataflowSourceRule 規則用于定義污點源,不過(guò)這(zhè)個隻支持定義函數的一些屬性作爲污點源,比如返回值、參數等,返回值是污點數據,規則的解釋如下:
1.首先 RuleID 用于唯一标識一條規則
2.FunctionIdentifier 用于匹配一個函數, 其中包含一個 FunctionName 子節點,表示通過(guò)函數名進(jìn)行匹配,這(zhè)裡(lǐ)就(jiù)是匹配 get_user_input_str 函數
3.然後(hòu) OutArguments 用于定義污點源, return 表示該函數的返回值是污點數據,如果該節點的值爲數字 n , 則表示第 n 個參數爲污點數據,n 從0開(kāi)始計數。
定義好(hǎo) source 點後(hòu),還(hái)需要定義 sink 點,DataflowSinkRule 規則用于定義 sink 點
這(zhè)條規則的作用是設置 system 的第 0 個參數爲 sink 點,規則解釋如下:
1.VulnCategory 是一個字符串,會(huì)在掃描結果中呈現
2.FunctionIdentifier 用于匹配一個函數,這(zhè)裡(lǐ)就(jiù)是匹配 system 函數
3.Sink 和 InArguments 用于表示函數的第 0 個參數爲 sink 點
規則編寫完後(hòu),保存成(chéng)一個 xml 文件,然後(hòu)在對(duì)源碼進(jìn)行掃描時(shí)通過(guò) -rules 指定自定義的規則文件即可
/home/hac425/sca/fortify/bin/sourceanalyzer -rules system.xml -b fortify-example -scan -f fortify-example.fpr -no-default-rules
ps: -no-default-rules 表示不使用Fortify的默認規則,這(zhè)裡(lǐ)主要是在自己開(kāi)發(fā)規則時(shí)避免幹擾。
掃描的結果如下
規則作用是告知 Fortify 調用 custom_memcpy 函數時(shí),第 1 個參數的污點數據會(huì)傳播到第 0 個參數,結果如下
system命令執行檢測 # 2
除了使用 DataflowSourceRule 、DataflowSinkRule 等規則來定義污點跟蹤相關的屬性外,Fortify還(hái)支持使用 CharacterizationRule 來定義污點跟蹤相關的特性。
其中對(duì)應關系如下圖所示:
根據文檔的使用示例,修修改改很快就(jiù)可以使用 CharacterizationRule 來搜索出涉及 system 命令執行的代碼,代碼路徑如下
https://github.com/hac425xxx/sca-workshop/blob/master/fortify-example/system_rules/system_CharacterizationRule.xml
介紹具體的 CharacterizationRule 規則實現之前,先介紹一下 StructuralRule 規則,因爲 CharacterizationRule 就(jiù)是通過(guò) StructuralRule 的語法來匹配代碼中的語法結構。
StructuralRule 官方文檔中的内容
Fortify在編譯/分析代碼過(guò)程中會(huì)把代碼中的元素(代碼塊、類、表達式、語句等)通過(guò)樹狀結構體組裝起(qǐ)來形成(chéng)一顆 structural tree,然後(hòu)掃描的時(shí)候使用 Structural Analyzer 來解析 StructuralRule ,最後(hòu)輸出匹配。
其中 StructuralMatch 使用 StructuralRule 的語法來匹配代碼,然後(hòu)在 Definition 裡(lǐ)面(miàn)可以使用一些API(比如TaintSource)和匹配到的代碼元素來标記污點跟蹤相關的熟悉,比如污點源、Sink點等,這(zhè)裡(lǐ)要注意一點:Definition 中可以訪問到 StructuralMatch 中聲明的所有變量,不論是通過(guò) : 還(hái)是通過(guò) [] 聲明。
上述規則的作用就(jiù)是
1.首先通過(guò) StructuralMatch 匹配到 get_user_input_str 的函數調用對(duì)象 fc.
2.然後(hòu)在 Definition ,使用 TaintSource 設置 fc 爲污點源,污點标記爲 PRIVATE.
規則解釋如下:
1.首先使用 StructuralMatch 匹配 fc 爲 system 的函數調用, e 爲 fc 的第0個參數
2.然後(hòu)在 Definition 使用 TaintSink 設置 e 爲sink點,污點标記爲 PRIVATE.
這(zhè)樣就(jiù)表示如果 system 函數調用的第 0 個參數爲污點數據且污點數據中包含 PRIVATE 标記,就(jiù)會(huì)把這(zhè)段代碼爆出來。
其他的規則(函數建模,clean_data函數)也是類似這(zhè)裡(lǐ)不再介紹,最終掃描結果如下圖:
在開(kāi)發(fā) Structural相關規則時(shí)可以在分析時(shí)使用 -Ddebug.dump-structural-tree 把代碼的 structural tree 打印出來,然後(hòu)我們根據樹的結構就(jiù)可以比較方便的開(kāi)發(fā)規則,完整命令行如下
/home/hac425/sca/fortify/bin/sourceanalyzer -no-default-rules -rules hello_array.xml -b fortify-example -scan -f fortify-example.fpr -D com.fortify.sca.MultithreadedAnalysis=false -Ddebug.dump-structural-tree 2> tree.tree
打印出來的示例如下
關于蘇州華克斯信息科技有限公司
聯系方式:400-028-4008 0512-62382981
專業的測試及安全産品服務提供商
Fortify | Webinspect | AppScan | SonarQube | 極狐GitLab
LoadRunner | UFT(QTP) | ALM(QC)
Micro Focus 鉑金合作夥伴 | SonarQube中國(guó)總代理
極狐GitLab鉑金級合夥伴 | HCL中國(guó)合作夥伴
掃二維碼用手機看
更多資訊