Side-channel attack 是一種利用系統實作上的特性,而不是用密碼學演算法本身的攻擊,其中 Timing attacks 是其中一種很常見的手法,可以透過演算法的執行時間進而破解,舉例來說,一個判斷密碼是否正確的算法是從第一個字母開始逐一比對,一遇到不一樣的就馬上返回錯誤,那我們就可以透過多次嘗試,並觀察時間來判斷輸入是否正確。
現今也有一些評估的工具了,像是 Valgrind
的延伸 ctgrind
,還有 ctverif
透過靜態的程式分析,但是有一些共同的缺陷是這些方法需要對硬體建模,但是困難的是 CPU 製造商通常不會給太多細節的資訊。
這篇論文的貢獻是,透過自己開發的 dudect
,一個透過統計分析的程式判斷程式是否是 constant-time 在給定的平台之下。與其他工具透過靜態分析的手法不同,dudect
是透過 timing leakeage detection tests 對執行時間的統計分析,就可以避開底層硬體的限制,不侷限某特定 CPU 硬體平台。
在統計分析之前需要做一些後處理。
運用統計學試著推翻虛無假說 (null hypothesis),這邊的虛無假說就是「兩個時間分布是相同的」,底下參考 WeiCheng14159。
class 1
真正的執行時間的平均值(未知)class 2
真正的執行時間的平均值(未知)class 1
採樣的執行時間的標準差(已知)class 2
採樣的執行時間的標準差(已知)class 1
的樣本數(已知)class 2
的樣本數(已知)class 1
採樣的的執行時間的平均值(已知)class 2
採樣的的執行時間的平均值(已知)class 1
和class 2
的平均執行時間相等,亦為 『兩個 class
的執行時間分佈是相同的』class 1
和class 2
的平均執行時間並不相等,亦為 『兩個 class
的執行時間分佈是不同的』t_threshold_moderate
lab0-c
的 Welch’s test 測試項目有兩個:
is_insert_tail_const()
: 用來測試將字串加到 Queue 尾端的執行時間是否能在常數時間完成。is_size_const()
: 用來測試取得 Queue 大小時間是否能在常數時間完成。每個測項又細分兩個階段:
fix class
'\0'
則為 8bytes) random class
is_insert_tail_const()
或 is_size_const()
),並記錄執行時間 (CPU cycles)t_push()
與 t_compute()
。其所計算得出 t value 就可用來判斷測試項目是否在常數時間完成。在 fixture.c
當中可以看到,最後會根據 t 值大小來判定是否為 constant time。
/* threshold values for Welch's t-test */
#define t_threshold_bananas \
500 /* Test failed with overwhelming probability \
*/
#define t_threshold_moderate 10 /* Test failed */
if (max_t > t_threshold_bananas) {
return false;
} else if (max_t > t_threshold_moderate) {
return false;
} else { /* max_t < t_threshold_moderate */
return true;
}