1
您現在的位置:
首頁
/
/
Fortify掃描C/C++代碼

Fortify掃描C/C++代碼

  • 分類:新聞資訊
  • 作者:蘇州華克斯信息科技有限公司
  • 來源:蘇州華克斯信息科技有限公司
  • 發(fā)布時(shí)間:2023-01-30
  • 訪問量:0

【概要描述】

Fortify掃描C/C++代碼

【概要描述】

  • 分類:新聞資訊
  • 作者:蘇州華克斯信息科技有限公司
  • 來源:蘇州華克斯信息科技有限公司
  • 發(fā)布時(shí)間:2023-01-30
  • 訪問量:0
詳情

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ó)合作夥伴

 

掃二維碼用手機看

更多資訊

聯系我們

聯系我們

發(fā)布時(shí)間:2020-09-16 13:55:16
地址:蘇州市工業園區新平街388号
          騰飛創新園塔樓A617
電話:400-028-4008
          0512-62382981

關注我們

這(zhè)是描述信息

頁面(miàn)版權所有 -  蘇州華克斯信息科技有限公司  |  Copyright - 2020 All Rights Reserved.