◆魏 凡 姜 楠 路曉明 吳君軼 徐志輝
(1.北京工業(yè)大學(xué) 北京 100124;2.北京郵電大學(xué) 北京 100876;3.中移(杭州)信息技術(shù)有限公司安全產(chǎn)品部 浙江 310012)
UPnP(Universal Plug and Play)協(xié)議是微軟提出并推廣的一種用于 PC機(jī)和智能設(shè)備的常見對等網(wǎng)絡(luò)連接的體系結(jié)構(gòu)[1]。UPnP協(xié)議主要用于智能設(shè)備的互聯(lián)互通,使用UPnP協(xié)議時(shí)不需要設(shè)備驅(qū)動(dòng)程序,在無需任何配置的前提下實(shí)現(xiàn)設(shè)備的發(fā)現(xiàn)、聲明和服務(wù)調(diào)用等功能。
隨著物聯(lián)網(wǎng)設(shè)備的增加,UPnP協(xié)議的廣泛使用,應(yīng)用UPnP協(xié)議的一些設(shè)備的許多安全隱患逐漸暴露了出來。UPnP設(shè)備主要存在以下安全隱患:
(1)安全傳輸問題
UPnP協(xié)議的數(shù)據(jù)包一般以明文傳輸,攻擊者可以輕松獲得UPnP協(xié)議的通信信息。
(2)訪問控制不當(dāng)問題
UPnP網(wǎng)絡(luò)中有兩種節(jié)點(diǎn)——UPnP設(shè)備與 UPnP控制點(diǎn),UPnP設(shè)備將提供服務(wù)給控制點(diǎn)使用。一般而言UPnP設(shè)備只希望給某些特定的控制點(diǎn)提供服務(wù),而UPnP設(shè)備缺乏對UPnP控制點(diǎn)的認(rèn)證,這導(dǎo)致攻擊者無須任何憑證隨意調(diào)用UPnP設(shè)備的服務(wù)。
(3)字符串處理不當(dāng)問題
UPnP設(shè)備未對遠(yuǎn)程調(diào)用的數(shù)據(jù)包中的某些字段值進(jìn)行檢驗(yàn),可能出現(xiàn)整數(shù)處理不當(dāng)、堆/棧溢出和格式化字符串漏洞等問題,以上漏洞均可能導(dǎo)致設(shè)備異常(UPnP服務(wù)崩潰或設(shè)備崩潰),甚至可能導(dǎo)致攻擊者可以在設(shè)備上執(zhí)行任意代碼。
關(guān)于UPnP協(xié)議的安全問題,許多專家學(xué)者已做過研究。針對UPnP協(xié)議的安全傳輸問題,文獻(xiàn)[2]提出了一種由安全控制臺來對設(shè)備進(jìn)行權(quán)限控制、設(shè)備和控制點(diǎn)之間進(jìn)行加密傳輸?shù)陌踩珔f(xié)議,文獻(xiàn)[3]設(shè)計(jì)并實(shí)現(xiàn)了一套安全的協(xié)議 UPnP-Sec;針對UPnP訪問控制問題,文獻(xiàn)[4]提出了一個(gè)帶鑒權(quán)服務(wù)的家庭網(wǎng)關(guān)設(shè)備架構(gòu),文獻(xiàn)[5]討論了UPnP技術(shù)的用途和設(shè)備安全策略,分析了UPnP與Window XP安全缺陷之間的關(guān)系及解決策略。現(xiàn)有的研究大部分在對UPnP網(wǎng)絡(luò)的實(shí)現(xiàn)與改進(jìn)上,僅有文獻(xiàn)[6]從固件角度對網(wǎng)絡(luò)設(shè)備的UPnP協(xié)議安全進(jìn)行分析,提出了一種基于固件分析的模糊測試技術(shù)。
本文主要對UPnP設(shè)備的訪問控制不當(dāng)漏洞、整數(shù)處理不當(dāng)、堆/棧溢出和格式化字符串漏洞進(jìn)行研究,設(shè)計(jì)出一種基于模糊測試技術(shù)的 UPnP協(xié)議測試方案,并根據(jù)該方案設(shè)計(jì)并實(shí)現(xiàn)了UPnP協(xié)議模糊測試工具。
在安全測試中,模糊測試(Fuzzy testing)是一種通過向測試對象發(fā)送半畸形數(shù)據(jù)并監(jiān)控測試對象的異常來發(fā)現(xiàn)測試對象的漏洞的測試技術(shù)[7]。模糊測試是一種基于黑盒或灰盒的測試技術(shù),與傳統(tǒng)的滲透測試技術(shù)不同的是,模糊測試的核心思想是利用帶有攻擊性的畸形數(shù)據(jù),用于觸發(fā)設(shè)備的各種漏洞,因此使用模糊測試技術(shù)使得漏洞的自動(dòng)化挖掘成為可能。
如圖1,模糊測試流程主要分為四步:數(shù)據(jù)生成;數(shù)據(jù)輸入;異常監(jiān)控;異常判定[8]。數(shù)據(jù)生成指的是帶有攻擊性的畸形數(shù)據(jù)的生成,數(shù)據(jù)生成決定著模糊測試的結(jié)果,是模糊測試的核心。數(shù)據(jù)輸入指的是將畸形數(shù)據(jù)輸入到測試設(shè)備。異常監(jiān)控指的是在數(shù)據(jù)輸入后,對測試設(shè)備的狀態(tài)進(jìn)行監(jiān)控,異常監(jiān)控決定著模糊測試的準(zhǔn)確率。最后進(jìn)行異常判定,對監(jiān)控到的異常進(jìn)行判定,得到測試結(jié)果。
1.2節(jié)提到,模糊測試的核心是數(shù)據(jù)生成,一般而言,目前的數(shù)據(jù)生成主要有兩種方法:基于變異的數(shù)據(jù)生成,或者是基于生成的數(shù)據(jù)生成[9]?;谧儺惖臄?shù)據(jù)生成方法是通過變異的方法
生成新的測試數(shù)據(jù),這種數(shù)據(jù)生成的方式比較簡單,但測試效率比較低,因?yàn)檫@種方式生成的數(shù)據(jù)有一定概率被測試設(shè)備丟棄,從而無法到達(dá)測試效果?;谏傻臄?shù)據(jù)生成方法是基于對已有協(xié)議或數(shù)據(jù)的分析,再去生成隨機(jī)數(shù)據(jù),這種測試方法大大提高了測試效率,但對模糊測試工具的開發(fā)人員水平要求較高,有一定的測試難度。
圖1 模糊測試流程
使用傳統(tǒng)的模糊測試方案測試應(yīng)用UPnP協(xié)議的設(shè)備時(shí),存在以下問題:
(1)UPnP設(shè)備的協(xié)議數(shù)據(jù)報(bào)文是由UPnP設(shè)備制造商決定,不同設(shè)備的協(xié)議數(shù)據(jù)報(bào)文不同,因此傳統(tǒng)的數(shù)據(jù)生成方式不能滿足UPnP協(xié)議模糊測試的需求,大部分測試數(shù)據(jù)被設(shè)備丟棄,測試效率比較低;
(2)UPnP設(shè)備作為一種物聯(lián)網(wǎng)設(shè)備,UPnP往往是其提供的一種服務(wù),UPnP服務(wù)的異常不等于設(shè)備異常,因此如何對UPnP服務(wù)的異常進(jìn)行判定是問題所在。
必須解決以上兩個(gè)問題才能保證協(xié)議測試的高效性和自動(dòng)化進(jìn)行,下面提出的測試方案將解決以上問題。
一般來說,本方案的測試點(diǎn)由協(xié)議的脆弱點(diǎn)決定,這里的脆弱點(diǎn)指的是各種實(shí)現(xiàn)該協(xié)議的設(shè)備易發(fā)生安全漏洞的協(xié)議字段。本方案將使用基于已知漏洞特征的測試方法,這種方法將有效提高UPnP協(xié)議測試的效率,因?yàn)闅v史上出現(xiàn)過漏洞的協(xié)議字段往往依然存在漏洞[10]。我們在著名漏洞庫 CVE[11](Common Vulnerabilities and Exposures)上對UPnP協(xié)議進(jìn)行漏洞調(diào)研得知,最早的與UPnP協(xié)議有關(guān)的漏洞可追溯至2001年9月27日,從2001年9月27日至2018年8月25日,CVE上共有64個(gè)與UPnP協(xié)議有關(guān)的漏洞。其中緩沖區(qū)溢出的漏洞有27個(gè),訪問控制不當(dāng)?shù)穆┒从?0個(gè),拒絕服務(wù)漏洞有6個(gè),其他漏洞有11個(gè)。通過對這些漏洞的分析與研究,我們發(fā)現(xiàn)UPnP協(xié)議的脆弱點(diǎn)主要集中在下面幾個(gè)方面:
(1)訪問控制不當(dāng)
UPnP設(shè)備的服務(wù)無需任何認(rèn)證即可遠(yuǎn)程調(diào)用。
(2)NOTIFY和M-SEARCH導(dǎo)致的緩沖區(qū)溢出
接收NOTIFY和M-SEARCH數(shù)據(jù)包的設(shè)備和控制點(diǎn)未對其中的Location字段長度進(jìn)行檢驗(yàn),導(dǎo)致緩沖區(qū)溢出漏洞。
(3)緩沖區(qū)溢出及拒絕服務(wù)漏洞
UPnP設(shè)備未對控制點(diǎn)發(fā)來的SOAP遠(yuǎn)程調(diào)用數(shù)據(jù)包中的某些字段進(jìn)行檢查,導(dǎo)致拒絕服務(wù)或緩沖區(qū)溢出。
其中緩沖區(qū)溢出漏洞和拒絕服務(wù)漏洞可通過模糊測試進(jìn)行挖掘,訪問控制相關(guān)的漏洞可先用工具進(jìn)行分析后人工挖掘。
畸形數(shù)據(jù)包的構(gòu)造是模糊測試的關(guān)鍵,直接決定著模糊測試的效率?;螖?shù)據(jù)包由正常數(shù)據(jù)包變異而來,本測試方案將使用隨機(jī)和基于協(xié)議脆弱點(diǎn)的混合變異進(jìn)行模糊測試,這種測試方法既保證了模糊測試的隨機(jī)性,又提高了測試的針對性。
畸形數(shù)據(jù)包的構(gòu)造主要在于正常數(shù)據(jù)包字段的變異,字段變異的策略有超長字符串、格式化字符串等,下面以NOTIFY消息數(shù)據(jù)包和SOAP方法調(diào)用數(shù)據(jù)包為例進(jìn)行說明。
NOTIFY數(shù)據(jù)包是UPnP設(shè)備廣播的數(shù)據(jù)包,UPnP控制點(diǎn)將接收并解析該數(shù)據(jù)包。NOTIFY數(shù)據(jù)包的Location字段為字符串類型,用于標(biāo)識UPnP設(shè)備的描述文件地址,控制點(diǎn)接收到此消息會(huì)去Location字段指定的URL獲取設(shè)備描述,下面畸形數(shù)據(jù)包變異了Location字段:
控制點(diǎn)使用SOAP方法調(diào)用UPnP設(shè)備提供的接口方法,不同的接口方法 SOAP報(bào)文結(jié)構(gòu)不同,下面展示了對路由器的AddPortMapping方法中NewRemoteHost字段的變異:
根據(jù)2.1節(jié)得到的UPnP協(xié)議脆弱點(diǎn),我們設(shè)計(jì)了如圖2測試流程。
其中,掃描器實(shí)現(xiàn)了對待測設(shè)備的掃描,掃描得到待測設(shè)備的設(shè)備信息并將其寫入數(shù)據(jù)庫;監(jiān)控器對待測設(shè)備的異常進(jìn)行監(jiān)控,并將異常反饋到檢測核心;檢測核心根據(jù)數(shù)據(jù)庫中的設(shè)備信息,對待測設(shè)備進(jìn)行模糊測試;漏洞驗(yàn)證模塊主要對已檢測出的漏洞進(jìn)行驗(yàn)證,保證測試結(jié)果的準(zhǔn)確性。
我們使用 python語言實(shí)現(xiàn)該模糊測試工具,該測試工具在Linux下運(yùn)行,只需將該測試工具和被測設(shè)備連入同一網(wǎng)段即可進(jìn)行測試。該工具可自動(dòng)獲取 UPnP設(shè)備信息并完成模糊測試,測試得到的UPnP設(shè)備漏洞將存入數(shù)據(jù)庫并展示給測試人員,實(shí)現(xiàn)了完全的自動(dòng)化測試。
圖2 協(xié)議測試流程
針對UPnP的兩類節(jié)點(diǎn)(UPnP設(shè)備和控制點(diǎn))的測試方法不同,由于UPnP控制點(diǎn)是無法提供服務(wù)(沒有服務(wù)端口),我們在UPnP組播網(wǎng)絡(luò)中對其進(jìn)行模糊測試,使用ping技術(shù)進(jìn)行異常監(jiān)控;對于UPnP設(shè)備,我們先獲得其UPnP端口和提供的服務(wù),而后根據(jù)獲得的服務(wù)進(jìn)行模糊測試,使用端口檢測技術(shù)進(jìn)行異常監(jiān)控。在整個(gè)測試流程中,除了訪問控制類的漏洞需人工進(jìn)行測試,其他測試均可自動(dòng)進(jìn)行。其中,模糊測試和設(shè)備監(jiān)控同時(shí)進(jìn)行、互不干擾,保證了異常監(jiān)控的準(zhǔn)確性和實(shí)時(shí)性。
根據(jù)我們的UPnP協(xié)議模糊測試方案,我們設(shè)計(jì)了圖3的系統(tǒng)架構(gòu):
圖3 測試工具系統(tǒng)架構(gòu)
我們使用該模糊測試工具對多款UPnP設(shè)備進(jìn)行了測試,發(fā)現(xiàn)多個(gè)安全漏洞,表1為測試結(jié)果(考慮部分漏洞未公布,對未公布漏洞的路由品牌未列出):
表1 UPnP設(shè)備測試結(jié)果
模糊測試得到漏洞的某品牌路由器1和某品牌路由器2的漏洞信息如下:
(1)某品牌路由器 1接口方法均可未授權(quán)進(jìn)行訪問,其實(shí)帶參數(shù)的接口方法若參數(shù)中含有“>>x00”字符會(huì)導(dǎo)致UPnP服務(wù)崩潰(無法自動(dòng)重啟)產(chǎn)生拒絕服務(wù);
(2)某品牌路由器 2接口方法均可未授權(quán)訪問,其中“AddPortMapping”方法中的“NewPortMappingDescription”字段為空時(shí)導(dǎo)致UPnP服務(wù)崩潰(自動(dòng)重啟)。
本文對UPnP協(xié)議進(jìn)行了詳細(xì)的分析和研究,通過漏洞調(diào)研明確了UPnP協(xié)議的測試點(diǎn)和測試方法,最終設(shè)計(jì)出UPnP協(xié)議測試方案,并使用python語言實(shí)現(xiàn)了自動(dòng)化的UPnP協(xié)議模糊測試工具。我們使用該工具對多款UPnP設(shè)備進(jìn)行了測試,發(fā)現(xiàn)部分UPnP設(shè)備存在安全漏洞,測試結(jié)表明該模糊測試工具具有可用性和高效性。