02 常見(jiàn)且低成本的Fault Injection方式
Fault Injection 攻擊手段通??蓞^分為侵入式攻擊和非侵入式攻擊。
侵入式攻擊所影響的是產(chǎn)品功能永久性的故障和異常,這手段通常是透過(guò)高精密的儀器對產(chǎn)品內部電路或數據做修改和破壞,因此所需的硬件成本和技術(shù)門(mén)坎都很高。
非侵入式攻擊則是在產(chǎn)品運行中,注入攻擊,使其短暫的影響產(chǎn)品當下運作行為,造成異?;蚬δ芄收?,這類(lèi)攻擊手段常見(jiàn)的方式為攻擊產(chǎn)品輸入電壓和頻率。因為這樣的攻擊是針對電壓及頻率且持續時(shí)間短暫,我們稱(chēng)之為 Voltage Glitch 攻擊與 Clock Glitch 攻擊。這兩種攻擊方式,只需具備可以產(chǎn)生對 voltage 和 clock 訊號干擾的硬設備即可達成,因此實(shí)現所需成本比侵入式攻擊低上許多,也更容易取得和實(shí)現。
Figure 3. Voltage Glitch Attack
因為 Voltage Glitch 和 Clock Glitch 的攻擊都可以造成產(chǎn)品執行時(shí),跳過(guò)某些指令或是影響某些操作的輸出結果, 本章節接下來(lái)將以 Voltage Glitch 攻擊范例來(lái)說(shuō)明常見(jiàn)的 Fault Injection 影響。
03 Voltage Glitch 對TrustZone 配置設定的攻擊
在具備 TrustZone® 技術(shù)的微控制器產(chǎn)品中,都會(huì )具有 Secure Attribution Unit (SAU) 控制單元,用來(lái)將微控制器的所有資源,設置為 Secure 和Non-secure 區域,目的是為了透過(guò)隔離 Secure與 Non-secure 區域的方式,來(lái)保護 Secure 區域中的資源。
在針對 TrustZone® 技術(shù)的攻擊中,攻擊者會(huì )企圖透過(guò)讓 SAU 的設置無(wú)效化,來(lái)瓦解這樣的隔離保護機制,此攻擊主要是在系統程序配置 SAU 屬性時(shí)進(jìn)行 Voltage Glitch 的攻擊, 讓系統執行指令出現錯誤,造成 SAU 配置和系統原先規劃的不一致,以期在這當中尋找到可利用的漏洞。
我們以試圖攻擊 M2351 微控制器在配置 SAU 過(guò)程中設定 Non-secure 區域為例,整個(gè) M2351 的 Flash 內存大小為 512 KB,如果規劃其中的 Secure 空間大小為 256 KB,那么剩下的 256 KB 空間,就屬于 Non-secure ,其在內存空間中的地址如下圖:
Figure 4. TrustZone® Secure, Non-secure Partition。
在這樣的內存配置下, Secure代碼與Non-secure代碼被遠遠的區隔開(kāi)來(lái),實(shí)現了TrustZone®的硬件隔離,而想要進(jìn)行這樣的隔離配置,實(shí)際上所需要的設置有三個(gè)部分,一個(gè)是SAU的配置設定,一個(gè)是Flash Non-secure Boundary的設定,最后則是編譯代碼需要的設置。
SAU的配置,主要在指定Non-secure區域的起始地址與結束地址,這里設定的范圍是由0x10040000到0x1007FFFF,至于其它未定義的區域,則默認為Secure區域。
Flash Non-secure Boundary的設定,是指Flash內存空間中,由哪里開(kāi)始要劃分給Non-secure使用,在這里其設定為0x40000,表示Flash后面的256KB,將劃歸給Non-secure使用,其余則是給Secure使用。Flash Non-secure Boundary的設定,是一出廠(chǎng)就設置好的,不會(huì )再改動(dòng) 。
由Figure3可知,Secure區域跟Non-secure區域是分開(kāi)的,因此在編譯時(shí),Secure代碼與Non-secure 代碼的RO Base就必定不同,也就是Secure的RO Base必須落在0x0到0x3FFFF的范圍,而Non-secure的RO Base則是要落在0x10040000到0x1007FFFF的范圍內,這里我們設定Secure RO Base為0x0,Non-secure RO base為0x10040000。
上述的三種設置,其中只有SAU的設置,會(huì )在系統運作中進(jìn)行,因而有機會(huì )被Voltage Glitch攻擊,如果系統在寫(xiě)入SAU區域設置時(shí),遭到攻擊,就有可能造成指令執行失敗,因而使得SAU的設置不正確,也就是設置 SAU Non-secure Region的起始地址 0x10040000這行指令執行失敗,這將造成SAU Non-secure Region的實(shí)際設定為 0x0,則系統的內存規劃將變成如下圖所示:
Figure 5. Secure, Non-secure Partition after Attack SAU Setting.
注意在Non-secure Region起始地址被竄改成0x0的情況下,0x0至0x0003_FFFF內存的屬性并不會(huì )真的被改成Non-secure,這是因為另一個(gè)固定的屬性設置單元Implementation Defined Attribution Unit (IDAU)所造成的影響,在SAU于0x0到0x0003_FFFF設置為Non-secure的情況下,最終的0x0到0x0003_FFFF的屬性將依照較嚴格的IDAU設置,這表示,即使成功的攻擊SAU,讓Non-secure 起始地址設定為0x0,仍然無(wú)法讓原來(lái)的Secure 區域改變?yōu)镹on-secure區域,而是變成IDAU設置的Non-secure callable 區域,而Non-secure callable區域,其本質(zhì)上仍是屬于Secure區域的一部分。
另外,雖然成功的攻擊SAU后,會(huì )讓大部分的Secure區域,轉變?yōu)镹on-secure callable區域,但是因為這些區域缺乏SG (Secure Gateway)指令的緣故,Non-secure code是無(wú)法任意用Non-secure callable方式呼叫這區域的指令的。
值得注意的是,M2351微控制器SAU最多總共有8個(gè)區域可以設定, 可是這8個(gè)區域的范圍,是不允許重迭的,重迭區域的設定,將導致該重迭區域強制為Secure屬性,也就是說(shuō),若是原來(lái)的設定中,本來(lái)就有劃定0x3F000至0x3FFFF為Non-secure callable區域,而因為此區域跟被攻擊后的SAU區域0x0到0x1007FFFF重迭了,將使得0x3F000至0x3FFFF這個(gè)區域的設定直接成為Secure區域,這將造成所有的Non-secure callable API無(wú)法被Non-secure code呼叫。
因此,單純的攻擊SAU設置,并無(wú)法為Non-secure code取得額外的權限,甚至會(huì )失去原本可以呼叫Non-secure callable API權限,所以即使成功的攻擊了SAU的設置,也并無(wú)法形成一個(gè)有效的攻擊,不會(huì )有任何Secure區域信息的泄漏或被Non-secure code取得任何的Secure權限。
04 Voltage Glitch 對 AES 加密的攻擊
此攻擊方式主要是在代碼執行AES加密相關(guān)處理時(shí),使用Voltage Glitch攻擊其運作,使其產(chǎn)生錯誤的密文。執行AES加密的基本流程如下圖所示, 最終會(huì )產(chǎn)生密文 :
Figure 6. AES Encrypt Procedure.
例如在輸入 AES Key操作時(shí)被Voltage Glitch攻擊,可能出現輸入密鑰的動(dòng)作被忽略或是輸入錯誤的密鑰值。如果是輸入密鑰的動(dòng)作因為攻擊而沒(méi)有實(shí)際上的密鑰值輸入,那么接下來(lái)的加密過(guò)程,就會(huì )直接使用其緩存器內原來(lái)的值,通常這會(huì )是一組全部為0的密鑰值,所以對于最后加密過(guò)后的秘文,只要使用全0的密鑰來(lái)解密,就可以還原出正確的原文了。
Figure 7. Zero Key Fault Injection Attack.
另一種狀況是在原文已知道情況下,攻擊者利用Voltage Glitch造成輸入錯誤的密鑰,然后加密過(guò)后,得到對應的密文,以此重復多次,攻擊者就可以根據原文、正確密鑰加密后的密文、各種錯誤密鑰加密后的密文,經(jīng)過(guò)Differential Fault Analysis (DFA) 差分故障分析方法,就可以還原出正確的密鑰。
Figure 8. Use Fault Injection to get N Encrypted Text for DFA.
05 如何透過(guò)軟件來(lái)防護這些攻擊
由上述幾個(gè)采用Voltage Glitch攻擊的例子可以發(fā)現,攻擊者需要在正確的時(shí)間點(diǎn),進(jìn)行Fault Injection攻擊,才有一些機會(huì )得到其想要達成的目的,因此讓攻擊者無(wú)法輕易的了解系統內部運作的時(shí)序,將會(huì )是一個(gè)有效的防護,最簡(jiǎn)單的方法就是建立不可預測的系統時(shí)序和處理流程, 讓攻擊者不容易找到合適的攻擊時(shí)間點(diǎn),也不容易持續攻擊到同一個(gè)關(guān)鍵運行點(diǎn),而這可以透過(guò)隨機延遲和隨機變化處理流程的順序來(lái)實(shí)現。
Figure 9. Add Random Delay
Figure 10. Change Execution Procedure Randomly
但是只要無(wú)法擋住攻擊的來(lái)源,攻擊者總會(huì )達成他們所要的攻擊目的。如果軟件可以偵測到系統可能被攻擊, 則可透過(guò)對應的處里程序將攻擊損害程度降到最低。
本章節將依據前一章節提到的故障攻擊范例來(lái)說(shuō)明軟件解決方案, 并實(shí)現可偵測出系統是否被攻擊以及對應的處理。
06 關(guān)鍵設置攻擊防護
在先前所舉TrustZone®設定攻擊的例子中,我們知道攻擊者企圖利用跳過(guò)SAU配置指令來(lái)影響Secure與Non-secure區域范圍的設置,企圖擴大Non-secure區域范圍,藉此取得存取Secure資源的機會(huì )。雖然在之前的描述中提到,因為Secure與Non-secure范圍設置,除了SAU,還需要搭配IDAU,所以單純的攻擊SAU,并無(wú)法取得有效的權限,但這里我們仍然為這樣的攻擊提出對應的策略,讓攻擊者連SAU的設置都無(wú)法攻擊成功。
這個(gè)防護最主要原理,是偵測異常的SAU配置,并做復原SAU配置的處理, 讓針對SAU設置的攻擊無(wú)效化。
首先要偵測出異常的SAU設置,可針對所有的SAU設置進(jìn)行冗余檢查。
紀錄有效的系統SAU設定值:
1. 系統SAU設定值已預先被定義在partition_M2351.h內,需要將這些設定值預先記錄下來(lái), 可供后續步驟的使用。
2. 計算出有效的系統SAU設定值總和 :
將有效的SAU相關(guān)設定例如: RBAR, RLAR和CTRL等設定值全部加起來(lái)做運算, 會(huì )得到一個(gè)Checksum值。
3. 將有效的SAU設定值寫(xiě)入對應的SAU region :
將partition_M2351.h內定義有效的SAU設定值和屬性寫(xiě)入各自的SAU區域內。
4. 讀出全部有被寫(xiě)入SAU region的設定值, 并做加總運算
5. 判斷寫(xiě)入SAU是否正確 :
在此比對Step 2和Step4計算出來(lái)的總和值是否一致,便可得知在寫(xiě)SAU設定值是否因遭到攻擊而產(chǎn)生異常的設定結果。
上述步驟Step 1,2,4,5是針對偵測攻擊所加的步驟, 而Step 3則是原來(lái)沒(méi)有加防護代碼時(shí)的SAU設置。如下圖所示,
Figure 11. Fault Injection Countermeasure Flow.
接下來(lái),偵測到錯誤后,必須要讓系統能夠自行回復,所以需要重復Step3的步驟再次寫(xiě)入SAU設定。
07 防護Zero Key攻擊與AES加密攻擊
Zero Key攻擊與SAU設置攻擊類(lèi)似,都是讓軟件寫(xiě)入動(dòng)作失效,也就是讓系統無(wú)法寫(xiě)入正確地密鑰到運算單元中,因而使用默認的空白數據,據此產(chǎn)生使用 空白密鑰的效果。
對AES加密運算的攻擊, 目的是影響密鑰的加載使其加密出錯誤的密文,然后攻擊者透過(guò)分析大量不同的錯誤密文和正確密文的關(guān)系, 透過(guò)DFA分析方法推導出系統內使用的加密密鑰后, 再解密密文, 便可得到明文數據。
因此AES加密攻擊的防護重點(diǎn)是讓軟件可以知道AES加密運算過(guò)中有受到攻擊,避免使用到空白或錯誤的密鑰,并且不能將被攻擊后產(chǎn)生的密文回報給攻擊者,使其有機會(huì )進(jìn)行DFA分析。
攻擊者再攻擊密鑰的加載前,需要先精確的定位到特定的時(shí)間點(diǎn),因為配置密鑰與輸入明文的程序,是可以互換的,軟件可以在這個(gè)部分進(jìn)行隨機的次序調換,如此可以增加攻擊者定位密鑰加載時(shí)間點(diǎn)的難度。
Figure 12. Random change the plaintext, Key input procedure.
由于對AES運算的攻擊,重點(diǎn)在于使其密鑰的加載出錯,無(wú)論是Zero Key或是大量錯誤的Key,所以只要在加載密鑰之后,再針對緩存器中的密鑰做檢查,即可保障密鑰輸入的正確性,而且如果運算中有使用到DMA的話(huà),DMA的Source, Destination與Transfer Count都應該也納入檢查。
而加密運算使用密鑰時(shí)的攻擊,則可在加密完成后,直接把密文用同一把密鑰解密,并與原來(lái)的明文做比對,即可驗證在加密過(guò)程中是否有任何出錯。
整個(gè)防護對策流程圖如下:
Figure 13. AES Key Fault Injection Countermeasure Flow.
總結
對于微控制器產(chǎn)品而言,Fault Injection確實(shí)是一個(gè)簡(jiǎn)單、有效又低成本的攻擊, 只是要能夠完整的取得有用的成果,攻擊仍然必須能夠精確的定位安全設定、密鑰加載、加密運算的關(guān)鍵時(shí)序,這對并不熟悉微控制器內部運行的程序的惡意攻擊已屬不易,而且軟件也可以利用隨機的延遲與程序交錯等方式,更加深定位的困難度。
即使攻擊者精確找到關(guān)鍵位置,只要軟件多一道自我校驗程序,就可以讓攻擊的難度急遽增加,因此對于系統中的關(guān)鍵設置、密鑰加載部分,增加相應的防護會(huì )是一個(gè)很值得做的事。
(來(lái)源:新唐MCU,作者:張紋碩 部經(jīng)理 )