◆魏 凡 姜 楠 路曉明 吳君軼 徐志輝
(1.北京工業大學 北京 100124;2.北京郵電大學 北京 100876;3.中移(杭州)信息技術有限公司安全產品部 浙江 310012)
UPnP(Universal Plug and Play)協議是微軟提出并推廣的一種用于 PC機和智能設備的常見對等網絡連接的體系結構[1]。UPnP協議主要用于智能設備的互聯互通,使用UPnP協議時不需要設備驅動程序,在無需任何配置的前提下實現設備的發現、聲明和服務調用等功能。
隨著物聯網設備的增加,UPnP協議的廣泛使用,應用UPnP協議的一些設備的許多安全隱患逐漸暴露了出來。UPnP設備主要存在以下安全隱患:
(1)安全傳輸問題
UPnP協議的數據包一般以明文傳輸,攻擊者可以輕松獲得UPnP協議的通信信息。
(2)訪問控制不當問題
UPnP網絡中有兩種節點——UPnP設備與 UPnP控制點,UPnP設備將提供服務給控制點使用。一般而言UPnP設備只希望給某些特定的控制點提供服務,而UPnP設備缺乏對UPnP控制點的認證,這導致攻擊者無須任何憑證隨意調用UPnP設備的服務。
(3)字符串處理不當問題
UPnP設備未對遠程調用的數據包中的某些字段值進行檢驗,可能出現整數處理不當、堆/棧溢出和格式化字符串漏洞等問題,以上漏洞均可能導致設備異常(UPnP服務崩潰或設備崩潰),甚至可能導致攻擊者可以在設備上執行任意代碼。
關于UPnP協議的安全問題,許多專家學者已做過研究。針對UPnP協議的安全傳輸問題,文獻[2]提出了一種由安全控制臺來對設備進行權限控制、設備和控制點之間進行加密傳輸的安全協議,文獻[3]設計并實現了一套安全的協議 UPnP-Sec;針對UPnP訪問控制問題,文獻[4]提出了一個帶鑒權服務的家庭網關設備架構,文獻[5]討論了UPnP技術的用途和設備安全策略,分析了UPnP與Window XP安全缺陷之間的關系及解決策略。現有的研究大部分在對UPnP網絡的實現與改進上,僅有文獻[6]從固件角度對網絡設備的UPnP協議安全進行分析,提出了一種基于固件分析的模糊測試技術。
本文主要對UPnP設備的訪問控制不當漏洞、整數處理不當、堆/棧溢出和格式化字符串漏洞進行研究,設計出一種基于模糊測試技術的 UPnP協議測試方案,并根據該方案設計并實現了UPnP協議模糊測試工具。
在安全測試中,模糊測試(Fuzzy testing)是一種通過向測試對象發送半畸形數據并監控測試對象的異常來發現測試對象的漏洞的測試技術[7]。模糊測試是一種基于黑盒或灰盒的測試技術,與傳統的滲透測試技術不同的是,模糊測試的核心思想是利用帶有攻擊性的畸形數據,用于觸發設備的各種漏洞,因此使用模糊測試技術使得漏洞的自動化挖掘成為可能。
如圖1,模糊測試流程主要分為四步:數據生成;數據輸入;異常監控;異常判定[8]。數據生成指的是帶有攻擊性的畸形數據的生成,數據生成決定著模糊測試的結果,是模糊測試的核心。數據輸入指的是將畸形數據輸入到測試設備。異常監控指的是在數據輸入后,對測試設備的狀態進行監控,異常監控決定著模糊測試的準確率。最后進行異常判定,對監控到的異常進行判定,得到測試結果。
1.2節提到,模糊測試的核心是數據生成,一般而言,目前的數據生成主要有兩種方法:基于變異的數據生成,或者是基于生成的數據生成[9]。基于變異的數據生成方法是通過變異的方法
生成新的測試數據,這種數據生成的方式比較簡單,但測試效率比較低,因為這種方式生成的數據有一定概率被測試設備丟棄,從而無法到達測試效果。基于生成的數據生成方法是基于對已有協議或數據的分析,再去生成隨機數據,這種測試方法大大提高了測試效率,但對模糊測試工具的開發人員水平要求較高,有一定的測試難度。

圖1 模糊測試流程
使用傳統的模糊測試方案測試應用UPnP協議的設備時,存在以下問題:
(1)UPnP設備的協議數據報文是由UPnP設備制造商決定,不同設備的協議數據報文不同,因此傳統的數據生成方式不能滿足UPnP協議模糊測試的需求,大部分測試數據被設備丟棄,測試效率比較低;
(2)UPnP設備作為一種物聯網設備,UPnP往往是其提供的一種服務,UPnP服務的異常不等于設備異常,因此如何對UPnP服務的異常進行判定是問題所在。
必須解決以上兩個問題才能保證協議測試的高效性和自動化進行,下面提出的測試方案將解決以上問題。
一般來說,本方案的測試點由協議的脆弱點決定,這里的脆弱點指的是各種實現該協議的設備易發生安全漏洞的協議字段。本方案將使用基于已知漏洞特征的測試方法,這種方法將有效提高UPnP協議測試的效率,因為歷史上出現過漏洞的協議字段往往依然存在漏洞[10]。我們在著名漏洞庫 CVE[11](Common Vulnerabilities and Exposures)上對UPnP協議進行漏洞調研得知,最早的與UPnP協議有關的漏洞可追溯至2001年9月27日,從2001年9月27日至2018年8月25日,CVE上共有64個與UPnP協議有關的漏洞。其中緩沖區溢出的漏洞有27個,訪問控制不當的漏洞有20個,拒絕服務漏洞有6個,其他漏洞有11個。通過對這些漏洞的分析與研究,我們發現UPnP協議的脆弱點主要集中在下面幾個方面:
(1)訪問控制不當
UPnP設備的服務無需任何認證即可遠程調用。
(2)NOTIFY和M-SEARCH導致的緩沖區溢出
接收NOTIFY和M-SEARCH數據包的設備和控制點未對其中的Location字段長度進行檢驗,導致緩沖區溢出漏洞。
(3)緩沖區溢出及拒絕服務漏洞
UPnP設備未對控制點發來的SOAP遠程調用數據包中的某些字段進行檢查,導致拒絕服務或緩沖區溢出。
其中緩沖區溢出漏洞和拒絕服務漏洞可通過模糊測試進行挖掘,訪問控制相關的漏洞可先用工具進行分析后人工挖掘。
畸形數據包的構造是模糊測試的關鍵,直接決定著模糊測試的效率。畸形數據包由正常數據包變異而來,本測試方案將使用隨機和基于協議脆弱點的混合變異進行模糊測試,這種測試方法既保證了模糊測試的隨機性,又提高了測試的針對性。
畸形數據包的構造主要在于正常數據包字段的變異,字段變異的策略有超長字符串、格式化字符串等,下面以NOTIFY消息數據包和SOAP方法調用數據包為例進行說明。
NOTIFY數據包是UPnP設備廣播的數據包,UPnP控制點將接收并解析該數據包。NOTIFY數據包的Location字段為字符串類型,用于標識UPnP設備的描述文件地址,控制點接收到此消息會去Location字段指定的URL獲取設備描述,下面畸形數據包變異了Location字段:

控制點使用SOAP方法調用UPnP設備提供的接口方法,不同的接口方法 SOAP報文結構不同,下面展示了對路由器的AddPortMapping方法中NewRemoteHost字段的變異:

根據2.1節得到的UPnP協議脆弱點,我們設計了如圖2測試流程。
其中,掃描器實現了對待測設備的掃描,掃描得到待測設備的設備信息并將其寫入數據庫;監控器對待測設備的異常進行監控,并將異常反饋到檢測核心;檢測核心根據數據庫中的設備信息,對待測設備進行模糊測試;漏洞驗證模塊主要對已檢測出的漏洞進行驗證,保證測試結果的準確性。
我們使用 python語言實現該模糊測試工具,該測試工具在Linux下運行,只需將該測試工具和被測設備連入同一網段即可進行測試。該工具可自動獲取 UPnP設備信息并完成模糊測試,測試得到的UPnP設備漏洞將存入數據庫并展示給測試人員,實現了完全的自動化測試。

圖2 協議測試流程
針對UPnP的兩類節點(UPnP設備和控制點)的測試方法不同,由于UPnP控制點是無法提供服務(沒有服務端口),我們在UPnP組播網絡中對其進行模糊測試,使用ping技術進行異常監控;對于UPnP設備,我們先獲得其UPnP端口和提供的服務,而后根據獲得的服務進行模糊測試,使用端口檢測技術進行異常監控。在整個測試流程中,除了訪問控制類的漏洞需人工進行測試,其他測試均可自動進行。其中,模糊測試和設備監控同時進行、互不干擾,保證了異常監控的準確性和實時性。
根據我們的UPnP協議模糊測試方案,我們設計了圖3的系統架構:

圖3 測試工具系統架構
我們使用該模糊測試工具對多款UPnP設備進行了測試,發現多個安全漏洞,表1為測試結果(考慮部分漏洞未公布,對未公布漏洞的路由品牌未列出):

表1 UPnP設備測試結果
模糊測試得到漏洞的某品牌路由器1和某品牌路由器2的漏洞信息如下:
(1)某品牌路由器 1接口方法均可未授權進行訪問,其實帶參數的接口方法若參數中含有“>>x00”字符會導致UPnP服務崩潰(無法自動重啟)產生拒絕服務;
(2)某品牌路由器 2接口方法均可未授權訪問,其中“AddPortMapping”方法中的“NewPortMappingDescription”字段為空時導致UPnP服務崩潰(自動重啟)。
本文對UPnP協議進行了詳細的分析和研究,通過漏洞調研明確了UPnP協議的測試點和測試方法,最終設計出UPnP協議測試方案,并使用python語言實現了自動化的UPnP協議模糊測試工具。我們使用該工具對多款UPnP設備進行了測試,發現部分UPnP設備存在安全漏洞,測試結表明該模糊測試工具具有可用性和高效性。