思科CVE-2019-1663補丁失效安全通告
發布時間 2019-03-06漏洞編號和級別
CVE編號: CVE-2019-1663,危險級別:嚴重, CVSS分值:廠商自評:9.8,官方未評定
影響范圍
受影響版本:
RV110W Wireless-N VPN Firewall
RV130W Wireless-N Multifunction VPN Router
RV215W Wireless-N VPN Router
漏洞概述
思科發布安全公告,表示其企業無線VPN和防火墻路由器存在嚴重安全漏洞。漏洞產生是由于在基于web的管理界面中對用戶提供的數據進行了錯誤的驗證。允許攻擊者通過向目標設備發送惡意HTTP請求,然后以高權限用戶的身份在受影響設備的底層操作系統上執行任意代碼。
思科表示該漏洞已經存在六個月,目前已發布補丁,但是發現補丁失效,漏洞利用仍然在繼續。
漏洞細節
首先看一下CVE-2019-1663漏洞的起因:
研究人員最早是在RV130路由器上發現該漏洞的,RV130路由器運行的并不是Cisco IOS系統而是嵌入式Linux系統。路由器的主要功能是由一些二進制函數處理的,包括處理用戶輸入和使路由器正常工作。
大多數的用戶輸入來自于web接口,受影響的二進制文件是httpd webserver二進制文件。實際上該文件只是處理經過80或443端口的所有數據,它獲取通過HTTP傳輸的用戶輸入,并轉換為系統級的配置。
下面看一下CVE-2019-1663漏洞背后的問題機制:
RV130固件
如果太長的數據傳遞到login.cgi終端的pwd參數,就會出現緩沖區溢出。這一步是認證之前發生的,下面看一下正常登陸的過程:
到web接口的登陸請求會發送給login.cgi終端,格式如下:
Pwd值實際上是以32字節長的編碼密碼的形式發送的,該值是在請求發送前通過瀏覽器中的JS代碼計算的。
登陸是由httpd的0x0002C614處的函數處理的。請求參數會從POST請求中進行分析,然后token化之后放在可執行文件的靜態數據庫(.bss)。
從POST請求中取出后內存中的參數
然后,合法編碼的密碼就會從NVRAM設備中取出,放入內存中。然后,pwd參數的值就會從.bss中取出來,這里使用了標準C調用strcpy將它放入動態分配的內存中。
*record scratch*.
在正常登陸情況下,每個值都會進行相同的檢查。在strcpy將值復制到內存中后,strlen就會計算每個項目的長度,然后strcmp比較兩個值。如果所有檢查都通過的話,就可以成功登陸。
檢查長度
問題就在于strcpy。
strcpy使用很常見
使用C語言編程的開發人員和安全人員請注意:strcpy其實是有個非常危險的函數。網上有上千篇文章解釋為什么該函數很危險。下面簡單看一下:
首先看一下,在標準的C語言中,strcpy定義如下:
Strcpy函數會復制s2指向的字符串到s1指向的數組中。如果復制在交叉的對象間發生,這種情況是沒有預先定義的。也就是說可能會發生一些意料之外的事情。為什么說strcpy有威脅呢?是因為它會復制s2字符串到s1指向的內存。但是該函數不傳遞長度,也就是說strcpy函數不關心字符串的長度。對strcpy來說,字符串的長度一點也不重要。復制的過程中可能會產生覆寫的情況,而攻擊者也正是利用這一潛在漏洞發起攻擊,可以覆寫棧內保存的返回指針,然后重定向進程的執行流。
下圖是在使用strcpy時可能會發生的情況:
A segfault
在發送下面的請求給RV130時發生的情況就和上面一樣:
棧中保存的返回指針被“ZZZZ”覆寫了,因此執行流會被重定向到0x5A5A5A5A。
研究人員建議使用strlcpy函數,strlcpy是C語言標準庫函數,是更加安全版本的strcpy函數,在已知目的地址空間大小的情況下,把從src地址開始且含有'\0'結束符的字符串復制到以dest開始的地址空間,并不會造成緩沖區溢出。
修復建議
思科之前已發布補丁,但是發現補丁失效, 請密切關注官網更新。
參考鏈接
https://www.pentestpartners.com/security-blog/cisco-rv130-its-2019-but-yet-strcpy/