歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

利用Cobra實現自動化代碼審計的經驗分享

來源:本站整理 作者:佚名 時間:2019-07-02 TAG: 我要投稿

一、背景
筆者在某甲方運維部負責信息安全,代碼審計已經加入到上線流程里面,在沒有引入Cobra之前用的是綠色版FortifySCA。公司是Java開發環境,每次上線前都需要開發人員單獨把未編譯的上線源碼打包發送給我,手動執行審計任務,輸出報告,上傳SVN等一系列操作。
原先的上線源碼審計流程如下圖:

這樣的弊端一是源碼傳輸方式不可控,二是手動執行審計任務太繁瑣,所以開始尋找實現自動化審計的方法。因為公司預算吃(mei)緊(qian),只能從開源工具上入手。
二、需求分析
前面有戳進傳送地址的大佬們應該已經知道了Cobra的大概情況,它是python寫的,支持掃描文件夾、壓縮包、Github,支持多種報告格式輸出及郵件發送等等。我這里需要實現的是上線源碼自動采集、審計任務自動執行及審計報告自動發送郵件及上傳SVN。
Cobra的基礎執行命令是這樣的:
python cobra.py -t code_path -o report_format -o email_addr
上線源碼的自動采集已經在Jekins上實現了,配置管理員將上線源碼編譯打包后,會同時將未編譯的上線源碼壓縮包通過FTP傳輸到我的Cobra服務器。因此,現在需要考慮的就是如何自動對這些傳輸過來的源碼執行審計任務。
三、實現方法
我通過一個簡單的python腳本實現了以上的需求,這里把這個腳本稱作調度腳本吧,整個自動化項目的結構和邏輯如下:

上圖各目錄作用如下:
FTP目錄:用于接收Jekins服務器傳輸過來的未編譯的上線源碼壓縮包。
Cobra目錄:Cobra工具的代碼目錄。
SVN目錄:用于存放及上傳Cobra輸出的代碼審計報告。
調度腳本的主要函數介紹如下:
1.mkdir():在SVN目錄中根據當前日期安裝年月日分級建立目錄并同步到SVN,方便后續上傳審計報告。
2.code_detect():通過循環執行listdir函數,檢測FTP目錄下是否存在上線源碼壓縮包。
3.code_scan():步驟2中檢測到源碼包后逐個執行Cobra工具的審計命令:python cobra.py -t code_path -o report_format -o email_addr,任務結束后刪除源碼包,將報告輸出到SVN目錄。
4.code2svn():將步驟3中輸出的報告上傳到SVN服務器。
通過這個調度腳本,原先的上線審計流程就完全實現自動化了,我只需要在收到審計報告后查看一下結果,自動化后流程圖如下:

四、定制Cobra
由于Cobra原始發送過來的郵件內容比較單一,我根據自己的需求改動了一下它的代碼,主要改動了./cobra/engine.py、./cobra/send_mail.py和./cobra/cli.py三個文件的內容,改動前后的郵件內容對比如下:


主要改動的內容如下:
1. Cobra審計結果加入風險數量統計
2. 報告文件名改為上線源碼包名
3. 郵件內容加入SVN地址和風險數量統計
4.1 Cobra審計結果加入風險數量統計
該功能改動的是engine.py,Cobra審計結果的Level字段通過H-xx、M-xx和L-xx(xx為數字)來標記高中低三個等級的風險,因此利用count函數統計這幾個字符就可以實現風險數量統計,代碼如下:
    global h_c
    global m_c
    global l_c
    h_c = str(statis.count('H-'))
    m_c = str(statis.count('M-'))
    l_c = str(statis.count('L-'))
    logger.info('[STATIS] High level count: ' + h_c + ' Middle level count: ' + m_c + ' Low level count: ' + l_c)
這里通過global定義全局變量的原因是方便send_mail功能調用這個變量,從而實現在郵件內容中顯示統計數量,而statis是cobra輸出的審計結果內容。
4.2 報告文件名改為上線源碼包名
這里比較簡單,直接將cli.py第122行在生成附件名稱(attachment_name)時,將本來的隨機數s_sid改為源碼包名target即可。
# 匹配郵箱地址
    if re.match(r'^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$', output):
        # 生成郵件附件
        attachment_name = [target] + '.' + formatter
        write_to_file(target=target, sid=s_sid, output_format=formatter, filename=attachment_name)
        # 發送郵件
        send_mail(target=target, filename=attachment_name, receiver=output)
4.3 郵件內容加入SVN地址及風險數量
審計報告的SVN地址在調度腳本執行上傳SVN操作的時候已經生成,但是為了避免跨目錄跨模塊傳輸變量值的麻煩,我直接在send_mail.py文件里面重新生成了SVN地址風險數量則是調用engine.py中的h_c、m_c和l_c三個變量值,下面分享一下生成郵件內容的代碼。
改動前內容:
 s_sid = filename.split('.')[0]
    msg = MIMEMultipart()
    msg['From'] = sender

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺