價值17875美金的Github未授權訪問漏洞挖掘

GitHub在2022年9月9日發布了一個新功能,允許用戶向開源項目維護者報告安全問題。

這個功能稱為安全公告,它讓維護者可以創建一個公共咨詢信息,描述報告的漏洞,并開始處理補丁。

這個功能創建了一個特殊的私有分支,與普通的分支有一些不同之處,例如禁用了問題、項目和討論。

這是為了確保安全和訪問控制。維護者可以在修復漏洞后打開私有PR,并合并到主分支中。

安全公告如何工作?

安全公告功能允許維護者起草有關所報告漏洞的公共咨詢信息。創建后,維護者可以通過創建存儲庫的私有分支來開始處理補丁。

由安全公告創建的私有分叉與常規復刻/存儲庫略有不同。例如,默認情況下,安全公告的私有分支禁用問題、項目和討論。

advisory.build_workspace_repository(attributes.merge({
      name: name,
      private: true,
      owner: owner,
      parent: nil,
      network: nil,
      created_by_user_id: actor.id,
      has_issues: false,
      has_wiki: false,
      has_downloads: false,
      has_projects: false,
      repository_license: repository.repository_license&.dup,
    }))

這表明默認情況下,在這種類型的分支中實現了一些額外的訪問控制,因為它們是敏感的。修復漏洞后,維護者可以針對漏洞存儲庫打開私有 PR 以供稍后合并。

安全公告中有哪些新增功能?

在 11 月版本中,安全通報允許組織允許外部用戶向其公共存儲庫報告漏洞。權限模型沒有隨著新功能而發生重大變化:

在組織公開披露之前,安全公告是私有的 只有所有者/維護者才能合并補丁

但是,有些事情發生了變化:

1.外部報告者將作為協作者添加到漏洞報告中。外部協作者獲得的許可有限:

2.對咨詢的評論。

3.接受咨詢信用。

4.創建私有分叉后,外部報告者會自動作為協作者添加到存儲庫中。然后,外部報告者可以幫助修補漏洞并打開 PR 供維護者接受。

私有分叉、協作者+代碼空間=漏洞利用

通過安全公告報告漏洞的外部用戶將作為協作者添加到修補程序存儲庫中。

進一步調查,補丁存儲庫與易受攻擊的存儲庫位于同一組織中。

最初,這影響不大,因為單個存儲庫的外部協作者沒有太多訪問權限。

特別是在這種情況下,問題、項目、下載和操作等功能被禁用。

但是,為這些存儲庫啟用了代碼空間。

什么是 GitHub Codespace?

GitHub Codespace 是一個基于云的開發環境,允許開發人員快速貢獻和測試他們的代碼。

此環境具有所有開發功能,因為它在所有用戶的獨立虛擬機中運行。此外,為了讓開發人員更安全、更易于與組織協作,GitHub 引入了 Codespace Secrets。Codespaces 機密允許用戶和組織安全地存儲敏感字符串,例如 API 密鑰、SSH 密鑰對、密碼等。

代碼空間機密存在于三個資源中:組織、存儲庫和個人。

個人機密由用戶自己創建,可在用戶創建的所有代碼空間中使用。(對用戶自己來說幾乎是私人的)
存儲庫機密鏈接到特定存儲庫,并且只能由這些存儲庫訪問。
組織機密鏈接到組織,可以進一步鏈接到特定倉庫(同時鏈接到多個倉庫)或所有公共/私有倉庫。

由于組織機密可以設置為由所有私有倉庫訪問,因此我們決定測試并檢查外部用戶是否可以訪問這些機密。從理論上講,這就是我們設想漏洞利用的工作方式:

1.外部用戶創建漏洞報告

2.外部用戶將自動作為協作者添加到漏洞報告中。

3.外部報告者在未經管理員批準的情況下為安全修補程序創建私有分支。

4.創建的私有分叉位于受影響的組織中。

5.外部報告器將代碼空間用于私有分叉并訪問組織級別的機密。

確認漏洞

我們在其中一個公共存儲庫中啟用了漏洞報告來測試這一點。然后,我們使用外部帳戶提交測試安全問題。使用外部帳戶,我們為關聯的分叉創建了一個私有分叉和一個代碼空間。

由于代碼空間是在易受攻擊的組織上下文中創建的,因此 env 命令打印出代碼空間的環境變量。這包括純文本格式的機密。為了確認我們的漏洞,我們為組織中的所有私有倉庫提供了一個“標志”機密。

漏洞挖掘 — 訪問 GitHub 的內部存儲庫

對于使用新測試版功能的任何組織來說,訪問組織機密已經是一個有問題的安全問題,但是,我們希望進一步升級。

嘗試這樣做的一種方法是利用它來對付GitHub(https://github.com/github)組織本身。

在瀏覽了一些公共 GitHub 存儲庫后,我們發現 Github Enterprise Importer (https://github.com/github/gh-gei) 已啟用該功能。

我們為其創建了一個測試安全問題和一個私有分支。

然后,我們為私有分叉創建了一個代碼空間。這使我們能夠訪問 GitHub 組織的組織機密。

通過訪問,我們能夠讀取和提取 GitHub 的組織機密,例如 GOPROXY_TOKEN 。

披露的令牌是gh-containers-bot的GitHub用戶令牌。

進一步探索 API,我們調用了 https://api.github.com/user/repos,它列出了用戶所有可訪問的存儲庫。

這使我們能夠訪問具有讀寫權限的 GitHub 的多個內部存儲庫。確認令牌有效性和訪問權限后,我們向 GitHub 報告了安全問題。