天天看點

甲方安全中心建設:代碼審計系統

* 本文作者:陌度,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載

縱觀甲方的安全體系建設,最開始和最重要的那一部分就是代碼安全。甲方公司内部有很多項目,每個項目都由不同的開發人員進行開發,是以項目開發水準也是參差不齊,也就是說有很大可能産生漏洞(SQL注入,XSS,指令執行等)。很多甲方公司公司無法将SDL徹底落地除了DevOps的頻繁傳遞,還有就是安全工程師無法在短時間内對大量項目的源代碼進行人工審計。基于上面這個原因,我自己寫了一個自動化代碼審計的系統,為了讓自己能夠偷懶,減少工作量,提升工作效率。

該系統是使用python3的django去開發,隊列使用celery+redis,最後調用代碼審計工具fortify進行審計代碼。

安裝

源碼的位址:https://github.com/yingshang/banruo.git

docker安裝,具體可以去檢視源碼的docker目錄

FROM ubuntu:16.04
COPY run.sh /opt/run.sh
COPY sources.list /etc/apt/sources.list
COPY fortify_linux /opt/fortify_linux
ENV DEBIAN_FRONTEND noninteractive   
RUN chmod 777 /opt/run.sh
RUN apt-get update -y \
  && apt-get install -y mysql-server mysql-client libmysqlclient-dev --no-install-recommends \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN apt-get update -y
RUN apt-get install -y redis-server  unzip python3-pip wget vim git libffi-dev libssl-dev  libjpeg8-dev zlib1g-dev libxml2-dev libxslt-dev libyaml-cpp-dev 
RUN pip3 install django
RUN pip3 install  mitmproxy==0.18.2 
RUN pip3 install django-celery redis pymysql
RUN pip3 install typing
RUN cd /opt && git clone https://github.com/yingshang/banruo.git
RUN service mysql start && mysql -e "create  database banruo DEFAULT CHARSET utf8 COLLATE utf8_general_ci; " && mysql -e "set password for 'root'@'localhost' =password('123456');"
RUN service mysql start &&  cd /opt/banruo && python3 manage.py makemigrations && python3 manage.py migrate
RUN mkdir /data && mkdir /data/fortify && mkdir /data/fortify/report && chmod 777 /data -R
#這個是fortify的運作程式
#RUN chmod 777 -R /opt/fortify_linux/ && ln -s /opt/fortify_linux/bin/sourceanalyzer /usr/local/bin/sourceanalyzer && ln -s /opt/fortify_linux/bin/ReportGenerator /usr/local/bin/ReportGenerator
EXPOSE 8000
ENTRYPOINT /opt/run.sh           

複制

示範的docker,裡面有一些測試資料。

docker run -it -p 8000:8000 wushangleon/sc           

複制

(很奇怪,在最小安裝版的centos7啟動不起來,但是圖形系統又可以啟動。可以直接使用Ubuntu啟動這個docker)

系統架構

系統分為下面幾個部分:

1.報告圖表

報告圖表我使用echarts進行渲染生成圖表,這裡面包括周報、月報和年報,圖表中有漏洞趨勢和高危漏洞占比。

甲方安全中心建設:代碼審計系統

2.項目掃描

我在設計要怎麼拖取項目進行掃描的時候,想過要不要直接調取gitlab或者jenkins的接口,但是感覺這樣太麻煩了,還不如幹脆直接拉取項目。

①git項目掃描,這個功能隻支援對單個項目進行掃描,适合于掃描單個項目的代碼。

②git-list掃描,這個功能支援對多個項目批量掃描,我在配置檔案設定了兩種掃描方案,一種是本地文本檔案裡面有多個項目的git位址(推薦),一種伺服器運作一個接口,通過調取這個接口擷取項目的git位址。這裡可以去django的背景設定定時計劃,我是每天淩晨的時候去跑項目,因為晚上伺服器沒有人用。

#git-list
http://192.168.1.210:8880/root/dvwa.git
http://192.168.1.210:8880/root/test.git           

複制

下面是web-api

甲方安全中心建設:代碼審計系統

③svn掃描,對于這個功能我感覺可有可無,對于中型企業一般都是本地搭建gitlab做版本控制,主要是我沒用到SVN= =

④壓縮包上傳,這個功能隻支援單個項目進行掃描,并且隻允許上傳ZIP檔案。

甲方安全中心建設:代碼審計系統

3.項目情況

這個功能顯示每個項目的名字,漏洞總數,以及掃描的類型,點選項目的序号進入到項目詳情檢視項目的具體情況,裡面包括項目高危漏洞分布的圖表和漏洞代碼的位置,這樣就可以很快定位到漏洞的問題。還有一個重新審計的功能,這個功能不支援壓縮類型的重新審計,畢竟你還不如直接上傳審計。(對于代碼高亮那一部分是借鑒了cobra的代碼=-=)

甲方安全中心建設:代碼審計系統
甲方安全中心建設:代碼審計系統

這些漏洞标題、漏洞描述、修複建議是參照fortify報告的描述,但是fortify是英文,我在info.py翻譯成中文,我隻翻譯了嚴重和高危的漏洞的描述。

甲方安全中心建設:代碼審計系統

4.禅道

對于一個安全老油條來說,甩鍋這個技能是必須要學的。由于開發本身就忙于項目的開發進度,肯定沒有時間去看你的項目情況(那這些給誰看,肯定給上司看啊= =),是以才需要禅道的存在。因為假如由于這個漏洞出現的安全問題,一追蹤發現是開發沒有根據禅道的記錄去修改,于是就可以殺開發祭天,nice,逃過一劫。但是正确的态度還是要跟開發撕,撕到這個問題被解決。

由于本人不想花時間去研究禅道的接口,幹脆直接簡單粗暴将漏洞的記錄直接寫進資料庫裡面。

對于禅道的功能,我設定了三個功能以完成發送到禅道系統裡面進行展示。

①批量隐藏,為什麼不是删除呢?因為我是根據漏洞的标題+漏洞的項目+漏洞的檔案名+漏洞的處于的行數進行生成一個MD5值,當你删除之後,下一次這個漏洞會再次生成,是以隻能将這條記錄隐藏。

②過濾漏洞,周遊所有項目,找到新發現的漏洞(資料庫沒有這個漏洞的記錄)并儲存在資料庫裡面。

③發送到禅道。一般過濾漏洞之後,有些問題是誤報,作為一個專業的安全工程師,你不可能直接将誤報發給開發,讓開發嘲笑。這時候就需要使用隐藏功能,将這條誤報記錄給隐藏下來。最後篩選過後,直接将記錄寫到禅道的資料庫裡面。

④郵件系統。這個功能是一個django背景設定定時發送郵件給開發組,告訴他們去認坑。為什麼不适用禅道的郵件?因為直接寫進資料庫是不發送郵件的。

甲方安全中心建設:代碼審計系統

禅道系統的設定:建立一個産品叫安全審計,在項目添加對應的git的項目,添加負責人= =講真,這一部分要根據自身的業務做一個調整

甲方安全中心建設:代碼審計系統
甲方安全中心建設:代碼審計系統
甲方安全中心建設:代碼審計系統

說一下禅道和我這個系統的連結配置,person_info這個表是儲存禅道項目的負責人和項目ID,發送過程的時候擷取這些資訊加入到SQL中,最後執行這段SQL寫入禅道的資料庫。

甲方安全中心建設:代碼審計系統
甲方安全中心建設:代碼審計系統

配置

在banruo檔案下中config.py是全局的配置檔案

禅道系統的測試可以參照這篇文章:https://blog.csdn.net/qq_28039297/article/details/78650552

#fortify的配置路徑
fortify_path = "/data/fortify/" 
#fortify報告生成的路徑
report_path = "/data/fortify/report/"
#GitAPI配置,1為文檔,2為web-api
git_username = '[email protected]'
git_password = 'abc123456'
git_api_choice = 1
#這個是我自己寫的一個測試接口
git_api_adress = "http://127.0.0.1:8000/aduit/api_test"
parm = "gitlab_url"
#方案1接口的路徑
git_filepath = "/opt/git-list"
#過濾fortify的高危漏洞到禅道資料表裡面
filter_title = ['Injection', 'Cross-Site Scripting']
#發送禅道的設定,不使用禅道的接口,直接寫入資料庫
openedBy = '1' #建立人ID
product = '3' #項目的ID
MYSQL_HOST = '192.168.1.210'
MYSQL_USER = 'root'
MYSQL_PASSWORD = '123456'
MYSQL_DATABASE = 'zentao'
MYSQL_PORT = 3307
#郵件設定
MAIL_HOST = "smtp.163.com"
MAIL_USER = ""
MAIL_PASSWORD = ""           

複制

結尾

假如你沒有fortify的Linux版,這一切将不存在。。。

* 本文作者:陌度,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載