React 漏洞利用鏈解析

看了某個中文講解 React 漏洞 CVE-2025-55182 的影片,看完只覺得他是不是根本沒有看懂整個漏洞在幹嘛 😅 (不想給流量,不會貼網址)

最重要的 constructor.constructor 直接被跳過了,講的好像 server 原本就來者不拒可以執行任意程式碼一樣,重點也完全不是什麼隨便相信外面的東西,這本來就是一個反序列化的 protocol…,你看最後的 patch 就知道成因根本不是那樣了

看得出來是直接從最後的 exploit 往回倒推在哪裡執行的,但卻根本沒看懂整個利用鏈,直接倒果為因,明明就有很多文章可以參考 😢

完整的利用鏈我還沒看,但我目前的理解是,React server 那邊有個反序列化的 protocol 支援一些 reference 的操作,例如說你可以把 $1 定義成 {“name”:”huli”},接著用 “$1:name” 就可以表示 obj.name 這個概念,在反序列化的時候變成 “huli”。

這樣的操作可能是為了做資料壓縮?可以用 reference 的方式去取得那些資料,有點資料正規化的感覺。所以正常使用下,我猜整包反序列化完以後應該還是個 JSON 物件

然而,在取值的時候沒有檢查 key 是不是在那個 object 上,因此你隨便定義一個 string,拿這個 string 的 constructor.constructor,就可以拿到 function constructor,這次 bug 的根因是這個。

接下來只要想辦法把參數傳進去然後執行,就可以執行任意程式碼了。而這一步應該是整個利用鏈最難的,儘管已經知道上面這些資訊,資安專家們還是花了半天到一天的時間才找到該怎麼利用這點(kudos to maple <(_ _)>)。

這段也是我還沒仔細看的部分,要花滿多時間理解的。但總之看起來是利用原本解析流程的一些邏輯,做出一個假的 chunk,而這個假 chunk 被丟下去解析完以後,最後會呼叫 response._formData.get(response._prefix + obj)

所以我們可以用前面提過的方式,把 response._formData.get 變成 function constructor,然後在 _prefix 裡面放程式碼,就會得到一個我們要的 function,然後丟到 { then } 裡面會因為 Promise 的特性被自動執行,流程應該是這樣,只是細節可能不太對。

最後的 patch 我記得是加個 hasOwnProperty 的檢查,確保在呼叫 obj[key] 的時候,那個 key 是真的存在於物件上的,就不會拿到奇怪的東西。

看完上面,你就會知道跟那個影片講的完完全全不一樣。

然後 SSR 跟 RSC 原本就是兩回事,雖然這概念確實滿容易混淆的,但寫前端的應該要知道他們的區別。

儘管我自己到現在也還是不喜歡 RSC(對我來說成本太高,效益太低),也早就沒寫 Next.js,甚至也很少寫 React 跳去 Vue 了,但看到有人在轉發的影片傳播部分錯誤資訊,還是想出來講一下。

評論