Blog
/
Frontend | Website
當技術面試遇上 Next.js 動態執行漏洞攻擊
本篇介紹一名工程師在執行 Next.js 面試作業時遭遇的動態執行漏洞攻擊,分析 RCE 的形成方式、惡意代碼來源,以及求職過程中常被忽略的安全風險。
Posted at
2025年12月5日
Posted on
Frontend | Website
Vercel 發布資安更新
近期前端社群都在轉貼 Vercel 12/3 發布高達的 10/10 安全漏洞,請大家盡速更新 Next.js 和 React 到較新的 patch。平常 RCE 攻擊對我而言太遙遠,不要亂下載東西,亂點網站,自己做前端維護好跟上 patch 也沒什麼。
https://nextjs.org/blog/CVE-2025-66478
私鑰被盜的故事緣起
我朋友最近在找工程師工作,由於他和我一樣鍾愛 Blockchain 產業,面試常常都需要和海外工面試,錄取的話也會是遠端工作,而他也是一名有 RCE 資安意識的工程師,知道不能下載來路不明的檔案,避免點擊奇怪的網址,拒絕無理的協作產品要求。
某家公司給了一份 Next.js 面試作業,叫他 clone 下來跑跑看、修幾個 bug、回答一些實作題。整份作業看起來都很正常:「公開」的 repo、「看得見」的程式碼、沒有奇怪的二進位檔,也沒有要求你做什麼危險的事,面試題目也有一定的挑戰性,他就栽進去 Debug了。節錄其中兩題下來:
This site is mobile-responsive. However, there's a bug in the center of the landing page that doesn't fit this, and it's immediately visible to the naked eye. Please let me know what's causing this bug and how to fix it.
If crypto payments were added, which method would you recommend and why?
說真的我遇到這樣的情境,我想也想不到會是詐騙:公開的程式碼、很認真的面試題,是我就馬上 Clone 下來到 Client 上再說,丟給 Claude Code 幫我看看。結果 clone 下來後,應該是當天, 12/3 工程師朋友就中毒了。
後門藏在大海的某處
問題出在 src/auth/controllers/orderController.js 裡的一段邏輯。
那段程式碼原本看起來只是「寫得很奇怪的錯誤處理」,但實際上完全不是那麼回事。
這串看起來像奇怪的動態錯誤處理,但他其實是把 require(也就是 Node.js 最高權限工具)權限交給外部字串,開啟完整 RCE 能力。只只要攻擊者能控制 errCode 內容,他就能:
讀寫你電腦裡的檔案
發 request
跑 shell
掃你的
.env、金鑰、Session、SSH Key
也就是所謂完整的 Remote Code Execution(RCE)。
惡意內容「遠端下載」
這個後門不是寫死的,而是「在你啟動專案時才動態拉惡意 payload 下來」。
流程其實非常簡單:
你啟動 server
程式自己去攻擊者的 API 拉一段字串
把字串丟到前面那個動態 execution 裡
變成真正的程式碼在你電腦上執行
.env直接被掃、憑證被讀走、錢包被清空
整個過程你完全感受不到任何異常。
工程師最後的狀況
我朋友的 .env 裡的金鑰被讀走,錢包被轉走。接著花了兩天重灌他的電腦 (歐對附帶一提,他是 Mac,真正危險的攻擊面前Mac不會比較安全)。
他說唯一的好處是,重灌讓他電腦少了很多垃圾。
目前官方建議 Next.js 升級至 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7, 16.0.7
目前官方建議 React 升級至 19.0.1, 19.1.2, and 19.2.1
