「安全開發教學」github泄露掃描系統開發
首發小米安全中心公眾號:『安全開發教學』Github泄露掃描系統開發
概述
github敏感信息泄露一直是企業信息泄露和知識產權泄露的重災區,安全意識薄弱的同事經常會將公司的代碼、各種服務的賬戶等極度敏感的信息『開源』到github中,github也是黑、白帽子、安全工程師的必爭之地,作為甲方的安全工程師,我們需要一套可以定期自動掃描特定的關鍵字系統,以期第一時間發現豬隊友同事泄露出去的敏感信息。
積極響應開源號召的同學請開自己業餘的項目,公司的產品代碼、各系統賬戶屬於公司的資產,擅自對外界公布侵犯了公司的知識產權,屬於違法行為,造成後果嚴重者,不僅會被公司開除,還需承擔相應的法律責任。
接下來我們一起來看看如何寫一款github泄露掃描系統。
功能需求
雖然寫代碼可以一把梭,但一把梭之前需要先把要寫的功能清單列一下,我們的github掃描系統會實現以下功能:
- 雙引擎搜索,github code介面搜索全局github以及本地搜索例行監控的repos
- 支持對指定的用戶、倉庫、組織進行監控
- 提供WEB管理界面,支持規則管理(github搜索規則及本地repos搜索規則)
- 支持github token管理和用戶管理
- 掃描結果審核
已經完成的項目的地址為:
https://github.com/MiSecurity/x-patrol
實現過程
引擎1 - github code搜索模塊的實現
github對API調用的速率限制如下:
- 對未驗證的請求,每小時的限速為60次,使用token認證後,可以把速率提升為每小時5000次。
- 對於搜索API,未驗證的請求的速率限制為10次每分鐘,認證後,可以提高到30次每分鐘。
所以在使用github的sdk前,我們需要先準備好token管理模塊,方便我們隨機獲取到額度沒用完的token建立client去請求數據,github token的數據結構如下:
每個token初始化時,默認額度為最大值5000,然後在使用的過程中根據返回值動態實時更新remaining的值:
我們在使用github client前,從資料庫中先拉取當前額度還大於50的token
然後用這些當前額度夠用的Token創建一個map[string]*Client,每次使用時隨機獲取一個github client,代碼如下所示:
在github client建立好後,我們就可以使用關鍵字進行全局代碼搜索了,暫定只取前500條記錄,相關的代碼片斷如下:
在實際使用中,我們的系統中會存在大量的規則需要github code 搜索引擎執行,以下為相應的任務管理代碼:
ScheduleTasks(duration time.Duration)
函數是定時任務管理,duration指定了多久進行一次github code 搜索GenerateSearchCodeTask() (map[int][]models.Rules, error)
函數為任務分割函數,因為github search api的速率限制為每分鐘30次,我們將其按25個分發幾批RunSearchTask(mapRules map[int][]models.Rules, err error)
函數會按批次執行搜索任務,每次執行完都會查看用時,如果小於1分鐘就等待到1分鐘,以便我們永遠不會超出search api的速率限制Search(rules []models.Rules) ()
函數的作用是以並發的方式進行github code搜索,並將搜索結果保存到資料庫中。
引擎2 - 本地repos高速搜索模塊
我們在使用password等通用的敏感關鍵字進行github code搜索時,往往會搜索到大量與要監控的目標無關的結果,從裡面排查出我們想監控的目標的敏感信息如同大海撈針一般。為了避免這個問題,我們的解決方案是:
- 只關注與目標相關的用戶、組織與倉庫,比如搜集小米公司員工的用戶名,組織,然後通過github sdk查出這些組織與用戶所有的倉庫,定期拉到本地用更詳細的關鍵字進行深入掃描;
- 利用與目標相關的關鍵字進行github code搜索,將搜索結果中的庫放到引擎2中定期地進行本地深入掃描。
引擎2的高速搜索演算法來自一個開源項目https://github.com/etsy/hound,該演算法最初來自google的大神Russ Cox 的一篇文章Regular Expression Matching with a Trigram Index or How Google Code Search Worked,有興趣了解演算法的同學可以仔細閱讀一下,我直接將該演算法封裝為了一個SearchRepos函數,傳遞一條規則和一批倉庫進去,會返回該規則的搜索結果。
以下為引擎2的任務調度核心代碼:
代碼解讀:
SegmentationTask(reposConfig []models.RepoConfig) (map[int][]models.RepoConfig)
的作用是將需要掃描的倉庫按配置的MAX_Concurrency_REPOS的數量分成批次DistributionTask(tasksMap map[int][]models.RepoConfig, rules []models.Rules)
會將任務按批次分別傳給Run(reposConfig []models.RepoConfig, rule models.Rules)
執行Run(reposConfig []models.RepoConfig, rule models.Rules)
的本意是並發執行代碼搜索任務,比如有10000個倉庫,每次並發100,100次就查完了。想想這個速率就美滋滋。SaveSearchResult(responses map[string]*index.SearchResponse, rule models.Rules, err error)
函數的作用是將搜索結果去重保存到資料庫中ScheduleTasks(duration time.Duration)
為定時任務的調度函數,每隔指定的時間後重新獲取最新的倉庫及規則並進行本地代碼搜索。
規則管理
前面我們已經實現了github code搜索與本地repos的深入掃描功能,接下來需要提供一個規則管理模塊了,利用規則對引擎1和引擎2進行調度。
為了兼容gitrob
的規則文件,我們把規則的數據結果定義如下,並提供增、改、刪、查、禁用、啟用等功能程序啟動時,如果發現規則表為空,則會默認插入當前目錄中conf/gitrob.json
中規則,代碼如下:
我們再提供一個自定義規則管理的WEB界面,以下為規則相關的路由信息,詳細實現請直接參考github倉庫。
最後的效果圖如下,需要注意的是在為github code搜索填寫規則時,因為我代碼中為了兼容正則,沒有直接加精確搜索,需要在配置規則時手工加上雙引號表示精確搜索。
資產管理及倉庫管理
對於github泄露檢測來說,資產就是我們需要監控的用戶、組織與倉庫,這些信息會最終轉化為倉庫列表中,供本地檢測模塊使用。
以下代碼為將錄入資產列表中的用戶、組織的倉庫全部查詢出來並插入到倉庫表中。
倉庫管理表中的信息為引擎2的掃描目標,允許修改禁用、啟用狀態,在結果審核時,忽略的倉庫的狀態會設為禁用狀態,下次掃描時將會忽略。token管理、用戶管理、倉庫管理、結果審核展示界面的WEB實現的佔用篇幅較大就不細說了,詳細請參考github中完整的代碼,最終的效果如下:
倉庫管理:
命令行
到目前為止,我們的github泄露巡航系統的核心功能及WEB管理功能已經一把梭完了,接下來用github.com/urfave/cli
庫再給這些功能加上命令行外殼,把WEB啟動功能與掃描功能分開。
最終我們的程序的命令行如下:
使用說明
- 配置好conf/app.ini中的參數後啟動WEB。默認會監聽到本地的8000埠,默認的管理員賬戶和密碼分別為:
xsec
和x@xsec.io
。
- 然後在WEB中錄入github token、規則。
- 啟動搜索功能:
- scan指令表示只啟動github搜索
- scan -m local,表示只啟動本地代碼搜索功能
- scan -m all,表示同時啟動github代碼搜索與本地Repos搜索功能
- 審核結果 github code搜索結果審核:
本地repos詳細搜索結果審核:
第3種選擇
sourcegraph是非常專業的代碼搜索服務商,他們提供的Sourcegraph Server是免費的代碼搜索伺服器,通過docker的方式部署,支持無限擴展,支持對GitHub, BitBucket, GitLab等倉庫的代碼搜索。搜索內容包括倉庫代碼、diff、commit。
Sourcegraph Server還提供了GraphQL API,可直接通過API提交代碼搜索請求。利用Sourcegraph Server代替引擎2的功能應該會有不錯的效果,有興趣的同學可以嘗試一下。
推薦閱讀:
※PowerView 滲透測試工具使用方法Part.1
※如何將大數據分析技術應用於信息安全領域?
※這名黑客說,他能看到明星整容前的樣子
※如何黑掉一個Web App
※黑客X檔案現在不更了,有沒有什麼途徑可以接觸到類似黑客檔案這樣通俗易懂的書籍或者與其相關很好的論壇呢?