9月23日,XEN官方來了個帽子戲法,一口吻爆出3個裂痕。隨后,就有關于亞馬遜AWS大局限重啟處事器的動靜爆出。這次重啟事件豈論是影響到的產(chǎn)物、照舊一連的時間都是史無前例的,整個修復周期一連5天,從9月25日下午7點到9月30日下午5點,影響的產(chǎn)物包羅EC2、RDS、ElastiCache、RedShift,個中EC2最為嚴重,約莫占到AWS EC2總量的10%.由于是產(chǎn)生在美國,所以海內(nèi)這塊的報道較少,許多同學大概還不知道是什么裂痕,讓亞馬遜做如此大范疇的重啟操縱。下面我們一塊看看這三兄弟到底是啥來頭。
這次的三個裂痕,危害有哪些?
1、CVE-2014-7154這個可以說是三兄弟中的老大,為何?因為它在要害位置有人,因為它老爹是dom0.dom0在XEN架構中的職位很是重要,它包括節(jié)制硬件的驅動和節(jié)制虛擬機的東西集。所以它會影響到整個物理機上面所有的虛擬機,這樣的裂痕是最可怕的,波及范疇廣,修補起來又需要重啟,那就得業(yè)務間斷啊,尚有,假如重啟起不來咋辦??
2、CVE-2014-7155這個可以排行老二,客戶機可以操作該裂痕加載本身的IDT或GDT,大概導致虛擬機的宕機,還可以獲取root權限。看到這里我們也不要太張皇,因為這里不是虛擬機逃逸,而是獲取虛擬機的root權限。危害也不小,“黑闊”又多了一個提權利器。
3、CVE-2014-7156與上述那倆暮年邁比起來,就個裂痕危害就要差一些了。操作該裂痕,大概導致虛擬機的宕機,但宕機也不是小事,不容小覷,只是生不逢時。
神馬是XEN?
在舉辦技能闡明之前,我們先相識一下關于XEN的配景常識。
VMware各人都很熟悉了,無論是WorkStation照舊企業(yè)級的ESX,XEN就是雷同于ESX的一個軟件,不外是開源的(雷同的尚有KVM)。此刻KVM已經(jīng)是Linux官方插手到內(nèi)核中的虛擬化技能。
XEN最早由劍橋大學開拓,此刻被Citrix收購,亞馬遜的AWS就是基于XEN技能的。
通過下圖我們來相識下XEN技能架構:
從上面可以看出,XEN hypervisor直接運行在硬件之上,認真處理懲罰CPU、內(nèi)存、間斷等。它是運行完bootloader之后第一個運行的措施。在hypervisor之上答允虛擬機,在XEN內(nèi)里,一個虛擬機實例被稱為domain可能guest.個中,domain0是一個非凡的domain,它包括所有節(jié)制硬件的驅動,同時包括節(jié)制打點虛擬機的東西集。
除了domain0之外,其它的虛擬機就是我們熟悉的guest,大抵分為兩種范例:Paravirtualization(PV)半虛擬化 和 Full Virtualization(HVM)全虛擬化。
PV是由XEN引入的,厥后被其它虛擬化平臺回收。半虛擬化是一種高效、輕量的虛擬化技能,它不需要物理機CPU含有虛擬化擴展,但卻需要一個Xen-PV-enabled內(nèi)核和PV驅動,說白了就是需要修改虛機系統(tǒng)的內(nèi)核,虧得Linux、BSD、OpenSolaris等提供了該內(nèi)核,可是Windows就不可了,因為只有微軟可以修改它的內(nèi)核。
HVM利用了物理機CPU的虛擬化擴展來虛擬出虛擬機。該技能需要Intel VT可能AMD-V硬件擴展。Xen利用Qemu來仿真PC硬件,包羅BIOS、IDE硬盤節(jié)制器、VGA、USB節(jié)制器、網(wǎng)卡等等。由于利用虛擬機硬件擴展來提高仿真機能,所以HVM不需要修改內(nèi)核,因此其上可以運行Windows系統(tǒng)。
技能揭秘
此刻我們大抵相識了這三裂痕有啥危害了,下面我們隨著官方的裂痕告示和補丁文件,來詳細闡明下這些裂痕。
1、CVE-2014-7154
CVE-2014-7154說的是在HVMOP_track_dirty_vram內(nèi)里存在竟態(tài)條件,HVMOP_track_dirty_vram是一個用來節(jié)制臟顯存跟蹤配置的函數(shù)。下面是官方給出的補丁:
p2m_type_t t;- struct sh_dirty_vram *dirty_vram = d->arch.hvm_domain.dirty_vram;+ struct sh_dirty_vram *dirty_vram;struct p2m_domain *p2m = p2m_get_hostp2m(d);
if ( end_pfn < begin_pfn || end_pfn > p2m->max_mapped_pfn + 1 )
@@ -3495,6 +3495,8 @@ int shadow_track_dirty_vram(struct domai p2m_lock(p2m_get_hostp2m(d));paging_lock(d);
+ dirty_vram = d->arch.hvm_domain.dirty_vram;+ if ( dirty_vram && (!nr ||
從補丁中可以看出,在沒有打補丁的代碼里,系統(tǒng)在獲取paging_lock之前,已經(jīng)獲取到了dirty_vram的值。這里有一個潛在的問題,兩個并發(fā)的hypercall會實驗同時釋放dirty_vram,那么兩者中,第二個實驗舉辦釋放的是一個野指針。別的,兩個并發(fā)的hypercall也大概會實驗同時建設一個新的dirty_vram布局體,那么最先建設的那塊內(nèi)存會泄漏,因為第二個dirty_vram建設之后,兩個指針都指向新的dirty_vram布局體。
所以修補起來也很簡樸,就是將獲取d->arch.hvm_domain.dirty_vram的值放到獲取了paging_lock之后。