SEC-005 P1: UserDefaults 儲存敏感使用者標識

Resolved 💬 2 comments Opened Mar 22, 2026 by stephen-taipei Closed Mar 25, 2026

問題描述

ReferralManager 的 getUserId() 方法將已驗證使用者 ID 和生成的 UUID 儲存在 UserDefaults 中。UserDefaults 的加密不如 Keychain,該 ID 可能被其他應用程式讀取。

檔案位置

ios-swift/Connectors/Managers/ReferralManager.swift:574-582

詳細說明

private func getUserId() -> String {
    if let authenticatedUserId = AuthManager.shared.currentUser?.id {
        UserDefaults.standard.set(authenticatedUserId, forKey: "user_id")  // 不安全
        return authenticatedUserId
    }
    if let userId = UserDefaults.standard.string(forKey: "user_id") {
        return userId
    }
    let newUserId = UUID().uuidString
    UserDefaults.standard.set(newUserId, forKey: "user_id")  // 不安全
    return newUserId
}

風險評估

  • UserDefaults 在備份中明文存儲
  • Xcode debugger 可直接訪問
  • 其他應用可能在特定環境下讀取
  • 使用者 ID 洩漏可能導致帳戶盜用

解決方案

  1. 使用 Keychain 替換 UserDefaults 存儲使用者 ID
  2. 已驗證使用者 ID 應由伺服器分配,不應本地生成
  3. 若必須本地生成,應通過伺服器驗證同步
  4. 定期清除過期的本地 ID

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗