一诈皿、前言
源代碼審計,顧名思義就是檢查源代碼中是否存在安全隱患欠雌,使用自動化工具以及人工的方式對源代碼進行分析檢查蹄梢,發(fā)現(xiàn)源代碼的這些缺陷引起的漏洞,并提供修復(fù)措施和建議富俄。
在開始之前禁炒,我們先了解一下MVC設(shè)計模式的基本概念:
MVC:全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫霍比。其中:
Model(模型)一般用于放置對數(shù)據(jù)庫進行存取等操作的代碼
View(視圖)一般用于放置靜態(tài)資源如前端代碼幕袱、css等
Controller(控制器)用于存放接受用戶輸入和業(yè)務(wù)邏輯處理的代碼。
我們以Java的SpringMVC來舉例桂塞,SpringBoot項目的三層架構(gòu)如下:
Model層:包含service層和dao層
Service層用來實現(xiàn)業(yè)務(wù)邏輯
Dao層的作用是封裝對數(shù)據(jù)庫的訪問:增刪改查凹蜂,不涉及業(yè)務(wù)邏輯
Controller層:負責業(yè)務(wù)模塊的流程控制
View層:html、css阁危、js等等
過程如下:
有了這些知識之后玛痊,我們就可以大致定位到文件位置了。
二狂打、代碼審計的方法
下面我們來介紹三種常用的代碼審計的方式:
全文通讀敏感函數(shù)溯源功能點定向?qū)徲?/p>
說明從系統(tǒng)入口開始審計擂煞,分析所有數(shù)據(jù)流走向。搜索敏感函數(shù)趴乡,逆向追蹤參數(shù)的傳遞過程对省,分析參數(shù)是否可控蝗拿。定位敏感功能點,分析其是否存在安全缺陷蒿涎。
優(yōu)點能夠覆蓋所有請求入口哀托,避免了遺漏代碼的情況。高效劳秋。高效
缺點需要足夠的時間與精力對系統(tǒng)整體結(jié)構(gòu)了解不夠深入仓手,無法覆蓋邏輯漏洞。容易出現(xiàn)審計遺漏的情況玻淑。
說明:上述三種方法均為純?nèi)斯ごa審計的方法嗽冒,一般情況下我們采用靜態(tài)源代碼掃描工具檢測 + 人工驗證 + 人工檢查相結(jié)合的方式
三、審計工具介紹
Fortify:通過內(nèi)置的五大主要分析引擎:數(shù)據(jù)流补履、語義添坊、結(jié)構(gòu)、控制流箫锤、配置流等對源代碼進行靜態(tài)分析贬蛙,分析的過程中與它特有的軟件安全漏洞規(guī)則集進行全面地匹配、查找谚攒。
Checkmax:通過虛擬編譯器自動對軟件源代碼分析速客,并建立了代碼元素及代碼元素之間關(guān)系的邏輯圖。然后對這個內(nèi)部代碼圖進行查詢五鲫,包含已知安全漏洞和質(zhì)量缺陷問題預(yù)先設(shè)定好的查詢列表溺职。
CodeQL:在 CodeQL 中,代碼被視為數(shù)據(jù)(所以進行掃描前位喂,需要先生成源碼對應(yīng)的數(shù)據(jù)庫文件)浪耘,安全漏洞則被建模為可以對數(shù)據(jù)庫執(zhí)行的查詢語句。
Semgrep: 是一種快速塑崖、開源的靜態(tài)代碼分析工具七冲,它提供了強于grep工具的代碼匹配檢索能力,并支持兩種類型的代碼模式匹配规婆。一種是基于AST的匹配澜躺,另一種是通用文本匹配。
SonarQubec:是一個用于代碼質(zhì)量管理的開源平臺抒蚜,用于管理源代碼的質(zhì)量掘鄙。可以通過PMD,CheckStyle,Findbugs等等代碼規(guī)則檢測工具檢 測出潛在的缺陷嗡髓。
Fortify和Checkmax屬于純商業(yè)軟件操漠,各有優(yōu)缺點,我們重點介紹剩下三款軟件饿这。
四浊伙、工具的使用
1撞秋、Semgrep:
semgrep是一款基于Facebook開源SAST工具pfff中的sgrep組件開發(fā)的開源SAST工具,目前由安全公司r2c統(tǒng)一開發(fā)維護嚣鄙。
優(yōu)點:?? 支持語言豐富吻贿,目前已經(jīng)支持C#, JSON, Json, Kotlin, Rust, Yaml, c, cs, csharp, generic, go, golang, hack, hacklang, html, java, javascript, js, json, kotlin, kt, lua, ml, none, ocaml, php, py, python, python2, python3, rb, regex, rs, ruby, rust, scala, ts, typescript, vue, yaml
開源掃描規(guī)則豐富,由社區(qū)共同開發(fā)維護的掃描規(guī)則超過1000條
規(guī)則設(shè)置簡單哑子,采用yaml配置文件編寫廓八,語法簡單
掃描速度極快:官方稱掃描速度大約是每條規(guī)則20K-100K loc/sec
生態(tài)良好:支持嵌入到幾乎所有CI工具中
支持本地掃描:官方不僅提供了VSCode、IntelliJ IDEA赵抢、Vim的相關(guān)插件,還支持通過pre-commit的方式在代碼提交前進行自動掃描
缺點:
數(shù)據(jù)流跟蹤能力較弱
我們通過兩小例子來看下semgrep的使用
查找代碼中是否使用MD5
Rule:
Test code:
Result:
不安全的命令執(zhí)行
Rele:
Test Code:
Result:
通過這兩個小例子我們可以看到semgrep的使用非常簡單声功。即使非常復(fù)雜的規(guī)則也極少有超過100行的規(guī)則烦却。
接下來我們來通過一個小例子,來看下semgrep的一些參數(shù)的用法:
Rule:
Test Code:
Result:
我們可以看到在匹配模式中先巴,sleep函數(shù)中用到了int和float兩種模式進行匹配其爵,在結(jié)果中也確實只匹配到了第五行和第七行代碼。而其他行并沒有匹配到伸蚯。
我們來修改下摩渺,將sleep函數(shù)的參數(shù)通過函數(shù)返回值的方式傳入,看看是否能夠匹配
Rule:
跟上面的規(guī)則保持不變
Test Code:
Result:
從結(jié)果可以看到仍然是只匹配到了第六行和第八行剂邮,而在第九行中摇幻,函數(shù)a的返回值雖然是一個int類型的值,但是并未匹配到挥萌,從而也說明了绰姻,semgrep的數(shù)據(jù)流的追蹤能力較弱。
如果我們需要匹配到所有sleep的函數(shù)引瀑,可以在匹配模式中修改
Relue:
再次對上面的代碼進行匹配狂芋,則可以看到所有函數(shù)都被匹配到了。
Result:
當然在匹配模式中也可以排除掉某些條件憨栽,比如我們想匹配所有的sleep的函數(shù)帜矾,但是通過函數(shù)傳參的排除掉蒲障,則可以修改規(guī)則:
Relue:
對上述代碼進行匹配钓猬,可以看到第九行沒有匹配到饭弓。
Resul
后續(xù)計劃
codeql和SonarQube工具的使用
典型案例分析
一個完整的項目分析過程