X Windows系統,今天做爲世界各地的Linux桌面,已經存在超過20年了,仍然存在Bug。幾天前Sysadmins爲libXfont庫提供了補丁,來對應新發現的已經在代碼中存在了22年的特權升級漏洞,補丁搶在了讓人厭煩的exploit前發佈了。這一漏洞可使得登入到一個存在漏洞的機器的人將X服務搞崩潰,或者執行輸入代碼後成爲超級用戶。html
在混沌通訊大會(譯註:始於1984年,由歐洲最大的黑客聯盟組織——德國混沌電腦俱樂部主辦。該會議主要研討計算機和網絡安全問題,旨在推動計算機和網絡安全。開始可能是熱愛計算機的黑客參與,其後不斷吸引科學家、安全專家和計算機愛好者參加,所以也有人稱之爲歐州黑客大會。)的一個展現上,發現了數百個漏洞(在X.org上討論的電子郵件在此:http://lists.x.org/archives/xorg-devel/2013-December/039773.html),最新發現的漏洞是文本的棧溢出漏洞,能夠追溯到1991年,這個Bug至今仍存在於全部的X11版本中。git
這一漏洞很簡單,而且影響共享的電腦,可是本文只想剖析這一系列的安全問題是如何發生的。數組
來自X.org的公告內容:「一個BDF字體文件包含了一個超過時望長度的字符串,會致使站溢出。在建立了棧保護的X服務上進行測試,當讀取用戶提供的巧妙設計的字體時,會致使服務當即崩潰。」 (譯註:http://lists.x.org/archives/xorg-announce/2014-January/002389.html)安全
存在問題的地方是以下代碼中的bdfReadCharacters()函數中(譯註:源代碼路徑http://cgit.freedesktop.org/xorg/lib/libXfont/tree/src/bitmap/bdfread.c)服務器
若是你沒有見過這個bug,我會詳細解釋。屏幕上的字體能夠保存成GBD格式(Glyph Bitmap Distribution),詳情參見此文檔(http://partners.adobe.com/public/developer/en/font/5005.BDF_Spec.pdf),保存後的內容格式是以STARTCHAR 2.1+字體內容的格式。(譯註:請參照上圖中1305行的代碼)網絡
若是被加載的字體包含一個短的版本號,做爲字符串加載的話一切正常,例如本文中的版本號「2.1」。這一信息在代碼中經過文件dbfread.c中的函數調用函數sscanf將信息拷貝到charName字符數組當中。(譯註:參照上述圖中的1302-1308行代碼)。問題是sscanf函數沒有限定讀取版本號碼的字符串長度,該函數會一致拷貝文件中的數據,直到遇到了一個空格符,才終止。(譯註:http://www.cplusplus.com/reference/cstdio/sscanf/函數
http://www.cplusplus.com/reference/cctype/isspace/)工具
字符數組charName被定義爲長度只有100個字節,所以當一個BDF字體包含一個「STARTCHAR」開始的字符串而且其版本號的長度超過字符數組長度將會致使超過數組範圍,將數據放在棧中的其餘數據區上。這意味着攻擊者能夠覆蓋內存從而控制處理器的命令指針離開bdfReadCharacters函數,從而有效的劫持程序。測試
由於X服務一般是以超級用戶權限運行的,若是攻擊成功,普通用戶權限的用戶能夠經過執行代碼來獲得機器的控制權。關於在現今系統中存在保護機制狀況下,如何觸發棧溢出的更深層次的文章能夠參考以下兩篇文章字體
http://www.exploit-db.com/papers/24085/
http://crypto.stanford.edu/~blynn/rop/
修補漏洞很簡單,以下圖所示,明確指定數據長度爲99個字節,第100個字節用來保存NULL。
來自X.org的聲明:
在由X.org 發佈的全部的X服務中,libXfont被用來讀取用戶指定的字體文件,包含Xorg服務,它一般是以root權限來運行的,或者是以setuid-root的權限來運行以方便訪問硬件,這一漏洞可能致使在某些系統中,一個普通用戶拿到root權限。
在12月份的混沌通訊大會上,Ilja van Sprundel 說他要在兩個月內,挖到120個漏洞。Van Sprundel說:「如今我尚未挖到那麼多」,Van Sprunde在2013年5月份致使了X.org的大量安全更新,包含數十個須要修正的漏洞,由於客戶端程序庫相信服務器發送的數據時有效的,沒有進行完整性測試。(譯註:http://lists.x.org/archives/xorg-devel/2013-May/036276.html)最新的漏洞是經過cppcheck靜態分析工具發現的,命名爲CVE-2013-6462,安全更新應該在全部的包管理中有效。(譯註:有關cppcheck,請參照http://cppcheck.sourceforge.net/)