資安雷達 2026 年 10 月 6 日

2026-10-06 — Struts 舊版 RESTful mapper 的 OGNL 注入可達 RCE

primary=https://www.openwall.com/lists/oss-security/2026/10/05/10 primary=https://cwiki.apache.org/confluence/display/WW/S2-075

Struts 舊版 RESTful action mapper 存在 OGNL 注入,可達遠端程式碼執行

oss-security / Apache Struts 公告 · 2026-10-05

Apache Struts 的舊版 RESTful action mapper 會把請求內容送進 OGNL 運算式,攻擊者可構造請求注入運算式,最終在伺服器上執行任意程式碼,編號 CVE-2026-104711。這個缺陷出現在 mapper 取代傳統 action 對應的那一層,而不是 REST plugin 本身。

Apache 於 2026-10-05 在 oss-security 發布公告,並同步公開安全頁面 S2-075。官方嚴重度評為 moderate,發現者為 LeaveSong。

漏洞機制

公告的描述是「Expression Language Injection」:特殊字元沒有被正確中和,就進入 OGNL 運算式。OGNL 是 Struts 用來存取與操作物件的表達式語言,一旦攻擊者能控制運算式內容,就等於能呼叫 Java 物件的方法,這也是 Struts 歷年多起 RCE 的共同根源。

觸發條件很窄:應用程式必須主動設定使用舊版 RESTful action mapper。公告明確指出,使用預設 action mapper、restful2 mapper 或 Struts REST plugin 的應用程式不受影響。公告與 S2-075 都沒有說明具體的注入點與 payload 格式,本文也不推測。

受影響版本

分支受影響範圍備註
2.0.x 至 2.3.x2.0.0 至 2.3.37S2-075 標示為 EOL,無修補版
2.5.x2.5.0 至 2.5.33S2-075 標示為 EOL,無修補版
6.x6.0.0 至 6.11.0修補於 6.12.0
7.x7.0.0 至 7.3.0僅在 OGNL allowlist 被關閉時受影響,修補於 7.4.0

Struts 7 的 OGNL allowlist 預設為開啟,所以 7.x 在預設設定下不受影響。把 allowlist 關掉的 7.x 專案,等於回到和 6.x 相同的暴露面。

修補與緩解

官方建議升級到 7.4.0,或 6.x 維護線的 6.12.0。S2-075 表示這次修改對使用一般 action 名稱的應用程式向下相容。舊版 RESTful action mapper 已被標示為 deprecated,官方建議改用 Struts REST plugin。

暫時無法升級時,唯一列出的緩解方式是改用其他 mapper:

  • 預設 action mapper
  • restful2 mapper
  • Struts REST plugin

判斷自己有沒有中

這個漏洞不是「用了 Struts 就中」,而是三個條件疊在一起才成立。下表把公告裡的條件整理成可以逐項對照的形式:

你的情況是否受影響
預設 action mapper、restful2 mapper 或 REST plugin不受影響
舊版 RESTful mapper,Struts 2.x 或 6.0.0 至 6.11.0受影響
舊版 RESTful mapper,Struts 7.0.0 至 7.3.0,allowlist 開啟(預設)不受影響
舊版 RESTful mapper,Struts 7.0.0 至 7.3.0,allowlist 關閉受影響

實務上,先在專案設定中確認有沒有選用舊版 RESTful mapper。沒有的話,這份公告對你沒有動作;有的話,再依版本決定是升級還是換 mapper。因為舊版 mapper 已被標示為 deprecated,順手遷移到 REST plugin 比單純升版更能一次解掉這類問題。

為什麼不能因為評為 moderate 就放著

官方把嚴重度標成 moderate,原因是觸發需要特定設定:只有明確啟用舊版 mapper 的應用才暴露。但一旦暴露,後果是遠端程式碼執行,而且公告沒有提到需要登入或其他前置條件。對外開放的服務,只要符合上表的受影響情況,就應該當成高優先處理,不必等到出現公開利用才動手。

另一個容易漏掉的地方是 EOL 分支。2.0.0 到 2.5.33 的版本官方不再提供修補,這類系統只能靠改 mapper 或整體遷移來解,無法等待下一個 patch release。

影響範圍

真正需要動作的,是仍在 2.x EOL 分支上、又用了舊版 RESTful mapper 的老系統:這些分支沒有修補版,唯一出路是換 mapper 或遷移到 6.x、7.x。跑 6.x 的專案要先確認設定檔裡是否啟用了舊版 mapper,沒有就不受影響,有就升到 6.12.0。

跑 7.x 的團隊要檢查兩件事:mapper 設定,以及 OGNL allowlist 有沒有為了相容舊程式而被關閉。兩者同時成立才會中;任一項安全就不在範圍內。公告未說明是否已有公開利用程式,release notes 也未提供更細的攻擊面描述。

原始來源:oss-security 公告、Struts S2-075


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