這個漏洞的CVE編號是CVE-2016-5367。
漏洞二:INI配置注入漏洞
INI是一種常見的初始化配置文件格式,INI就是的前三個字母。INI文件的格式非常簡單,由多個節(Section)組成,每個節由一行行的鍵值對組成,如下所示:
[section1]
key1=value1
key2=value2
[section2]
key3=value3
復制
Xware的HTTP服務存在一個登錄接口login,該接口會解析HTTP請求中cookie里的一些參數,并將值保存入ini配置文件中。例如cookie = "isvip=0; jumpkey=A; =B; userid=1"時,ini配置文件中會寫入用戶相關的參數,樣例配置文件如下:
[license]
server_addr=X.X.X.X
[huiyuan]
userid=1
username=B
vip_level=0
jumpkey=A
復制
細心的話會發現在ini配置文件中,不同的鍵值對都是通過換行來區分。如果鍵或值中存在換行符怎么辦?假如我們嘗試給出這樣的cookie = “isvip=0; jumpkey=A\n\n[license]\=1.3.3.7; =B; userid=1”,那么寫入配置文件的就是:
[license]
server_addr=X.X.X.X
[huiyuan]
userid=1
username=B
vip_level=0
jumpkey=A
[license]
server_addr=1.3.3.7
復制
這樣我們就可以在ini文件后面的位置插入一個新的配置,來修改文件前面的默認配置,此例中我們修改的是的值。
本身通過cookie來設置的配置項只能是huiyuan這個節中的指定鍵,通過在值中插入換行符,我們就實現了任意配置選項的注入。
這個漏洞的CVE編號是CVE-2016-5366。
漏洞三:發生在2016年的棧溢出
利用上述漏洞,在配置文件中把默認的license server改掉能有什么用呢?
幸運的是,Xware的這個HTTP服務器還暴露了一個接口可以重啟Xware軟件,攻擊者可以隨時調用它,來讓程序在重啟時解析被我們注入過的INI配置文件。所以讓我們看看程序在初始化過程中對配置文件中的license server做了什么。
通過逆向分析,我們找到了解析license server的相關代碼:
解析server地址和端口的代碼在函數中:
此處代碼明顯存在溢出,首先memcpy函數在使用時指定的拷貝長度只與源字符串有關,其次在另個分支中直接使用了危險函數strcpy。兩處拷貝的目標緩沖區v4,即傳入的第二個參數,實際是在上層函數中棧上的局部buffer,因此這里的溢出是典型的棧溢出。
這個漏洞的CVE編號是CVE-2016-5365。
漏洞利用:“組合拳”
上面三個漏洞每個漏洞單獨看都無法造成嚴重影響,即便是棧溢出漏洞也是發生在解析初始化INI配置文件的過程中,一般人都會認為配置文件中的選項都是寫死的,例如這里的license server地址,就算用strcpy也不必擔心。然而如果我們把這幾個小問題組合在一起使用時,會出現怎樣的威力呢?
首先我們可以通過堆內存的泄露找到libc庫加載的地址,因為通常linux采用的是/,堆上空閑的塊中會包含指向libc全局變量的指針(具體參考堆的實現,這里不作展開)。目前大多MIPS/ARM架構的路由器都沒有開啟地址隨機化保護(ASLR),泄露的這個地址往往是不變的。
接下來我們可以利用INI配置注入漏洞,往INI配置文件中注入超長的license server地址,并在其中植入ROP payload。由于我們已經知道libc的地址,我們就能夠使用libc中的gadget來組ROP。
最終,只要我們調用重啟Xware的接口,Xware就會重新解析INI配置文件,并在這個過程中觸發棧溢出,從而執行我們的ROP代碼。
我們用下面的流程圖來總結這三個漏洞的組合利用過程:
后記
本文以一個真實案例給大家介紹了棧溢出漏洞造成的危害。根據長亭安全研究實驗室的研究經驗,像這樣的棧溢出的案例在智能設備上還有很多很多。目前市面上的智能設備種類和品牌可謂百花齊放,這些產品在安全性的設計和實現上參差不齊。如果單從安全性考量,筆者建議讀者在選購時選擇大廠商自主研發的產品,因為大品牌廠商不僅在研發經驗上有更多的積累,而且在對待安全問題的態度上也是積極正面的。也建議大家在使用智能設備時,多關注官方的動態和安全補丁的發布,及時更新固件。