iT邦幫忙

1

[資訊安全] React2Shell、PHP2Shell、Node2Shell 是什麼?看懂 X2Shell 漏洞家族與該修什麼

  • 分享至 

  • xImage
  •  

資訊基準日:2026-10-29。本文整理截至當日的公開資訊,版本與日期以各專案官方公告為準;標示「需查證」處代表目前缺乏可驗證的一手來源。

先講結論

這一年多來,資安新聞上冒出一長串「某某 2Shell」:React2Shell、PHP2Shell、Node2Shell、Broccoli2Shell⋯⋯看起來像同一種新型攻擊正在蔓延。其實不是。

  • 「2Shell」只是一種命名格式,不是一種攻擊手法。 它借用了當年 Log4Shell 的語感,意思是「從某個東西(X)一路打到取得 shell(遠端執行程式碼,RCE)」。被這樣命名的,是十幾個彼此獨立、成因完全不同的漏洞。
  • 其中有一個漏洞,自己就有五個名字。 Node2Shell、HTTP2Shell、Broccoli2Shell、Brotli2Shell、Python2Shell 指的都是同一個漏洞 CVE-2026-111497,根源在 Google 的 Brotli 壓縮函式庫;因為 Node.js、Python、.NET 等生態系都打包了它,才各自被取了一個名字。
  • 所以最重要的一句話:看 CVE 編號和受影響的函式庫決定要修什麼,不要看暱稱。 看到 Node2Shell 就只升級 Node、看到 Python2Shell 就只升級 Python 套件,都可能漏掉真正的修補點。

如果你現在只想做三件事:

  1. 對照本文第二節的「家族總表」——表裡列出每個暱稱對應的 CVE 編號與官方修復版本。看你的系統有沒有用到表中的元件(PHP、Brotli、React、WordPress⋯⋯),再照 CVE 與修復版本比對,不是照暱稱。
  2. 升級後重啟服務、重建容器映像——只更新套件檔案,執行中的程式不會自動換掉。
  3. 別急著跑網路上來路不明的「一鍵檢測/一鍵修補」腳本,這波漏洞伴隨大量蹭熱度甚至夾帶惡意程式的 repo。

下面先說明這波命名潮怎麼來的,再按「誰該負責修」把成員分成三大類逐一介紹,最後附一份自查與修補清單。

一、為什麼它們都叫「2Shell」

可以查到的最早一個「X2Shell」是 2025 年 12 月的 React2Shell,由發現者自己命名——研究者 Sylvie Mayer 與 Lachlan Davidson 在各自的文章裡說他們把 CVE-2025-55182「稱為 react2shell」(sylvie.fyi、lachlan.nz)。這個「-Shell」字尾的系譜更早可追到 2021 年的 Log4Shell(Wikipedia)與 2022 年的 Spring4Shell(Wikipedia);不過要說 X2Shell 這個格式「源自」Log4Shell,目前沒有來源明說,只能當成語感上的延續。

到了 2026 年 10 月,這個命名幾乎成了行銷慣例。資安廠商各自替漏洞取暱稱、搶註 something2shell 的網域;broccoli2shell.com 站方就觀察到「最近每個嚴重漏洞都配一個 2shell 網域,大家搶著註冊」(broccoli2shell.com)。The Hacker News 的週報甚至用「This2Shell、That2Shell、Everything2Shell」來揶揄這股風氣(THN)。

值得注意的是:官方文件幾乎不用這些暱稱。 PHP 官方公告、台灣資安署與 TWCERT/CC 的警訊,一律只寫 CVE 編號(資安署、TWCERT/CC)。暱稱方便記憶和傳播,但也正是它造成誤解——尤其當一個漏洞有好幾個名字的時候。

二、家族總表

下表整理截至 2026-10-29 可查證的成員。KEV 指美國 CISA 的「已知遭利用漏洞清單」(Known Exploited Vulnerabilities),列入代表有實際遭攻擊的證據。

X2Shell 家族時間軸,從 2025 年 12 月 React2Shell 到 2026 年 10 月 PHP2Shell 與 Brotli 系列

暱稱 CVE 大類 產品 漏洞類別 修復版本 KEV
React2Shell CVE-2025-55182 框架 React Server Components 不安全反序列化 React 19.0.1/19.1.2/19.2.1 2025-12-05
WP2Shell CVE-2026-63030+CVE-2026-60137 應用程式 WordPress 核心 SQL injection → RCE 6.8.6/6.9.5/7.0.2 2026-07-21
XSS2Shell CVE-2026-64638 應用程式 WordPress 核心 XSS 串接 → RCE 7.0.3 否
KindaRails2Shell CVE-2026-66066 框架 Rails Active Storage 影像處理不安全操作 7.2.3.2/8.0.5.1/8.1.3.1 否
Mail2Shell CVE-2026-28289 應用程式 FreeScout 上傳過濾繞過 1.8.207 否
Comment2Shell 對應待確認 應用程式 WordPress 核心 XSS 7.1.1 否
Click2Shell 揭露時無 CVE 應用程式 WordPress 核心 (未載明) 7.1.1 否
Plex2Shell CVE-2026-96652/96654/96655/96656 應用程式 Plex Media Server 漏洞鏈 1.43.3.10861 2026-10-20
PHP2Shell CVE-2026-109618+CVE-2026-109619 語言/函式庫 PHP 核心 記憶體破壞、釋放後使用 8.2.35/8.3.36/8.4.27/8.5.12 2026-10-26
Node2Shell/HTTP2Shell/Broccoli2Shell/Brotli2Shell/Python2Shell CVE-2026-111497 語言/函式庫 Google Brotli 解碼器 記憶體越界寫入 Brotli 1.0.10/1.1.1/1.2.1;見第三節 2026-10-27
HTML2Shell 無(惡搞) — — — — —

三、第一類:語言 runtime 與底層函式庫

這一類影響面最廣,因為受害的是所有人共用的底層。負責處理的是維運與平台團隊:升級、重啟、重建映像,缺一不可。

PHP2Shell(CVE-2026-109618、CVE-2026-109619)

2026 年 10 月 21 日,PHP 官方同時修補兩個嚴重漏洞(php.net 公告、GHSA w8hw 與 6wmf)。概念上,問題出在 PHP 處理「請求中途因錯誤而中斷」時沒有把狀態清乾淨,殘留的半成品狀態被同一個工作程序的下一個請求沿用,進而造成記憶體破壞與釋放後使用(use-after-free)。攻擊者有機會藉此在不登入的情況下於伺服器執行程式碼。

要注意風險落差:根據 PHP 官方與多家分析,Apache mod_php 的預設環境已被證實可被利用,而 PHP-FPM 的前提較窄、需要先觸發應用層的致命錯誤,且攻擊得讓連續請求落在同一個工作程序上,可靠度不高(watchTowr FAQ、Sansec)。換句話說,新聞標題的恐慌程度,比多數實際部署的風險要高。

修復版本為 PHP 8.2.35/8.3.36/8.4.27/8.5.12。8.1 以下沒有官方修補(7.4/8.0/8.1 僅有原始碼 backport),這些 EOL 分支的使用者應盡快升級到受支援版本。

CISA 於 10 月 26 日將兩個 CVE 都列入 KEV(CISA 公告)。影響規模具體可感:Wikimedia 基金會為了防範,在 10 月 20 日就預防性地把 Toolforge、Cloud VPS、Phabricator 等社群服務下線(Wikimedia Diff);截至 10 月 28 日,Phabricator 等已完全恢復,Cloud VPS 與 Toolforge 僅部分恢復。在台灣,據數發部資安署在記者會上的說明(經 iThome 報導),約有 2.8 萬個對外網站使用 PHP,其中約 200 個是政府網站;資安署也在第一時間發布了警訊(資安署新聞稿)。

中文維基百科頂部公告:為應對近期 PHP 的軟體安全事件,大部分社群工具暫時停止運作
圖片來源:Wikimedia Foundation & Addonian1123, CC BY-SA 4.0, via Wikimedia Commons(檔案頁)

另外有一個常被混為一談的 CVE-2026-115560,是 PHP session upload progress 相關、官方評為「不太可能被利用」的問題,截至 10-29 尚未在 NVD/CVE.org 留下紀錄,修補也還沒釋出。它不是 PHP2Shell 的一部分,「第三個 PHP2Shell 漏洞」只是媒體標題的說法。

Brotli 家族:一個漏洞,五個名字(CVE-2026-111497)

這是整波裡最能說明「暱稱害人」的案例。Node2Shell、HTTP2Shell、Broccoli2Shell、Brotli2Shell、Python2Shell——這五個名字指的是同一個 CVE,根源在 Google 的 Brotli 壓縮函式庫的 C 版解碼器(1.0.3 至 1.2.0),概念上是解碼器在遇到某種異常輸入時誤判狀態,把攻擊者的資料寫到了緩衝區之外(越界寫入)。

名字為什麼這麼多?因為每家廠商從自己看到的角度命名:

名字 命名者 命名角度
Node2Shell Imperva(文章) 從受害的 Node.js 命名
HTTP2Shell 來源不明,最早見於 Aikido 從 HTTP 傳輸命名(與 HTTP/2 無關)
Broccoli2Shell Juliano Rizzo(broccoli2shell.com,據網站所述) Brotli 的諧音玩梗
Brotli2Shell Tenable(FAQ) 從真正有漏洞的函式庫命名
Python2Shell 來源不明 從受害的 PyPI 套件命名

CVE-2026-111497 的五個別名與受影響載體關係圖

這就是風險所在:看到 Node2Shell 的人去升級 Node、看到 Python2Shell 的人去升級 PyPI 套件,但真正要修的是 Brotli——凡是打包了這個函式庫的地方都要處理。受影響的載體包括 Node.js、Bun、PyPI 的 brotli 與 brotlicffi、.NET,以及 PHP 的 Windows build。純 Go 的移植版 github.com/andybalholm/brotli 有相同的邏輯錯誤,但因為 Go runtime 有邊界檢查,只會造成程式崩潰(DoS),不會變成 RCE,而且沒有獨立的 CVE(Sweet Security)。

利用的前提是:你的程式會去解壓攻擊者可以控制的 Brotli 資料——例如用 fetch() 讀取帶 br 壓縮的回應、用 Express 5/body-parser 解開 br 的請求內容,或直接呼叫解壓函式。能不能走到 RCE 還高度依賴執行環境;Imperva 自己也只在特定一個 Node 官方映像上成功,資安媒體 CyberScoop 引述多位專家提醒,Brotli 的影響「完全取決於實作」、可利用性常被高估(CyberScoop)。對多數人來說,較實際的下限是 DoS。

修復版本:Brotli 升到 1.0.10/1.1.1/1.2.1;Node.js 22.23.4/24.22.1/26.12.1(Node.js 公告);PyPI brotli 1.2.1、brotlicffi 1.2.1.0(GHSA);.NET 見 dotnet/announcements。CISA 於 10 月 27 日列入 KEV。

升級後有個陷阱:Node.js 24.22.1(已修補)的 process.versions.brotli 仍然顯示 1.2.0,用這個字串判斷有沒有修好會誤判(ELLIO 分析)。請改看 Node.js 本身的版號。

四、第二類:框架

這一類要修的是你專案的相依套件。負責處理的是開發團隊,特別要留意「框架自帶一份副本」的情況。

React2Shell(CVE-2025-55182)

這是整個家族的起點,2025 年 12 月揭露。概念上,React Server Components 在還原前端傳來的資料時,沒有擋掉物件從原型鏈繼承來的屬性,讓攻擊者可以在不登入的情況下讓伺服器執行程式碼(react.dev 公告、GHSA-fv66-9v8q-g76r)。

兩個重點:第一,預設設定就會中招,你不需要自己定義任何 Server Function。第二,用 create-next-app 的預設 Next.js App Router 專案即受影響,而 Next.js 自帶一份 React,只升級 react 套件不夠,要連 Next.js 一起升。這個漏洞揭露後數小時內就有國家級攻擊組織投入利用,約 30 小時後出現公開 PoC(Datadog、AWS),CISA 於 12 月 5 日列入 KEV。

修復版本為 React 19.0.1/19.1.2/19.2.1 及對應的 Next.js 版本。順帶一提,Next.js 當初另外編的 CVE-2025-66478 已被 NVD 以「與 55182 重複」為由駁回,所以你只需要追 CVE-2025-55182。

KindaRails2Shell(CVE-2026-66066)

Ruby on Rails 的 Active Storage 在用 libvips 處理圖片時,沒有停用 libvips 的不安全操作。據資安廠商 Rapid7 的分析,這可導致任意檔案讀取、並「可能」造成 RCE(Rapid7);「任意檔案讀取/可能 RCE」這個描述目前只見於 Rapid7,CVE 官方文字未明載。前提是你的應用有用 Active Storage+libvips 去處理不可信的圖片。修復版本為 Rails 7.2.3.2/8.0.5.1/8.1.3.1,未列入 KEV。

五、第三類:應用程式

這一類要更新的是整套軟體本體,負責處理的是網站/服務的管理者。

WordPress 的一連串(WP2Shell、XSS2Shell、Comment2Shell、Click2Shell)

WordPress 核心在 2026 年下半年連續出現多個被冠上 2Shell 的漏洞:

  • WP2Shell(CVE-2026-63030+CVE-2026-60137):由 Searchlight Cyber 發現並命名,概念上是 REST 批次端點的參數對應錯位繞過了結構驗證,進而造成 SQL injection、再串到 RCE(Searchlight、wordpress.org 7.0.2)。修復版本 6.8.6/6.9.5/7.0.2;要注意兩個 CVE 影響的版本範圍不同——6.8 只受 CVE-2026-60137 影響,CVE-2026-63030 只打 6.9.x 與 7.0.x。兩者皆於 7 月 21 日列入 KEV。
  • XSS2Shell(CVE-2026-64638):登入頁的未授權反射型 XSS,可被用來劫持管理員工作階段、進而走到 RCE(pwn.ai)。修復於 WordPress 7.0.3(2026-08-06),並 backport 到 4.7 以上所有分支,未列入 KEV。
  • Comment2Shell 與 Click2Shell:這兩個名字出自 Field Effect 對 WordPress 7.1.1 的報導(Field Effect)。但它們對應到哪個 CVE,目前沒有一手來源證實:WordPress 7.1.1 的官方公告列出的修補項目沒有標註 CVE 編號,而被外界對應過去的 CVE-2026-93485 官方描述只是 DOM XSS、沒有提到 RCE。這兩個暫以「對應待確認」看待,升級到 7.1.1 即涵蓋(wordpress.org 7.1.1)。

Mail2Shell(CVE-2026-28289)

客服信箱系統 FreeScout 的漏洞,概念上是用特殊字元繞過上傳檔案的過濾、寫入設定檔而取得 RCE(OX Security)。前提是攻擊者得先有一個通過驗證的帳號。修復版本為 FreeScout 1.8.207,未列入 KEV。

Plex2Shell(CVE-2026-96652/96654/96655/96656)

Plex Media Server 的四個 CVE 串成的漏洞鏈。修復版本為 1.43.3.10861 以上,四個 CVE 都在 10 月 20 日列入 KEV,並有被用來植入挖礦程式的報導(SecurityAffairs,單一來源)。自架 Plex 的人應盡快更新。

六、不存在的那些

命名潮熱起來,假漏洞也跟著出現。

  • HTML2Shell 是惡搞,背後沒有真實漏洞。梗圖裡掛的「CVE-2026-42069」確實是個真實編號,但那是 Kirby CMS 的一個資訊揭露問題,跟 HTML 或 shell 無關(事實查核見 Lead Stories)。如果你是從「連 HTML 都能被打」這個說法一路找過來的,可以放心,這個不存在。
  • This2Shell、That2Shell 不是漏洞,只是前面提到的 The Hacker News 週報用來嘲諷命名浮濫的修辭。

七、自查與修補清單

以下是把前面散落的注意事項集中起來的操作清單,與上面的說明分開放,方便你照著做。

升級本身

  • 以官方修復版本比對,不要用暱稱判斷。各成員的版本見第二節總表。
  • 升級套件檔案後重啟對應服務(PHP-FPM/Apache、Node 服務、WordPress 的 PHP 程序)。只換檔案,執行中的舊程序不會自動更新。
  • 用容器的人要重建映像:pinned 的舊 tag(例如 node:24.22.0)仍然帶著漏洞版本;Node、Bun 自帶 Brotli,.NET 的 self-contained/NativeAOT 需重新建置。

版本判斷的陷阱

  • Linux 發行版會把修補 backport 回舊版號,上游版號不會跳。Ubuntu、Debian 要看發行版自己的套件修訂號(如 Debian 的 8.2.35-1~deb12u1),只比對上游 X.Y.Z 的掃描器會誤報(Ubuntu、Debian)。
  • Node.js 的 process.versions.brotli 修補後仍顯示 1.2.0,改看 Node 本身版號。
  • PHP 的 Windows 版在 10-26 重新封裝(版號加 -1 字尾)以內含修補後的 Brotli,PHP 版號不變。

緩解只是過渡,不能取代升級

  • WAF 規則是暫時手段:Cloudflare 的 PHP 規則只比對預設參數名,被改名即可繞過(Cloudflare)。
  • Brotli 的入站緩解(在反向代理剝除或拒絕請求的 Content-Encoding: br)擋得住請求內容路徑,但擋不住你的程式主動用 fetch() 去讀惡意伺服器回應的出站路徑——那只能靠升級。
  • PHP 官方明言不要用 RLIMIT_AS/RLIMIT_DATA 當緩解,那反而會觸發漏洞路徑。

升級前後

  • PHP 8.4.27/8.5.12 已知有一個與 SimpleXML+垃圾回收相關的回歸問題,修正尚未釋出(據 Tenable 整理,PHP 官方 bug tracker 仍在處理);用到 SimpleXML 的服務升級前先跑回歸測試。
  • EOL 分支沒有官方修補:PHP 8.1 以下、Node 20/23/25 都沒有官方 release,只能升級到受支援分支或依賴發行版/商業 backport。

別被蹭熱度的 repo 害到

  • 這波漏洞伴隨大量在揭露後數小時內冒出的「PoC」repo,AhnLab 分析指出其中充斥無授權的複製、star 高度集中,過去也出現過夾帶惡意程式的假 PoC、以及「一行修補腳本」本身就是攻擊入口的案例(AhnLab);Tenable 也警告公開程式碼「可能夾帶惡意程式」。不要執行來路不明的 PoC 或一鍵修補腳本。
  • 不要把自家網域貼進匿名的「免費檢測」網站。

八、接下來看什麼

這波還沒完全落定,可以留意這幾個可觀察的指標:

  • CVE-2026-115560(PHP session upload progress)的修補何時釋出、是否取得正式 CVE 紀錄。
  • PHP SimpleXML 回歸問題的修正版何時發布。
  • CISA KEV 是否新增這個家族的成員,或把目前「未列入」的(如 XSS2Shell、KindaRails2Shell、Mail2Shell)補上——那代表實際遭利用的情況有變化。
  • WordPress 7.1.x 的 Comment2Shell/Click2Shell 是否補上正式 CVE 編號,讓對應關係明確化。
  • 命名潮本身:下一個被冠上 2Shell 的會是什麼,以及社群是否開始回歸用 CVE 編號溝通。

說到底,這波給工程師的教訓很單純:暱稱是給新聞用的,修補要認 CVE 編號和受影響的函式庫。把這兩件事對起來,再走一遍上面的清單,就不會被十幾個名字繞暈。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言