在UFS裡,有這麼一個LU,主機往該LU寫資料時,UFS裝置會校驗資料的合法性,只有特定的主機才能寫入;同時,主機在讀取資料時,也提供了校驗機制,保證了主機讀取到的資料是從該LU上讀的資料,而不是攻擊者偽造的資料。這個LU就是RPMB(Replay Protected Memory Block)LU,四大“名擼”(四個Well Known LU)之一。
有些人家裡有保險箱,用以存放他們認為重要的東西,比如現金、存摺、房產證、情書等。輸入密碼,開啟密碼箱,然後放東西進去;取的時候,首先需要密碼開啟保險箱,然後把東西取出。沒有密碼,老婆是萬萬看不到老公和他初戀之間的情書的。RPMB就像是手機裡的密碼箱,使用者可以把一些重要資料儲存其中。
我們來看看RPMB這個保險箱。
UFS主機通過認證(authenticated)的方式訪問RPMB LU。下圖展示了資料寫過程:
- 首先,UFS主機和UFS裝置共享金鑰,該金鑰在UFS裝置出廠時就儲存在UFS裝置;
- UFS主機在傳送主機資料給UFS裝置前,會用該金鑰和雜湊演算法生成訊息認證碼(Message Authentication Code, MAC);
- UFS主機把主機資料連同MAC一起發給UFS裝置;
- UFS裝置把收到的主機資料和共享金鑰在本地重新計算MAC,然後把計算出的MAC和收到的MAC做對比,如果一致,則認證成功,寫入到快閃記憶體;否則,拒絕該筆資料的寫。
UFS使用HMAC(Hash-based Message Authentication Code)SHA-256演算法生成訊息認證碼。HMAC運算利用雜湊演算法,以一個金鑰和一個訊息為輸入,生成一個訊息摘要作為輸出。關於HMAC具體演算法,可參看https://en.wikipedia.org/wiki/HMAC,我們這裡不深入。
訊息認證碼本質是雜湊值。雜湊的一個特點是,即使只改變原資料一位元資料,兩者的雜湊值也是完全不同的。如果惡意攻擊者在資料傳輸過程中篡改了使用者資料,那麼UFS裝置根據收到的資料和共享金鑰生成的MAC肯定與接收到的MAC不一樣,認證通不過,資料就不會寫入UFS裝置。
這裡的前提是共享金鑰不能被惡意攻擊者獲取,否則,惡意攻擊者完全可以模擬主機行為:把自己的惡意資料和共享金鑰生成MAC,然後把惡意資料和其對應的MAC傳送給UFS裝置。UFS裝置會認證成功,惡意資料被寫入。所以,請保管好你的密碼!
但是,惡意攻擊者是狡猾的,即使他沒有辦法獲得你的金鑰,它還是有辦法對你進行攻擊的。
惡意攻擊者監聽到UFS主機和UFS裝置之間某次資料傳輸,得到“主機資料 + MAC”,然後該惡意攻擊者重複傳送該“主機資料 + MAC”給UFS裝置,由於“主機資料 + MAC”是合法的,認證通過,UFS裝置就會接收該資料並寫到快閃記憶體。惡意攻擊者如果一直重複發這些資料給UFS裝置,UFS裝置RPMB LU將會被寫爆!這就是重放攻擊, Replay Attack。
RPMB的全名是:Replay Protection Memory Block,它的名字暗示了RPMB是能抵禦重放攻擊的。那麼RPMB是怎麼對付重放攻擊的呢?
UFS維護了一個寫計數(Write Counter),初始化為0。UFS裝置每次成功處理完一個RPMB寫命令,寫計數加一。主機在往裝置寫入資料前,獲得該計數。然後把使用者資料和該計數一起做MAC計算。這樣,即使惡意攻擊者竊聽到某次合法的“使用者資料 + MAC”,往裝置寫入時,由於寫計數發生變化,它無法生成寫計數改變之後的MAC值,因此就無法一直重複往裝置寫入某次合法的“使用者資料 + MAC”。魔高一尺,道高一丈,正義終戰勝邪惡!
上面就是RPMB資料安全性背後的原理。下面再回到UFS RPMB協議上來。
UFS2.1中,RPMB LU最小邏輯空間為128KB,最大為16MB。它的邏輯塊大小為256B(普通LU邏輯塊大小一般為4KB)。應用層不是通過普通的Read/Write命令讀/寫RPMB上的資料,而是通過SECURITY PROTOCOL OUT/IN命令來訪問RPMB的。
UFS主機在訪問裝置RPMB時,是通過下面訊息互動完成的。
每條訊息包含一條或者若干條訊息資料幀。訊息資料幀大小是512位元組,具體如下:
從中,我們看到:
- 認證金鑰(Key)是32位元組;
- 1使用SHA-256計算MAC,就是任意長度的資料,產生的MAC值總是256位元,即MAC大小為32位元組。
- 邏輯塊資料大小為256位元組。
- 寫計數(Write Counter)為4位元組,當該值漲到0xFFFF FFFF,它就保持不動,不會繼續增長了。
- Address,RPMB的邏輯地址,同LBA。兩個位元組,最多表示65536個邏輯塊,每個邏輯塊大小為256位元組,因此RPMB邏輯空間最大為
- Block Count,邏輯塊數,即指定讀寫多少個邏輯塊。
- Result,RPMB操作結果(狀態)。
下面舉幾個RPMB操作例子來理解上面的訊息:
- 主機讀取寫計數
如前所述,寫計數的目的是抵禦重放攻擊。寫計數是UFS裝置管理和維護的,UFS裝置遞增該計數。主機在寫資料時,需要知道該計數,然後加上使用者資料,一起計算MAC。
命令層發SECURITY PROTOCOL OUT/IN命令讀取寫計數,然後傳輸層生成相應的UPIU進行主機與裝置之間的互動,具體見上圖。
- 主機寫認證資料
主機命令層通過SECURITY PROTOCOL OUT命令把使用者資料和對應的MAC傳送給裝置,然後通過SECURITY PROTOCOL OUT請求獲取前面資料寫結果,最後通過SECURITY PROTOCOL IN讀取寫結果。寫結果中包含新的寫計數,這樣下次主機利用新的寫計數計算MAC。注意,只有本次寫認證資料成功,裝置才會遞增該計數。
- 主機讀認證資料
首先,主機通過SECURITY PROTOCOL OUT命令傳送讀取認證資料請求給裝置,然後傳送SECURITY PROTOCOL IN命令讀取資料。
注意,主機讀取資料也是需要認證的。在裝置端,UFS裝置會計算MAC,然後主機端根據MAC認證該資料。這樣可以防止惡意攻擊者在資料傳輸過程中(從裝置到主機),用惡意資料更換原始資料。
RPMB提供了認證訪問方式和抵禦重放攻擊的機制,保證了儲存在RPMB LU上資料的安全。因此,使用者可以把一些敏感和重要的資訊寫在RPMB上。在實際應用中,它通常用於儲存一些有防止非法篡改需求的資料,例如手機上指紋支付相關的公鑰、序列號等敏感資訊。