Rsa
是否可以驗證執行檔的輸出來自其未更改的控制流?
我想一個執行檔可能包含一個簽名其輸出的密鑰,但可以提取該密鑰並用於簽署其他數據。是否可以驗證執行檔的輸出是其自身未更改(彙編)控制流的直接結果?
該密鑰可以被提取並用於簽署其他數據
正確的。攻擊者可以提取密鑰並簽署任何內容。
是否可以驗證執行檔的輸出是其自身未更改(彙編)控制流的直接結果?
一般來說,沒有。
只能在某些特定情況下進行驗證。一種方法是使用在受控環境中執行的簽名執行檔(由其提供者簽名)。通過驗證簽名,您將確保程式碼未被修改。通過使用受控環境,您將確保在作業系統載入執行檔時,既沒有修改輸入也沒有修改輸出,也沒有修改程式碼,也沒有其他程序修改了執行檔使用的記憶體。
一般來說,在不受控制的環境中(例如可以修改作業系統),這是不可能的。無論您想出什麼(驗證機器程式碼、檢查數字簽名等)都不能通過您的軟體副本來完成,並且仍然可以對輸出進行簽名。
驗證載入和執行的實際程式碼是否來自特定作者只能由作業系統(或一般系統)完成,而不能由第三方偽造。
而相信這種驗證只會使系統本身無法被篡改。
所以不,我認為沒有可行的方法來做到這一點。你最接近這樣一個封閉系統的可能是iOS/iPad OS。至少我不知道那裡有這樣的系統功能。我之前什至搜尋過它,因為我會發現它非常方便,例如,如果 iOS 可以簽署網路請求並在簽名中包含應用程序的製造商。不過,據我所知,這是不可能的。(特別是因為即使是 iPhone 也可以越獄)
另一方面,在嵌入式(封閉)系統中,您可以控制每個可用於載入程式碼的介面,您可以自己實現它。不過,這與防篡改一樣安全。並且我們知道,這從來都不是完美的。
但是,在您的普通筆記型電腦或 PC 上,我認為這是不可能的。