對網站的開源代碼進行審計
0x00 前言
@0r3ak 師傅向我推薦了一款代碼審計工具Cobra(wufeifei/cobra),該工具基於Python開發,可以針對多種語言的源代碼安全性評估。
在測試的過程中,總是不得要領,有一些問題不知道怎麽解決,都是又很想了解下這款項目的實現原理。
在這一系列的筆記中,將會記錄下對 Cobra 的使用體驗,以及源碼級的分析。
0x01 基礎環境
Ubuntu 16.04.3 LTS
Python 2.7.12
Cobra 2.0.0-alpha.5
pdb
0x02 執行流程&關鍵代碼分析
關於 Cobra 的安裝,與基本的使用方法在 Cobra 的文檔中說的很詳細了。我這裏就不在贅述。不了解的同學可以在本文的參考鏈接中獲取 Cobra 的文檔。
這篇筆記主要記錄下,CLI模式下,對某一個文件中代碼做安全審計的過程中,相關的函數調用棧,及關鍵函數的原理分析。其間會通過pdb動態調試結合靜態代碼分析以及項目的文檔,輔助對整個項目的理解。(關於pdb的使用方法可以參考:Flask debug 模式 PIN 碼生成機制安全性研究筆記)
第1步:在cobra.py文件中sys.exit(main())語句前下斷點
第2步:執行如下代碼(具體的功能為:審計XXX目錄下的代碼)
python cobra.py -t /home/tonghua/XXX
步入到main()函數中
main()中的代碼主要功能是,獲取當前命令行敲的命令,並做相應的處理。
通過第18行可知,main()函數在\cobra\__init__.py文件中定義,我們步入到main()函數的定義位置。
第55行args = parser.parse_args(),args變量包含著需要用到的各個變量的值。
由代碼可知,debug模式將會執行57行的if邏輯,通過logger記錄debug日誌,61行的if判斷是打印幫助信息,65行的if邏輯是啟動RESTful服務。
當然由於我們只執行了-t參數,所以以上if判斷均不會進入,直接logger.debug(‘[INIT] start scanning...‘)後,繼續向下執行。
第68-84行,即為該程序進行代碼審計的關鍵代碼。
get_sid()函數(\cobra-master\cobra\cli.py 第28-38行),拼接字符串‘a+項目文件夾md5的前5位+一個隨機字符串‘,其功能想必應該是區分不同的掃描項目。
第78行,Running(a_sid).status(data),實例化Running類(調用其__init__()構造方法),然後調用該對象的status()方法。其會向指定的臨時文件中寫入當前的審計狀態。
第82行,調用cli.start()函數,開始掃描,步入到該函數的具體實現代碼(\cobra-master\cobra\cli.py 第41-122行)。
來到cli.start()函數中,第52-67行,實現了對變量初始化賦值、logger記錄掃描報告的URL、確認目標模式(文件夾、還是Git文件等),輸出方式。
第70-75行,明確文件夾路徑,確認每一個需要掃描的文件位置,統計文件數量
其中對文件夾下的內容進行遍歷和統計的功能,主要由\cobra-master\cobra\pickup.py中的Directory()類實現。為了先大體了解下整體的執行流程,這塊具體實現細節先不分析。
第78-88行,通過Detection()類中的功能實現對開發語言、開發框架的檢測(檢測規則後續還可以自行增加)。這裏用到了Python的@property語法糖,可以將類中的方法已變量的形式進行調用。
步入scan()函數,顧名思義這裏實現了掃描功能。
第153行創建了Rule()實例,接下來幾行,對漏洞類型、開發語言、掃描規則等進行定義
第160行,通過scan_cve()函數進行CVE漏洞掃描,步入到該函數(cobra-master\cobra\cve.py第332-361行)中,查看其實現方式。
第348-350行的for循環中,會對【漏洞規則】目錄下的,漏洞文件進行遍歷,其中【CVI-999】開頭的文件為CVE漏洞檢測文件,遍歷出所有的CVE漏洞文件。
第354行,pool = multiprocessing.Pool(),搞了一個進程池,之後循環遍歷所有的CVE漏洞文件,在第358行進行漏洞掃描,pool.apply_async(scan_single, args=(target_directory, cve_path), callback=store),調用scan_single()漏掃函數,掃描完成後回調到store()函數中。
第372行,漏掃函數scan_single()的調用鏈:scan_single()->cve.scan_cve(),cve.get_scan_result()
這裏有一個坑點就是,文件中的scan_cve()函數和CveParse類中的scan_cve()方法同名,導致剛剛跟丟了,2333
分析下cve.scan_cve()方法(第214-225行)
今天就先到這裏,剩下的內容明天再更新。
0x03 程序執行鏈
今天的分析先到這裏,腦闊疼。
梳理下截至目前的函數調用鏈:
\cobra.py line 22 main()
-->\cobra\__init__.py line 82 cli.start() and line 78 Running()
---->\cobra\cli.py line 91 scan()
------>\cobra\engine.py line 160 scan_cve()
-------->\cobra\cve.py line 358 pool.apply_async(scan_single, args=(target_directory, cve_path), callback=store)
---------> \cobra\cve.py line 371 cve.scan_cve()
pause!!!
另外,Cobra好多文件、類中都采用相同的方法名,翻起來好費勁啊!!!
0x04 後記
希望我可以盡快熟悉這套項目的代碼,做一些二次開發、增加漏洞規則的事。同時也期待有一天我可以參與到這個開源項目中來,貢獻力量。
暫且不論該工具的漏報、誤報情況,因為自動化的代碼審計,文件與文件之間的關系、函數與函數之間的調用關系、Web框架提供的操作接口、如何確定URL路由以及不同漏洞類型的檢測規則,本來就是一件難度很大的事。漏報、誤報在所難免,光是這種分享精神就讓我很敬佩了,再次要感謝下該開源項目的作者,讓像我一樣的菜鳥有一個學習的方向。也要感謝那些幫助我的師傅們,是你們不斷的指導著我成長。
對網站的開源代碼進行審計