Timing-Attack
編譯器引入的攻擊向量
我有一個關於通過編譯和編譯器優化啟用的加密程式碼實現的攻擊的問題。我知道這一點。誰能指出我的其他例子?特別是,是否存在通過編譯(特別是通過編譯器優化)啟用的時序攻擊範例,這些範例在源語言的語義上是不可能的?
$ \mathbf{Edit:} $ 讓我從兩個方面說明我的意思。
首先,有時程式語言的語義是使用一步歸約關係給出的。特別是,可以像這樣指定等式的一步減少。
- 對於所有值 $ x $ : $ x = x \rightarrow \mathtt{true} $ .
- 對於所有值 $ x, y $ 這樣 $ x $ 不等於 $ y $ : $ x = y \rightarrow \mathtt{false} $ .
您可以將一步減少視為花費一個單位時間,因此在此模型中,所有相等性計算都花費相同的時間。但是對於字元串、列表或數組等複雜的資料結構,編譯通常是具有與數據相關的執行時間(或功耗或 EM 輻射或任何您最喜歡的邊通道)的程式碼。
其次,我知道並不是所有的程式語言都有像這樣好的、簡單的操作語義。因此,看待同一問題的另一種方式是:如果我編譯一個程序兩次,一次幾乎沒有開啟優化,一次編譯器高度優化,後者是否會打開我的執行檔容易受到攻擊?以前沒有?我特別考慮 JIT 編譯器所做的優化(跟踪)。
PS我沒有足夠的聲譽給我的問題提供更多/更好的標籤。請隨意這樣做。
不是我有一個現實生活中的例子,只是一個想法。
使用記憶化可以更快地完成某些計算密集型任務。現在,如果編譯器設法自動對某些程式碼使用記憶,那麼程式碼的執行速度可能比語言符號所建議的要快得多。我不知道實際上有任何編譯器這樣做。
例如,在 C++ 中,只要保留可觀察的行為(包括對易失性記憶體的訪問和對 I/O 庫函式的呼叫),任何優化都是允許的。允許編譯器以其他任何方式轉換程序。
剛剛出現的一篇論文JIT Leaks: Inducing Timing Side Channels through Just-In-Time Compilation確實更詳細地研究了這種現象。