天天看點

Source引擎的遠端代碼執行漏洞,可能影響千萬遊戲玩家

本文講的是<b>Source引擎的遠端代碼執行漏洞,可能影響千萬遊戲玩家</b>,

Source引擎的遠端代碼執行漏洞,可能影響千萬遊戲玩家

目前多款主流遊戲,如CS、絕地要塞等都在使用Source引擎,Source引擎由Valve軟體公司開發,這個引擎提供關于渲染、聲效、動畫、消鋸齒、界面、美工創意和實體模拟方面的支援。 

其實Source引擎存在漏洞已經不是什麼秘密了,早在去年的GeekPwn2016黑客大賽中,就有參賽隊員在不接觸對方裝置,不知道對方賬号資訊的情況下,侵入了正在遊戲的電腦,還通過電腦攝像頭監控了遊戲者的實時活動。

最近曝出的漏洞是Source SDK中出現了一個緩沖區溢出漏洞,會導緻攻擊者在用戶端和伺服器上能執行任意代碼。該漏洞可以導緻加載特定的躲避攻擊(Ragdoll Avalanche) (比如一個玩家被射殺),目前包括CS、絕地要塞等遊戲已經修複了這個漏洞。

缺少Bounds Check

BoundsChecker是一個運作時錯誤檢測工具,它主要定位程式運作時期發生的各種錯誤。當函數nexttoken用于Token的一個字元串時,可以看到,隻要找不到NULL字元或者分隔符sep,就會導緻str這個buffer被複制到token的buffer中,壓根就沒有邊界檢查。

漏洞介紹

當以Ragdoll Avalanche處理資料時,像ParseKeyValue就會被調用。這個方法調用nexttoken來Token那些待處理的規則。通過建立一個大于256字元的collisionpair規則,緩沖區szToken就會溢出。因為szToken存儲在棧上,是以ParseKeyValue的傳回位址就會被覆寫。

漏洞預防

ASLR會将可執行檔案加載到記憶體中的位址随機化,并且一個程序内所有加載到記憶體的可執行檔案都必須開啟這個功能才能起到漏洞預防的作用。

由于動态庫steamclient.dll并沒有開啟ASLR。這意味着steamclient.dll加載到記憶體中的位址是可預測的,攻擊者可以很友善地定位并使用可執行檔案記憶體中的Token。

Source引擎的遠端代碼執行漏洞,可能影響千萬遊戲玩家

ROPgadget的使用

一個更有效的方法就是使用特定的識别gadgets的工具。舉個例子,ROPgadget就是個很棒的工具,它可以被用于識别所有的gadgets。如果你能找到一系列retn指令結尾的指令,就能把ROP鍊的第一條指令的位址插入到棧,當函數傳回位址被pop到指令寄存器時,Token就開始執行。由于x86和x64的Token不需要在記憶體對齊的情況下執行,是以任何位址都能作為Token。我可以把Token指針指向其中一條指令,這樣就可以得到更多的指令。

Immunity Debugger插件Mona提供了查找gadget的工具。但是這個插件無法找到所有有用的gadget,如rep movs。Immunity Debugger軟體專門用于加速漏洞利用程式的開發,輔助漏洞挖掘以及惡意軟體分析。

Source引擎的遠端代碼執行漏洞,可能影響千萬遊戲玩家

啟動cmd.exe

由于有效載荷的處理方式不同,NULL字元不能被使用,并且大寫字元需要轉化為小寫字元。這意味着我的ROP gadget位址資源及有效載荷的處理方式都很有限。為了解決這個問題,我用一個gadget鍊來引導shellcode,以定位記憶體中未修改的原始緩沖區,然後将未修改的有效載荷通過rep movs gadget複制到棧。

這樣,Steamclient.dll就導入了LoadLibraryA和GetProcAddressA。現在,我就能往記憶體中加載任意DLL了,并得到其他的導出函數。比如,導入shell32.dll以獲得ShellExecuteA函數,這個函數能啟動其他程式。

有效載荷的擷取

Source引擎允許将自定義内容打包到地圖檔案中,因為這樣可以在地圖中添加一些額外的内容,比如聲音或者文字。于是我将Ragdoll Avalanche模型檔案打包到一個地圖檔案中,而且使用與Ragdoll Avalanche模型檔案一樣的路徑。

Source引擎的遠端代碼執行漏洞,可能影響千萬遊戲玩家

總結

視訊遊戲很容易成為黑客進行漏洞利用的目标, 因為視訊遊戲通常會在使用者的家中或者工作中進行,攻擊者就是通過漏洞利用進入到組織的公共網絡或家中的私人網絡。另外,在流行的視訊遊戲中發現的這個遠端代碼執行漏洞可以用來建立僵屍網絡或者傳播勒索軟體。

是以建議各位玩家,不要在工作中玩遊戲或在不受信任的網絡環境中進行遊戲。

對那些Source的玩家而言,需要禁用第三方内容的下載下傳以減少攻擊。通過cl_allowdownload 0 和 cl_downloadfilter all Token就可以實作禁用第三方内容下載下傳。

由于是在Source SDK中發現的漏洞,可以推測,在其他的第三方子產品也很可能存在漏洞。但如果玩家在所有子產品下都啟用了ASLR,就隻有洩漏的記憶體漏洞才能利用了,進而加大了攻擊者漏洞利用的難度。

是以為了防止緩沖區溢出發生,請不要在緩沖區中存儲過多的資料。nexttoken函數應該有一個token長度來作為參考,這個參數用來進行Bounds Check。

對于Source遊戲的開發者來說,可以使用更新檔進行修複,也可以使用chromium團隊開發的checkbins.py工具來完成。

除此以外,Source遊戲應該可以進行沙箱設定以限制通路并阻止新程序的啟動。比如,當利用web浏覽器的記憶體破環漏洞時經常會要用到核心利用,如果進行沙箱設定,則通路使用者層的浏覽器程序就要受限。

原文釋出時間為:2017年7月25日

本文作者:xiaohui

本文來自雲栖社群合作夥伴嘶吼,了解相關資訊可以關注嘶吼網站。

<a href="http://www.4hou.com/technology/6806.html" target="_blank">原文連結</a>