Dcard about.*****.tw 生產環境使用 Staging 配置導致內部 Kubernetes 服務與 Staging 域名洩露 - HITCON ZeroDay

Vulnerability Detail Report

Vulnerability Overview

  • ZDID: ZD-2026-00392
  •  發信 Vendor: 狄卡科技股份有限公司
  • Title: Dcard about.*****.tw 生產環境使用 Staging 配置導致內部 Kubernetes 服務與 Staging 域名洩露
  • Introduction: about.*****.tw 在生產環境跑著 staging 設定,內部的 Kubernetes 服務位址跟 staging 域名洩漏

處理狀態

目前狀態

公開
Last Update : 2026/03/29
  • 新提交
  • 已審核
  • 已通報
  • 已修補
  • 已複測
  • 公開

處理歷程

  • 2026/03/23 13:56:12 : 新提交 (由 鄉民 更新此狀態)
  • 2026/03/23 14:24:46 : 新提交 (由 鄉民 更新此狀態)
  • 2026/03/23 14:25:55 : 新提交 (由 鄉民 更新此狀態)
  • 2026/03/23 16:05:42 : 新提交 (由 鄉民 更新此狀態)
  • 2026/03/23 18:28:35 : 審核中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/03/23 19:02:28 : 修補中 (由 組織帳號 更新此狀態)
  • 2026/03/25 13:29:05 : 複測申請中 (由 組織帳號 更新此狀態)
  • 2026/03/25 15:19:35 : 確認已修補 (由 鄉民 更新此狀態)
  • 2026/03/29 03:00:14 : 公開 (由 HITCON ZeroDay 平台自動更新)

詳細資料

  • ZDID:ZD-2026-00392
  • 通報者:鄉民
  • 風險:高
  • 類型:資訊洩漏 (Information Leakage)

參考資料

暫無資料
(本欄位資訊由系統根據漏洞類別自動產生,做為漏洞參考資料。)

相關網址

https://about.dcard.tw/
https://creator.dcard.tw/

敘述

about.dcard.tw 裡有一個部份 它的 Next.js publicRuntimeConfig 裡面寫的是 staging 的設定,不是 production
具體來說,送一個帶 RSC: 1 header 的請求到 about.dcard.tw,回來的 payload 裡面可以看到:

{
  "isEnvProd": false,
  "isEnvStage": true,
  "strapiHost": "http://strapi.default.svc.cluster.local",
  "megapxHost": "https://megapx-stage.dcard.io",
  "creatorHost": "https://creator-stage.dcard.io",
  "tracesSampleRate": 1.0
}

產生以下問題:

  1. strapi.default.svc.cluster.local 是內部 Kubernetes 的服務名稱,而且跑在 default namespace 知道命名規則之後,攻擊者如果拿到內網存取權限,可以直接猜其他服務的名字
  2. staging 域名全部都是活的 ,所以這裡我有使用dig,以下都有解析到 Cloudflare IP(104.18.26.37 / 104.18.27.37):
    • megapx-stage.dcard.io
    • creator-stage.dcard.io
    • id-stage.dcard.io
    • ads-stage.dcard.io
    • about-stage.dcard.io
    • stage.dcard.io

目前這些 staging站都被 Cloudflare Access擋下,不過dns有解析這件事本身不太好 staging環境的防禦通常比 production 鬆很多

  1. Sentry 的 tracesSampleRate 設 1.0,production 不應該這樣設,這會讓更多的錯誤細節(stack trace、變數內容)被送出去
    btw creator.dcard.tw has same problem

reproduce

先進https://about.dcard.tw/
f12 -> console -> paste JSON.stringify(window.__CLIENT_PUBLIC_RUNTIME_CONFIG, null,2)
output will be like:

'{\n  "isEnvProd": false,\n  "isEnvStage": true,\n  "envName": "staging",\n  "isNodeEnvProd": true,\n  "nodeEnvName": "production",\n  "isDevelopment": false,\n  "isPullup": false,\n  "version": "2.26.1",\n  "sentry": {\n    "environment": "staging",\n    "sampleRate": 1,\n    "release": "[email protected]"\n  },\n  "domain": "about.dcard.tw",\n  "appName": "dcard-official",\n  "megapx": {\n    "host": "https://megapx-stage.dcard.io"\n  },\n  "strapi": {\n    "url": "http://strapi.default.svc.cluster.local."\n  },\n  "supportedLanguage": {\n    "defaultLocale": "zh-TW",\n    "locales": [\n      "zh-TW",\n      "en"\n    ]\n  }\n}'

圖片
找一下publicRuntimeConfig應該就會發現那些東西

驗證 staging 域名:

dig +short megapx-stage.dcard.io
# 104.18.26.37, 104.18.27.37

圖片

修補建議

1. 把 about.dcard.tw & creator.dcard.tw 的部署設定修正為 production 內部服務的URL(像 strapiHost)不要放 `publicRuntimeConfig`
2. 用 `serverRuntimeConfig` 就不會送到 client 端 Sentry sample rate調到 0.01~0.1
3. staging 的 DNS 記錄如果不需要對外解析的話建議拿掉。

擷圖

留言討論

聯絡組織

 發送私人訊息
您也可以透過私人訊息的方式與組織聯繫,討論有關於這個漏洞的相關資訊。
;