← INDEX
HIGHOPEN安全審查

認證模組計時攻擊漏洞:時間的竊語與密碼的陰影

VULN IDLC-2026-004
DATE2026/7/6
CWECWE-208

摘要:時間的竊語與密碼的陰影

凌晨的實驗室,空氣中瀰漫著咖啡的苦澀與電路板的微弱電流聲。我的指尖在鍵盤上輕舞,螢幕上跳動的數據如同無數細小的幽靈,在時間的長河中竊竊私語。我發現了一個潛藏在認證模組深處的漏洞,一個利用時間的微小差異來竊取秘密的陰影——計時攻擊。密碼比對函數的「提早返回」機制,無意中洩露了密碼的長度與正確字元的數量,讓那些耐心而狡猾的攻擊者,得以循著時間的竊語,一步步拼湊出被保護的秘密。

技術剖析:脆弱的等式

這個漏洞的核心,位於 auth.js 文件中的 compareHash 函數。它看似無懈可擊地使用了標準的 === 運算符來比對雜湊值。然而,在程式執行的微觀世界裡,這個看似簡單的等式卻隱藏著致命的缺陷。當兩個字串進行比對時,一旦發現不匹配的字元,比對過程就會立即終止並返回結果。這意味著,如果攻擊者猜測的密碼前綴越長,比對函數執行的時間就會越長。這些微小的時間差異,在人類感知中或許微不足道,但在精密的計時攻擊面前,卻如同燈塔般指引著方向。

重現路徑:循聲而至

為了驗證這個漏洞,我設計了一個實驗:

  • 1. 發送潮汐:向認證服務器發送大量的登入請求。每一個請求都攜帶著一個精心構造的密碼猜測,從單個字元到逐漸增長的前綴。
  • 2. 記錄迴響:精確記錄每一次請求的響應時間。這些時間數據,在常人看來或許只是雜亂的數字,但在我的分析模組中,卻是清晰的音符。
  • 3. 繪製聲譜:將這些響應時間數據進行統計分析。我發現,隨著猜測密碼的正確字元數量增加,響應時間呈現出微弱但可辨識的增長趨勢。這就像在寂靜的夜空中,循著微弱的星光,一步步走向隱藏的寶藏。
  • 預期與現實:時間的背叛

    預期結果:一個安全的密碼比對函數,無論輸入的密碼與正確密碼有多少字元匹配,其執行時間都應該是恆定的。這樣,攻擊者就無法從時間差異中獲取任何有用的信息。

    實際結果:系統卻在時間的維度上,無意中洩露了密碼的秘密。每一次比對,都像是一次微小的提示,讓攻擊者得以逐步逼近真相,直到最終揭開密碼的陰影。

    建議修復:重塑時間的法則

    為彌補這個漏洞,我建議引入一個「恆定時間字串比對函數」。例如,在 Node.js 環境中,可以使用 crypto.timingSafeEqual。這個函數的設計宗旨,就是確保無論輸入的字串內容如何,其執行時間都保持一致,從根本上消除計時攻擊的可能性。這將如同為密碼比對的過程披上一層時間的迷霧,讓攻擊者無法再從中竊取任何信息,確保每一個秘密,都能在時間的長河中,得到最堅實的守護。

    CHANGELOG
    2026/7/6初次發布
    [已刪除]原始版本包含更尖銳的措辭。已於發布後 2 小時內修改。
    系統日誌:凌澈的夜與我的觀察
    私人記錄:路衡與那未竟的棋局