DevOps風險測繪之代碼篇
DevOps是Development和Operations組合的縮寫詞,它指的是一種協作方法,使企業的應用程序開發團隊(Development team)和 IT 運營團隊(Operations team)能夠更好地溝通工作,DevOps的概念有助于使技術項目與業務需求保持一致,從而提高企業整體的工作效率。如圖1所示,DevOps流程主要會涉及8個步驟,分別是:計劃(PLAN)、編碼(CODE)、編譯(BUILD)、測試(TEST)、發布(RELEASE)、部署(DEPLOY)、運營(OPERATE)和監控(MONITOR)。

圖1 DevOps流程示意圖
編碼環節簡述
編碼(CODE)環節是DevOps流程中非常重要的一環,在這一環中企業機構一般都會使用相關的代碼管理工具來提高團隊整體的開發協作效率,同時大部分企業機構會選擇自建代碼倉庫管理工具來進行開發以避免自身相關的代碼暴露在公網之中。因此,DevOps團隊一般不會使用集中式公開的代碼管理工具(如Github、CSDN、Gitee等),而是選擇可以建在自己服務器上的代碼管理工具(如GitLab、Gogs、Gitea、Gitblit等)。
自建代碼倉庫測繪
代碼安全一直是網絡信息安全中至關重要的一環。對于一個網絡系統來說,代碼就是其生命的化身,無論是前期的研發還是后期的運營,代碼安全對于任何一個組織機構而言都有著舉足輕重的意義。基于網絡空間測繪技術,我們對自建代碼倉庫GitLab、Gogs、Gitea、Gitblit、Gitbucket等進行了研究,此篇我們將詳細介紹Gogs、Gitea和Gitblit三個代碼倉庫資產相關的測繪研究結果。
Gogs資產風險測繪
Gogs是一款極易搭建的自助 Git 服務,它的目標是打造一個最簡單、最快速和最輕松的方式搭建自助 Git 服務。使用 Go 語言開發使得 Gogs 能夠通過獨立的二進制分發,并且支持 Go 語言支持的 所有平臺,包括 Linux、Mac OS X、Windows 以及 ARM 平臺[3]。
Gogs國內資產暴露情況
根據網絡測繪數據,我們對2022年3月國內Gogs資產暴露情況進行了統計,共計查詢到4650個暴露的資產,下面將從地區分布、暴露端口和網絡協議三個維度分別進行介紹。
如圖2所示,國內暴露的Gogs資產中約60%來源于北京市、廣東省、上海市;其中北京市暴露資產數量排名首位,暴露的Gogs資產達到1095個。

圖2 Gogs國內暴露資產分布圖(地區維度)
如圖3所示,國內暴露的Gogs資產使用的端口主要為3000和443,共占總數的93%,其中3000端口暴露量最多,共計3849個,占比83%。

圖3 Gogs國內暴露資產分布圖(端口維度)
如圖4所示,國內暴露的Gogs資產協議為HTTP和HTTPS,分別占比86%和14%。

圖4 Gogs國內暴露資產分布圖(協議維度)
Gogs國內資產脆弱性情況分析
我們對近幾年Gogs的CVE進行了分析,主要有七個,分別是:CVE-2020-15867、CVE-2019-14544、CVE-2018-20303、CVE-2018-18925、CVE-2018-16409、CVE-2018-15193和CVE-2018-15192。CVE發布時間、CVSS V3.1評分、CVE對應資產版本及漏洞類型如表1所示,其中評分9分以上的漏洞有兩個,分別是屬于RCE漏洞的CVE-2018-18925和屬于未授權訪問漏洞的CVE-2019-14544。

表1 Gogs CVE詳情
除了公布的Gogs CVE漏洞之外,我們通過研究還發現部分Gogs資產存在著因錯誤配置而導致的未授權訪問漏洞,攻擊者可以匿名訪問該資產的代碼倉庫并進行拷貝,如圖5所示。

圖5 存在未授權訪問漏洞的Gogs資產
針對于上述暴露的4650個Gogs資產,我們對其脆弱性進行了分析。如下圖6所示,我們共發現未授權訪問漏洞(因錯誤配置)2181個、CVE-2020-15867(權限提升)1263個、CVE-2018-20303(目錄遍歷)549個、CVE-2018-18925(RCE)503個、CVE-2018-15192(SSRF)435個、CVE-2018-15192(CSRF)435個、CVE-2019-14544(未授權訪問)151個和CVE-2018-16409(SSRF)65個。

圖6 Gogs暴露資產脆弱性情況
Gitea資產風險測繪
Gitea 是一個企業自身托管的Git服務程序,由Gogs 發展而來,支持 Linux、macOS 和 Windows 等各種架構。Gitea的首要目標是創建一個極易安裝,運行非常快速,安裝和使用體驗良好的自建 Git 服務,Gitea采用Go作為后端語言,這使它只要生成一個可執行程序即可[4]。
Gitea國內資產暴露情況
根據網絡測繪數據,我們對2022年3月國內Gitea資產暴露情況進行了統計,共計查詢到2922個暴露的資產,下面將從地區分布、暴露端口和網絡協議三個維度分別進行介紹。
如圖7所示,國內暴露的Gitea資產中約55.3%來源于北京市、廣東省、上海市;其中北京市暴露資產數量排名首位,暴露的Gitea資產達到563個。

圖7 Gitea國內暴露資產分布圖(地區維度)
由圖8可見,國內暴露的Gitea資產使用的端口主要為3000和443,占總數的96%,其中3000端口暴露量最多,共計2293個,占比78.5%。

圖8 Gitea國內暴露資產分布圖(端口維度)
如圖9所示,國內暴露的Gitea資產協議為HTTP和HTTPS,分別占比82%和18%。

圖9 Gitea國內暴露資產分布圖(協議維度)
Gitea國內資產脆弱性情況分析
我們對近幾年Gitea的CVE進行了分析,主要有九個,分別是:CVE-2018-18926、CVE-2019-11576、CVE-2020-13246、CVE-2021-3382、CVE-2021-45325、CVE-2021-45326、CVE-2021-45327、CVE-2021-45330、CVE-2021-45331,詳情如表2所示。其中評分9分以上的漏洞有四個,分別是屬于RCE漏洞的CVE-2018-18926和CVE-2021-45327、屬于未授權訪問漏洞的CVE-2019-11576、屬于弱身份驗證漏洞的CVE-2021-45330。

表2 Gitea CVE詳情
除了公布的Gitea CVE漏洞之外,和Gogs類似,我們還發現了部分Gitea資產存在著因錯誤配置而導致的未授權訪問漏洞,攻擊者可以匿名訪問該資產的代碼倉庫并進行拷貝,如圖10所示。

圖10 存在未授權訪問漏洞的Gitea資產
針對于上述暴露的2922個Gogs資產,我們對其脆弱性進行了分析。如下圖11所示,我們共發現未授權訪問漏洞(因錯誤配置)1743個、CVE-2021-45330(弱身份驗證)1537個、CVE-2021-3382(DoS)592個、CVE-2020-13246(線程死鎖)365個、CVE-2021-45327(RCE)325個、CVE-2019-11576(未授權)113個、CVE-2021-45325(SSRF)92個、CVE-2018-18926(RCE)56個、CVE-2021-45326(CSRF)52個和CVE-2021-45331(未授權)43個。

圖11 Gitea暴露資產脆弱性情況
Gitblit資產風險測繪
Gitblit 是一個開源的純 Java 堆棧,用于管理、查看和提供 Git 存儲庫,它是一款為希望托管集中式存儲庫的小型工作組設計的工具。Gitblit 可以用作沒有管理控制或用戶帳戶的存儲庫查看器,也可以用作完整的 Git 堆棧,用于克隆、推送和存儲庫訪問控制,同時Gitblit 可以在沒有任何其他 Git 工具(包括實際的 Git)的情況下使用,也可以與用戶已建立的工具配合使用[5]。
Gitblit國內資產暴露情況
根據網絡測繪數據,我們對2022年3月國內Gitblit資產暴露情況進行了統計,共計查詢到1556個暴露的資產,下面將從地區分布、暴露端口和網絡協議三個維度分別進行介紹。
如圖12所示,國內暴露的Gitblit資產中約74%來源于北京市、廣東省、上海市和浙江省;其中北京市暴露資產數量排名首位,暴露的Gitblit資產達到359個。

圖12 Gitblit國內暴露資產分布圖(地區維度)
由圖13可見,國內暴露的Gitblit資產使用8443端口最多,占比48%,其次是8080端口,占比14%。

圖13 Gitblit國內暴露資產分布圖(端口維度)
如圖14所示,國內暴露的Gitblit資產協議為HTTP和HTTPS,分別占比52%和48%。

圖14 Gitblit國內暴露資產分布圖(協議維度)
Gitblit國內資產脆弱性情況分析
類似于Gogs和Gitea,我們也發現Gitblit存在著同樣因錯誤配置而導致的未授權訪問漏洞,攻擊者可以匿名訪問該資產的代碼倉庫并進行拷貝,如圖15所示。

圖15 存在未授權訪問漏洞的Gitblit資產
針對于上述暴露的1556個Gitblit資產,我們對該未授權訪問漏洞進行了驗證,共計發現約602個Gitblit資產存在漏洞,存在著較大的安全隱患。
安全風險及建議
安全風險
通過對自建代碼倉庫Gogs、Gitea和Gitblit的風險測繪研究,我們可以發現暴露資產中存在著較大的安全隱患。目前我們已發現的潛在安全風險有:1. 敏感數據泄露;2. 項目源代碼泄露;3. 軟件供應鏈投毒攻擊。
敏感數據泄露:通過利用上文漏洞,攻擊者可以竊取部分Gogs、Gitea和Gitblit資產中的敏感數據,示例見圖16。

圖16 敏感數據泄露示例
項目源代碼泄露:源代碼是控制系統的最底層邏輯,通過代碼審計可以發現系統中存在的缺陷,攻擊者會通過缺陷對系統進行攻擊。通過利用上文漏洞,攻擊者可以成功竊取部分Gogs、Gitea和Gitblit資產中的源代碼。
軟件供應鏈投毒攻擊:通過利用上文漏洞,攻擊者可以增刪改部分Gogs、Gitea和Gitblit資產中的代碼,可能會導致供應鏈投毒攻擊,類似于solarwinds事件[6]。
安全建議
源代碼泄露的危害不可小覷,任何企業和組織機構都不會希望自己的代碼落入他人之手,對于開發團隊我們建議:
1. 及時更新軟件版本。
2. 盡量將資產使用的端口放在內網IP地址,避免直接暴露在互聯網。
3. 避免將敏感數據存放到代碼倉庫。
同時我們發現上述暴露的資產90%以上屬于軟件供應鏈的模式,如圖17所示。由于外包關系,受害單位很難知道自己使用的系統代碼是否泄露,并且我們已發現我國多個關鍵基礎設施單位的系統代碼存在著類似的安全風險,因此我們建議相關大型企業、單位聯系我們進行進一步的系統代碼泄露核查。

圖17 通過外包項目進行網絡攻擊(關系圖)
出于網絡安全和保護隱私等方面,大部分DevOps團隊都會選擇自建代碼倉庫進行協同開發合作(如GitLab、Gogs、Gitea、Gitblit等)。通過研究,我們發現我國存在大量暴露的Gogs、Gitea和Gitblit資產,且部分暴露的資產存在著嚴重的脆弱性漏洞(如RCE、未授權訪問漏洞等)。這些存在漏洞的代碼管理工具可能會導致敏感數據泄露、項目源代碼泄露及軟件供應鏈投毒攻擊等安全風險。同時我們還發現上述暴露的資產90%以上歸外包開發商所有,這進一步加大了對自身代碼泄露進行排查的難度。
Gartner報告指出[7],到2025年全球45% 組織機構的軟件供應鏈將遭到攻擊,這個數據將會是2021年的三倍。而在DevOps流程中,開發團隊會使用各種各樣的供應鏈軟件,因此DevOps安全值得引起我們所有人的注意。代碼開發協同合作是DevOps流程中非常重要的一環,而源代碼又是代碼開發協同合作中的核心,源代碼安全不僅會直接對相關企業單位造成嚴重影響,也會對國家整體網絡安全造成極大的威脅,因此保護好源代碼安全就是保護好DevOps流程安全的關鍵。