作者:啟明星辰ADLab
文章來源:Advantech WebAccess多個漏洞分析
Advantech WebAccess是研華科技開發的完全基于IE瀏覽器的HMI/SCADA監控軟件,其最大特點就是全部的工程項目、數據庫設置、畫面制作和軟件管理都可以通過使用標準的瀏覽器完成,不僅可以實現系統的遠程控制而且還能進行工程的開發和維護。近日ZDI公布了多個WebAccess的漏洞預警(CVE-2019-10985、CVE-2019-10993、CVE-2019-1099、 CVE-2019-6550以及ZDI-19-584 ~ ZDI-19-623、ZDI-19-691),其中包括多個內存破壞漏洞(ZDI-19-595~ ZDI-19-614)以及棧溢出漏洞(ZDI-19-585、ZDI-19-327~ZDI-19-330、ZDI-19-325、ZDI-19-323、ZDI-19-592、ZDI-19-594、ZDI-19-589、ZDI-19-588、ZDI-19-586),部分內存破壞漏洞可以在受影響的系統中執行任意代碼,但是大部分內存破壞漏洞利用條件較為苛刻。同時,由于Advantech WebAccess許多模塊并沒有開啟ASLR、DEP等系統相關安全機制,使得棧溢出等漏洞在受影響的系統中容易造成代碼執行。
Advantech WebAccess歷史漏洞統計情況
通過追蹤CVE漏洞數據庫中的Advantech WebAccess歷史漏洞,啟明星辰ADLab發現從2011年到2019年合計有134個漏洞被披露。圖1是我們統計的每一年的漏洞披露數量:

從圖中可以看出,其漏洞數量總體上隨著年份上下波動。2014年出現一次井噴達到26個,而2015年漏洞披露只有5個,隨后出現逐年上升趨勢。我們對WebAccess的漏洞類型信息進行了梳理,如圖2:

從圖中可以看出WebAccess的歷史漏洞類型比較豐富,包括了緩沖區溢出、SQL注入、XSS、權限管理不當、敏感信息泄露、代碼\命令執行等。其中緩沖區溢出類型漏洞最多,占到漏洞總數的1/3以上;其次是權限管理類漏洞(11.94%)、敏感信息泄露(8.96%)、SQL注入(8.21%)。由此可以看出,WebAccess的漏洞面較為廣泛。
為了分析WebAccess漏洞類型的演變趨勢,我們對其歷年不同漏洞類型的數量進行了梳理,如圖3:
從圖中可以看出,WebAccess的漏洞類型趨勢沒有明顯變化,其中緩沖區溢出漏洞和權限管理漏洞在經歷2014年井噴后仍然沒有得到有效緩解,代碼\命令執行漏洞從2018年開始增多。
Advantech WebAccess Node多個ZDI漏洞分析
在ZDI披露的Advantech WebAccess Node的漏洞中,大部分都存在于webvrpcs.exe中的RPC通訊模塊。RPC(Remote Procedure Call)即遠程過程調用,是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。RPC協議屏蔽了編程語言之間的特性差異,廣泛應用于分布式系統中,在工業控制DCS系統中也被廣泛應用。
對Advantech WebAccess Node分析發現,其采用RPC協議來實現ODBC 和一些控制臺命令。但在具體功能實現時缺乏相應的安全檢查,導致產生了命令執行、內存破壞等多個漏洞。我們對這些漏洞進行了分析,其中典型漏洞(CVE-2017-16720、CVE-2019-10993、CVE-2019-10991)的分析如下。
1、CVE-2017-16720命令執行漏洞
在該漏洞位于webvrpcs程序的RPC IOCTL code 0x2711功能實現。在一定條件下可利用該漏洞在安裝有Advantech WebAccess的系統上執行任意命令。該漏洞的EXP已被公開,核心代碼如圖4所示:

為了分析該漏洞的代碼路徑,先用IDA打開webvrpcs.exe,然后通過mida插件提取出其RPC接口,可以看到opcode 0x1對應的處理函數為sub_401260。

sub_401260(圖6所示偽代碼)首先對RPC消息的頭部數據進行處理,然后調用sub_402c60函數。sub_402c60函數最終調用DsDaqWebService函數(如圖7所示),而DsDaqWebService函數源于動態鏈接庫drawsrv.dll。用IDA打開drawsrv.dll并定位到函數DsDaqWebService,DsDaqWebService函數實現了各個不同IOCTL code的功能,而0x2711對應的處理函數為sub_100017B0。


分析sub_100017B0(圖8所示),該函數中調用了CreateProcessA()函數創建進程。其中lpCommandLine參數由RPC客戶端發送,且此處未對此參數進行任何檢查。因此,可以通過控制該參數使得CreateProcessA()執行任意命令,從而導致遠程命令執行。

該漏洞在WebAccess Node 8.4中得到修復,如圖9所示(case 0x2711為補丁前的分支代碼,case 1為補丁后的分支代碼) ,修復后的IOCTL增加了sub_100022D0函數對用戶的輸入內容進行檢查。具體的檢查方式是同白名單進行比較來判斷參數是否合法。

同樣類型的漏洞還有CVE-2019-10985,該漏洞觸發點位于IOCTL code 0x2715功能實現。該功能是通過unlink刪除指定文件,而文件名可以由RPC客戶端任意指定。由于對參數沒有任何過濾,可以設置該參數為任意文件路徑,從而導致任意文件刪除漏洞。
2、CVE-2019-10993指針解引用漏洞
該漏洞同樣也是位于webvrpcs處理RPC消息的動態鏈接庫drawsrv.dll中,觸發點在處理IOCTL code 0x27DB的代碼中。如下圖10所示:

通過分析,Filename變量直接來源于webvrpcs接收的RPC數據,通過修改該Filename的值可以控制SQLFreeConnet的參數。分析SQLFreeConnet函數,其調用了函數FreeIDbc釋放連接句柄ConnectionHandle(即SQLFreeConnet參數)。
在FreeIDbc函數中,ConnectionHandle會被視為指針類型解引用。因此,通過構造RPC消息可控制指針解引用,從而造成內存訪問錯誤。

進一步分析可發現,參數Memory賦值給了v2,在后續的操作中(v2[1]+36)賦值給了v7,后又進行了v7[1]的操作。而Memory受用戶輸入控制,因此v7[1]寫入內存的地址可控,從而形成一個任意地址寫漏洞。由于是內存寫入操作,精心利用可能造成代碼執行。
類似這類指針未校驗的漏洞在Advantech WebAccess Node中還有很多,CVE編號均為CVE-2019-10993,包含多個ZDI漏洞編號(ZDI-19-614 ZDI-19-613 ZDI-19-612 ZDI-19-611 ZDI-19-610 ZDI-19-609 ZDI-19-608 ZDI-19-607 ZDI-19-606 ZDI-19-605 ZDI-19-604 ZDI-19-603 ZDI-19-602 ZDI-19-601 ZDI-19-600 ZDI-19-599 ZDI-19-598 ZDI-19-597 ZDI-19-596 ZDI-19-595)。實際上這類漏洞就是對傳入webvrpcs中的DsDaqWebService函數的參數沒有進行檢查,導致幾乎所有的IOCTL code ODBC類函數都可以產生內存破壞漏洞,如圖13所示:

該系列漏洞在新版本8.4中得到修復,方式為在調用SQL函數前增加了檢驗函數(鏈式校驗流程如圖15),判斷參數是否合法,如圖14所示。


3、CVE-2019-10991棧溢出漏洞
CVE-2019-10991包含了多個棧溢出漏洞,由于這些漏洞的觸發條件和產生原因都較為相似,在此僅對其中一個漏洞(ZDI-19-594)進行詳細分析。
WebAccess Node軟件包含了一系列小組件程序,bwscrp.exe是其中一個。bwscrp.exe程序入口函數接收兩個命令行參數(如圖16),隨后使用命令行參數lpCmdLine作為函數參數之一調用了函數sub_4061F0。在函數sub_4061F0中,Source即為lpCmdLine,后續執行直接使用strcpy將Source拷貝到棧參數Dest,而沒有檢查Source的數據長度。由于變量Dest距離棧頂只有400字節,當Source長度超過404字節時, strcpy函數調用將覆蓋棧上的函數返回地址,是一個典型的棧溢出漏洞。

此外,CVE-2019-6550 (ZDI-19-585 ZDI-19-330 ZDI-19-329 ZDI-19-328 ZDI-19-327 ZDI-19-325 ZDI-19-323)漏洞原理同CVE-2019-10991也極為類似。CVE-2019-6550(ZDI-19-330)棧溢出漏洞存在于upandpr.exe。該程序主函數中的scanf調用將用戶提供的數據拷貝到棧內存,在拷貝之前未對用戶提供的數據長度進行驗證,如圖18所示。
CVE-2019-10991在最新版本的Advantech WebAccess Node中得到修復,補丁方式大致相同。以圖19所示的ZDI-19-594為例(左部分為補丁前代碼,右部分為補丁后代碼),修復方式為在strcpy調用之前加入數據長度檢查。

CVE-2019-6550在最新版本的Advantech WebAccess Node中也得到修復,補丁方式大致相同。以圖20所示的ZDI-19-330為例(上部分為補丁前代碼,下部分為補丁后代碼),修復方式為在sscanf的格式化輸出符設置了最大字符長度來防止sscanf函數棧溢出的產生。

Advantech WebAccess Node 漏洞挖掘
在分析ZDI披露的漏洞過程中,我們對Advantech WebAccess進行了初步審計,額外發現了三個漏洞,可導致任意文件刪除和遠程命令執行。
1、CNVD-2019-23511任意文件刪除漏洞(中危)
WebAccess Node軟件會在系統中注冊一個動態模塊,分析該模塊發現其包含一個文件刪除函數,但沒有對傳入參數的進行安全檢查過濾,導致存在任意文件刪除漏洞。
2、CNVD-2019-23512命令執行漏洞(高危)
WebAccess Node軟件會在系統中注冊另一個動態模塊,分析該模塊發現其包含一個外部程序調用功能,但沒有對傳入的調用參數進行檢查,導致存在任意命令執行漏洞。
3、CNVD-2019-23513命令執行漏洞(高危)
在分析ZDI披露的漏洞過程中,我們對Advantech WebAccess進行了初步審計,額外發現了三個漏洞,可導致任意文件刪除和遠程命令執行。
結 語
通過對這一系列漏洞的分析可以發現,Advantech WebAccess 軟件在實現過程中缺乏對程序輸入的安全檢查代碼,對重要操作的認證不足,因此才爆出如此多的漏洞。不同于常規信息化系統,工業控制系統對穩定性的要求極高,工控軟件漏洞被利用可能造成嚴重的后果。希望WebAccess相關用戶單位持續關注其漏洞公告,及時安裝補丁以修復相關漏洞。
參考鏈接:
1.https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=webaccess
2.https://www.zerodayinitiative.com/advisories/ZDI-18-024/
3.https://www.exploit-db.com/exploits/44278
4.https://www.zerodayinitiative.com/advisories/ZDI-19-616/
5.https://www.zerodayinitiative.com/advisories/ZDI-19-594/
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1017/
暫無評論