前言
虹科Vdoo的安全研究團(tuán)隊(duì)對(duì)領(lǐng)先的物聯(lián)網(wǎng)產(chǎn)品和安全設(shè)備進(jìn)行了大規(guī)模的安全研究,為了提高效率和透明度,此過(guò)程設(shè)備供應(yīng)商也參與其中。
這項(xiàng)研究的一部分是研究人員在多家供應(yīng)商的設(shè)備中發(fā)現(xiàn)了零日漏洞。這些漏洞我們已經(jīng)負(fù)責(zé)任地以最佳方式向供應(yīng)商披露,并將在披露期限結(jié)束后逐步分享。
我們發(fā)現(xiàn)易受攻擊設(shè)備的供應(yīng)商之一是??低?/u>。研究團(tuán)隊(duì)在??低暟踩珨z像機(jī)中發(fā)現(xiàn)了一個(gè)漏洞。攻擊者利用該漏洞能成功獲取攝像機(jī)IP地址,并且使用攝像機(jī)的root特權(quán)(通過(guò)LAN或Internet)遠(yuǎn)程執(zhí)行代碼。虹科Vdoo負(fù)責(zé)任地披露了此漏洞(CVE-2018-6414),并與??低暤陌踩珗F(tuán)隊(duì)合作解決了此問(wèn)題。
該漏洞并未在現(xiàn)場(chǎng)得到利用,因此不會(huì)對(duì)海康威視客戶(hù)造成任何具體的隱私侵犯或安全威脅。??低晥F(tuán)隊(duì)迅速采取了行動(dòng),修補(bǔ)了此漏洞,并將其他易受攻擊的產(chǎn)品也安裝了補(bǔ)丁。
技術(shù)概述
攝像機(jī)運(yùn)行Linux操作系統(tǒng)。davinci進(jìn)程包括攝像機(jī)的許多功能,比如Web服務(wù)器,并以使用者ID 0特權(quán)運(yùn)行(用戶(hù)ID名為“admin”,當(dāng)使用者ID為0時(shí),它有效地賦予了root特權(quán))。攝像頭的Web界面基于Embedthis appweb 3 Web服務(wù)器,??低暈槠涮砑恿艘恍┐a。
??低曁砑恿薟eb服務(wù)器的一些特殊頁(yè)面來(lái)控制攝像機(jī)的設(shè)置,通常這些特殊頁(yè)面僅在HTTP身份驗(yàn)證通過(guò)后運(yùn)行,但是其中一些頁(yè)面不需要身份驗(yàn)證。
在處理對(duì)不需要HTTP身份驗(yàn)證的頁(yè)面的請(qǐng)求的代碼中,存在對(duì)sscanf的非安全調(diào)用,當(dāng)使用特制請(qǐng)求時(shí),該調(diào)用會(huì)導(dǎo)致緩沖區(qū)溢出,從而損壞內(nèi)存和導(dǎo)致任意代碼執(zhí)行或進(jìn)程崩潰。
技術(shù)挑戰(zhàn)
此漏洞使攻擊者可以在相機(jī)的固件中執(zhí)行他們選擇的一段代碼。當(dāng)用戶(hù)使用登錄網(wǎng)頁(yè)登錄時(shí),將發(fā)送一個(gè)POST請(qǐng)求,其中也可以包含GET參數(shù)。
在解析特定GET參數(shù)的代碼中,有一個(gè)對(duì)isoc99_sscanf的調(diào)用。該isoc99_sscanf函數(shù)類(lèi)似于已知的scanf函數(shù),但不是從stdin讀取它的輸入,而是從一個(gè)字符串輸入。在這種情況下,輸入的字符串包含請(qǐng)求查詢(xún)字符串:

函數(shù)的格式字符串由參數(shù)名稱(chēng)組成,后面連接“ =%s”。這意味著函數(shù)期望字符串以參數(shù)名稱(chēng)開(kāi)頭,后面連接“ =”,然后將其后的任何字符串讀入上圖中名為“ s1”的堆棧變量中。這允許我們向堆棧中寫(xiě)入任意數(shù)量的字節(jié),%s沒(méi)有限制。唯一的限制是Web服務(wù)器應(yīng)用于整個(gè)URI(包括查詢(xún)字符串)的限制。
在頁(yè)面背后的任何邏輯發(fā)生之前,首先應(yīng)用Web服務(wù)器的限制,如appweb 3源代碼所示(可以在github上查找):

通過(guò)查看相關(guān)功能,可以找到??低晹z像機(jī)分配給maxUrl的值:

將偽代碼與原始代碼進(jìn)行比較時(shí),很容易理解“ v3 [52]”代表conn-》 http-》 limits,并且該值的偏移量是48。當(dāng)找到用于初始化值的函數(shù)時(shí)我們將看到該值設(shè)置為0x400(這與原始appweb 3源代碼中找到的值不同):

當(dāng)使用GET變量從0x400中減去URI的長(zhǎng)度時(shí),我們得到了可以在變量的值中使用的有效負(fù)載的限制。我們?nèi)匀恍枰獜脑撝抵袦p去一個(gè)字節(jié),因?yàn)檫€檢查了URI的長(zhǎng)度是否相等?,F(xiàn)在,我們可以檢查可用字節(jié)可以做什么。
回到漏洞的函數(shù),我們將觀察堆??蚣懿z查其中的“ s1”變量的偏移量。在此特定固件中,變量位于與堆棧起始位置足夠近的偏移量處,這意味著我們可能會(huì)溢出到堆棧幀的起始位置。但是,在我們檢查的某些其他固件版本中,該變量位于堆棧的較低地址,這不允許我們到達(dá)堆棧幀的起始位置。在這種情況下,如果通過(guò)覆蓋駐留在堆??蚣苌系淖兞?,漏洞可能仍會(huì)部分被利用。
由于調(diào)用函數(shù)的返回地址位于堆棧幀的起始位置,因此通過(guò)覆蓋它,我們可以控制接下來(lái)要運(yùn)行的代碼(在函數(shù)返回時(shí))。
由于攻擊是基于%s sscanf格式說(shuō)明符的,因此我們不能在攻擊中使用任何空格,也不能使用NULL字符。這限制了我們,因?yàn)榇a部分中的所有地址都以NULL字節(jié)開(kāi)頭。但是,我們使用了眾所周知的技術(shù)來(lái)克服此限制。
幫助利用此漏洞的一件重要的事是,雖然已將ASLR用于已加載的共享庫(kù),但未將其用于固件的主要二進(jìn)制文件。因此,可以準(zhǔn)確知道代碼所在的位置,從而使我們可以跳至自己選擇的代碼段。我們還可以看到?jīng)]有使用stack canaries,因此我們可以安全地覆蓋堆棧的內(nèi)容,而無(wú)需對(duì)其進(jìn)行檢查。
完成所有操作后,我們需要選擇一個(gè)地址跳轉(zhuǎn)至該地址。例如,類(lèi)似于Foscam PoC,我們選擇跳到一段代碼來(lái)重置設(shè)備的憑據(jù),從而使我們能夠以管理員身份登錄設(shè)備。然后,作為設(shè)備管理員,我們可以控制任何設(shè)置,包括使用自定義固件升級(jí)設(shè)備的能力。
考慮到此漏洞帶來(lái)的風(fēng)險(xiǎn),我們決定不發(fā)布PoC,以保護(hù)尚未升級(jí)其設(shè)備的用戶(hù)免受惡意攻擊。
給設(shè)備制造商的建議
攻擊者很容易發(fā)現(xiàn)并利用相機(jī)中的不良體系結(jié)構(gòu)導(dǎo)致的漏洞,因此制造商應(yīng)該檢查其設(shè)備研發(fā)過(guò)程中是否存在以下問(wèn)題:
1.使用不安全的函數(shù)。sscanf是一個(gè)潛在的不安全函數(shù),尤其是與%s或%[]一起使用時(shí)。可以在支持的API中用sscanf_s替換sscanf,或者可以通過(guò)添加長(zhǎng)度說(shuō)明符來(lái)安全使用sscanf(需要確保長(zhǎng)度小于緩沖區(qū)長(zhǎng)度,應(yīng)謹(jǐn)慎使用)。
最佳操作是即使在特定情況下也不要使用任何不安全的功能版本,定期使用它們很危險(xiǎn)。特別是,建議不要使用sscanf。固件中發(fā)現(xiàn)的其他可能不安全的功能包括strcpy(可以替換為strncpy),strcat(可以替換為strncat),sprintf(可以替換為snprintf)等等。
2.主二進(jìn)制文件缺少ASLR。ASLR已在設(shè)備上運(yùn)行的Linux OS中實(shí)現(xiàn)并打開(kāi),唯一要做的更改是通過(guò)在GCC上添加“ -pie-fPIE”標(biāo)志來(lái)使其與主要二進(jìn)制文件兼容。使用此功能,攻擊者無(wú)法猜測(cè)他想跳轉(zhuǎn)到的功能地址。
3.缺少stack canaries。這是一個(gè)非常簡(jiǎn)單且重要的安全功能,可以通過(guò)在GCC中添加“ -fstack-protector-all”標(biāo)志來(lái)啟用該功能,當(dāng)可執(zhí)行文件識(shí)別出堆棧受到破壞時(shí)將崩潰。這將導(dǎo)致短暫的拒絕服務(wù),但至少它不允許攻擊者運(yùn)行其選擇的代碼。
重要的是要注意此功能可能會(huì)導(dǎo)致性能下降,因?yàn)閷?duì)每個(gè)功能都檢查了stack canaries。如果性能下降使其無(wú)法使用,則可以控制stack canaries的創(chuàng)建,并將其設(shè)置為僅放在極容易遭受基于堆棧的緩沖區(qū)攻擊的函數(shù)上。這可以通過(guò)將“ -fstack-protector”標(biāo)志與“ --param ssp-buffer-size”一起使用來(lái)完成。
4.URL參數(shù)應(yīng)該被清理為僅包含ASCII可打印字符。與ASLR結(jié)合使用,將降低該漏洞的利用率。
5.使用對(duì)稱(chēng)加密對(duì)固件文件進(jìn)行加密。這使攻擊者可以打開(kāi)固件進(jìn)行研究。
6.固件文件未經(jīng)過(guò)數(shù)字簽名。這使攻擊者可以重新打包惡意固件,供應(yīng)商應(yīng)考慮簽署其固件,以防止受到這種威脅。
7.在我們研究的固件中,使用了appweb 3,特別是它的舊版本-長(zhǎng)期未維護(hù)。如https://www.embedthis.com/appweb/download.html 所述,此版本以及一些較新的版本被稱(chēng)為“壽命終止”,這意味著它將不會(huì)獲得任何安全補(bǔ)丁。
8.該設(shè)備的幾乎所有邏輯都包含在一個(gè)二進(jìn)制文件中。當(dāng)所有內(nèi)容都在一個(gè)二進(jìn)制文件中時(shí),特權(quán)分離就會(huì)減少,這會(huì)增加攻擊面。例如,任何設(shè)備功能中可能存在的拒絕服務(wù)漏洞都將使主進(jìn)程崩潰,并且許多設(shè)備功能也將遭受損失,而不僅僅是使負(fù)責(zé)特定邏輯的進(jìn)程崩潰。將攝像機(jī)的邏輯劃分為不同的二進(jìn)制文件可能還會(huì)使利用代碼執(zhí)行漏洞變得更加困難,因?yàn)檫M(jìn)程內(nèi)存中的可用代碼更少,無(wú)法跳轉(zhuǎn)。
編輯:jq
-
GCC
+關(guān)注
關(guān)注
0文章
112瀏覽量
26247 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4417瀏覽量
67499 -
代碼
+關(guān)注
關(guān)注
30文章
4967瀏覽量
73954 -
??低?/span>
+關(guān)注
關(guān)注
16文章
628瀏覽量
75303
原文標(biāo)題:虹科案例|安全性防護(hù)平臺(tái)-??低晹z像機(jī)中的重大漏洞
文章出處:【微信號(hào):Hongketeam,微信公眾號(hào):廣州虹科電子科技有限公司】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
探究??低晹z像機(jī)中的重大漏洞
評(píng)論