今年4月,來自德國的研究者披露了一個名為“StarBleed”的漏洞,它存在于賽靈思的Virtex、Kintex、Artix、Spartan等全部7系列FPGA中。通過這個漏洞,攻擊者可以同時攻破FPGA配置文件的加密(confidentiality)和鑒權(quán)(authenticity),并由此可以隨意修改FPGA中實現(xiàn)的邏輯功能。更嚴(yán)重的是,這個漏洞并不能通過軟件補丁的方式修復(fù),一旦某個芯片被攻破,就只能通過更換芯片的方式修復(fù)。
漏洞的發(fā)現(xiàn)者已于2019年9月將這個漏洞知會了賽靈思,并在第二天就獲得了賽靈思的承認(rèn)。根據(jù)賽靈思之前發(fā)布的財報,7系列FPGA貢獻(xiàn)了公司35%的營收。這些FPGA被廣泛用于通信設(shè)備、醫(yī)療、軍工宇航等多個領(lǐng)域,而這些領(lǐng)域很多都需要系統(tǒng)有著很高的穩(wěn)定性與安全性。因此,這次爆出的重大漏洞,無疑會對賽靈思及其客戶帶來較大的負(fù)面影響。
近年來,有關(guān)CPU的漏洞時有發(fā)現(xiàn)。例如在2018年初,幾乎全部主流的CPU廠商都被發(fā)現(xiàn)在其CPU產(chǎn)品中存在熔斷(Meltdown)和幽靈(Spectre)漏洞。相比之下,F(xiàn)PGA的漏洞問題并不那么“常見”。在這篇文章中,老石將深入解析造成這個漏洞的技術(shù)原因,并總結(jié)一些可行的應(yīng)對方法與預(yù)防措施。
關(guān)于詳細(xì)介紹這個漏洞的論文全文,已上傳至知識星球“老石談芯進(jìn)階版”,請于文末掃碼進(jìn)入星球查看。
FPGA的主要加密方式
隨著FPGA在數(shù)據(jù)中心、通信基礎(chǔ)設(shè)施、AI加速、醫(yī)療設(shè)備、邊緣計算等多個領(lǐng)域的廣泛使用,針對FPGA安全性的研究在近年來逐漸成為學(xué)術(shù)界和工業(yè)界關(guān)注的熱點之一。
與CPU、ASIC等芯片相比,F(xiàn)PGA芯片本身并不會完成任何邏輯功能,它只包含大量的可編程邏輯陣列,以及若干固化的IP核。FPGA系統(tǒng)功能的實現(xiàn),基本完全取決于開發(fā)者的邏輯設(shè)計。由于不同的設(shè)計者可以開發(fā)不同的系統(tǒng)邏輯,這就使得相同的FPGA芯片可以廣泛用于眾多不同的行業(yè)領(lǐng)域。通常來說,一個FPGA設(shè)計都是由很多IP組合而成,而這些IP才是FPGA設(shè)計中最有價值的部分。
為了將設(shè)計加載到FPGA中運行,唯一的方式就是通過一個所謂的“比特流(bitstream)”文件完成,業(yè)界也通常稱之為系統(tǒng)映像。系統(tǒng)映像由FPGA設(shè)計軟件自動生成,它包含了FPGA設(shè)計的全部信息,因此是FPGA加密環(huán)節(jié)的重中之重。
通常來說,對比特流或系統(tǒng)映像文件的保護(hù)方式有兩個層面,第一是加密,第二是鑒權(quán)。加密指的是使用特定算法對比特流文件進(jìn)行處理,將其轉(zhuǎn)換成密文,使得其中的內(nèi)容對外不可見。在賽靈思的7系列FPGA中,使用了CBC-AES-256算法進(jìn)行比特流加密。
鑒權(quán)指的是對加密后的比特流文件進(jìn)行身份驗證,防止對其進(jìn)行篡改和刪減,這類似于我們?nèi)粘I钪械纳矸蒡炞C。如果比特流文件被修改,勢必會導(dǎo)致錯誤的鑒權(quán)結(jié)果。如果將這個比特流下載到FPGA中,會因為身份校驗失敗而拒絕執(zhí)行,從而避免被攻擊的可能。在賽靈思的7系列FPGA中,使用了基于SHA-256的HMAC(散列消息認(rèn)證碼,Hash-basedMessageAuthenticationCode)方法進(jìn)行鑒權(quán)。
可以想象,如果比特流的加密過程被破解,那么攻擊者就可以讀出比特流文件中的所有信息,從而進(jìn)行反向工程、IP破解、信息收集等工作。如果鑒權(quán)過程被破解,那么攻擊者就可以對比特流文件進(jìn)行任意修改,比如修改系統(tǒng)功能、木馬注入等。所以說,這兩種保護(hù)方式缺一不可。
只可惜,這次的StarBleed漏洞恰恰利用了這兩種保護(hù)方式各自的短板,從而徹底破解比特流的加密和鑒權(quán),并達(dá)到了完全控制比特流和FPGA芯片的目的,可以說這個漏洞的破壞性和潛在危害性極強。
StarBleed漏洞的具體攻擊方法
整個攻擊過程分為兩大部分,第一是對加密的比特流文件進(jìn)行破解,第二是獲取鑒權(quán)密鑰。
為了破解加密的比特流文件,攻擊者利用了賽靈思FPGA里的一個特殊的配置寄存器WBSTAR,這個寄存器原本保存了FPGAMultiBoot功能的起始地址,當(dāng)啟動FPGA時,就通過讀取這個寄存器從片外非易失性存儲器找到映像文件。因此,當(dāng)FPGA復(fù)位時,這個寄存器的內(nèi)容是不會被抹掉的。
對加密比特流的破解過程分為5個步驟。
第一步,攻擊者對一個合法的比特流文件進(jìn)行了簡單篡改。具體來說,他需要修改比特流的一個32位字,將其改成對WBSTAR寄存器的寫操作。寫入的內(nèi)容,就是比特流本身。
雖然比特流是加密的,但這個篡改過程并沒有想象中那么困難。由于Vivado生成的比特流文件的格式和很多內(nèi)容是固定的,攻擊者可以對比不同的比特流文件,從而確定對WBSTAR寄存器操作命令的位置,然后對其進(jìn)行修改即可。由于篇幅所限,這部分的具體的細(xì)節(jié)不再贅述,歡迎在知識星球或微博與老石進(jìn)一步交流。
比特流數(shù)據(jù)結(jié)構(gòu),灰色部分是加密的內(nèi)容
第二步,將篡改后的比特流加載到FPGA里。此時,F(xiàn)PGA會對比特流進(jìn)行解密,并將一個32位字寫入WBSTAR寄存器。值得注意的是,這里寫入的是已經(jīng)解密的比特流內(nèi)容!
第三步,加載完畢后,由于比特流發(fā)生了修改,因此校驗失敗,并自動觸發(fā)系統(tǒng)復(fù)位。
第四步,使用另外一個未加密的比特流文件,讀取WBSTAR寄存器的內(nèi)容。由于WBSTAR寄存器的特殊性,它的內(nèi)容不會隨著復(fù)位而清除。因此,此時攻擊者再使用另外一個未加密的比特流文件讀取這個寄存器的內(nèi)容,就可以得到解密后的FPGA比特流的32位內(nèi)容了。這個未加密的比特流文件已開源,請在文末掃碼進(jìn)入知識星球查看。
第五步,手工復(fù)位,然后重復(fù)上述步驟,直到整個比特流都解密完成。
可以看到,攻擊者利用了上面提到的鑒權(quán)過程晚于加解密過程這個缺陷,通過“螞蟻搬家”的方式完成了對比特流的完全解密。最可憐的是,此時的FPGA本身也淪為了幫助解密的工具。這也解釋了為什么只能通過更換FPGA芯片才能修補這個漏洞。
下面的表格總結(jié)了不同的7系列FPGA的比特流大小,以及解密所需要的時間。讀出一個32位字大概需要7.9毫秒,那么破解一個KintexFPGA的比特流就大概需要3小時42分鐘。
接下來,就可以對鑒權(quán)過程進(jìn)行破解了。這個過程相對簡單,事實上,身份校驗所需的HMAC密鑰就存儲在比特流文件中,并且未經(jīng)其他額外的加密。這正是所謂的“謎底就在謎面上”。所以只需要讀取完整的比特流,就可以免費附贈HMAC密鑰一枚。有了它,就可以任意修改比特流文件的內(nèi)容,并重新計算身份校驗。此外,攻擊者甚至可以修改HMAC密鑰本身。
綜上所述,StarBleed漏洞正是利用了賽靈思7系列FPGA的兩大設(shè)計缺陷:
1.身份校驗發(fā)生在解密過程之后
2.身份校驗的密鑰直接存儲在加密后的比特流文件里,且無額外加密
通過StarBleed漏洞,攻擊者破解了全系列的賽靈思7系FPGA,包括SAKURA-X板卡上的Kintex-7,Basys3板卡上的Artix-7等等。同時,攻擊者還利用同樣的原理攻擊了6系FPGA,例如ML605板卡上的Virtex-6FPGA,也能實現(xiàn)不完全破解。
防御方法
由于StarBleed漏洞直接利用了賽靈思7系列FPGA芯片的設(shè)計缺陷,且攻擊過程直接在加載映像文件時展開,因此不能使用軟件補丁或固件升級的方法規(guī)避這個漏洞。目前唯一的修復(fù)方法只有更換芯片,賽靈思官方已經(jīng)向研究者承認(rèn)了這一點。
事實上,攻擊者使用這種方法無法破解UltraScale或更新的FPGA系列。這說明上面所說的設(shè)計缺陷已經(jīng)在新型FPGA架構(gòu)中得到了修復(fù)。例如,首先對比特流文件進(jìn)行鑒權(quán),通過后再進(jìn)行加載。
雖然除了換芯片外沒有完全防御的方法,我們?nèi)匀豢梢圆捎靡恍┰O(shè)計手段增加破解的成本和復(fù)雜度。一個常見的方法是在設(shè)計中增加額外的冗余邏輯,這些額外的部分并不影響邏輯功能,但會極大的提升設(shè)計的復(fù)雜度,從而增加破解的時間成本。比如,在狀態(tài)機(jī)中增加很多無用狀態(tài)等等。
此外,還可以在板卡設(shè)計時封鎖FPGA的配置端口,比如研究者使用的JTAG和SelectMAP端口等。事實上,在量產(chǎn)的FPGA設(shè)計中,應(yīng)該也很少有暴露的JTAG端口。
同時,研究者還思考了如何盡早發(fā)現(xiàn)這類設(shè)計缺陷和漏洞,而形式化方法就是一個很好的解決手段。設(shè)計者可以根據(jù)芯片的設(shè)計規(guī)約,建立形式化模型,并通過滿足性驗證(satisfiability)等方式對這個模型進(jìn)行分析和證明。老石在之前的文章《形式化芯片驗證:救世主還是烏托邦》中,曾對形式化方法做過詳細(xì)介紹,有興趣的讀者可以看看。
結(jié)語
FPGA的安全性研究并非一個全新的課題。然而,傳統(tǒng)的FPGA攻擊方法都需要使用額外的物理設(shè)備或操作,實用性遠(yuǎn)不如此次爆出的StarBleed漏洞。
一旦FPGA被攻破,攻擊者可以任意讀取FPGA比特流的數(shù)據(jù)、IP內(nèi)容等,并實現(xiàn)反向工程;也可以任意改變FPGA實現(xiàn)的邏輯功能,這使得FPGA所在的系統(tǒng)可能淪為攻擊者的高性能“肉雞”。由于FPGA能以40Gbps甚至更高的速度線速發(fā)送數(shù)據(jù)包,這使得大規(guī)模DDOS攻擊變得“簡單”。此外,攻擊者也可以通過邏輯實現(xiàn)的方式,大幅提升芯片溫度并對系統(tǒng)硬件進(jìn)行不可逆的物理破壞,等等。
可以說,這次的StarBleed漏洞給業(yè)界敲響了警鐘,也將會提升人們對FPGA安全性的重視,并以此指導(dǎo)未來的FPGA安全性設(shè)計。亡羊補牢,猶未晚也。
評論