資安雷達 2026 年 9 月 18 日

2026-09-18 — Grav CMS 單日七個安全公告,未驗證 RCE 與權限提升最嚴重

primary=https://github.com/advisories/GHSA-r94f-hx44-8jqf primary=https://github.com/advisories/GHSA-xhfv-7758-r9hx primary=https://github.com/advisories/GHSA-q2j8-x8hf-63ch primary=https://github.com/advisories/GHSA-f8wv-xp27-6gq7 primary=https://github.com/advisories/GHSA-vfmf-q6x9-cw96 primary=https://github.com/advisories/GHSA-4v9q-p283-qc2m primary=https://github.com/advisories/GHSA-jq29-c7v8-rg55

Grav CMS 單日七個安全公告,未驗證 RCE 與權限提升最嚴重

GitHub Security Advisories · 2026-09-17

Grav CMS 的外掛安裝流程裡,有一個原本用來擋下「危險方法名稱」的檢查,只要把方法名稱寫成陣列(類別、方法兩個值)而不是單一字串,檢查就整個失效,攻擊者因此能讓伺服器把使用者上傳的 ZIP 檔解壓到網站的公開目錄,寫入一支可執行的 PHP 後門。這是 getgrav/grav 在 2026 年 9 月 17 日一口氣發布的七個資安公告(GHSA-r94f-hx44-8jqfCVE-2026-72819)中最嚴重的一個,CVSS 3.1 為 8.8。同一天公布的另外六個公告,涵蓋權限提升、兩種儲存型 XSS、任意檔案寫入與刪除、未驗證路徑穿越,架設 Grav 網站的管理員需要一次性盤點升級。

漏洞機制

RCE 的關鍵在 Grav 的「安全方法白名單」只認得字串形式的方法名,寫成 ["Grav\\Common\\GPM\\Installer", "unZip"] 這種陣列時,白名單與黑名單都不會比對到它,於是被判定為「安全」而放行呼叫。unZip() 本身會檢查壓縮檔內每個檔名不能包含 ../,但目的地資料夾完全信任呼叫端傳入的字串,只要把目的地指到網站根目錄,解壓出的 PHP 檔就會直接落在對外可存取的路徑上,之後打開該網址即可執行任意指令。整個攻擊只需要一個已登入帳號、一次設定檔儲存與一次上傳,不需要碰觸伺服器檔案系統。

"pwn": {"type": "text", "label": "pwn",
  "data-default@": [["Grav\\Common\\GPM\\Installer", "unZip"],
                     "user/media/evil.zip",
                     "/absolute/path/to/grav-docroot"]}

權限提升公告(GHSA-xhfv-7758-r9hxCVE-2026-75837,CVSS 3.1 為 9.1)的成因是漏補:帳號藍圖 account.yaml 早先已經替 access 欄位加上 security@: admin.super 防護,但功能幾乎相同的群組藍圖 system/blueprints/user/group.yaml 從未補上同一個守門欄位。只要是能編輯使用者群組的委任管理員(admin.users.update),就能在群組設定裡塞入 access.admin.super: true,讓自己所屬的整個群組直接升級為超級管理員,進而透過排程器或 Twig 執行任意程式碼。

另一個值得注意的是 XSS 過濾繞過(GHSA-q2j8-x8hf-63chCVE-2026-75834,CVSS 3.1 為 5.4):Security::detectXss() 的六條規則全部使用 PCRE 的 u(UTF-8)修飾符,只要字串裡混進一個無效的 UTF-8 位元組,PHP 的 preg_match() 就不是「找不到」而是直接回傳 false,等同六條規則同時失效。瀏覽器解碼同一段內容時只會把那個壞位元組換成替代字元,其餘標籤照常渲染,藏在裡面的 onerror 事件依然會被觸發。

受影響版本

七個公告涉及的版本區間不完全相同,最保守的做法是直接升到目前最新的 2.0.16,才能一次涵蓋全部修補。

GHSA問題CVSS 3.1受影響版本修補版本
GHSA-r94f-hx44-8jqfZIP 上傳造成 RCE8.8< 2.0.132.0.13
GHSA-xhfv-7758-r9hx群組 access 欄位漏補,提升為超級管理員9.1< 2.0.142.0.14
GHSA-q2j8-x8hf-63ch無效 UTF-8 位元組繞過 XSS 過濾5.4< 2.0.142.0.14
GHSA-f8wv-xp27-6gq7藍圖裸函式呼叫造成任意檔案寫入8.8≤ 2.0.142.0.15
GHSA-vfmf-q6x9-cw96未配對引號造成儲存型 XSS8.7≤ 2.0.142.0.15
GHSA-4v9q-p283-qc2m靜態資源伺服器未驗證路徑穿越5.9≤ 2.0.142.0.15
GHSA-jq29-c7v8-rg55deleteFile() 路徑穿越,可刪除任意檔案8.1≤ 2.0.152.0.16

其中 GHSA-4v9q-p283-qc2m 的路徑穿越不需要任何帳號即可觸發,攻擊面比其餘六個都更寬GHSA-jq29-c7v8-rg55 是唯一延伸到 2.0.15 的公告,代表就算已經在近期升級過,只要沒有到 2.0.16,刪檔漏洞依然存在。

修補與緩解

七個公告的修補都已經隨版號釋出,直接升級到 2.0.16 或更新版本即可涵蓋全部項目,不需要逐一套修補程式。對於暫時無法升級的站台,可以先做兩件事縮小暴露面:關閉非管理員帳號的 ZIP/媒體上傳權限,並在反向代理層擋掉直接請求靜態資源代理路徑(plugin-asset-map.php)中帶有 ../ 的請求。

權限提升與檔案刪除這兩類問題特別建議升級後重新檢查既有的使用者群組設定:如果站台在漏洞公開前已經被委任管理員濫用過,群組設定裡可能已經寫入了 admin.super: true,單純升級套件並不會自動清除既有的惡意設定,需要人工比對 user/config/groups.yaml 是否有非預期的超級管理員授權。

原始來源:GHSA-r94f-hx44-8jqfGHSA-xhfv-7758-r9hxGHSA-q2j8-x8hf-63chGHSA-f8wv-xp27-6gq7GHSA-vfmf-q6x9-cw96GHSA-4v9q-p283-qc2mGHSA-jq29-c7v8-rg55


End of article
0
Would love your thoughts, please comment.x
()
x