開源軟件漏洞挖掘實踐

今天分享的主題是開源軟件漏洞挖掘實踐,主要講對于企業項目、開源項目審計的認識以及做代碼審計的經驗。

01
自我介紹
關于我在代碼安全這一塊的經歷,主要分為三個階段。

階段一,主要挖PHP寫的內容管理系統的一些漏洞,作為我剛入門的一個階段;
階段二,是在百度云計算網絡等業務線的安全評估,里面也會涉及到一些代碼審計相關的東西;
階段三,目前在火線安全做云原生相關的安全研究。

02
開源軟件安全評估
第二部分:介紹一下開源軟件安全評估的一些手段,主要是兩個自動化相關的手段。

目前可以看到市面上的很多開源軟件都集成了fuzz功能,可以大概理解成我們給程序隨機的數據,然后去看這個程序有沒有崩潰,如果程序崩潰,它就可能存在比如IP指針被覆蓋的安全問題,然后研究人員根據這些崩潰的案例去進一步的看有沒有安全漏洞。
這些開源軟件怎么集成fuzz,舉一個例子就是CPython的一個項目,就像上面PPT畫的。CPython下面有一個目錄,這個目錄的文件里面有類似單元測試的代碼,它會去調用那個CPython的已實現的API接口,想去測試這些API接口,單元測試會被fuzz工具自動化的去看這些API有沒有安全漏洞。
從公開的一些報道來看的話,現在國內也有一些廠商,比如說騰訊,是已經這個fuzz集成到他們的流程里。

第二點,開源軟件有很多借助靜態代碼掃描的手段去自動化檢測漏洞。在安全里面最出名的自動化的靜態掃描工具應該是Code QL。
比如說PPT右邊展示的這個配置文件,他們做了一些配置,然后github就會根據這個配置去對倉庫做一個漏洞掃描,掃描結果也可以在github上看到,就像左邊的這四個漏洞,他標記的都是高風險類型。
開源軟件作者或者安全研究者,可以借助這些工具來保證軟件的安全性和漏洞挖掘。
03
企業代碼審計
第三點,想分享一下之前在企業里面做代碼審計的經驗。我在沒有去百度做代碼審計和安全評估之前,我以為企業的代碼審計可能跟開源的代碼審計差不多,主要就是看看代碼挖漏洞這種,但實際上不是這樣。

實際上企業里代碼審計跟開源的目標不一樣,企業里面代碼審計的目標主要是為了防守、降低漏洞代碼帶來的安全風險。目標是挖掘和修復所有漏洞,并且覆蓋到所有對外的線上業務。基于這個目標的話,工作內容就會發生變化。
跟開源軟件相比,就不會太注重那個漏洞分析這一塊兒。舉個例子,比如我們做SDL時需要去分析fastjson漏洞的原理、各種利用鏈是怎么回事嗎?就我的工作經歷來看的話,其實是不太需要的。為什么呢?因為我們要審計的目標很多,但是資源、人力、工具都是很有限的。在這么一個情況下去防守,去推動業務完成漏洞的防御,所以說,我們可能就不會優先去投入很多的資源去分析這個漏洞。
還有一點相比于開源來說,它多了漏洞的修復。我們需要讓研發來修復,那么就需要要提供詳細的修復方案給研發,還要不斷的去催研發修這個漏洞,這個事情比較花時間。

另外來說就是我們的一些工作思路,這個還是以我個人的經驗來做分享,我假設攻擊者是沒有拿到源碼和訪問不了內網系統,在這種情況下,我不太關注特別復雜的情況。
比如從黑盒的角度來看的話,你拿不到這個token,你就訪問不了API,這也干不了什么事兒。但是實際的情況不太一樣,舉一個例子,我在挖掘一個安全廠商的漏洞的時候發現了這個漏洞,從github上泄露了源碼,拿到源碼以后,我看到了代碼里面的這個key,這個key是用來做身份證的,我有了這個Key以后,就能訪問這個服務的所有的API,也能拿到很多的數據,特別是其中有一個API還是存在一些SQL注入的問題。
另外一些不同點,企業里面的文檔相對來說沒有大型的成熟的開源項目那么完善,從文檔里面你很難看出業務架構、業務技術棧以及業務邏輯。第二個是企業的代碼相對來說更復雜一些,包括他用的技術棧和依賴的組件,還有一些業務形態。就比如說云上的一些Paas平臺,它可能還要考慮到一些多租戶的這種情況,相對來說可能會更復雜。
第三個是從我在企業里面做代碼審計的經驗來看,你很難在本地去搭建一個開發環境出來。
04
方法論和案例
第四部分我想跟大家分享一些之前總結出來的方法論。

我們在做代碼審計的時候到底是在關注哪些目標?看右圖,把關注目標分成三個層級。每一層理解成一個業務。
我們在審計的時候總是假設在底層它的實現是正確的。我們在這一層的服務角度上來講,去看一下有沒有安全問題。三層里面每一層它其實都算一種。這些業務,你用不同語言的不同框架都有可能出現類似的漏洞。
經驗經常是出現在最底層的誤用這一塊兒,比如說語言層或者庫層,都會提供命令執行或者是文件操作這些功能,我們服務出現制造命令執行漏洞,或者是任意文件讀寫這種漏洞,其實都算是對底層的一種誤用。根據這個經驗,我審計的時候遵循幾個原則,審計的目標是自上而下的,我假設Java的日志庫是安全的。文件讀寫這種上層的業務,如果說我在這兒上傳業務,在我已經覺得比較安全的情況下還想繼續發掘漏洞,可能審計目標就會變成下一層,我會去看框架層有沒有漏洞。審計之前我也會去學習同類業務的歷史漏洞。
最后,審計時我會以那個黑盒視角去找到風險業務,做安全評估比較多的人,可能就是較容易知道哪些業務經常出現問題,就比如說身份認證這種功能,它經常可能就會出現一些奇奇怪怪的問題,如果一旦出現問題,他可能就會造成API有一個未授權訪問。

最后,給大家分享兩個案例,第一個案例Bytebase身份認證偽造的漏洞,他是CNCF基金下的一個項目,主要是用來做數據庫的版本管理。這個項目的身份認證是依賴jwt,本身生成的簽名需要有一個key跟固定的算法去生成一個簽名。
如果說我們能拿到這個key的話,我們就可以偽造這個簽名,偽造這個簽名的話,我們也就可以去修改jwt的payload,也就是這些里面的數據,比如可以用戶名來判斷你當前的請求是哪個用戶,另一方面是隨機數的生成,需要一個API接口,它這里是一個偽隨機數算法,就是說它的隨機數的一個序列是可以被猜測到的,所以我們是可以猜到它的key。
對于這個案例,其實是相當于把業務分層,它的身份證業務其實是依賴jwt的實現,或者說這個規范的實現。關于隨機數的生成,如果你把它也當做一個業務的話,生成的方式有兩種,一種就是說你用庫提供的rand api去生成一個隨機數,這種情況下,它有可能分真隨機跟偽隨機。第二種就是有一些業務會拿uid來當做一個隨機數,但用uid這種東西,它本身也是有規律的,也不是說完全隨機的。

第二個案例是yaml解析的一個安全問題,這個是我在好早之前挖一個廠商的漏洞的時候遇到的。
Snake Yaml在解析用戶提供的惡樣本數據時存在一個反序列化漏洞,但是它的利用鏈是說你需要能夠從外網去拿到一個字節碼,然后它才會根據你這個字節碼去實例化對象,然后造成命令執行。但是我怎么在不出網的環境下去利用,因為我對Snake Yaml其實也不也不熟,我當時的想法是根據用戶提供的對象名還有構造參數來實例化一個對象,fastjson之前被爆過一些漏洞利用鏈是可以不出網實現任意文件讀寫。那么,我這個能不能把fastjson的這個這個鏈能移到這個Snake Yaml上來,結果證明是可以的。
做完這個漏洞挖掘之后,我的想法是說Snake Yaml是Java語言的一個庫,那其他語言是否可以?類似Java關于yaml的解析,業務都是類似的,都可能是根據用戶提供的對象跟參數值去實例化,造成命令執行。我稍微測試了一下,像python也是可以根據用戶的輸入直接造成命令執行的。
所以可以看得出來,相似的業務總有相似的漏洞利用鏈。

因為我們的資源都是有限的,時間也是有限的,但我們的審計目標都是很多的。我們總是想要提高效率,主要有幾個方面。
一個就是高危函數的正則,一個是建立標準的審計流程,關于審計流程的話,因人而異。第三個就是通過git日志,可以知道最近的審計目標對象,它新增了哪些業務代碼,然后再去針對性的審計。

在審計過程中,我也遇到了很多問題,總結一些比較常見的問題,比如說怎么閱讀源碼?關于這個你可以去看一些日志或者文檔,去理解你的審計目標,從而更好的避免直接陷入代碼里面的細節。
舉個例子,就是我之前在審計Snake Yaml的時候,我一開始看就覺得很迷糊,但它實際上用的是一個狀態機,如果說文檔里面提到了狀態機這個背景知識的話,我可以不用看他那一塊兒的邏輯,因為確實也很繞。這樣的話我可以省去一些時間,從而提高自己的效率。
第二個是學習語言是不是都是差不多的?我之前也會聽到一個說法,語言都是一通百通。但是做審計會接觸到很多的技術棧,很多應用可能是用不同的語言寫的,我們都要去審計,這種情況下,我們花費很多的精力是在學習他的語言和應用構建。實際上,如果我們把語言當做一種業務來理解,它總要實現一些共同性的東西,比如很多語言在運行時都要支持并發、支持垃圾回收等等。
然后第三個是怎么快速去掌握一個新的框架?我們審計的時候,拿到一個新的應用,它可能是用到我們之前不認識或者從沒接觸過的web框架。那這個時候我們怎么去掌握?可以分兩點:
- 第一點是API怎么使用。
- 第二點是它的web框架怎么實現。
以上兩點都要掌握的。怎么掌握呢?一個是概念,比如說容器跟web框架的關系,還有請求、上下文這些東西。另外一個就是框架的設計思想,比如springboot的具體配置,我們可能更容易去理解一個新的框架。

參考資料:
1.聊聊 Golang 的 Web 框架
https://mp.weixin.qq.com/s/1mnlMddHzZHMfmfpE5-yhw
2.代碼安全審計之道-有價值炮灰
https://www.bilibili.com/video/BV15L411P7cM?spm_id_from=333.1007.top_right_bar_window_history.content.click
3.持續Fuzzing在DevSecOps中的應用
https://mp.weixin.qq.com/s/1mnlMddHzZHMfmfpE5-yhw
4.漏洞挖掘
https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU0MzgzNTU0Mw==&action=getalbum&album_id=1363100069033066496&scene=173&from_msgid=2247484124&from_itemidx=1&count=3&nolastread=1#wechat_redirect
5.如何高效地學習開源項目 | “華仔,放學別走!”
https://time.geekbang.org/column/article/10022
6.使用Github CodeQL進行0day漏洞挖掘
https://mp.weixin.qq.com/s/KYyW2-JElofG1--k3vnxOg
上圖所展示的部分是我在做這個PPT時候參考的一些資料和相關知識,目前的工作主要偏向漏洞,后面也會給大家分享一些漏洞相關的東西。
【火線Zone云安全社區群】
進群可以與技術大佬互相交流
進群有機會免費領取節假日禮品
進群可以免費觀看技術分享直播
識別二維碼回復【社區群】進群


【火線zone社區周激勵】
2022.3.21~ 2022.3.27公告

【相關精選文章】




火線Zone是[火線安全平臺]運營的云安全社區,內容涵蓋云計算、云安全、漏洞分析、攻防等熱門主題,研究討論云安全相關技術,助力所有云上用戶實現全面的安全防護。歡迎具備分享和探索精神的云上用戶加入火線Zone社區,共建一個云安全優質社區!
如需轉載火線Zone公眾號內的文章請聯系火線小助手:hxanquan(微信)

微信號
huoxian_zone

點擊閱讀原文,加入社區,共建一個有技術氛圍的優質社區!