返回
2026/11/05
Rails Active Storage 重大漏洞:11 月 7 日前請檢查這三項設定
Rails Active Storage 出現 CVSS 9.8 漏洞,一次圖片上傳就可能在伺服器上寫入檔案。請檢查三項設定、盡快升級,並留意 Rails 8.0 的支援期限。
幾乎所有接受大頭貼、文件或商品照片上傳的 Rails 應用程式,都會透過 Active Storage 處理這些檔案。2026 年 11 月 4 日,Rails 團隊針對這條上傳路徑發布了一則重大安全公告。在某些常見的設定下,只要一個特製的上傳檔案,未經驗證的攻擊者就可能在你的伺服器上寫入檔案。
是否受影響,取決於三項很容易檢查的設定。本文說明這個漏洞的原理、如何逐一檢查各項設定,並列出今天無法升級時該怎麼做。這對使用 Rails 8.0 的團隊尤其重要,因為該分支的安全支援將於 2026 年 11 月 7 日結束。
重點摘要
- GHSA-f3w6-w445-fwh9 的 CVSS 評分為 9.8,發布時尚未取得 CVE 編號。
- 只有在三個條件同時成立時才會受影響:Active Storage 使用 ImageMagick、ImageMagick 的 policy 沒有封鎖危險的 coder,且不受信任的使用者可以上傳檔案。
- 修正方式是升級至 Rails 8.1.4.1 或 8.0.5.2,並搭配 mini_magick 5.1 以上版本。
- Rails 8.0 只會提供安全性修正到 2026 年 11 月 7 日,更舊的分支則完全不會有修正。
- 如果你使用 Disk 儲存服務,還必須輪換應用程式可讀取的所有機密資訊。
漏洞內容
附加檔案時,Active Storage 會執行分析器(analyzer)讀取圖片尺寸等基本資訊。使用 :mini_magick 處理器時,分析器會把檔案交給 ImageMagick。ImageMagick 透過稱為 coder 的模組支援多種格式,其中有些功能非常強大:修正 commit 顯示,上傳的 SVG 可以觸及 MSL coder,而 MSL 是一種腳本格式,能讀寫腳本中指定的檔案。Active Storage 並未限制上傳檔案能觸及哪些 coder,因此伺服器上的 ImageMagick policy 成了唯一的防線。
有兩個細節讓問題更加嚴重。第一,分析器在附加檔案時就會執行,不需要產生 variant、預覽或明確呼叫 analyze:只要接受上傳就足以觸發。第二,使用 Disk 服務儲存檔案的應用程式,還可能被迫讀取應用程式程序可讀取的任何檔案,包括 secret_key_base 以及其他系統的憑證,進而導致遠端程式碼執行或橫向移動。
此漏洞由 GMO Flatt Security 的 RyotaK 透過 HackerOne 回報。Rails 團隊指出,目前回報的是其中一條攻擊鏈,但他們不認為這是唯一的一條。公告中並未說明此漏洞是否已遭利用。
三項條件的曝險檢查
只有三項條件全部成立時才會受影響。請依序檢查;只要有任何一項不成立,這條攻擊鏈就不適用,但升級仍然是正確的做法。
| 條件 | 檢查位置 | 符合以下情況即有風險 |
|---|---|---|
| 1. Variant 處理器 | config.active_storage.variant_processor 與 load_defaults | 值為 :mini_magick(load_defaults 6.1 或更早版本的預設值) |
| 2. ImageMagick policy | 伺服器上的 policy.xml | 未封鎖 MSL、Ghostscript 相關 coder 及 gs delegate(Debian 與 Ubuntu 的預設 policy 都沒有封鎖) |
| 3. 誰可以上傳 | 你的上傳表單與 API | 不受信任的使用者可以附加檔案 |
1. Active Storage 使用哪一種處理器?
搜尋設定檔,並直接向執行中的應用程式確認:
grep -rn "variant_processor\|load_defaults" config/
bin/rails runner 'p Rails.application.config.active_storage.variant_processor'
自 Rails 7.0 起預設值為 :vips,但從舊版升級上來的應用程式,常常仍載入舊的預設值,或明確設定了 :mini_magick。也請執行 bundle info mini_magick:如果 bundle 中有這個 gem,請找出它在哪裡被使用。
2. 你的 ImageMagick policy 有封鎖危險的 coder 嗎?
在每台應用程式伺服器與 worker 上,列出 ImageMagick 實際載入的 policy:
magick -list policy # ImageMagick 7
convert -list policy # ImageMagick 6
確認 MSL coder、PostScript 與 PDF 相關 coder 以及 gs delegate 是否有 rights="none" 的規則。如果你直接使用 Debian 或 Ubuntu 套件附帶的 policy 而未修改,請假設它們沒有被封鎖。也請記得,容器映像檔與 worker 主機上的 ImageMagick 建置版本,可能與 Web 伺服器不同。
3. 不受信任的使用者能上傳檔案嗎?
列出所有讓檔案進入 attach、has_one_attached 或 has_many_attached 的地方,包括 API、直接上傳(direct upload),以及從外部匯入檔案的管理工具。開放公開註冊並提供大頭貼欄位,也算是不受信任的上傳。
提示:請同時確認你使用的是哪一種儲存服務。如果 config/storage.yml 中的正式環境服務設定為 service: Disk,你就會受到檔案讀取的影響,修補後應輪換機密資訊。
修正方式:各分支的升級路徑
已修正的版本為 Rails 8.1.4.1 與 Rails 8.0.5.2。這兩個版本合計修正了 21 個安全性問題,因此即使你不受這個漏洞影響,也值得安裝。
| 你使用的分支 | 應採取的行動 |
|---|---|
| 8.1 | 升級至 8.1.4.1 |
| 8.0 | 立即升級至 8.0.5.2,並規劃遷移至 8.1:8.0 的安全支援將於 2026 年 11 月 7 日結束 |
| 7.2 及更舊版本 | 不會釋出修正。請套用下方的 policy 因應措施,並升級至 8.0 以上版本 |
使用 :mini_magick 的應用程式還需要 mini_magick 5.1 以上版本。若使用較舊版本,修正版會在啟動時拋出錯誤,因此請同時更新這兩個 gem,並在 staging 環境測試能否正常啟動:
bundle update rails mini_magick
bundle info activestorage
bundle info mini_magick
修正版本身附帶了 ImageMagick policy,但請確認它確實有套用到 ImageMagick。如果你的應用程式在啟動後替換了 MiniMagick.cli_env、使用了 MiniMagick.cli_prefix,或安裝了自己的 MiniMagick::Shell,這份 policy 就不會生效;這類應用程式需要把規則寫進系統 policy。GraphicsMagick 則完全不會讀取 ImageMagick 的 policy。此外,隨附的 policy 是附加在伺服器的 policy.xml 之上,而不是取代它,因此該檔案中的允許規則(包括萬用字元)會覆蓋封鎖設定。
同一批版本也修正了另一個漏洞 GHSA-v924-7rp8-4mxh(CVSS 8.8)。Active Storage 將上傳檔案交給 ImageMagick 與 FFmpeg 時,使用的暫存檔名保留了原始副檔名,因此能控制檔名與宣告內容類型的攻擊者,就能影響實際執行的是哪個解碼器。Rails 針對這個漏洞提供的因應措施只涵蓋 FFmpeg,這也是應該升級、而非仰賴因應措施的另一個理由。
這是一種模式,而非單一事件
2026 年 7 月的 CVE-2026-66066 是另一個獨立的 Active Storage 重大漏洞,影響使用 libvips 的應用程式。使用 ImageMagick 的應用程式當時不受那條路徑影響,但這次卻受到影響。四個月內出現兩個重大漏洞,且分別出自兩個受支援的圖片函式庫,說明了同一個教訓:圖片處理是很大的攻擊面,而 Active Storage 會在檔案附加的那一刻,就對陌生人上傳的檔案執行這些處理。
單靠更換處理器並不能解決問題。真正能保護你的,是把圖片函式庫視為攻擊面的一部分:像框架一樣持續修補、用 policy 加以限制,並掌握哪些主機在執行它。尤其 ImageMagick policy 是很容易被遺忘的伺服器設定,因為它存在於作業系統映像檔中,而不是你的應用程式程式碼裡。
如果無法立即升級
Rails 也針對 8.1 與 8.0 發布了修補 commit。在能夠部署修正版之前,請依照以下檢查清單處理:
- 在每台處理上傳檔案的主機上,將公告中的最低限度規則加入 ImageMagick 的系統 policy(例如
/etc/ImageMagick-7/policy.xml)。 - 確認同一檔案中沒有任何允許規則或萬用字元會覆蓋這些規則,再用
magick -list policy驗證。 - 如果你透過 ImageMagick 轉譯 PDF 或 PostScript,請重新允許
gsdelegate 以及真正需要的 coder,並接受這樣仍會留下部分風險。 - 限制上傳:暫時縮小可附加檔案的使用者範圍,或暫停匿名上傳。
- 如果你使用 Disk 服務,請規劃輪換
secret_key_base、master key、config/credentials.yml.enc的內容、儲存與資料庫的憑證,以及第三方 token。不要把已外洩的機密保留作為備援。
公告中公布的最低限度規則如下:
<policy domain="coder" rights="none" pattern="MSL"/>
<policy domain="delegate" rights="none" pattern="gs"/>
<policy domain="coder" rights="none" pattern="{PS,PS2,PS3,EPS,EPS2,EPS3,EPI,EPSF,EPSI,EPT,EPT2,EPT3,PDF,AI,EPDF,PDFA,POCKETMOD,XPS,PCL}"/>
提示:請將 policy 內建到基礎伺服器映像檔或容器映像檔中,而不是手動修改各台主機,這樣新的 worker 與重建的容器也會自動套用。
完整細節請參閱 Rails 安全公告。
LOGIQ 能如何協助
LOGIQ 協助在 Linux 上運行開源技術堆疊的團隊,範圍涵蓋作業系統映像檔到應用程式執行環境。如果你需要協助檢查所有伺服器上的 ImageMagick policy,或規劃從即將結束支援的分支遷移,歡迎與我們的團隊聯繫。
Global
Japan
Korea
China
Vietnam
Thailand
Indonesia
Portugal
Spain
France
Germany
Egypt
Russia