999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

SPI范圍保護(hù)寄存器漏洞研究

2018-02-12 12:24:56王冠楊松松
軟件導(dǎo)刊 2018年12期

王冠 楊松松

摘要:SPI范圍保護(hù)寄存器是UEFI固件常用的一種保護(hù)機(jī)制。提出了一種篡改SPI范圍保護(hù)寄存器值的方法,利用該方法可以實(shí)現(xiàn)SMM漏洞攻擊。闡述了SPI范圍保護(hù)寄存器原理,研究了SPI范圍保護(hù)寄存器修改理論,實(shí)現(xiàn)對(duì)計(jì)算機(jī)SPI范圍保護(hù)寄存器值的篡改。實(shí)驗(yàn)結(jié)果表明,任何采用SPI范圍保護(hù)機(jī)制的固件均有可能采用這種方式進(jìn)行破壞。

關(guān)鍵詞:SPI范圍保護(hù)寄存器;UEFI漏洞;閃存寫(xiě)保護(hù)

Research on SPI Protected Ranges vulnerability

WANG Guan1,2,YANG Song?song1,2

(1.College of Computer,Beijing University of Technology;

2.Key Laboratory of Trustworthy Computing in Beijing, Beijing 100124,China)

Abstract:SPI range protection register is a common protection mechanism for UEFI firmware. In this paper, a method of tampering with SPI range protection register value is proposed, which can realize SMM copper leak attack. This paper also expounds the principle of SPI range protection register, studies the modification theory of SPI range protection register, and realizes tampering with the value of computer SPI range protection register. The experimental results show that any firmware using SPI scope protection mechanism may be destroyed in this way.

Key Words:SPI protected ranges;UEFI vulnerability;flash write protection

0?引言

BIOS是一組固化在計(jì)算機(jī)主板ROM芯片上的程序,主要負(fù)責(zé)初始化硬件和操作系統(tǒng)預(yù)啟動(dòng)處理[1]。BIOS還負(fù)責(zé)配置和實(shí)例化系統(tǒng)管理模式(System Management Mode,SMM),這是一種x86平臺(tái)上具有高度特權(quán)的執(zhí)行模式[2]。任何控制BIOS的惡意軟件都可將任意代碼放入SMM中。因此,很有必要保護(hù)BIOS安全。UEFI是新一代BIOS接口規(guī)范[3]。為保護(hù)UEFI固件,Intel提出了多種保護(hù)機(jī)制,包括BIOS_CNTL寄存器保護(hù)機(jī)制、SPI范圍保護(hù)寄存器機(jī)制(PR0-PR4,簡(jiǎn)稱(chēng)“PRx”)以及BootGuard保護(hù)機(jī)制。大多數(shù)計(jì)算機(jī)都使用SPI范圍保護(hù)寄存器機(jī)制保護(hù)固件,防止隨意對(duì)閃存進(jìn)行編程操作。

1?UEFI啟動(dòng)關(guān)鍵點(diǎn)分析

1.1?S3恢復(fù)引導(dǎo)路徑

S3恢復(fù)引導(dǎo)路徑是一種不同于UEFI框架正常引導(dǎo)路徑的引導(dǎo)方式,是S3模式下的一種引導(dǎo)路徑[4]。通過(guò)這個(gè)路徑,UEFI框架從閃存中獲取有關(guān)平臺(tái)配置的預(yù)存數(shù)據(jù),并在跳轉(zhuǎn)到操作系統(tǒng)的喚醒向量之前配置平臺(tái)。

S3模式就是Suspend to Ram(簡(jiǎn)稱(chēng)STR)模式,是6種ACPI電源管理模式中的一種[5]。利用該模式,可以在保存系統(tǒng)關(guān)鍵信息的情況下節(jié)省電源。在這種模式下,系統(tǒng)可將轉(zhuǎn)到S3模式前的重要信息存儲(chǔ)到內(nèi)存中,而且電源能持續(xù)為內(nèi)存等系統(tǒng)設(shè)備供電,以防數(shù)據(jù)丟失。當(dāng)打開(kāi)電源開(kāi)關(guān)時(shí)系統(tǒng)啟動(dòng),可很快從內(nèi)存中讀取數(shù)據(jù)并返回到S3之前的狀態(tài)。由于是對(duì)內(nèi)存進(jìn)行讀取,因此恢復(fù)狀態(tài)的速度很快。

1.2?UEFI引導(dǎo)腳本

UEFI引導(dǎo)腳本是一種在ACPI S3睡眠模式下保存平臺(tái)狀態(tài)的數(shù)據(jù)結(jié)構(gòu)[6]。為保護(hù)計(jì)算機(jī)固件,UEFI規(guī)范引入了一種稱(chēng)為SMM LockBox的機(jī)制,將引導(dǎo)腳本存儲(chǔ)在系統(tǒng)管理RAM(SMRAM)中,起到保護(hù)引導(dǎo)腳作用。

在S3恢復(fù)引導(dǎo)路徑中,框架需要在PEI和DXE階段恢復(fù)配置。由于DXE階段承載服務(wù)眾多,因此為了提高性能,需要避免S3恢復(fù)引導(dǎo)路徑中的DXE階段。為達(dá)到這個(gè)目的,UEFI框架在正常啟動(dòng)期間構(gòu)建引導(dǎo)腳本。各種芯片組驅(qū)動(dòng)程序?qū) / O、PCI、內(nèi)存、系統(tǒng)管理總線(SMBus),以及恢復(fù)芯片組和處理器配置所必需的其它特定操作或程序信息記錄在引導(dǎo)腳本中。在S3恢復(fù)引導(dǎo)路徑期間,引導(dǎo)腳本引擎解析腳本,恢復(fù)系統(tǒng)配置。

引導(dǎo)腳本可訪問(wèn)I / O、內(nèi)存和PCI配置空間,還可執(zhí)行特定的微處理器指令。在觸發(fā) S3 模式掛起—恢復(fù)動(dòng)作的情況下,通過(guò)更改這個(gè)數(shù)據(jù)結(jié)構(gòu)覆蓋SPI范圍保護(hù)寄存器的值。

1.3?SPI范圍保護(hù)寄存器機(jī)制

SPI范圍保護(hù)寄存器機(jī)制是Intel提供的一種保護(hù)主板閃存中BIOS固件不被隨意覆寫(xiě)的機(jī)制,其包含PR0—PR4寄存器(簡(jiǎn)稱(chēng)“PRx”寄存器)。該機(jī)制通過(guò)設(shè)置PR0—PR4寄存器值來(lái)規(guī)定受保護(hù)的目標(biāo)區(qū)域地址,在保護(hù)狀態(tài)下,受保護(hù)目標(biāo)區(qū)域不可被寫(xiě)入、擦除或讀取。當(dāng)PR0—PR4寄存器值都為0時(shí),SPI范圍保護(hù)機(jī)制失效[7]。

PR0—PR4寄存器的地址范圍為0x3800—0x39ff,單個(gè)寄存器長(zhǎng)度為32位。每個(gè)寄存器除內(nèi)存地址不同外,讀寫(xiě)權(quán)限、默認(rèn)值、大小都是相同的。其中,第0~12位表示保護(hù)范圍基址,指定受保護(hù)范圍下限。13~14位是保留位,第15位是讀使能保護(hù)位,當(dāng)該位被設(shè)置時(shí),表示該寄存器中的基址和限制字段有效,禁止對(duì)它們之間的地址進(jìn)行讀取操作。第16~18位表示保護(hù)范圍限制位,指定受保護(hù)范圍的上限。第29~30位是保留位。第31位表示寫(xiě)保護(hù)使能位,當(dāng)該位被設(shè)置時(shí),表示該寄存器中的基址和限制字段有效,禁止對(duì)它們之間的地址進(jìn)行寫(xiě)入和擦除操作。該位被清除時(shí),基址和限制字段被忽略。

SPI范圍保護(hù)寄存器通過(guò)SPI根復(fù)合寄存器塊(RCRB)的SPI Host Interface內(nèi)存映射寄存器進(jìn)行配置。根復(fù)合寄存器塊是一組用于配置根聯(lián)合體設(shè)備的寄存器組。根聯(lián)合體設(shè)備是一種將處理器和內(nèi)存子系統(tǒng)連接到由一個(gè)或多個(gè)交換設(shè)備組成的PCI Express交換結(jié)構(gòu)。不同芯片組的根復(fù)合寄存器塊地址不同,可通過(guò)讀取位于LPC橋接器件的PCI配置空間內(nèi)偏移量為0xf0的根復(fù)合基址寄存器,確定根復(fù)合寄存器塊地址。

2?破壞SPI范圍保護(hù)寄存器機(jī)制

UEFI正常引導(dǎo)路徑即UEFI框架引導(dǎo)系統(tǒng)正常啟動(dòng)過(guò)程。在該路徑中,UEFI框架構(gòu)建UEFI引導(dǎo)腳本,將包括SPI范圍保護(hù)寄存器值在內(nèi)的信息保存到閃存中。當(dāng)系統(tǒng)進(jìn)入到S3睡眠模式時(shí),UEFI引導(dǎo)腳本通過(guò)SMM LockBox機(jī)制保存到SMRAM中;系統(tǒng)從S3睡眠模式喚醒時(shí),引導(dǎo)腳本引擎解析引導(dǎo)腳本文件,將系統(tǒng)配置恢復(fù)到S3睡眠模式前狀態(tài)。如果在進(jìn)入S3睡眠模式期間更改UEFI引導(dǎo)腳本中SPI范圍保護(hù)寄存器的值,當(dāng)系統(tǒng)被喚醒時(shí),SPI范圍保護(hù)寄存器的值就會(huì)被UEFI引導(dǎo)腳本中的記錄覆蓋,從而實(shí)現(xiàn)對(duì)SPI范圍保護(hù)寄存器值的篡改。

為使用引導(dǎo)腳本,需要知道SMM LockBox驅(qū)動(dòng)程序如何將其存儲(chǔ)到SMRAM中,因此需對(duì)SMM LockBox驅(qū)動(dòng)程序進(jìn)行逆向工程。從逆向源碼中獲得UEFI引導(dǎo)腳本地址后,根據(jù)該地址對(duì)UEFI引導(dǎo)腳本中SPI范圍保護(hù)寄存器的值進(jìn)行修改,最后觸發(fā)S3睡眠模式掛起,恢復(fù)篡改SPI范圍保護(hù)寄存器的值。

2.1?逆向S3恢復(fù)引導(dǎo)路徑

在不同結(jié)構(gòu)中,固件中的SMMLockBox驅(qū)動(dòng)程序具有相同的LockBoxGUID(bd445d79-b7ad-4f04-9ad8-29bd2040eb3c)。因此,將實(shí)驗(yàn)機(jī)固件加載到UEFITool中,然后搜索該GUID。UEFI Tool是一種可以確定SMMLockBox驅(qū)動(dòng)程序位置的可視化工具[8],如圖1所示。

利用UEFITool找到實(shí)現(xiàn)SMMLockBox功能的DXE驅(qū)動(dòng)程序,將其轉(zhuǎn)儲(chǔ)到磁盤(pán)中,加載到IDAPro并反編譯PE鏡像的入口函數(shù)。sub_77C()函數(shù)對(duì) SMM LockBox 執(zhí)行初始化:

int?__fastcall sub_77C(EFI_HANDLE ImageHandle)

{

...

v1 = gBS->LocateProtocol(&gEfiSmmBaseProtocolGuid, 0,&SmmBaseProtocol);

v2 = 0;

if (v1 >= 0)

{

// 確定驅(qū)動(dòng)程序是否被加載到SMRAM

SmmBaseProtocol->InSmm(SmmBaseProtocol, &v10);

if (v10)

{

// 找到EFI_SMM_SYSTEM_TABLE

SmmBaseProtocol->GetSmstLocation(SmmBaseProtocol,&gSMST);

gRT->SetVariable(L"Smst",gEfiSmmLockBoxCommunicationGuid, 3);

// 找到EFI_SMM_ACCESS_PROTOCOL

gBS->LocateProtocol(&gEfiSmmAccessProtocolGuid, 0,&SmmAccessProtocol);

// 得到SMRAM 地址

SmmAccessProtocol->GetCapabilities(SmmAccessProtocol,&v11, 0);

gSMST->SmmAllocatePool(6, v11, &qword_F68);

// 把sub_674()注冊(cè)為回調(diào)函數(shù)

SmmBaseProtocol->RegisterCallback(SmmBaseProtocol,0xF9E9662B,sub_674, v4);

}

}

從代碼可知,驅(qū)動(dòng)代碼利用EFI_SMM_BASE_PROTOCOL的InSmm()函數(shù)確定它如何加載驅(qū)動(dòng)。SMM回調(diào)注冊(cè)則使用EFI_SMM_BASE_PROTOCOL的RegisterCallback()函數(shù)實(shí)現(xiàn)。調(diào)用EFI_SMM_SYSTEM_TABLE.SmmAllocatePages()函數(shù)完成為SMM LockBox數(shù)據(jù)列表?xiàng)l目分配內(nèi)存的工作,用于存儲(chǔ)引導(dǎo)腳本的副本,該地址來(lái)自 SMM 回調(diào)輸入。EFI_SMM_SYSTEM_TABLE.SmmAllocatePool()函數(shù)用于存儲(chǔ)引導(dǎo)腳本地址、大小以及 “LOCKBOXD”簽名等。

通過(guò)SMMLockBoxGUID和配置表開(kāi)頭的常量簽名“LOCKB_64”,可以找到帶有雙鏈表頭的指針UEFISMM配置表,利用轉(zhuǎn)儲(chǔ)工具獲得SMRAM轉(zhuǎn)儲(chǔ),如圖2所示。

從目標(biāo)機(jī)的SMRAM內(nèi)容轉(zhuǎn)儲(chǔ)結(jié)果可以看出轉(zhuǎn)儲(chǔ)成功。將轉(zhuǎn)儲(chǔ)結(jié)果加載到IDA中,從中可得到配置表信息。通過(guò)“SMST”簽名可在SMRAM中找到EFI_SMM_SYSTEM_TABLE。在EFI_SMM_SYSTEM_TABLE結(jié)尾,可發(fā)現(xiàn)UEFISMM配置表和指向EFI_CONFIGURATION_TABLE結(jié)構(gòu)數(shù)組的指針,地址為0xad34cdc8的列表中包含“LOCKBOXD”簽名的引導(dǎo)腳本信息結(jié)構(gòu),并可知道引導(dǎo)腳本的SMRAM副本位于0xad1c1000的地址,長(zhǎng)度為0×7e12字節(jié)。

2.2?篡改SPI范圍保護(hù)寄存器的值

通過(guò)引導(dǎo)腳本位置對(duì)存儲(chǔ)在 SMM LockBox 中的引導(dǎo)腳本進(jìn)行讀和寫(xiě)操作,從而修改PRx寄存器的值達(dá)到破壞SPI范圍保護(hù)機(jī)制的目的。首先,需要通過(guò)GUID查找EFI_CONFIGURATION_TABLE的VendorTable。函數(shù)smst_addr()可用于通過(guò)表頭簽名來(lái)查找EFI_SMM_SYSTEM_TABLE的地址。利用該地址找到VendorTable后,可以編寫(xiě)定位UEFISMM配置表函數(shù)并解析它的數(shù)據(jù),確定啟動(dòng)腳本表副本在SMRAM中存儲(chǔ)的位置。接著利用該函數(shù)可看到目標(biāo)計(jì)算機(jī)固件引導(dǎo)腳本的十六進(jìn)制轉(zhuǎn)儲(chǔ)。在該表最后可看到PR0-PR4寄存器的值(黃色代表寄存器,綠色代表寄存器的值),如圖3所示。

從轉(zhuǎn)儲(chǔ)結(jié)果得到PRx寄存器的值,利用disable()函數(shù)將PR0-PR4寄存器的值設(shè)置為零:

for (int i = 0; i < 5; i += 1)

{

if (addr == pr_regs[i].addr)

{

val = 0;

// 將PRx寄存器的值設(shè)置為0

if (phys_mem_write(target, (void *)(bootscript_addr + ptr +0x11),

sizeof(unsigned int), (unsigned char *)&val,NULL) == 0)

{

entries_patched += 1;

}

if (!pr_regs[i].found)

{

registers_found += 1;

}

pr_regs[i].found = true;

break;

}

}

然后調(diào)用s3_sleep_with_timeout()函數(shù)觸發(fā)掛起-恢復(fù)動(dòng)作,同時(shí)修改腳本文件表。最后,S3復(fù)位后再一次讀取PR0-PR4值,檢查PRx閃存寫(xiě)保護(hù)是否被成功禁用。

{

if (s3_sleep_with_timeout(10) == 0)

{

// 得到當(dāng)前PRx 寄存器的值

if (pr_get(target, &rcrb_addr,

&pr0_val, &pr1_val, &pr2_val, &pr3_val,

&pr4_val) != 0)

{

goto _end;

}

// 檢查SPI保護(hù)是否被設(shè)置

if (pr0_val == 0 && pr1_val == 0 && pr2_val == 0 &&

pr3_val == 0 && pr4_val == 0)

{

ret = 0;

}

}

2.3?S3睡眠模式喚醒系統(tǒng)

最后,需要從S3睡眠模式喚醒Windows操作平臺(tái)。首先要判斷目標(biāo)計(jì)算機(jī)是否支持S3睡眠狀態(tài)。利用SetSuspendState()函數(shù)判斷電腦是否進(jìn)入睡眠狀態(tài),如果判斷為真,再利用SetWaitableTimer()Win32API函數(shù)中的fResume參數(shù),通過(guò)改變定時(shí)器狀態(tài)使系統(tǒng)退出睡眠狀態(tài)。

2.4?結(jié)果檢測(cè)

利用Intel開(kāi)發(fā)的安全評(píng)估框架CHIPSEC對(duì)目標(biāo)計(jì)算機(jī)的寄存器初始狀態(tài)進(jìn)行檢測(cè),得到結(jié)果如圖4所示。

從檢測(cè)結(jié)果可以看出,目標(biāo)計(jì)算機(jī)運(yùn)行正常,SPI范圍保護(hù)寄存器值不都為0,保護(hù)機(jī)制正常。

下面運(yùn)行本文中提出的方法程序檢驗(yàn)是否破壞了SPI范圍保護(hù)機(jī)制,如圖5所示。

從程序結(jié)果中可知,PRx的閃存寫(xiě)保護(hù)功能被禁止。

運(yùn)行CHIPSEC并驗(yàn)證PR0-PR4寄存器值是否得到了修改,如圖6所示。

從結(jié)果可以看到,PR0-PR4的值都變?yōu)?。通過(guò)與寄存器初始狀態(tài)進(jìn)行對(duì)比,寄存器的值確實(shí)被篡改,證明本文提出方法的正確性。

3?結(jié)語(yǔ)

本文提出了一種篡改SPI范圍保護(hù)寄存器值的方法,實(shí)現(xiàn)對(duì)SMRAM中UEFI引導(dǎo)腳本中記錄的SPI范圍保護(hù)寄存器值的篡改。利用代碼實(shí)現(xiàn)S3睡眠模式的掛起—恢復(fù)動(dòng)作,從而將寄存器值設(shè)置為0,達(dá)到了破壞該保護(hù)機(jī)制的目的。這種修改寄存器值旁路SPI范圍保護(hù)機(jī)制的方式,適用于絕大多數(shù)采用這種安全機(jī)制的計(jì)算機(jī)。分析可知,PRx寄存器值的設(shè)置方式是這種旁路攻擊的切入點(diǎn)。因此,需要對(duì)寄存器的設(shè)置過(guò)程加以保護(hù),才能避免攻擊者隨意對(duì)寄存器的值進(jìn)行修改。

參考文獻(xiàn):

[1]?房強(qiáng).基于固件文件系統(tǒng)的UEFI安全機(jī)制研究[D].成都:電子科技大學(xué),2016.

[2]?楊旭,駱祖瑩,韓銀和.基于Cache內(nèi)容替換的系統(tǒng)管理模式漏洞檢測(cè)方法[D].北京:北京師范大學(xué),2011.

[3]?UNIFIED EXTENSIBLE FIRMWARE INTERFACE FORUM.Version2.4 Errata. [EB/OL].http:∥www.uefi. org/node/670/download/f776d13e2ee21d3e8d3659e0e 024f7c5.

[4]?INTEL. Platform innovation framework for EFI S3 resume boot path specification[EB/OL].www.intel.com/content/dam/doc/reference?guide/efi?s3?resume?boot?path?specification.pdf

[5]?顧麗紅,吳少剛.基于ACPI標(biāo)準(zhǔn)的龍芯3A平臺(tái)系統(tǒng)功耗分析[J].計(jì)算機(jī)工程與設(shè)計(jì),2016,37(9):2?5.

[6]?INTEL. Platform innovation framework for EFI boot script specification[EB/OL]. https:∥www.intel.com/content/dam/doc/guide/efi?boot?script?specification?v091.pdf

[7]?INTEL. 6 series chipset and C200 series chipset[EB/OL]. http:∥www.intel.com/content/www/us/en/chipsets/6?chipset?c200?chipset?datasheet.html

[8]?SOFTPEDIA. UEFITool.[EB/OL].http:∥www.softpedia.com/get/System/System?Miscellaneous/UEFITool.shtml.

主站蜘蛛池模板: 欧美日韩久久综合| 亚洲伊人电影| 精品国产一区91在线| 一区二区欧美日韩高清免费| 91精品国产丝袜| 国产精品手机视频| 成人午夜视频免费看欧美| 国产精品手机视频| 色135综合网| 午夜欧美理论2019理论| 久久国产拍爱| 国产国产人成免费视频77777| 91亚洲精品第一| 天堂av综合网| 日韩av无码DVD| 超碰91免费人妻| 99久久99视频| 国产精品xxx| 视频二区欧美| 亚洲高清资源| 成人小视频在线观看免费| 国产91成人| 国产区在线看| 制服丝袜一区二区三区在线| 久久精品无码国产一区二区三区 | 国产白浆一区二区三区视频在线| 日a本亚洲中文在线观看| 草逼视频国产| 美女被狂躁www在线观看| 午夜激情婷婷| 亚洲国产精品一区二区高清无码久久| 另类专区亚洲| 四虎精品国产AV二区| 国产不卡国语在线| 亚洲av无码片一区二区三区| 亚洲码一区二区三区| 国产人成午夜免费看| 中文字幕亚洲精品2页| 99色亚洲国产精品11p| 亚洲专区一区二区在线观看| 亚洲精品成人片在线播放| 热伊人99re久久精品最新地| 国产91蝌蚪窝| 国产一级小视频| 亚洲日产2021三区在线| h网址在线观看| 激情国产精品一区| 好吊妞欧美视频免费| 最新亚洲人成无码网站欣赏网| 国产综合亚洲欧洲区精品无码| 国产精品蜜臀| 国产尤物视频在线| 国产精品福利在线观看无码卡| 国产又粗又猛又爽| 精品视频一区在线观看| 一级毛片在线直接观看| 国产欧美日韩一区二区视频在线| 亚洲成a人片| 在线播放91| 99这里只有精品在线| 国产打屁股免费区网站| 婷婷中文在线| 免费在线看黄网址| 国产精品精品视频| 一区二区理伦视频| www.国产福利| 国产网站一区二区三区| 国产传媒一区二区三区四区五区| 亚洲男人天堂久久| 伊人久久精品亚洲午夜| 日韩 欧美 小说 综合网 另类| 成人夜夜嗨| 丁香六月激情综合| 在线观看网站国产| 亚洲三级网站| 99久久亚洲综合精品TS| 青青操视频在线| 久久国语对白| 午夜无码一区二区三区| 国产精品人成在线播放| 久久九九热视频| 91精品情国产情侣高潮对白蜜|