菜鳥的源代碼審計之路

一诈皿、前言

源代碼審計,顧名思義就是檢查源代碼中是否存在安全隱患欠雌,使用自動化工具以及人工的方式對源代碼進行分析檢查蹄梢,發(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工具的使用

典型案例分析

一個完整的項目分析過程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末金赦,一起剝皮案震驚了整個濱河市烙如,隨后出現(xiàn)的幾起案子撑蒜,更是在濱河造成了極大的恐慌哼绑,老刑警劉巖严嗜,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旁涤,死亡現(xiàn)場離奇詭異翔曲,居然都是意外死亡迫像,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門瞳遍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闻妓,“玉大人,你說我怎么就攤上這事掠械∮衫拢” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵猾蒂,是天一觀的道長均唉。 經(jīng)常有香客問我,道長肚菠,這世上最難降的妖魔是什么舔箭? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蚊逢,結(jié)果婚禮上层扶,老公的妹妹穿的比我還像新娘。我一直安慰自己烙荷,他們只是感情好镜会,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著终抽,像睡著了一般戳表。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昼伴,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天扒袖,我揣著相機與錄音,去河邊找鬼亩码。 笑死季率,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的描沟。 我是一名探鬼主播飒泻,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吏廉!你這毒婦竟也來了泞遗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤席覆,失蹤者是張志新(化名)和其女友劉穎史辙,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡聊倔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年晦毙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耙蔑。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡见妒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出甸陌,到底是詐尸還是另有隱情须揣,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布钱豁,位于F島的核電站耻卡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏牲尺。R本人自食惡果不足惜卵酪,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秸谢。 院中可真熱鬧,春花似錦霹肝、人聲如沸估蹄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臭蚁。三九已至,卻和暖如春讯赏,著一層夾襖步出監(jiān)牢的瞬間垮兑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工漱挎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留系枪,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓磕谅,卻偏偏與公主長得像私爷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子膊夹,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容