透過OPSWAT Red Team 進行的全面安全分析,安全研究人員 Thai Do 和 Minh Pham 發現了多個影響 Rack Ruby 框架的漏洞,特別是CVE-2025-25184、CVE-2025-27111 和CVE-2025-27610。
本文提供這些漏洞的詳細概述,並特別著重於 CVE-2025-27610。它檢視根本原因、評估潛在影響,並概述有效的緩解策略,以確保依賴 Rack 框架的應用程式安全。
機架概觀
Rack 是一個模組化介面,用來連接網頁伺服器與基於 Ruby 的網頁應用程式。它將 HTTP 請求與回應包裝成單一的方法呼叫,將這些元件之間的互動標準化,簡化開發流程,並促進各種框架與伺服器之間的相容性。
許多 Ruby 網路框架和函式庫都使用 Rack,例如 Ruby on Rails 和 Sinatra。它可以 Ruby Gem 的形式提供。Rack 在全球被廣泛採用,全球下載量超過 10 億次,突顯了它在 Ruby 開發生態系統中不可或缺的角色。Rack::Static 和 Rack::Sendfile 等中間件元件透過處理靜態內容傳送和最佳化檔案傳輸來提升效率。由於這種廣泛的整合,在 Rack 中發現的漏洞會造成重大的安全影響,可能會影響全球許多應用程式和系統。
在 Rack 中發現安全漏洞
在最近針對 Rack 中介軟體框架所進行的安全研究中,OPSWAT 的研究人員 Thai Do 和 Minh Pham 發現了幾個漏洞,這些漏洞對於以 Ruby 為基礎的 網路應用程式造成了重大的安全風險:
- CVE-2025-25184:Thai Do 發現漏洞,攻擊者可透過 CRLF (Carriage Return Line Feed) 字元執行日誌注入,可能篡改日誌項目。
- CVE-2025-27111:Minh Pham 發現了一個安全漏洞,攻擊者可以透過惡意的標頭值,注入並操控日誌內容。
- CVE-2025-27610:Minh Pham 還發現一個路徑遍歷漏洞,攻擊者可藉此未經授權存取位於指定靜態檔案目錄以外的檔案,造成重大的安全威脅。
在這些漏洞中,CVE-2025-27610尤其嚴重,因為它可能讓未認證的攻擊者擷取敏感資訊,包括組態檔案、憑證和機密資料,進而導致資料外洩。此漏洞的 CVSS 得分為 7.5,屬於高度嚴重風險。
Rack::Static 與本機檔案包含漏洞
瞭解 Rack::Static
Rack::Static是 Rack 應用程式中不可或缺的中介軟體,主要用來有效率地提供 JavaScript、CSS 及圖片等靜態檔案。利用 Rack::Static,開發人員可以將靜態內容服務無縫整合到 Ruby 應用程式中,而無需依賴額外的 Web 伺服器設定。
配置 Rack::Static 時,有兩個重要的選項 -:urls和:root。正確理解和使用這兩個選項,可以大幅簡化並精簡靜態檔案服務流程。
1.:urls 選項
:urls 選項指定 Rack 應用程式應將哪些 URL 路徑當成靜態資產來處理。它以字串陣列的形式提供,每個字串代表一個觸發靜態檔案處理的路徑前綴。
例如:
在此設定中,對 /images、/css 或/js的要求會被Rack::Static 截取並處理。任何符合這些路徑的檔案都會直接從檔案系統提供服務。
2.:root 選項
:root 選項定義提供靜態檔案的基本目錄。這個目錄是相對於 Rack 應用程式的目前工作目錄。
鑒於前面的例子:
當向/assets/logo.png 提出請求時,Rack::Static 會嘗試提供位於public/assets/logo.png 的檔案。
實例
透過 :urls 和 :root 選項有效地實作 Rack::Static,可在 Ruby 網路應用程式中提供有組織且高效能的靜態內容服務:
在這種情況下,對 /assets/* 和 /favicon.ico 的請求將自動由 Rack::Static 處理。所有對應的檔案應該分別存在於 public/assets 目錄和 public/favicon.ico。
CVE-2025-27610 技術細節
在對Rack::Static 進行廣泛的安全分析時,Minh Pham 發現了一個與 :root 選項處理不當有關的重大漏洞。具體來說,當 :root 參數沒有明確定義時,Rack 會透過指定 Dir.pwd 的值,將此值預設為目前的工作目錄,隱含地指定它為 Rack 應用程式的網頁根目錄。
值得注意的是,Rack::Static 直接將傳入的 URL 路徑與指定的 :root 目錄連接起來,而沒有進行充分的驗證或淨化。因此,如果 :root 選項相對於 :urls 選項未定義或配置錯誤,未經認證的攻擊者可利用此漏洞,透過路徑遍歷技術,存取指定網頁目錄以外的敏感檔案。
以下部分將詳細分析 Rack::Static 的請求處理流程,清楚說明如何利用此漏洞。
Rack::Static 中的路徑遍歷及本機檔案包含漏洞
為了深入瞭解 Rack::Static 中介軟體如何處理請求,Minh Pham 對 Rack 的原始碼進行了徹底的分析。在 Rack::Static 類的初始化過程中,他觀察到如果沒有明確定義 :root 選項,Rack::Static 預設會從目前的工作目錄 (Dir.pwd) 提供檔案。因此,省略這個選項會導致中介軟體隱含使用執行應用程式的目錄。
初始化之後,確定 Rack::Static 接收到傳入的 HTTP 請求時,會呼叫方法。
隨後,Rack::Static 將檔案服務作業委派給 Rack::Files,Rack::Files 嘗試根據由設定的 :root 目錄和使用者提供的 PATH_INFO 所產生的建構檔案路徑來定位和服務檔案。
首先,透過呼叫方法 can_serve(path) 和 overwrite_file_path(path),中介軟體會檢查 env["PATH_INFO"],以判斷傳入的要求是否符合任何已設定的 URL 前綴 (例如 /static、/public)。
如果符合條件,Rack::Static 會結合設定的根目錄 (:root)和使用者提供的 PATH_INFO 來建立檔案路徑。此建構發生時,並未對輸入路徑進行適當的規範化或淨化。具體來說,中介軟體直接將傳入請求的 PATH_INFO 與 :root 選項指定的目錄串接起來,由於提供的路徑未經過充分驗證,因而產生漏洞。
Minh Pham 發現,由於在此工作流程中缺乏適當的淨化或驗證,如果使用者提供的 PATH_INFO 包含目錄遍歷序列,且 :root 選項未明確定義,則建構的檔案路徑可能會解析到預期根目錄以外的位置,可能會暴露敏感檔案。
CVE-2025-27610 概念驗證
為了展示 Rack::Static 的這個漏洞,我們利用 Rack 版本 3.1.10 開發了一個基於 Ruby 的 網路應用程式。在應用程式沒有明確定義 :root 選項的情況下,未經驗證的攻擊者可利用此漏洞存取敏感資料,例如憑證、組態檔案或資料庫檔案,可能導致重大資料外洩。
請參閱以下視訊,詳細瞭解此漏洞所造成的重大影響:
緩解與指導
為了減少我們上面討論的漏洞,請確保您的系統已更新至最新版本的 Rack。
使用 SBOM 引擎的MetaDefender Core 可偵測此漏洞。
OPSWAT MetaDefender CoreMetaDefender Core 配備先進的SBOM軟體物料清單)功能,可讓組織採取主動的方式來處理安全風險。透過掃描軟體應用程式及其相依性,MetaDefender Core 可辨識所列元件中的已知漏洞,例如 CVE-2025-27610、CVE-2025-27111 及 CVE-2025-25184。這有助於開發和安全團隊優先進行修補工作,在惡意行為者利用這些漏洞之前減輕潛在的安全風險。
以下是MetaDefender Core 使用 SBOM 檢測到的 CVE-2025-27610、CVE-2025-27111 和 CVE-2025-25184 的截圖: