我們怎么知道展出的著名藝術品是真實的而不是偽造的?這顯然不是一件容易的事,因為藝術品偽造行業估計每年產生約30億美元的收入。藝術家經常在他們的原創作品上簽名,但很難區分原始簽名和復制品。
識別偽造品的一種方法是利用原子彈,或者更確切地說,在14年代原子彈試驗之后在所有有機材料中發現的高碳-1960同位素比率的特征。如果用于結合油漆中顏料的有機物來自在此期間之前死亡的植物,則碳-14的比例將大大低于更現代油漆中的比例,從而使調查人員能夠可靠地識別現代偽造品。
與藝術一樣,我們經常更關心數據的真實性,而不是其他人是否能夠查看它。例如,我們如何知道設備上運行的代碼是真實的?我們并不總是關心隱藏代碼 - 任何人都可以查看開源的u-boot引導加載程序代碼。但是,在開始執行之前,我們的設備能夠驗證引導加載程序代碼是否未經更改且真實,這一點至關重要。
本博客介紹了消息身份驗證代碼和數字簽名,它們是驗證數據的完整性(數據是否已更改?)和真實性(誰生成了數據?)的加密方法。但是,為什么不直接使用校驗和或CRC來驗證數據是否未被更改呢?正如我們將在下一節中看到的那樣,不幸的是,它們無法抵御故意修改數據的對手。
為什么CRC不合適
驗證數據是否已被更改的一種眾所周知的方法是添加錯誤檢測代碼,例如循環冗余校驗 (CRC)。例如,考慮由多項式 x+1 生成的 1 位 CRC。這相當于添加一個偶數奇偶校驗位,如果數據中的 1 個數為奇數,則在數據后附加 1,否則附加 0。
如果我們10010111輸入數據,我們可以看到數據中有一個奇數個 1,所以我們的奇偶校驗位將是 1。那么,為什么這種有效的錯誤檢測方案不適合確保完整性和真實性呢?
問題在于CRC相當于藝術家的簽名。如果我們像CRC偽造者一樣思考,設備怎么會被愚弄,接受更改后的數據不變?首先,讓我們采用最簡單的情況:假設數據及其CRC一起存儲在未受保護的內存(例如閃存)中。攻擊者需要做的就是用自己的數據覆蓋原始數據,然后計算適當的CRC并將其附加到他們的數據中。當設備讀取更改后的數據時,它將計算CRC并驗證其是否與攻擊者生成的CRC匹配,接受更改后的數據為原始數據!對于此攻擊的真實示例,本演練詳細解釋了黑客如何通過操縱 Linux 內核中的 CRC 來控制 Docker 服務器。
規避 CRC:(左)原始代碼和 CRC 通過驗證,(中間)具有對抗性修改和原始 CRC 驗證失敗的代碼,(右)具有對抗性修改和對抗性 CRC 通過驗證的代碼
為了使攻擊者更難,該設備可以將CRC存儲在一次性可編程(OTP)存儲器中。不幸的是,這并不能消除問題。雖然CRC是檢測通道噪聲或不穩定單元良性錯誤的好方法,但它們不能防止主動惡意修改。
假設我們前面的示例數據用于啟用或禁用不同的產品功能,具體取決于客戶選擇的許可證模型。如果高價值功能位于最左側的位中,則能夠更改我們的示例向量10010111將更左側的位翻轉為 1s 將啟用這些功能,而無需為價格較高的許可模型付費。對于對手來說,這是微不足道的:
原始數據 | 修改后的數據 |
10010111 1 | 11110111 1 |
由于 1 位 CRC 在原始數據中為 1(表示數據中的奇數為 1),因此對手只需要確保修改后的數據也有奇數 1。通過將最左邊的兩個 0 翻轉為 1,攻擊者啟用了兩個額外的高價值功能,而無需修改安全存儲在 OTP 中的 CRC 檢查位。此策略也適用于實際應用中使用的較大 CRC。
重要的一點是,CRC僅提供良性錯誤保護,例如通信通道上的噪聲或不穩定的SRAM單元。當攻擊者主動嘗試修改數據時,他們可以以一種不會改變從原始數據生成的CRC的方式進行修改。
審核編輯:郭婷
-
存儲器
+關注
關注
38文章
7453瀏覽量
163608 -
服務器
+關注
關注
12文章
9024瀏覽量
85187 -
crc
+關注
關注
0文章
199瀏覽量
29438
發布評論請先 登錄
相關推薦
評論