來自 man 3 memcmp
:
請勿使用
memcmp()
比較安全關鍵數據,例如密碼機密,因為所需的CPU時間取決於相等字節的數量。相反,需要在恆定時間內執行比較的功能。
為什麼會這樣呢?我的想法是,如果某人可以訪問處理此“安全關鍵數據”的計算機,則這些秘密已經受到破壞,因為該人可以從RAM中提取它們。或者,如果該人無法訪問計算機,則他們無論如何都無法準確地測量CPU時間。
來自 man 3 memcmp
:
請勿使用
memcmp()
比較安全關鍵數據,例如密碼機密,因為所需的CPU時間取決於相等字節的數量。相反,需要在恆定時間內執行比較的功能。
為什麼會這樣呢?我的想法是,如果某人可以訪問處理此“安全關鍵數據”的計算機,則這些秘密已經受到破壞,因為該人可以從RAM中提取它們。或者,如果該人無法訪問計算機,則他們無論如何都無法準確地測量CPU時間。
利用定時信息是對密碼身份驗證系統之類的一種可能的攻擊。
從概念上講, memcmp()
的工作原理是逐字節比較兩組二進制數據(實際上,處理器可以一次比較多個字節,具體取決於優化,但以下相同原理將適用)。該函數從數據的開頭開始,依次比較每個字節,並在發現差異時立即退出。如果沒有發現差異,則該函數將返回表示數據匹配的代碼。
由於該函數一旦發現差異,便會返回,因此具有足夠準確時鐘的攻擊者可以推斷出秘密信息。他們可以使用不同的輸入來引發對 memcmp()
的調用,並通過測量哪些輸入花費的時間更長,可以推斷出存儲的機密可能是什麼。
示例:
考慮經典的密碼哈希系統。假設您的密碼存儲為秘密哈希,例如 Ek8fAMjPhBo
。 (該哈希值是使用Linux crypt()
函數提供的DES方案生成的,鹽分為 na
,密碼為 secret
。)注意(該功能是不安全的,因此您不應該在實際系統中使用它。)
在強密碼系統中,您的哈希 Ek8fAMjPhBo
已存儲,但是密碼未存儲。當要求您進行身份驗證時,系統將獲取您的密碼,對其進行哈希處理,然後將兩個哈希進行相互比較。如果生成的哈希值匹配,則將授予您訪問系統的權限;如果哈希值不匹配,則將拒絕您的密碼。這樣,系統就可以檢查您是否知道密碼,而無需實際存儲密碼本身。
攻擊者如何利用計時來攻擊該系統:
為了攻擊該系統,對手實際上只需要弄清楚對存儲的哈希使用什麼密碼哈希即可。通常,存儲的哈希是秘密的,但對手可以使用計時信息來推斷存儲的哈希可能是什麼。一旦對手推斷出存儲的哈希,它很容易受到更快,離線的彩虹表攻擊,以及規避諸如密碼重試限制之類的在線安全措施。
上面的密碼系統必須將候選哈希與存儲的哈希進行比較,以使其正常運行。假設將候選哈希的每個字節與秘密存儲的哈希進行比較需要10納秒。如果沒有字節匹配(一次比較),則 memcmp()
將花費大約10ns。如果一個字節匹配(兩次比較),則 memcmp()
將花費大約20ns。攻擊者會生成一些密碼,並在系統中運行它們,並記錄每個密碼所花的時間。假設前幾次哈希比較每次大約花費10ns,然後返回,表明候選哈希的字節均與存儲的哈希不匹配。經過幾次嘗試後,哈希比較中的一個會花費20ns,這表示候選哈希的第一個字節與存儲的哈希匹配。在上面的示例中,這表明攻擊者已推斷哈希 Ek8fAMjPhBo
的第一個字節為 E
。
設計中的散列具有無法預測什麼散列與什麼密碼相對應的屬性,因此例如,該不會告訴攻擊者密碼以 s開頭代碼>。但是,攻擊者可能會有一大堆預先計算的哈希表(彩虹表),因此他們可以查找其他密碼,這些密碼散列到以
E
開頭的字符串。在嘗試了足夠的哈希之後,他們最終將得到一個輸入,該輸入使 memcmp()
花費30ns,這表明前兩個字節匹配,並且他們推論出哈希的前兩個字節是 Ek
。他們一遍又一遍地重複此過程,直到推斷出所有或大部分哈希。此時,他們要么知道密碼,要么可以通過傳統的彩虹表攻擊將其強行使用。
這有點假設,但是您可以在網絡上其他地方找到許多有關定時攻擊的實用信息,例如:
https://research.kudelskisecurity。 com / 2013/12/13 / timing-attacks-part-1 /
問題並不是要爭辯道,無論您想使用哪種系統,都可以使用旁道攻擊。
一個更好的觀點是
在大多數情況下,與大多數開發人員無法想到的情況相比,在更多情況下可能會發生側通道攻擊。
在任何給定情況下,可靠地說服自己沒有進行定時攻擊的機會正在開發時需要大量工作而不是簡單地將安全比較方法用作SOP。更多的工作意味著更多的成本和出錯的風險。
簡而言之,這是低下的成果。對於幾乎每個參數我都擁有“絕不對安全性至關重要的數據使用 memcmp
”的策略,優於“在安全的情況下可以使用 memcmp
的策略”的策略。可以想像。
如果您處於的情況下,每次不匹配 em都花了微秒的CPU時間比較(首先通常是不常見的情況!)將為您節省足夠的錢,值得在正確的安全分析上投入精力,然後您將有大量的業務文檔證明這一事實。
(即使這樣,在讓Moore's Law為您完成工作的同時,閱讀漫畫需要花費的時間,也可能同樣為您節省了CPU微秒的時間)。
它屬於側通道攻擊(與RSA相同的要求,使用私鑰的執行時間應恆定)。同樣也不一定是RAM受到損害,操作可以在TEE(受信任的執行環境)上執行。