菜鳥的源代碼審計之路

一、前言

源代碼審計,顧名思義就是檢查源代碼中是否存在安全隱患,使用自動化工具以及人工的方式對源代碼進(jìn)行分析檢查,發(fā)現(xiàn)源代碼的這些缺陷引起的漏洞,并提供修復(fù)措施和建議。

在開始之前,我們先了解一下MVC設(shè)計模式的基本概念:

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫。其中:

Model(模型)一般用于放置對數(shù)據(jù)庫進(jìn)行存取等操作的代碼

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層:負(fù)責(zé)業(yè)務(wù)模塊的流程控制

View層:html、css、js等等

過程如下:


有了這些知識之后,我們就可以大致定位到文件位置了。

二、代碼審計的方法

下面我們來介紹三種常用的代碼審計的方式:

全文通讀敏感函數(shù)溯源功能點(diǎn)定向?qū)徲?/p>

說明從系統(tǒng)入口開始審計,分析所有數(shù)據(jù)流走向。搜索敏感函數(shù),逆向追蹤參數(shù)的傳遞過程,分析參數(shù)是否可控。定位敏感功能點(diǎn),分析其是否存在安全缺陷。

優(yōu)點(diǎn)能夠覆蓋所有請求入口,避免了遺漏代碼的情況。高效。高效

缺點(diǎn)需要足夠的時間與精力對系統(tǒng)整體結(jié)構(gòu)了解不夠深入,無法覆蓋邏輯漏洞。容易出現(xiàn)審計遺漏的情況。

說明:上述三種方法均為純?nèi)斯ごa審計的方法,一般情況下我們采用靜態(tài)源代碼掃描工具檢測 + 人工驗證 + 人工檢查相結(jié)合的方式

三、審計工具介紹

Fortify:通過內(nèi)置的五大主要分析引擎:數(shù)據(jù)流、語義、結(jié)構(gòu)、控制流、配置流等對源代碼進(jìn)行靜態(tài)分析,分析的過程中與它特有的軟件安全漏洞規(guī)則集進(jìn)行全面地匹配、查找。

Checkmax:通過虛擬編譯器自動對軟件源代碼分析,并建立了代碼元素及代碼元素之間關(guān)系的邏輯圖。然后對這個內(nèi)部代碼圖進(jìn)行查詢,包含已知安全漏洞和質(zhì)量缺陷問題預(yù)先設(shè)定好的查詢列表。

CodeQL:在 CodeQL 中,代碼被視為數(shù)據(jù)(所以進(jìn)行掃描前,需要先生成源碼對應(yīng)的數(shù)據(jù)庫文件),安全漏洞則被建模為可以對數(shù)據(jù)庫執(zhí)行的查詢語句。

Semgrep: 是一種快速、開源的靜態(tài)代碼分析工具,它提供了強(qiáng)于grep工具的代碼匹配檢索能力,并支持兩種類型的代碼模式匹配。一種是基于AST的匹配,另一種是通用文本匹配。

SonarQubec:是一個用于代碼質(zhì)量管理的開源平臺,用于管理源代碼的質(zhì)量??梢酝ㄟ^PMD,CheckStyle,Findbugs等等代碼規(guī)則檢測工具檢 測出潛在的缺陷。

Fortify和Checkmax屬于純商業(yè)軟件,各有優(yōu)缺點(diǎn),我們重點(diǎn)介紹剩下三款軟件。

四、工具的使用

1、Semgrep:

semgrep是一款基于Facebook開源SAST工具pfff中的sgrep組件開發(fā)的開源SAST工具,目前由安全公司r2c統(tǒng)一開發(fā)維護(hù)。

優(yōu)點(diǎn):?? 支持語言豐富,目前已經(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ā)維護(hù)的掃描規(guī)則超過1000條

規(guī)則設(shè)置簡單,采用yaml配置文件編寫,語法簡單

掃描速度極快:官方稱掃描速度大約是每條規(guī)則20K-100K loc/sec

生態(tài)良好:支持嵌入到幾乎所有CI工具中

支持本地掃描:官方不僅提供了VSCode、IntelliJ IDEA、Vim的相關(guān)插件,還支持通過pre-commit的方式在代碼提交前進(jìn)行自動掃描

缺點(diǎn):

數(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兩種模式進(jìn)行匹配,在結(jié)果中也確實只匹配到了第五行和第七行代碼。而其他行并沒有匹配到。

我們來修改下,將sleep函數(shù)的參數(shù)通過函數(shù)返回值的方式傳入,看看是否能夠匹配

Rule

跟上面的規(guī)則保持不變

Test Code

Result

從結(jié)果可以看到仍然是只匹配到了第六行和第八行,而在第九行中,函數(shù)a的返回值雖然是一個int類型的值,但是并未匹配到,從而也說明了,semgrep的數(shù)據(jù)流的追蹤能力較弱。

如果我們需要匹配到所有sleep的函數(shù),可以在匹配模式中修改

Relue:

再次對上面的代碼進(jìn)行匹配,則可以看到所有函數(shù)都被匹配到了。

Result:


當(dāng)然在匹配模式中也可以排除掉某些條件,比如我們想匹配所有的sleep的函數(shù),但是通過函數(shù)傳參的排除掉,則可以修改規(guī)則:

Relue:

對上述代碼進(jìn)行匹配,可以看到第九行沒有匹配到。

Resul

后續(xù)計劃

codeql和SonarQube工具的使用

典型案例分析

一個完整的項目分析過程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容