- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 2436字
- 2020-10-30 17:56:32
第1章 夾縫求生
To live without evil belongs
only to the gods.
—Sophocles.Fragments.l.683
計算機系統并不易受攻擊,易受攻擊的是我們人類,只不過遭受的攻擊通過計算機系統完成罷了。
2003年8月11日爆發的W32.Blaster.Worm蠕蟲病毒很好地例證了軟件中的安全缺陷是如何讓我們變得易受攻擊的。Blaster可以在毫無用戶參與的情況下感染任何一臺連接到互聯網且未打補丁的計算機系統。微軟提供的數據顯示,至少有800萬個Windows系統被該蠕蟲感染[Lemos 2004]。Blaster的主要破壞力在于使用戶無法正常使用自己的機器,并且能夠滲透整個局域網,感染的用戶必須設法刪除該蠕蟲并且升級系統才能正常工作。
Blaster蠕蟲作惡前后的一系列事件,如圖1.1所示,揭示了軟件廠商、安全研究人員、發布漏洞利用代碼者以及惡意攻擊者之間錯綜復雜的關系。
圖1.1 蠕蟲時間表
首先,LSD研究小組發現了RPC [1](可通過TCP/IP交換信息)中存在一個緩沖區溢出漏洞,成因在于對“畸形”消息的錯誤處理。該漏洞影響監聽RPC端口的一個分布式組件對象模型(DCOM)接口,后者處理由客戶機發送給服務器的對象激活請求。對該漏洞的成功利用允許攻擊者在受感染的系統上以本地權限執行任意的代碼。
在這種情況下,LSD小組遵循了負責任的披露原則,在公開該漏洞前與軟件廠商進行了合作,以尋求解決問題的辦法。2003年7月16日,微軟發布了微軟安全公告MS03-026 [2],LSD發布了一個特別報告,而CERT協調中心(CERT/CC)則發布了一個漏洞說明VU#568148 [3],詳細描述了該漏洞,并提供相應的補丁和應急方案的信息。第二天,CERT/CC還發布了名為“Buffer Overflow in Microsoft RPC”(微軟RPC緩沖區溢出)的CERT公告CA-2003-16 [4]。
9天后,也就是7月25日,一個名為Xfocus的安全研究小組以安全公告板和補丁的形式發布了該漏洞的利用代碼。Xfocus自稱是“一個在1998年創立于中國的非營利和自由技術組織,致力于研究和展示網絡服務與通信安全方面的弱點”。實質上,Xfocus對微軟提供的補丁程序進行了逆向工程,研究了該漏洞的原理,并且開發了相應的攻擊該漏洞的方法,并將其公之于眾[Charney 2003]。
H.D.Moore(Metasploit項目的創始人)改進了Xfocus的代碼,使其可以對更多版本的操作系統生效。很快就有漏洞利用工具發布了,這使得黑客可以通過IRC網絡發送命令。8月2日就已經發現了這些攻擊的蛛絲馬跡[de Kere 2003]。
由于DEF CON黑客大會將于8月2日~3日召開,因此大家普遍預計將會有針對該漏洞的蠕蟲發布(并不是說參加DEF CON的人會這么做,而是由于該大會會引起人們對黑客技術的關注)。DHS(Department of Homeland Security,美國國土安全部)于8月1號發布了一個預警,FedCIRC(Federal Computer Incident Response Center,聯邦計算機事故響應中心)、NCS(National Communications System,美國國家通信系統)以及NIPC(National Infrastructure Protection Center,美國國家基礎設施保護中心)也在對漏洞利用行為積極進行監測。8月11日,也就是補丁程序發布后的第26天,發現Blaster蠕蟲首次在互聯網上傳播。24小時后,Blaster感染了336000臺計算機[Pethia 2003a]。截至8月14日,Blaster已經感染了超過100萬臺計算機,在高峰期,它每小時感染100000個系統[de Kere 2003]。
Blaster是一個通過TCP/IP進行傳播的貪婪的蠕蟲,它利用了Windows的DCOM RPC接口中的一個漏洞。當Blaster執行時,它首先檢測計算機是否已感染以及蠕蟲是否正在運行,如果是這樣,它就不會重復感染該計算機,否則,Blaster將:
"windows auto update"="msblast.exe"
加入注冊表的
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
鍵中,這樣,每當啟動Windows,該蠕蟲程序都會運行。接下來,Blaster產生一個隨機的IP地址,并試圖感染具有該地址的計算機。該蠕蟲利用Windows 2000或Windows XP上的DCOM RPC漏洞通過TCP 135端口發送數據。Blaster監聽UDP端口69,以接收可以通過DCOM RPC漏洞利用連接的機器的請求。一旦接收到請求,隨即將msblast.exe文件發送到對方計算機并且執行該蠕蟲[Hoogstraten 2003]。
蠕蟲利用cmd.exe建立一個遠程shell進程“后門”,該后門監聽TCP端口4444,從而允許攻擊者在受危害的系統上發出遠程命令。Blaster同時還試圖對Windows Update網站發起拒絕服務(Denial-of-Service,DoS)攻擊,以阻止用戶下載補丁。蠕蟲會在一個特定的日期以SYN洪水(SYN flood) [5]的形式對windowsupdate.com的80端口發起DoS攻擊。
即便Blaster不能成功地感染目標系統,DCOM RPC緩沖區溢出漏洞利用蠕蟲也會終止其掃描到的Windows NT、Windows 2000、Windows XP以及Windows 2003系統上運行的svchost.exe進程。對于Windows 2000和Windows NT而言,這會導致系統不穩定甚至掛起;而對于Windows XP和Windows 2003,默認情況下會造成系統重啟。
Blaster的爆發并不令人驚訝。在Blaster利用的漏洞公布前的一個月,CERT/CC的主管Richard Pethia于2003年6月25日在主題為“網絡安全、科學、研究和發展”的美國國土安全小組委員會的特委會會議[Pethia 2003a]上明確表示:
當今理應關注互聯網的安全問題。與互聯網有關的漏洞將用戶置于危險的境地。適應于組織內部的大型機和小型的、規劃良好的網絡的安全措施,對互聯網不再有效,因為這是一個復雜的、動態的互聯網絡世界,沒有明確的邊界,沒有中央控制。安全問題通常沒有得到很好地理解,在許多開發者、廠商、網絡管理者乃至消費者心目中,這個問題很少得到足夠的重視。
根據評估,Blaster蠕蟲所造成的經濟損失至少達5.25億美元。這個數字是綜合了生產效率的損失、浪費的工時、損失的銷售額以及額外消耗的網絡帶寬等統計出來的[Pethia 2003b]。雖然看上去Blaster的危害已經非常大了,但是實際上它很容易造成更大的破壞。例如,它刪除被感染計算機上的文件?;谝粋€使用了簡單破壞模型的參數化“最壞情況”分析,Nicholas Weaver和Vern Paxson[Weaver 2004]估計通過攻擊微軟Windows中廣泛使用的服務并且攜帶某種高破壞性的載荷(例如,破壞主硬盤控制器、覆寫CMOS RAM或擦除閃存等),一個最可怕的蠕蟲,可能造成多達500億美元乃至更大的直接經濟損失!
W32.Blaster.Worm利用的缺陷邏輯(即有問題的代碼)如圖1.2所示 [6]。錯誤在于第21~22行的while循環(用來從一個長字符串中解析出主機名字)沒有加上足夠的邊界檢測。一旦確定了問題,修正問題的工作就非常簡單了。例如,通過往while循環的控制表達式中添加第二個條件,該條件可以使在pwszTemp或pwszServerName引用的寬字符串越界前終止搜索。
圖1.2 W32.Blaster.Worm所利用的缺陷邏輯