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