架構安全與可靠性

側通道攻擊(side-channel attack)

假設一個保險箱的密碼從正面無從得知,但你注意到轉到正確數字時鎖會喀答得稍微大聲一點,或轉盤在對的數字處會發熱。你從沒撬開鎖;你從它無意間放出的「側面」訊號讀到了秘密。側通道攻擊對電腦正是如此:它不正面攻擊演算法,而是從運算的物理副產物學到秘密——花了多久、耗了多少電、發出什麼聲音或電磁波,或在共享快取裡留下什麼狀態。

這之所以行得通,是因為真實硬體的行為會悄悄取決於它所處理的資料,即使官方輸出什麼也沒透露。一個天真的密碼檢查,一碰到第一個不符的字元就立刻回「錯」,對前面更多字元相符的密碼會多花一丁點時間——於是靠對許多次猜測計時,攻擊者能一次一個字元地還原密碼,全程沒看到它。功耗更豐富:晶片燒掉的能量可能取決於某個金鑰位元是 0 還是 1,所以在加密期間量測功耗軌跡能抽出一把密碼學金鑰。快取狀態是現代 CPU 裡最重要的通道:一個依秘密而定的位址有沒有被快取,會改變稍後存取的時間(見 cache-timing-attack)。

誠實地說,側通道是一類深刻而令人謙卑的威脅,因為它繞過了安全的常規邏輯。一個密碼演算法可以在數學上無法破解,卻仍透過功耗或時間洩漏金鑰,因為數學假設的是理想化的機器,而攻擊利用的是凌亂的物理機器。防禦的目標是讓副產物與秘密無關——不論資料都做同樣工作的常數時間程式、致盲、加噪、或切分共享資源——但每一項都耗費效能,而要證明一個真實系統什麼也不洩漏確實很難。Spectre 與 Meltdown 正是這一家族的側通道攻擊,以快取時間為通道(見 microarchitectural-security)。

一個登入檢查把輸入的密碼逐字元和真密碼比對,一碰到不同的字元就立刻回「否」。若真密碼以「p」開頭,猜「aXXXXX」會比「pXXXXX」稍快被拒。靠對成千上萬次猜測計時,攻擊者找出第一個字元(被拒最慢的那個),再找第二個,依此類推——純靠時間就還原整個密碼,從沒讀到它。

提早退出的比對會透過時間洩漏;總是比對每個字元的常數時間程式能關上這條通道。

一個密碼學演算法可以在紙上被證明安全,卻仍透過側通道洩漏金鑰,因為證明假設的是理想機器,而攻擊量測的是真實機器。數學上的保密與物理上的保密並不是一回事。

又称
sidechannel attackcovert channel旁路攻擊側信道攻擊