暗藏深層代碼之中的十大“長壽”漏洞
2021年,某現(xiàn)代計(jì)算底層系統(tǒng)中曝出一個漏洞。攻擊者可迫使該系統(tǒng)執(zhí)行任意代碼。令人驚訝的是,存在漏洞的代碼竟然已有54年歷史,而且沒有補(bǔ)丁可用,估計(jì)以后都不會有補(bǔ)丁推出了。
不過,這個系統(tǒng)是圖靈獎獲得者馬文·明斯基(Marvin Minsky)在1967年實(shí)現(xiàn)的通用圖靈機(jī),盡管對計(jì)算機(jī)科學(xué)領(lǐng)域具有重大理論意義,卻從未實(shí)際構(gòu)建到實(shí)用計(jì)算機(jī)中。沒有補(bǔ)丁似乎無傷大雅。但在明斯基設(shè)計(jì)出這款圖靈機(jī)之后十年左右的時間里,早期版本的Unix和DOS系統(tǒng)誕生,直到21世紀(jì)的今天,這兩大操作系統(tǒng)的后裔仍然常伴我們左右。其中一些系統(tǒng)的漏洞暗藏深層代碼之中已經(jīng)數(shù)年甚至數(shù)十年了。
下面我們舉出十個近年來發(fā)現(xiàn)的重大漏洞。
漏洞清單
- 日產(chǎn)汽車遠(yuǎn)程信息控制模塊基帶漏洞
- sudo堆溢出漏洞Baron Samedit
- Linux GRUB2 Secure Boot漏洞
- LioWiki本地文件包含漏洞
- Domain Time II旁觀者(man-on-the-side)攻擊
- Linux SCSI 子系統(tǒng)漏洞
- Windows DNS服務(wù)器遠(yuǎn)程代碼執(zhí)行漏洞SIGRed
- PuTTY 堆溢出漏洞
- win32k.sys漏洞
- PrintDemon本地提權(quán)漏洞
日產(chǎn)汽車遠(yuǎn)程通信控制模塊基帶漏洞
年齡:7歲
引入日期:2010
修復(fù)日期:2017
早在2011年,安全研究員Ralf-Philipp Weinmann在手機(jī)基帶處理器中發(fā)現(xiàn)了一個最近才引入的隱秘漏洞:黑客可設(shè)置虛假手機(jī)信號塔,誘騙手機(jī)連接此虛假信號塔,然后劫持其網(wǎng)絡(luò)連接。手機(jī)制造商的修復(fù)動作不可謂不快,但修復(fù)后拋諸腦后的速度也一樣快。
這就留下了一個問題:手機(jī)并不是使用此類芯片的唯一一種設(shè)備。安全公司Eclypsium首席網(wǎng)絡(luò)安全研究員Jesse Michael表示:“基本上,同樣的蜂窩基帶芯片組也用在日產(chǎn)聆風(fēng)和其他多款車型上。”多位研究人員在從廢車場淘來的車上實(shí)驗(yàn)過后也發(fā)現(xiàn)了同樣的漏洞。
Michael稱:“這個漏洞在多個不同市場領(lǐng)域已經(jīng)眾所周知很久了,比我們在汽車市場中發(fā)現(xiàn)它時早了近七年時間。由于廣泛存在于多個市場領(lǐng)域且供應(yīng)鏈復(fù)雜,此前沒人意識到汽車也會遭遇和手機(jī)一樣的漏洞利用。”行業(yè)孤島問題確實(shí)值得重視了。
sudo堆溢出漏洞Baron Samedit
年齡:9歲6個月
引入日期:2011年7月
修復(fù)日期:2021年1月
sudo命令是Unix管理員工具箱中的重要工具,可以賦予調(diào)用者超級用戶權(quán)限。但“能力越大,責(zé)任越大”,很有必要給這條命令設(shè)置使用門檻,防止用戶在系統(tǒng)中橫沖直撞。例如,可以在shell模式下帶-c參數(shù)調(diào)用sudo命令,該參數(shù)后跟隨的一系列shell命令就能以超級用戶權(quán)限執(zhí)行了。但是,此模式容易遭到緩沖區(qū)溢出攻擊,插入這些指令中的特殊字符會誘使系統(tǒng)將代碼寫入所分配的內(nèi)存緩沖區(qū)之外,可能使攻擊者獲得root權(quán)限。
一般情況下,sudo會在執(zhí)行前識別此類特殊字符,從而抵御此類攻擊。然而,2011年,sudo中意外插入了一個漏洞,令緩沖區(qū)溢出攻擊成為可能,而這個漏洞就在眾人眼皮子底下潛伏了十年之久。該漏洞并不存在于sudo命令本身,而是藏身在輔助命令sudoedit中。sudoedit命令允許用戶以超級用戶權(quán)限訪問和編輯文件,而不授予編輯器程序本身完整的超級用戶權(quán)限。正如2021年1月Qualys博客中指出的,該漏洞可導(dǎo)致嚴(yán)重的提權(quán)攻擊,修復(fù)迫在眉睫。幾乎所有Unix系操作系統(tǒng)均受影響,包括Linux、Solaris和macOS。
Linux GRUB2 Secure Boot漏洞
年齡:10歲
引入日期:2010
修復(fù)日期:2020年7月
作為BIOS的替代品引入的時候,UEFI被認(rèn)為具有相當(dāng)先進(jìn)的安全功能,能夠?qū)共僮飨到y(tǒng)引導(dǎo)加載軟件級攻擊。個中關(guān)鍵在于UEFI采用了名為Secure Boot的機(jī)制,用簽名加密證書聯(lián)鎖鏈驗(yàn)證每個引導(dǎo)加載程序的合法性。UEFI的根證書由微軟簽名,Linux發(fā)行版將其具備經(jīng)驗(yàn)證證書的引導(dǎo)加載程序放在鏈的下游。
然而,廣為使用的Linux引導(dǎo)加載程序GRUB2不僅具備UEFI就緒證書,還包含了緩沖區(qū)溢出漏洞,可被插入其配置文件中的惡意代碼利用。(盡管GRUB2自身經(jīng)過簽名,但其可被本地管理員編輯的配置文件并沒有經(jīng)過簽名。)安全公司Eclypsium發(fā)現(xiàn)了這一漏洞。雖然攻擊者需要一定程度的目標(biāo)機(jī)器本地控制權(quán)來實(shí)施攻擊,但只要成功實(shí)施了,他們就能確保在每次啟動時都能繼續(xù)控制這臺電腦,很難將他們從系統(tǒng)中驅(qū)逐出去。
LioWiki本地文件包含漏洞
年齡:11歲11個月
引入日期:2008年11月
修復(fù)日期:2020年10月
LionWiki是款采用PHP語言編寫的極簡維基引擎。不同于很多流行維基引擎,比如維基百科底層引擎,LionWiki不使用數(shù)據(jù)庫,而是完全基于文件的。由于其目標(biāo)就是簡潔,完全基于文件是LionWiki的優(yōu)勢,但也導(dǎo)致了重大漏洞的引入。
從本質(zhì)上講,用戶通過相應(yīng)頁面URL中的文件和路徑名訪問特定LionWiki實(shí)例下的各種文件。這意味著,借助正確構(gòu)造的URL,攻擊者可以遍歷托管此LionWiki實(shí)例的服務(wù)器上的文件系統(tǒng)。可以通過配置URL過濾來阻止文件系統(tǒng)遍歷嘗試,但正如信息安全研究所網(wǎng)絡(luò)靶場工程師June Werner發(fā)現(xiàn)的,繞過URL過濾簡直太容易了。
Werner指出,盡管多次嘗試修復(fù),但該漏洞仍持續(xù)存在了很久。“2009年7月就首次推出了一些緩解措施,然后2012年1月又鋪開了更廣泛的緩解措施。但盡管實(shí)施了緩解措施,代碼還是無法抵御同類型的攻擊。直到2020年10月隨著繞過這些緩解措施的方法一起被重新發(fā)現(xiàn),該漏洞在代碼中又留存了八年。”
正式上報之后,漏洞被開發(fā)人員修復(fù)了。
Domain Time II旁觀者(man-on-the-side)攻擊
年齡:14歲
引入日期:2007
修復(fù)日期:2021年4月
如果同一網(wǎng)絡(luò)上的兩臺計(jì)算機(jī)不能就時間問題達(dá)成一致,所造成的后果可能從單純的煩人直到無法收拾的災(zāi)難。時間同步問題是計(jì)算領(lǐng)域的老生常談了,目前最成熟的企業(yè)解決方案是Domain Time II,這是一款廣泛部署在Windows、Linux和Solaris上的閉源應(yīng)用。
Domain Time II從誕生之日起就存在一個非常嚴(yán)重的漏洞。時不時地,或者在用戶可以設(shè)置的條件下,這個軟件會向其供應(yīng)商Greyware Automation Products運(yùn)營的更新服務(wù)器發(fā)送UDP查詢請求。如果服務(wù)器回復(fù)URL,Domain Time II會以管理員權(quán)限運(yùn)行程序,下載并安裝來自此URL的更新。
問題出在哪兒呢?如果惡意黑客搶在Greyware的更新服務(wù)器之前成功回復(fù)查詢請求,那他/她就能發(fā)送自己構(gòu)造的回復(fù),促使Domain Time II下載攻擊者想要安裝的任何惡意軟件。在真正的中間人攻擊中,攻擊者會雙向攔截;相較之下,Domain Time II攻擊是所謂的旁觀者(man-on-the-side)攻擊:攻擊者不攔截發(fā)往其目標(biāo)的回復(fù),而是搶在合法回復(fù)之前發(fā)送他/她自己構(gòu)造的回復(fù)。在實(shí)踐中,這意味著攻擊者需要已掌控目標(biāo)本地網(wǎng)絡(luò)上的一臺計(jì)算機(jī);但此類攻擊代表著攻擊者可以升級入侵,染指目標(biāo)主機(jī)本地網(wǎng)絡(luò)上其他更有價值、更安全的機(jī)器。發(fā)現(xiàn)此漏洞的安全公司Grimm指出,至少早在2007年,這個漏洞就出現(xiàn)在該軟件的各個版本中了。
Linux SCSI 子系統(tǒng)漏洞
年齡:15歲
引入日期:2006
修復(fù)日期:2021年3月
如果你是懷舊派,那你可能還記得SCSI:上世紀(jì)80年代的數(shù)據(jù)傳輸標(biāo)準(zhǔn)?;蛟S你的第一塊硬盤就是用它接入你的IBM PC或經(jīng)典Mac機(jī)的。直至今日,SCSI在某些環(huán)境中仍然在用。而一貫追求靈活性和通用性的Linux更是還為有需求的系統(tǒng)保留著一套擴(kuò)展SCSI子系統(tǒng)??梢酝ㄟ^自動模塊加載功能使用這些模塊,其中操作系統(tǒng)在需要時獲取并安裝所需系統(tǒng)代碼。這在你想給Linux機(jī)器掛載SCSI硬盤,但又不想費(fèi)事尋找各種必要支持代碼的時候真是非常有用,但也同樣有助于攻擊者利用代碼中的漏洞。
2021年3月,網(wǎng)絡(luò)安全咨詢機(jī)構(gòu)Grimm發(fā)布了在Linux SCSI代碼中發(fā)現(xiàn)的一系列漏洞。其中一個緩沖區(qū)溢出漏洞可使普通用戶獲得root權(quán)限,其他漏洞則可造成信息從內(nèi)核泄漏到用戶空間,而且全部漏洞都可用于獲取機(jī)密信息,或者對受影響機(jī)器展開DoS攻擊。Grimm稱這些漏洞可追溯至2006年,并冷冷指出,“這些漏洞是編程實(shí)踐缺乏安全考慮的表現(xiàn),而此類編程實(shí)踐在此代碼開發(fā)當(dāng)時十分普遍。”
Windows DNS服務(wù)器遠(yuǎn)程代碼執(zhí)行漏洞SIGRed
年齡:17歲
引入日期:2003
修復(fù)日期:2020
DNS是被低估的互聯(lián)網(wǎng)骨干系統(tǒng),計(jì)算機(jī)通過給定URL解析出關(guān)聯(lián)IP地址就靠DNS了。DNS是層級化的,域名解析請求在DNS金字塔各層間上下流轉(zhuǎn),找尋能回答“這臺計(jì)算機(jī)在哪兒?”這個問題的DNS服務(wù)器。因此,所有主流操作系統(tǒng)都內(nèi)置了DNS。
2020年,微軟披露了其DNS中一個潛伏了17年的關(guān)鍵漏洞,盡管沒有證據(jù)表明該漏洞曾經(jīng)被非法利用過。發(fā)現(xiàn)此漏洞的Check Point研究人員將之名為為SIGRed。這是個Windows DNS服務(wù)器緩沖區(qū)溢出漏洞,可被藏身DNS數(shù)據(jù)包簽名中的漏洞利用代碼觸發(fā)。惡意名稱服務(wù)器可向域名解析請求響應(yīng)此類數(shù)據(jù)包,繞過大多數(shù)安全防護(hù)措施,獲取微軟DNS服務(wù)器的遠(yuǎn)程訪問權(quán)限。該攻擊還可以蠕蟲化,也就是說,可以在沒有用戶干預(yù)的情況下自動傳播。
PuTTY 堆溢出漏洞
年齡:20歲9個月
引入日期:1999年1月
修復(fù)日期:2019年10月
PuTTY是一款開源免費(fèi)工具套件,包含串行控制臺、終端模擬器和各種網(wǎng)絡(luò)文件傳輸應(yīng)用,還內(nèi)置了SSH和各類其他加密方案。PuTTY最初是為了將Unix管理員慣用的系統(tǒng)自帶工具集引入Windows和經(jīng)典Mac OS而開發(fā)的,但現(xiàn)已擴(kuò)大了范圍,連Unix系統(tǒng)上也在用了。雖然PuTTY旨在保護(hù)網(wǎng)絡(luò)連接,但其核心代碼卻被曝出暗藏漏洞。該漏洞是另一種形式的緩沖區(qū)溢出問題(此處是堆溢出),可由過短SSH密鑰觸發(fā),造成PuTTY運(yùn)行崩潰,甚至遠(yuǎn)程代碼執(zhí)行。
歐盟EU-FOSSA項(xiàng)目發(fā)起的漏洞賞金計(jì)劃中,該漏洞被提交到HackerOne,為提交者賺取了3645美元的賞金,以及來自PuTTY團(tuán)隊(duì)的感謝。PuTTT團(tuán)隊(duì)指出,早在1999年,此漏洞就出現(xiàn)在PuTTY源代碼的早期版本中了。
win32k.sys漏洞
年齡:23歲
引入日期:1996
修復(fù)日期:2019
2019年,微軟Windows Win32 API曝出兩大漏洞。第一個漏洞發(fā)現(xiàn)于4月,是一個釋放后使用(User-After-Free)漏洞,程序可利用操作系統(tǒng)編碼錯誤訪問本應(yīng)受到保護(hù)的系統(tǒng)內(nèi)存。安全研究人員在發(fā)現(xiàn)惡意黑客嘗試?yán)么寺┒传@取計(jì)算機(jī)控制權(quán)的過程中檢測到了此漏洞。另一個漏洞是藏身于操作系統(tǒng)窗口切換功能中的提權(quán)漏洞,在12月份被發(fā)現(xiàn)。與前者類似,這個漏洞也是在主動攻擊過程中檢測到的,當(dāng)時這些攻擊為制造內(nèi)存泄漏而模擬擊鍵。
兩個漏洞都可追溯至Windows操作系統(tǒng)的早期階段??ò退够呒壈踩芯繂TBoris Larin解釋道:“問題源于WIN32K隨Windows NT 4.0首次亮相的時候,當(dāng)時多數(shù)Win32圖形引擎都從用戶級轉(zhuǎn)移到內(nèi)核以提高性能。”雖然這兩個具體漏洞已被修復(fù),但微軟多年前做出的圖形引擎內(nèi)移決策卻影響甚廣,而且影響可能還會持續(xù)下去。這些年來,Windows中發(fā)現(xiàn)的內(nèi)核安全漏洞恐怕半數(shù)以上都得歸咎于WIN32K組件。
PrintDemon本地提權(quán)漏洞
年齡:24歲
引入日期:1996
修復(fù)日期:2020年5月
打印機(jī)可謂IT行業(yè)常見痛點(diǎn),因?yàn)榉N類實(shí)在是太多了,而且并非由計(jì)算機(jī)和操作系統(tǒng)供應(yīng)商制造,用戶卻期望能夠插上就能開始打印。尤其是微軟,在其早期階段就努力想讓用戶能夠相對容易地安裝打印機(jī)驅(qū)動。但近期發(fā)現(xiàn)的PrintDemon漏洞表明,微軟可能在上世紀(jì)90年代走得太遠(yuǎn)了一點(diǎn),直到今天還在為此付出代價。
漏洞的核心在于三個事實(shí):非管理員用戶可以向Windows機(jī)器添加打印機(jī);底層實(shí)現(xiàn)機(jī)制允許打印到文件而非物理打印設(shè)備;Windows上關(guān)鍵打印服務(wù)以SYSTEM權(quán)限運(yùn)行。這意味著,只要做對了,就可以構(gòu)造“打印機(jī)”驅(qū)動,在文件系統(tǒng)(甚至是特權(quán)目錄)的任何位置創(chuàng)建文件(甚至是可執(zhí)行文件)。這么多年來,黑客設(shè)計(jì)了大量漏洞利用程序利用這些設(shè)計(jì)缺陷,大名鼎鼎的震網(wǎng)(Stuxnet)也是其中之一。但2020年發(fā)現(xiàn)的PrintDemon尤為特殊,而且成型于微軟多年來的修復(fù)不過是補(bǔ)丁而非完全重構(gòu)整個打印子系統(tǒng)。正如Winsider描述的,“只需對文件系統(tǒng)做一點(diǎn)點(diǎn)改動,你就可以實(shí)現(xiàn)不屬于任何進(jìn)程的文件復(fù)制/寫入行為,尤其是在重啟后。借助一個精心設(shè)計(jì)的端口名稱,你就可以讓Spooler進(jìn)程幫你在磁盤上任意位置放置[可移植可執(zhí)行]文件。”怎么聽都不像是個好消息……
追溯漏洞的年紀(jì)有意義嗎
這種“長壽”漏洞列表總能讓人猛然意識到,原來自己的電腦可能因?yàn)榭肆诸D時期的打印機(jī)子系統(tǒng)漏洞而被黑。但了解這些已經(jīng)沒有必要立即修復(fù)的“老”漏洞是有現(xiàn)實(shí)意義的。Grimm首席漏洞研究員Adam Nichols稱:“獨(dú)立研究工作中,我們在找到漏洞時會做的一件事就是嘗試確定這個漏洞到底已經(jīng)存在多久了。遺憾的是,這并非行業(yè)標(biāo)準(zhǔn)。不過,其他研究人員有時候也會這么做。多走這一步來查清人們面臨被黑風(fēng)險多久了不算是分內(nèi)的工作,但我覺得這是研究工作的重要組成部分。”
Sandy Clark的研究顯示,普遍的代碼重用現(xiàn)象造成了巨大的已知漏洞攻擊面,長期使用的代碼庫中潛伏的漏洞可能最終會演變?yōu)槁┒蠢贸绦?。這與傳統(tǒng)的軟件工程教條背道而馳,傳統(tǒng)的軟件工程教條認(rèn)為,大多數(shù)漏洞會在代碼庫使用早期遭遇現(xiàn)實(shí)問題和攻擊時即得到修復(fù)。但事實(shí)上,用Clark論文標(biāo)題的話來說,“熟悉會滋生蔑視”。