前言
虹科Vdoo的安全研究團(tuán)隊(duì)對領(lǐng)先的物聯(lián)網(wǎng)產(chǎn)品和安全設(shè)備進(jìn)行了大規(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)商之一是海康威視。研究團(tuán)隊(duì)在海康威視安全攝像機(jī)中發(fā)現(xiàn)了一個漏洞。攻擊者利用該漏洞能成功獲取攝像機(jī)IP地址,并且使用攝像機(jī)的root特權(quán)(通過LAN或Internet)遠(yuǎn)程執(zhí)行代碼。虹科Vdoo負(fù)責(zé)任地披露了此漏洞(CVE-2018-6414),并與海康威視的安全團(tuán)隊(duì)合作解決了此問題。
該漏洞并未在現(xiàn)場得到利用,因此不會對海康威視客戶造成任何具體的隱私侵犯或安全威脅。海康威視團(tuán)隊(duì)迅速采取了行動,修補(bǔ)了此漏洞,并將其他易受攻擊的產(chǎn)品也安裝了補(bǔ)丁。
技術(shù)概述
攝像機(jī)運(yùn)行Linux操作系統(tǒng)。davinci進(jìn)程包括攝像機(jī)的許多功能,比如Web服務(wù)器,并以使用者ID 0特權(quán)運(yùn)行(用戶ID名為“admin”,當(dāng)使用者ID為0時,它有效地賦予了root特權(quán))。攝像頭的Web界面基于Embedthis appweb 3 Web服務(wù)器,海康威視為其添加了一些代碼。
海康威視添加了Web服務(wù)器的一些特殊頁面來控制攝像機(jī)的設(shè)置,通常這些特殊頁面僅在HTTP身份驗(yàn)證通過后運(yùn)行,但是其中一些頁面不需要身份驗(yàn)證。
在處理對不需要HTTP身份驗(yàn)證的頁面的請求的代碼中,存在對sscanf的非安全調(diào)用,當(dāng)使用特制請求時,該調(diào)用會導(dǎo)致緩沖區(qū)溢出,從而損壞內(nèi)存和導(dǎo)致任意代碼執(zhí)行或進(jìn)程崩潰。
技術(shù)挑戰(zhàn)
此漏洞使攻擊者可以在相機(jī)的固件中執(zhí)行他們選擇的一段代碼。當(dāng)用戶使用登錄網(wǎng)頁登錄時,將發(fā)送一個POST請求,其中也可以包含GET參數(shù)。
在解析特定GET參數(shù)的代碼中,有一個對isoc99_sscanf的調(diào)用。該isoc99_sscanf函數(shù)類似于已知的scanf函數(shù),但不是從stdin讀取它的輸入,而是從一個字符串輸入。在這種情況下,輸入的字符串包含請求查詢字符串:
函數(shù)的格式字符串由參數(shù)名稱組成,后面連接“ =%s”。這意味著函數(shù)期望字符串以參數(shù)名稱開頭,后面連接“ =”,然后將其后的任何字符串讀入上圖中名為“ s1”的堆棧變量中。這允許我們向堆棧中寫入任意數(shù)量的字節(jié),%s沒有限制。唯一的限制是Web服務(wù)器應(yīng)用于整個URI(包括查詢字符串)的限制。
在頁面背后的任何邏輯發(fā)生之前,首先應(yīng)用Web服務(wù)器的限制,如appweb 3源代碼所示(可以在github上查找):
通過查看相關(guān)功能,可以找到海康威視攝像機(jī)分配給maxUrl的值:
將偽代碼與原始代碼進(jìn)行比較時,很容易理解“ v3 [52]”代表conn-》 http-》 limits,并且該值的偏移量是48。當(dāng)找到用于初始化值的函數(shù)時我們將看到該值設(shè)置為0x400(這與原始appweb 3源代碼中找到的值不同):
當(dāng)使用GET變量從0x400中減去URI的長度時,我們得到了可以在變量的值中使用的有效負(fù)載的限制。我們?nèi)匀恍枰獜脑撝抵袦p去一個字節(jié),因?yàn)檫€檢查了URI的長度是否相等。現(xiàn)在,我們可以檢查可用字節(jié)可以做什么。
回到漏洞的函數(shù),我們將觀察堆棧框架并檢查其中的“ s1”變量的偏移量。在此特定固件中,變量位于與堆棧起始位置足夠近的偏移量處,這意味著我們可能會溢出到堆棧幀的起始位置。但是,在我們檢查的某些其他固件版本中,該變量位于堆棧的較低地址,這不允許我們到達(dá)堆棧幀的起始位置。在這種情況下,如果通過覆蓋駐留在堆棧框架上的變量,漏洞可能仍會部分被利用。
由于調(diào)用函數(shù)的返回地址位于堆棧幀的起始位置,因此通過覆蓋它,我們可以控制接下來要運(yùn)行的代碼(在函數(shù)返回時)。
由于攻擊是基于%s sscanf格式說明符的,因此我們不能在攻擊中使用任何空格,也不能使用NULL字符。這限制了我們,因?yàn)榇a部分中的所有地址都以NULL字節(jié)開頭。但是,我們使用了眾所周知的技術(shù)來克服此限制。
幫助利用此漏洞的一件重要的事是,雖然已將ASLR用于已加載的共享庫,但未將其用于固件的主要二進(jìn)制文件。因此,可以準(zhǔn)確知道代碼所在的位置,從而使我們可以跳至自己選擇的代碼段。我們還可以看到?jīng)]有使用stack canaries,因此我們可以安全地覆蓋堆棧的內(nèi)容,而無需對其進(jìn)行檢查。
完成所有操作后,我們需要選擇一個地址跳轉(zhuǎn)至該地址。例如,類似于Foscam PoC,我們選擇跳到一段代碼來重置設(shè)備的憑據(jù),從而使我們能夠以管理員身份登錄設(shè)備。然后,作為設(shè)備管理員,我們可以控制任何設(shè)置,包括使用自定義固件升級設(shè)備的能力。
考慮到此漏洞帶來的風(fēng)險,我們決定不發(fā)布PoC,以保護(hù)尚未升級其設(shè)備的用戶免受惡意攻擊。
給設(shè)備制造商的建議
攻擊者很容易發(fā)現(xiàn)并利用相機(jī)中的不良體系結(jié)構(gòu)導(dǎo)致的漏洞,因此制造商應(yīng)該檢查其設(shè)備研發(fā)過程中是否存在以下問題:
1.使用不安全的函數(shù)。sscanf是一個潛在的不安全函數(shù),尤其是與%s或%[]一起使用時。可以在支持的API中用sscanf_s替換sscanf,或者可以通過添加長度說明符來安全使用sscanf(需要確保長度小于緩沖區(qū)長度,應(yīng)謹(jǐn)慎使用)。
最佳操作是即使在特定情況下也不要使用任何不安全的功能版本,定期使用它們很危險。特別是,建議不要使用sscanf。固件中發(fā)現(xiàn)的其他可能不安全的功能包括strcpy(可以替換為strncpy),strcat(可以替換為strncat),sprintf(可以替換為snprintf)等等。
2.主二進(jìn)制文件缺少ASLR。ASLR已在設(shè)備上運(yùn)行的Linux OS中實(shí)現(xiàn)并打開,唯一要做的更改是通過在GCC上添加“ -pie-fPIE”標(biāo)志來使其與主要二進(jìn)制文件兼容。使用此功能,攻擊者無法猜測他想跳轉(zhuǎn)到的功能地址。
3.缺少stack canaries。這是一個非常簡單且重要的安全功能,可以通過在GCC中添加“ -fstack-protector-all”標(biāo)志來啟用該功能,當(dāng)可執(zhí)行文件識別出堆棧受到破壞時將崩潰。這將導(dǎo)致短暫的拒絕服務(wù),但至少它不允許攻擊者運(yùn)行其選擇的代碼。
重要的是要注意此功能可能會導(dǎo)致性能下降,因?yàn)閷γ總€功能都檢查了stack canaries。如果性能下降使其無法使用,則可以控制stack canaries的創(chuàng)建,并將其設(shè)置為僅放在極容易遭受基于堆棧的緩沖區(qū)攻擊的函數(shù)上。這可以通過將“ -fstack-protector”標(biāo)志與“ --param ssp-buffer-size”一起使用來完成。
4.URL參數(shù)應(yīng)該被清理為僅包含ASCII可打印字符。與ASLR結(jié)合使用,將降低該漏洞的利用率。
5.使用對稱加密對固件文件進(jìn)行加密。這使攻擊者可以打開固件進(jìn)行研究。
6.固件文件未經(jīng)過數(shù)字簽名。這使攻擊者可以重新打包惡意固件,供應(yīng)商應(yīng)考慮簽署其固件,以防止受到這種威脅。
7.在我們研究的固件中,使用了appweb 3,特別是它的舊版本-長期未維護(hù)。如https://www.embedthis.com/appweb/download.html 所述,此版本以及一些較新的版本被稱為“壽命終止”,這意味著它將不會獲得任何安全補(bǔ)丁。
8.該設(shè)備的幾乎所有邏輯都包含在一個二進(jìn)制文件中。當(dāng)所有內(nèi)容都在一個二進(jìn)制文件中時,特權(quán)分離就會減少,這會增加攻擊面。例如,任何設(shè)備功能中可能存在的拒絕服務(wù)漏洞都將使主進(jìn)程崩潰,并且許多設(shè)備功能也將遭受損失,而不僅僅是使負(fù)責(zé)特定邏輯的進(jìn)程崩潰。將攝像機(jī)的邏輯劃分為不同的二進(jìn)制文件可能還會使利用代碼執(zhí)行漏洞變得更加困難,因?yàn)檫M(jìn)程內(nèi)存中的可用代碼更少,無法跳轉(zhuǎn)。
編輯:jq
-
GCC
+關(guān)注
關(guān)注
0文章
107瀏覽量
24857 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4341瀏覽量
62799 -
代碼
+關(guān)注
關(guān)注
30文章
4808瀏覽量
68808 -
海康威視
+關(guān)注
關(guān)注
16文章
432瀏覽量
73321
原文標(biāo)題:虹科案例|安全性防護(hù)平臺-海康威視攝像機(jī)中的重大漏洞
文章出處:【微信號:Hongketeam,微信公眾號:廣州虹科電子科技有限公司】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論