Fortify代码扫描工具
一、Fortify介紹? ? ?
?Fortify是一款強(qiáng)大的靜態(tài)代碼掃描分析工具,其發(fā)現(xiàn)代碼漏洞缺陷的能力十分強(qiáng)悍,主要是將代碼經(jīng)過(guò)編譯,依托于其強(qiáng)大的內(nèi)置規(guī)則庫(kù)來(lái)發(fā)現(xiàn)漏洞的。其次fortify SCA團(tuán)隊(duì)在開(kāi)發(fā)此商業(yè)工具時(shí),也提供了自定義規(guī)則的接口,只要經(jīng)過(guò)正版授權(quán)后,便可以在此基礎(chǔ)上自定義規(guī)則,來(lái)增強(qiáng)Fortify SCA的漏洞識(shí)別能力,同時(shí)經(jīng)過(guò)自定義規(guī)則,也可以降低誤報(bào),使靜態(tài)分析的準(zhǔn)確度和高效性。
? ? ?默認(rèn)情況下,Fortify SCA使用安裝的安全編碼規(guī)則包來(lái)檢查源代碼,并定義一系列可能出現(xiàn)的問(wèn)題,如可被攻擊者李勇的安全漏洞和不良的編碼缺陷。
? ? 安全編碼規(guī)則中的規(guī)則分析受支持語(yǔ)言的核心和擴(kuò)展的API包中的函數(shù),并將分析結(jié)果記錄在Fortify SCA中。每一個(gè)問(wèn)題的解釋包含了對(duì)問(wèn)題的描述和建議的解決方案,一邊更好的解決程序中的漏洞和缺陷。也可以通過(guò)創(chuàng)建自定義規(guī)則包來(lái)準(zhǔn)確地分析特定的應(yīng)用程序,驗(yàn)證專門的安全規(guī)則以及細(xì)化Fortify SCA所報(bào)告的問(wèn)題。
二、編寫自定義規(guī)則原理
要編寫有效的自定義規(guī)則,就必須熟悉一直的安全漏洞類別和通常與他們相關(guān)的函數(shù)類型。深入理解各類經(jīng)常出現(xiàn)在特定類型漏洞的函數(shù),有利于在編寫自定義規(guī)則過(guò)程中能夠準(zhǔn)確地找到與安全相關(guān)的函數(shù)。任何一門語(yǔ)言,都有其龐大的開(kāi)源框架和lib庫(kù)。所以自定義規(guī)則,既要精通安全漏洞原理,又要熟練掌握一門或幾門開(kāi)發(fā)語(yǔ)言,一般自定義規(guī)則用的比較多的語(yǔ)言有java、C/C++、PHP等。其次必須識(shí)別與安全相關(guān)的函數(shù),并熟悉這些函數(shù)的特性以此來(lái)確定能夠體現(xiàn)各個(gè)函數(shù)具體行為和與之相關(guān)的漏洞類別的正確規(guī)則形式。一旦確定好了這種聯(lián)系,使用自定義規(guī)則編輯器來(lái)創(chuàng)建規(guī)則就相對(duì)簡(jiǎn)單了。
三、自定義規(guī)則
1). 在fortify SCA安裝的bin目錄下找到打開(kāi)自定義規(guī)則編輯器,CustomRulesEditor.cmd,如下圖所示:
2). 打開(kāi)編輯器后,選擇File ——>Generate Rule,彈出規(guī)則向?qū)Э颉?/p>
3). 自定義規(guī)則模板可以按照漏洞類型(Category)和規(guī)則類型(Rule Type)進(jìn)行分類,不管是何種方式分類,這些模板大體上分為,數(shù)據(jù)污染源tainted規(guī)則,數(shù)據(jù)控制流規(guī)則,數(shù)據(jù)傳遞規(guī)則,以及漏洞缺陷爆發(fā)的sink規(guī)則。只要理解了這些規(guī)則模板,和開(kāi)發(fā)語(yǔ)言的函數(shù)特征,建立規(guī)則就簡(jiǎn)單了。
如下是fortify自定義規(guī)則向?qū)е械囊?guī)則選項(xiàng):
1) Access Control: Database ?Validation Rule
定義驗(yàn)證對(duì)數(shù)據(jù)庫(kù)中所存儲(chǔ)的信息的訪問(wèn)權(quán)限的函數(shù) (授權(quán)函數(shù))。這個(gè)規(guī)則可以發(fā)現(xiàn)與未經(jīng)授權(quán)的訪問(wèn)相關(guān)的漏洞Alias Rule
在安全編碼規(guī)則包或自定義規(guī)則的范圍內(nèi)定義核心和擴(kuò)展API 所發(fā)現(xiàn)的能夠模擬其他函數(shù)行為的函數(shù)。
2) Allocation Rule
定義內(nèi)存分配的函數(shù)。這個(gè)規(guī)則有助于跟蹤緩沖區(qū)大小并檢測(cè) buffer overflow 漏洞
3) Buffer Overflow Detection Rules for 'scanf' Family of Functions
定義像 scanf() 家族函數(shù)一樣運(yùn)行的函數(shù)。這些規(guī)則有助于跟蹤緩沖區(qū)大小并檢測(cè) buffer overflow 漏洞
4) Buffer Overflow Detection Rules for 'sprintf' Family of Functions
定義像 sprintf() 家族函數(shù)一樣運(yùn)行的函數(shù)。這個(gè)函數(shù)可以在格式化字符串中并置多個(gè)起始緩沖區(qū),并將格式化字符串的多個(gè)內(nèi)存單位復(fù)制到目標(biāo)緩沖區(qū)。這個(gè)規(guī)則有助于跟蹤緩沖區(qū)大小并檢測(cè) buffer overflow 漏洞
5) Buffer Overflow Detection Rules for 'strcat' Family of Functions
定義像 strcat() 家族函數(shù)一樣運(yùn)行的函數(shù)。它在目標(biāo)緩沖區(qū)的末端并置了多個(gè)起始緩沖區(qū)的內(nèi)存單位。這些規(guī)則有助于跟蹤緩沖區(qū)大小并檢測(cè) buffer overflow 漏洞
6) Buffer Overflow Detection Rules for 'strcpy' Family of Functions
定義像 strcpy() 家族函數(shù)一樣運(yùn)行的函數(shù)。它可以將多個(gè)內(nèi)存單位從起始緩沖區(qū)復(fù)制到目標(biāo)緩沖區(qū)。這些規(guī)則有助于
跟蹤緩沖區(qū)大小并檢測(cè) buffer overflow 漏洞
7) Cross-Site Scripting Sink Rule
定義在輸入?yún)?shù)沒(méi)有進(jìn)行適當(dāng)驗(yàn)證的情況下有可能在瀏覽器中執(zhí)行惡意代碼的函數(shù)
8) Cross-Site Scripting Source Rule
定義充當(dāng)輸入源的函數(shù),如果這樣的函數(shù)沒(méi)有經(jīng)過(guò)適當(dāng)?shù)尿?yàn)證,會(huì)導(dǎo)致瀏覽器執(zhí)行惡意代碼。
9) Cross-Site Scripting Validation Rule
定義發(fā)送到網(wǎng)頁(yè)前需要進(jìn)行適當(dāng)?shù)臄?shù)據(jù)驗(yàn)證的函數(shù)
10) Generic Pass-Through Rule
定義一個(gè)其輸入?yún)?shù)會(huì)和輸出參數(shù)交互數(shù)據(jù)的函數(shù)。
11) Generic Semantic Rule
定義可能出現(xiàn)的 dangerous function
12) Generic Sink Rule
定義在輸入?yún)?shù)沒(méi)有進(jìn)行適當(dāng)驗(yàn)證的情況下有可能帶來(lái)多種安全漏洞風(fēng)險(xiǎn)的函數(shù)
13) Generic Source Rule
定義充當(dāng)輸入源的函數(shù),如果這樣的函數(shù)沒(méi)有經(jīng)過(guò)適當(dāng)?shù)尿?yàn)證,會(huì)導(dǎo)致多種安全漏洞。
14) Generic Validation Rule
定義能夠針對(duì)多種安全漏洞而進(jìn)行適當(dāng)驗(yàn)證的函數(shù)
15) HTTP Response Splitting Sink Rule
定義在輸入?yún)?shù)沒(méi)有進(jìn)行適當(dāng)驗(yàn)證的情況下有可能破壞 HTTP 響應(yīng)頭文件的函數(shù)
16) HTTP Response Splitting Validation Rule
定義加入 HTTP 響應(yīng)頭文件之前已進(jìn)行適當(dāng)?shù)臄?shù)據(jù)驗(yàn)證的函數(shù)
17) Integer Overflow Sink Rule
定義易于發(fā)生 integer overflow 漏洞的函數(shù),這種漏洞會(huì)在輸入?yún)?shù)驗(yàn)證不當(dāng)?shù)那闆r下導(dǎo)致邏輯錯(cuò)誤和 buffer overflow。
18) Log Forging Sink Rule
定義在輸入?yún)?shù)沒(méi)有進(jìn)行適當(dāng)驗(yàn)證的情況下有可能向日志文件寫入惡意或偽造條目的函數(shù)
19) Pass-Through Rule that Indicates that Outgoing Value does not End with a Newline Character
定義未在輸出參數(shù)中附加換行符的參數(shù)
20) Pass-Through Rule that Indicates that Outgoing Value does not End with a Null Character
定義沒(méi)有適當(dāng)?shù)匾?"\0" 結(jié)束輸出緩沖區(qū)的函數(shù)
21) Pass-Through Rule that Indicates that Outgoing Value Ends with a Newline Character
定義在輸出參數(shù)中附加換行符的參數(shù)
22) Pass-Through Rule that Indicates that Outgoing Value Ends with a Null Character
定義適當(dāng)?shù)匾?"\0" 結(jié)束輸出緩沖區(qū)的函數(shù)
23) Pass-Through Rule that Indicates ?that Outgoing Value is ?Deobfuscated
定義充當(dāng)去模糊化例程的函數(shù)
24) Pass-Through Rule that Indicates ?that Outgoing Value is not ?Numeric
定義處理輸入?yún)?shù)的函數(shù),以使其輸出參數(shù)不為數(shù)字。
25) Pass-Through Rule that Indicates that Outgoing Value is Numeric
定義處理輸入?yún)?shù)的函數(shù),以使其輸出參數(shù)為數(shù)字。
26) Pass-Through Rule that Indicates ?that Outgoing Value is Poorly ?Encrypted
定義對(duì)輸入?yún)?shù)所執(zhí)行的加密方式較差的函數(shù),如基于 64位的編碼。
27) Pass-Through Rule that Indicates ?that Outgoing Value Represents ?the Length of the String
定義輸出參數(shù)可以表示字符串長(zhǎng)度的函數(shù)
28) Password Management Sink Rule
定義采用永遠(yuǎn)不會(huì)被破譯或去模糊化的明文密碼作為參數(shù)的函數(shù)
29) Password Management: Weak Cryptography Sink Rule
定義采用加密方式較差的密碼作為參數(shù)的函數(shù)
30) PCI Violation Sink Rule
定義有可能將信用卡數(shù)據(jù)顯示給攻擊者的函數(shù)
31) PCI Violation Source Rule
定義將信用卡數(shù)據(jù)引入應(yīng)用程序的函數(shù)
32) PCI Violation Validation Rule
定義信用卡數(shù)據(jù)顯示給攻擊者前可以對(duì)這些數(shù)據(jù)進(jìn)行適當(dāng)驗(yàn)證的函數(shù)
33) Privacy Violation Sink Rule
定義在輸入?yún)?shù)處理不當(dāng)?shù)那闆r下由于向攻擊者顯示私人信 息而導(dǎo)致可能危及用戶隱私的函數(shù)
34) Privacy Violation Source Rule
定義作為私人數(shù)據(jù)源的函數(shù),如果處理不當(dāng),會(huì)危害用戶隱私。
35) Privacy Violation Validation Rule
定義能適當(dāng)處理私人數(shù)據(jù)且不會(huì)危及用戶隱私的函數(shù)。
36) SQL Injection Sink Rule
定義在輸入?yún)?shù)沒(méi)有進(jìn)行適當(dāng)驗(yàn)證的情況下有可能執(zhí)行惡意SQL 或?qū)?shù)據(jù)庫(kù)所存儲(chǔ)的數(shù)據(jù)提供未經(jīng)授權(quán)的訪問(wèn)權(quán)限的函數(shù)
37) SQL Injection Source Rule
定義充當(dāng)輸入源的函數(shù),如果這樣的函數(shù)沒(méi)有經(jīng)過(guò)適當(dāng)?shù)尿?yàn)證,會(huì)導(dǎo)致 SQL 被注入到數(shù)據(jù)庫(kù)查詢中。
38) SQL Injection Validation Rule
定義在利用數(shù)據(jù)進(jìn)行 SQL 查詢之前能夠?qū)@些數(shù)據(jù)進(jìn)行適當(dāng)驗(yàn)證的函數(shù)
39) String Length Rule
定義能夠計(jì)算字符串長(zhǎng)度的函數(shù)。這個(gè)規(guī)則有助于跟蹤字符串的長(zhǎng)度,以便檢測(cè) buffer overflow 漏洞。
40) String Termination Error Sink Rule
定義在輸入?yún)?shù)沒(méi)有適當(dāng)?shù)匾?"\0" 結(jié)尾的情況下可能會(huì)容易導(dǎo)致 buffer overflow 漏洞
41) String Termination Error Source Rule
定義由于輸入數(shù)據(jù)源沒(méi)有適當(dāng)?shù)匾?"\0" 結(jié)尾而容易導(dǎo)致buffer overflow 漏洞。
42) String Termination Error Validation Rule
定義適當(dāng)?shù)匾?"\0" 結(jié)束緩沖區(qū)的函數(shù)。
43) System Information Leak Sink Rule
定義在輸入?yún)?shù)處理不當(dāng)?shù)那闆r下可能向攻擊者顯示有用的系統(tǒng)信息的函數(shù)
44) System Information Leak Source Rule
定義作為系統(tǒng)信息數(shù)據(jù)源的函數(shù),如果處理不當(dāng),會(huì)向攻擊者泄漏有用的數(shù)據(jù)。
45) System Information Leak Validation Rule
定義能夠適當(dāng)處理系統(tǒng)數(shù)據(jù)的函數(shù)
4) .選擇規(guī)則包語(yǔ)言,點(diǎn)擊next,然后填寫報(bào)名,類名,函數(shù)名
5). 點(diǎn)擊next,設(shè)置sink點(diǎn)
四. 運(yùn)行自定義規(guī)則
需要將編寫好的自定義規(guī)則包放在Fortify SCA指定的文件夾下方可生效。默認(rèn)一般是在${FortifyInstall}/Core/config/customrules/目錄下。你可以在${FortifyInstall}/Core/config/fortify-sca.properties進(jìn)行配置自定義路徑
五、Fortify代碼掃描使用教程
1、進(jìn)入Fortify安裝目錄,再進(jìn)入bin目錄,雙擊auditworkbench.cmd啟動(dòng)程序
2、打開(kāi)掃描窗口,點(diǎn)擊Scan Java Project
3、選擇要掃描的項(xiàng)目目錄,點(diǎn)擊確定按鈕
4、彈出java代碼版本選擇窗口,選擇版本后,點(diǎn)擊OK
5、彈出審計(jì)向?qū)Т翱?#xff0c;點(diǎn)擊Scan按鈕開(kāi)始掃描
6、掃描開(kāi)始,等待掃描結(jié)束,等待時(shí)間根據(jù)項(xiàng)目大小而定,可能時(shí)間會(huì)很長(zhǎng)
7、掃描結(jié)束后,顯示掃描結(jié)果。到此使用Fortify 17.10進(jìn)行源代碼漏掃的方法就介紹完了。
初始fortify,還存在很多認(rèn)知的不足,歡迎路過(guò)的伙伴們留言指正。。。望不吝賜教!!!
總結(jié)
以上是生活随笔為你收集整理的Fortify代码扫描工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 学习大数据看门的几本书
- 下一篇: APP 性能测试工具