鍛碼匠數位創意

我們以資料科學的嚴謹、全端開發的靈活與設計的美感,協助品牌打造兼具質感形象與轉換力的網站體驗,讓網站成為您的成長引擎。

想更了解我們?立即預約諮詢

聯絡資訊

  • Email

    service@fordige.com
  • 電話

    0905-428-844
  • 地址

    臺中市西區民龍里臺灣大道二段375號12樓之1

網站地圖

  • 台中網頁設計公司
  • 關於鍛碼匠
  • 作品集
  • 最新文章
  • 取得報價
  • 聯絡我們
  • 電子報訂閱
  • 形象網站設計
  • 電商網站架設
  • 內容網站架設 (部落格/文章)
  • SEO 排名優化
  • AI 智能客服
  • AI 流程自動化
  • 智能摘要生成
  • RAG 知識庫問答

鍛碼匠數位創意有限公司 統一編號:60476010

鍛碼匠 footer banner

© 2026 鍛碼匠數位創意有限公司. All rights reserved.

鍛碼匠 logo鍛碼匠
  1. 首頁
  2. 最新文章
  3. 2025 年底挖礦病毒驚魂記:我的 Next.js 容器是如何淪為駭客礦機的?(含Dockerfile完整防禦指南)
2026年1月2日
約 19 分鐘
資安防護

2025 年底挖礦病毒驚魂記:我的 Next.js 容器是如何淪為駭客礦機的?(含Dockerfile完整防禦指南)

Next.js RCE 漏洞導致 VPS CPU 飆高?本文詳解從被駭分析到構建 Docker 唯讀檔案系統的完整防禦實戰,拒絕再次成為免費礦工

2025 年底挖礦病毒驚魂記:我的 Next.js 容器是如何淪為駭客礦機的?(含Dockerfile完整防禦指南)

目錄

  • 延伸閱讀

前言:聖誕節沒等到禮物,卻等來了 VPS CPU 的 100%

2025 年 12 月,為了強化連線品質,把一部分原本放在德國伺服器託管商的站台,搬到有台灣機房的託管商。 27 日,那本來是個平靜的週末,我還在想要不要幫公司的吉祥物『鍛碼匠』換個新年造型。結果在 push 一個小更新時,部署的容器卡了一個小時才起來,VPS 的 CPU 與 RAM 使用率直接飆到 100%。我以為是某個專案突然爆紅,滿懷期待打開監控——沒有流量,只有一個在 Docker 容器深處悄悄跑的 miner 執行檔。 這是當時的真實截圖與 log 紀錄(為了保護其他客戶資訊做了去識別化處理): > [圖:Coolify Cloud 後台的 CPU 監控曲線,12/27 14:00 起從 5% 瞬間拉到 100% 並持續 6 小時以上] 駭客用的是教科書級的 RCE 攻擊鏈。kill 掉行程,幾秒後又復活;rebuild 容器,過一會兒又長出來。那個週末我學到一件事:容器不是保險箱,它只是薄薄一層塑膠袋;要變成防彈背心,得靠「最小權限」跟「唯讀檔案系統」。

案情重演:駭客是怎麼溜進來的?

事後我做了數位鑑識。這次入侵由三個弱點串成: > RCE(Remote Code Execution)= 駭客在遠端機器執行任意程式碼的能力,與本地端權限無關。OWASP 在 2021 年發布的 *Top 10 Web Application Security Risks* 中,「Broken Access Control」與「Injection」類別多次與 RCE 風險相關([OWASP Top 10 2021](https://owasp.org/Top10/)) 1. **軟體漏洞**:被入侵的專案用的是 Next.js 15.5.4,這個版本含有 Critical 等級的 RCE 漏洞([GitHub Advisory GHSA-9qr9-h5gf-34mp](https://github.com/advisories/GHSA-9qr9-h5gf-34mp))。要查某個 Next.js 版本是否受影響,可以直接看 [Next.js 官方的 Security Advisories 列表](https://github.com/vercel/next.js/security/advisories)。 2. **Root 執行**:容器預設以 root 跑。駭客進來後在容器裡就是 root,能在 `/app` 下載挖礦程式、改啟動腳本,甚至安家落戶。Docker 官方文件在 [Docker security non-root user 指南](https://docs.docker.com/engine/security/userns-remap/) 明確建議正式環境一律以非 root 身份執行。 3. **`/tmp` 可執行**:駭客把腳本藏在 `/tmp`,因為 Linux 預設允許 `/tmp` 執行二進位檔。Linux Foundation 與 NIST 的容器安全文件 [NIST SP 800-190(Application Container Security Guide)](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-190.pdf) 第 4.4 節直接把「以 root 執行 + 可寫入的暫存目錄」列為容器隔離失效的高風險組合。 症狀紀錄(我那天看 log 看到的): - VPS 的 CPU / RAM 長期 100%。 - `/app` 出現不明檔案 `miner`。 - `/tmp` 出現惡意 shell script(檔名是隨機 12 碼英數)。 - `crontab -l` 多了一筆每分鐘跑的排程。

防禦哲學:洋蔥式縱深防禦

痛定思痛後,單靠升級版本是不夠的——明天又會有新的 0-day。我們需要的是縱深防禦(Defense in Depth),這是資安領域的經典框架,NIST 在 [SP 800-190](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-190.pdf) 與 [SP 800-53 Rev. 5](https://csrc.nist.gov/pubs/sp/800/53/r5/upd1/final) 都有完整論述。 策略分四層: - **修補漏洞**:關上大門。 - **最小權限**:即使進來了,也做不了什麼。 - **唯讀系統**:想做壞事也寫不進去。 - **執行限制**:寫進去了也跑不起來。

實戰一:Dockerfile 的斷捨離(最小權限原則)

很多 Dockerfile 是直接 `FROM node` 然後 `CMD ["npm", "start"]`,開發環境沒問題,正式環境就是裸奔。OWASP 在 [*Docker Top 10*](https://owasp.org/www-project-docker-top-10/) 裡就把「Image 中的 Root 預設」列為 D01(Root User 風險)。 正解:建立低權限專用使用者 + 限制檔案歸屬。 ```Dockerfile # ... (前面的 Build Stages 省略) ... FROM node:20-bullseye-slim AS production # 1. 建立受限使用者:明確指定 UID 1001,避免與宿主機權限混淆 RUN groupadd --gid 1001 nodejs && \ useradd --uid 1001 --gid nodejs --shell /bin/bash --create-home nextjs # ... (複製編譯好的檔案) ... # 2. 權限加固:Root 擁有,nextjs 唯讀 # 例外:只開放「必須寫入」的目錄 RUN mkdir -p .next/cache && chown nextjs:nodejs .next/cache # 如果有用 Strapi 或其他 CMS,上傳目錄也需要開放 # 3. 切換使用者:放棄 Root 權杖 USER nextjs EXPOSE 3000 CMD ["node", "server.js"] ``` 關鍵三行: - `USER nextjs`:應用程式不再以 root 身份運行。 - 程式碼由 root 擁有,執行者是 nextjs,形成「唯讀」的物理基礎。 - Docker 官方在 [Dockerfile USER 指令](https://docs.docker.com/reference/dockerfile/#user) 明確建議「正式環境必須指定 USER」。

實戰二:Next.js Standalone 瘦身與加固

Next.js 有 [Standalone 輸出模式](https://nextjs.org/docs/app/api-reference/config/next-config-js/output),會自動追蹤依賴,只打包必要的檔案。檔案越少,攻擊面越小。設定只要在 `next.config.ts` 加一行: ```TypeScript // next.config.ts const nextConfig: NextConfig = { output: "standalone", }; ``` Image 更小、部署更快、攻擊面更窄。

實戰三:終極部署參數(唯讀與 Noexec)

這是整套防禦裡最關鍵的一環。我們用 `docker run` 參數強制上鎖(如果用 Coolify Cloud,可以在 Docker Options 加入同樣的參數): ```bash # 1. 鎖死 /tmp,禁止執行 (noexec) --tmpfs /tmp:rw,noexec,nosuid,size=64m # 2. Next.js Cache 掛在記憶體中,重啟即焚 --tmpfs /app/.next/cache:rw,noexec,nosuid,mode=1777 # 3. 其他暫存與上傳區 --tmpfs /app/cms-admin/.tmp:rw,noexec,nosuid,mode=1777 --tmpfs /app/cms-admin/public/uploads:rw,noexec,nosuid,mode=1777 ``` 這三個參數的意義: - `noexec`:就算駭客成功把 miner 丟進 `/tmp`,執行時系統只會冷冷回一句 `Permission denied`。Red Hat 與 Docker 官方都在 [Seccomp / noexec 文件](https://docs.docker.com/engine/security/seccomp/) 把 `noexec` 列入容器安全 baseline。 - `nosuid`:防止提權攻擊。 - `tmpfs`:這些目錄掛在記憶體。容器一重啟,潛在的病毒殘留就會瞬間被清掉。

緊急應變 SOP:當災難再次降臨時

資安沒有 100% 的安全。如果監控警報又響了,按這五步走,順序很重要: 1. **止血(切斷連線)**:立刻 `docker stop` 該 container,不要猶豫。 2. **保全證據**:不要急著刪!用 `docker commit ` 把中毒現場存成 Image,之後開隔離環境分析。NIST SP 800-61 Rev. 2([電腦事件處理指南](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-61r2.pdf))強調「證據保全先於系統還原」。 3. **溯源(看 Log)**:檢查 access log,找出駭客從哪個端點打進來的。 4. **焦土政策(Rotate Secrets)**:假設所有環境變數(DB 密碼、AWS Key、API Secret)都已經外洩,全部重設。不要心存僥倖。 5. **重生(Clean Build)**:跑 `npm audit` 修依賴漏洞,用 `--no-cache` 強制重新構建映像檔。

結語:付費學費後的領悟

那個週末損失了一些電費與假期,但對容器安全有了具體理解。容器預設的 root + 可寫入的 `/tmp`,是 NIST 與 OWASP 文件反覆點名的兩個高風險組合。修補這兩項不需要昂貴工具,只要改 Dockerfile 跟 docker run 參數。 VPS 後來恢復平靜,鍛碼匠也回到吉祥物的正職,而不是被迫當礦工。 如果你也在用 Next.js + Docker,趁駭客敲門之前,先把鎖換好。也記得定期看 [Next.js Security Advisories](https://github.com/vercel/next.js/security/advisories) 跟 [GitHub Dependabot alerts](https://docs.github.com/en/code-security/dependbot),該升級就升級。 ## 延伸閱讀 - [網站資安課:破解 JSON-LD 注入與檔案上傳偽裝](https://fordige.com/blog/2026-website-security-prevention) - [如何運用 Cloudflare 防禦前沿 AI 駭客攻擊以提升台灣網站的資安](https://fordige.com/blog/cloudflare-frontier-ai-cyber-defense) - [如何在 2026 年強化網站資安的三道防線](https://fordige.com/blog/website-security-ai-era-real-battle) - [JSON 注入攻擊完整解析:工程師必須知道的防護實務(2026)](https://fordige.com/blog/json-injection-attack-prevention-guide) - [SEO 排名優化服務](https://fordige.com/seo-ranking-optimization)

常見問題

我們採用SSL加密、定期更新與安全外掛,確保網站能夠抵禦潛在的威脅。電商網站更是整合了安全支付閘道,保護客戶交易資料。

網站設計服務

想找專業的網頁設計公司?

鍛碼匠專精企業形象網站、部落格網站、電商網站與 SEO 優化,歡迎聊聊你的需求。

了解我們的服務取得報價
Pillar Cluster

本篇是「網站資安防護」系列的一部分

想從整合視角理解這個主題?回到 pillar 主頁看完整攻略,或從整合型 hub 文章讀起。

←網站資安防護 pillar 主頁整合型 hub 文章→

本篇是 pillar 系列中的單一主題深入文章,完整攻略請從 pillar 主頁看起。

資安防護其他相關文章推薦

網站資安防護新考題:當 AI 代理開始代替員工上班,企業該如何守住存取大門?

網站資安防護新考題:當 AI 代理開始代替員工上班,企業該如何守住存取大門?

思科把零信任存取延伸到 AI 代理,推出 Duo IAM 代理式身分管理。這代表網站資安不再只管「人」,還要管「AI 代理」這個新身分。對台灣業主來說,重點在於:如果你的網站後台、未來串接的 AI 客服或自動化流程,都可能由 AI 代理代為操作,現有的帳號密碼、API 金鑰是否還夠安全?本文整理 AI 代理身分的五大風險與企業該建立的新存取原則。

https tls ssl 差別是什麼?Cloudflare Project Galileo 12 週年給台灣業主的資安啟示

https tls ssl 差別是什麼?Cloudflare Project Galileo 12 週年給台灣業主的資安啟示

https、tls、ssl 三者到底是什麼?為什麼網站一定要裝?本文用白話拆解 https tls ssl 差別,並告訴你小型網站如何借力 Cloudflare Project Galileo 計畫取得企業級防護。免費網站健診預約。

Chrome 更新一次修補數百個漏洞:你的網站瀏覽器安全該誰負責?網站設計公司實務建議

Chrome 更新一次修補數百個漏洞:你的網站瀏覽器安全該誰負責?網站設計公司實務建議

Google Chrome 150 一次修補 382 個漏洞,其中 15 個屬於重大等級,引發業界關注。對一般業主來說,這代表什麼?本文整理 Chrome 更新機制對網站業主的實際影響,並從網站設計公司角度說明瀏覽器安全責任歸屬、套版與客製化網站在更新策略上的差異,以及評估設計公司時該問哪些資安相關問題。