日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
淺析IOT二進(jìn)制靜態(tài)輔助方法

一、預(yù)備知識(shí)

1.1 污點(diǎn)分析

污點(diǎn)分析是一種跟蹤并分析污點(diǎn)信息在程序中流動(dòng)的技術(shù)。在漏洞分析中,使用污點(diǎn)分析技術(shù)將所感興趣的數(shù)據(jù)(通常來(lái)自程序的外部輸入)標(biāo)記為污點(diǎn)數(shù)據(jù),然后通過(guò)跟蹤和污點(diǎn)數(shù)據(jù)相關(guān)的信息的流向,可以知道它們是否會(huì)影響某些關(guān)鍵的程序操作,進(jìn)而挖掘程序漏洞。即將程序是否存在某種漏洞的問(wèn)題轉(zhuǎn)化為污點(diǎn)信息是否會(huì)被 Sink 點(diǎn)上的操作所使用的問(wèn)題。

為閻良等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及閻良網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站制作、網(wǎng)站建設(shè)、閻良網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

使用污點(diǎn)分析檢測(cè)程序漏洞的工作原理如下圖所示:

1.2 符號(hào)執(zhí)行

符號(hào)執(zhí)行起初應(yīng)用于基于源代碼的安全檢測(cè)中,它通過(guò)符號(hào)表達(dá)式來(lái)模擬程序的執(zhí)行,將程序的輸出表示成包含這些符號(hào)的邏輯或數(shù)學(xué)表達(dá)式,從而進(jìn)行語(yǔ)義分析。

程序中變量的取值可以被表示為符號(hào)值和常量組成的計(jì)算表達(dá)式,而一些程序漏洞可以表現(xiàn)為某些相關(guān)變量的取值不滿足相應(yīng)的約束,這時(shí)通過(guò)判斷表示變量取值的表達(dá)式是否可以滿足相應(yīng)的約束,就可以判斷程序是否存在相應(yīng)的漏洞。

使用符號(hào)執(zhí)行檢測(cè)程序漏洞的原理如下圖所示:

1.3 環(huán)境準(zhǔn)備

本文選用某廠商路由器的upnpd二進(jìn)制文作為實(shí)例,筆者在很久以前的一篇文章中對(duì)upnpd(CVE-2020-9373)挖掘利用作過(guò)分析,之后不同型號(hào)相繼爆出類似問(wèn)題。

  • 固件結(jié)構(gòu)

在上述文章中筆者對(duì)結(jié)構(gòu)作過(guò)分析,這里不贅述,結(jié)構(gòu)如下圖:

解包之分接單,直接通過(guò)binwalk提取,CPU架構(gòu)為ARMv5,文件系統(tǒng)是Squashfs。

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
58 0x3A TRX firmware header, little endian, image size: 32653312 bytes, CRC32: 0x5CEAB739, flags: 0x0, version: 1, header size: 28 bytes, loader offset: 0x1C, linux kernel offset: 0x21AB50, rootfs offset: 0x0
86 0x56 LZMA compressed data, properties: 0x5D, dictionary size: 65536 bytes, uncompressed size: 5470272 bytes
2206602 0x21AB8A Squashfs filesystem, little endian, version 4.0, compression:xz, size: 30443160 bytes, 1650 inodes, blocksize: 131072 bytes, created: 2018-12-13 04:36:38
  • 漏洞簡(jiǎn)介

漏洞成因是upnpd服務(wù)中解析 SSDP 協(xié)議數(shù)據(jù)包的代碼存在缺陷,導(dǎo)致未經(jīng)授權(quán)的遠(yuǎn)程攻擊者可以發(fā)送特制的數(shù)據(jù)包使得棧溢出,進(jìn)一步實(shí)現(xiàn)RCE。

漏洞原理很簡(jiǎn)單, strcpy()拷貝導(dǎo)致的緩沖區(qū)溢出,在 sub_1D020()中使用 recvfrom()從接受最大長(zhǎng)度 0x1fff的 UDP 報(bào)文數(shù)據(jù)。

在 ?sub_25E04()?中調(diào)用 strcpy()?將以上數(shù)據(jù)拷貝到大小為 0x634 - 0x58 = 0x5dc?的 buffer。

下文工具測(cè)試結(jié)果中就要重點(diǎn)關(guān)注sub_25E04調(diào)用strcpy()是否出現(xiàn)。

1.4 工具簡(jiǎn)介

BinAbsInspector

BinAbsInspector是Keenlab開發(fā)的用于自動(dòng)化逆向工程和掃描二進(jìn)制文件漏洞的靜態(tài)分析器,其基于 Ghidra 的 Pcode 而不是匯編,目前支持 x86、x64、armv7 和 aarch64 上的二進(jìn)制文件。

到目前為止 BinAbsInspector 支持以下漏洞檢測(cè):

  • CWE78(OS Command Injection)
  • CWE119(Buffer Overflow (generic case))
  • CWE125(Buffer Overflow (Out-of-bounds Read))
  • CWE134(Use of Externally-Controlled Format string)
  • CWE190(Integer overflow or wraparound)
  • CWE367(Time-of-check Time-of-use (TOCTOU))
  • CWE415(Double free)
  • CWE416(Use After Free)
  • CWE426(Untrusted Search Path)
  • CWE467(Use of sizeof() on a pointer type)
  • CWE476(NULL Pointer Dereference)
  • CWE676(Use of Potentially Dangerous Function)
  • CWE787(Buffer Overflow (Out-of-bounds Write))

SaTC

SaTC是上海交大研究人員提出的IoT漏洞自動(dòng)化挖掘方法,相應(yīng)的學(xué)術(shù)論文已在 USENIX Security 2021【2】發(fā)表。

與BinAbsInspector通用性不同,SaTC則是專注IOT漏洞挖掘?,F(xiàn)有嵌入式系統(tǒng)中的許多漏洞都位于web服務(wù)中,尋找這些漏洞的關(guān)鍵是如何定位后端程序中用于處理與用戶輸入數(shù)據(jù)相關(guān)的代碼,而Web前端文件(html、js、xml等)中存在的一些關(guān)鍵字符串通常與后端二進(jìn)制文件之間共享,也就是說(shuō)承載用戶輸入數(shù)據(jù)的某個(gè)參數(shù)名稱在前端文件與后端文件中都會(huì)存在?;诖耍琒aTC將解壓后的固件目錄作為輸入,然后全程自動(dòng)完成提取關(guān)鍵字符串、定位后端程序中關(guān)鍵字符串的引用位置、以引用點(diǎn)為起始位置進(jìn)行污點(diǎn)分析,最終輸出了所有可能存在漏洞的指令位置,同時(shí)還給出了從輸入點(diǎn)到漏洞指令位置的函數(shù)調(diào)用鏈條。

Rhabdomancer

Rhabdomancer是一個(gè)簡(jiǎn)單的Ghidra腳本,它將對(duì)可能不安全的API函數(shù)的所有調(diào)用定位在二進(jìn)制文件中。研究人員可以從這些候選點(diǎn)回溯,以找到二進(jìn)制文件脆弱性。

  • Haruspex + semgrep
  • Haruspex?是另一個(gè) Ghidra 腳本,它能夠以適合導(dǎo)入到 IDE(如 VS Code?)或靜態(tài)分析工具(如 Semgrep)解析的格式提取 Ghidra 反編譯器生成的所有偽代碼。
  • Semgrep?是經(jīng)過(guò)專門設(shè)計(jì)的,可幫助審計(jì)員識(shí)別潛在的錯(cuò)誤,并在 C/C++ 代碼中找到熱點(diǎn),以便將注意力集中在這些代碼上。

Haruspex + semgrep給了二進(jìn)制漏洞分析另一種“旁門左道”的分析思路,即先利用Haruspex反編譯成偽代碼,再通過(guò)semgrep對(duì)偽代碼作審計(jì),即轉(zhuǎn)黑為白的測(cè)試方法。

二、靜態(tài)分析

不需要氪金買設(shè)備,不需要解決各種頭疼的模擬錯(cuò)誤,下面開始愉快地靜態(tài)分析。

2.1 BinAbsInspector

安裝

將[ghidra_10.1.2_PUBLIC_20220420_BinAbsInspector.zip]()拷貝至ghidra_10.1.2_PUBLIC_20220125\\ghidra_10.1.2_PUBLIC\\Extensions\\Ghidra目錄下,

點(diǎn)擊file->install extension,選擇執(zhí)行插件安裝,這里注意版本要對(duì)應(yīng)上:

此外還需安裝[z3 lib](),如果z3 lib沒(méi)有裝成功,可以先不勾選z3。

  • 測(cè)試

用Ghidra打開upnpd二進(jìn)制文件,選擇windows→Script Manager→BinAbsInspector,等待分析結(jié)束即可:

當(dāng)然CWE規(guī)則可以自行選擇,這里默認(rèn)全選,所以檢測(cè)出的結(jié)果比較多……

  • 分析

可以看到把所有認(rèn)為的危險(xiǎn)函數(shù)列出并下了斷點(diǎn),在已知upnpd的漏洞處當(dāng)然也有標(biāo)識(shí):

但其缺點(diǎn)在于沒(méi)有作過(guò)濾(應(yīng)該可以通過(guò)二次開發(fā)解決),所以需要手動(dòng)回溯的信息過(guò)多,實(shí)際使用中必然要結(jié)合其他方式分析。再比如對(duì)strcpy(local_2c[0],s_HTTP/1.1_200_OK_CONTENT-LENGTH:_00081c70)此類固定值也未作判斷,也標(biāo)識(shí)為潛在漏洞點(diǎn):

2.2 SaTC

  • 安裝

SaTC安裝參見Github,當(dāng)然也可直接下載使用Docker:

# 從docker hun拉去image
docker pull smile0304/satc:V1.0

# 進(jìn)入Dokcer環(huán)境, 自行添加目錄映射
docker run -it smile0304/satc:V1.0

值得注意的是在使用中可能報(bào)錯(cuò),下述解決方案可供參考:

(1) Docker: Error response from daemon: cgroups: cgroup mountpoint does not exist: unknown

# 解決方法
$ sudo mkdir /sys/fs/cgroup/systemd
$ sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd

(2) No handlers could be found for logger "root" …… for consistency with C it should have a storage class specifier (usually 'extern') "(usually 'extern')" % (decl.name,))

# 解決方法
# 使用 -b 加參數(shù)時(shí)無(wú)需路徑,只需elf名:
$ python satc.py -d /targetfs/ -o ../lighttpd_result/ --ghidra_script=ref2sink_bof --ghidra_script=ref2sink_cmdi --taint_check -b lighttpd

(3) IOError: [Errno 2] No such file or directory: u'/home/satc/SaTC/SaTC_data/res/keyword_extract_result/simple/.data/downloadFlile.cgi.result’

這是因?yàn)楣碳鄠€(gè)bin共享關(guān)鍵字,調(diào)用順序應(yīng)該為 :前段關(guān)鍵字 -> lighttpd-> xxx.cgi,也就是數(shù)據(jù)是要先經(jīng)過(guò)lighttpd的,使用share2sink從lighttpd中提取使用nvram或env設(shè)置的關(guān)鍵字,然后再追蹤流向cgi的關(guān)鍵字。

# 首先使用ref2share提取關(guān)鍵字
$ python satc.py -d /home/satc/dlink_878 -o /home/satc/res --ghidra_script=ref2share -b prog.cgi
# 在進(jìn)行進(jìn)一步測(cè)試
$ python satc.py -d /home/satc/dlink_878 -o /home/satc/res --ghidra_script=share2sink --ref2share_result=/home/satc/res/ghidra_extract_result/prog.cgi/prog.cgi_ref2share.result -b rc --taint_check

更多細(xì)節(jié)可參見官方issue。

  • 測(cè)試

SaTC針對(duì)性更強(qiáng),但缺陷也教明顯,如果研究的二進(jìn)制文件沒(méi)有與前端共享字符串就很難檢測(cè)出異常。在upnpd檢測(cè)中,通過(guò)以下命令檢測(cè)bof漏洞:

$ python satc.py -d /home/satc/squashfs -o /home/satc/res --ghidra_script=refsink2_bof -b upnpd --taint_check

SaTC運(yùn)行時(shí)間較長(zhǎng),通過(guò)關(guān)鍵字層層過(guò)濾,最后結(jié)果可查詢?info.txt:

可以看到SaTC結(jié)果中給出了回溯信息:

2.3 Rhabdomancer

  • 安裝

無(wú)需安裝,只有一個(gè)java?文件,點(diǎn)擊window→Script Manager→Manager Script Directories,將.java所在文件夾路徑添加即可:

  • 測(cè)試

通過(guò)加載插件可以很快得到結(jié)果:

Rhabdomancer插件功能比較單一,會(huì)將設(shè)置好的關(guān)鍵字過(guò)濾打印,好處是代碼結(jié)構(gòu)很好理解,方便二次開發(fā),下文也會(huì)作進(jìn)一步分析。

2.4 Haruspex + semgrep

Haruspex同樣也是Ghidra插件,安裝同上:

其功能是將二進(jìn)制文件轉(zhuǎn)化成偽代碼,這里在生成的偽代碼文件夾中可以找到upnpd漏洞函數(shù),表現(xiàn)為一個(gè)以函數(shù)地址命名的C文件:

semgrep是一款開源的源代碼審計(jì)工具,適用于**C/C++**等多語(yǔ)言,以插件形式加載。

# 安裝
pip install semgrep
# 加載插件
semgrep --config=auto

此工具屬于源碼審計(jì)范疇,同類工具也比較多,這里就不作贅述,對(duì)該工具感興趣的可參考【3】,效果如下:

三、工具分析

3.1 源碼分析

BinAbsInspector

BinAbsInspector的關(guān)鍵文件包括InterSolver.java、BinAbsInspector.java和CWEXXX.java?,其執(zhí)行流如下圖所示:

  • AbsVal

抽象值(AbsVal)不同于具體值。抽象值由兩部分組成:一個(gè)是該抽象值所在的區(qū)域組件,另一個(gè)是通過(guò)區(qū)域基數(shù)加上區(qū)域內(nèi)的偏移量計(jì)算的值組件。

  • AbsEnv

抽象環(huán)境(AbsEnv)是存儲(chǔ)每個(gè)程序點(diǎn)的程序狀態(tài)的核心數(shù)據(jù)結(jié)構(gòu)。AbsEnv 是從 ALoc 作為鍵到 KSet 作為值的映射。

  • AbsVal

KSet是一個(gè)特殊的集合,可以容納具有大小限制K的抽象值 (AbsVal)。

InterSolver.java將Ghidra P-Code 轉(zhuǎn)化成 KSet,并生成Context和AbsEnv;BinAbsInspector.java先獲取GlobalState.config配置,然后call analyze()進(jìn)入分析引擎InterSolver進(jìn)行分析 ,其輸入是main/e_entry地址(從GlobalState.config讀取,可自定義),接著進(jìn)入到CheckerManager.runCheckers。CheckerManager.runCheckers根據(jù)GlobalState.config配置的CWE選項(xiàng)進(jìn)一步分析。

有關(guān)BinAbsInspector 原理與調(diào)試的更多細(xì)節(jié)可參考BinAbsInspector研究筆記【4】

  • SaTC

SaTC關(guān)注前后端關(guān)鍵字共享,并將其作為污點(diǎn)選取的依據(jù)。

SaTC使用python?開發(fā),結(jié)構(gòu)也十分清晰,stac.py?中通過(guò)前端分析函數(shù)front_analysise(args)?生成bin_list?列表,在根據(jù)參數(shù)進(jìn)一步污點(diǎn)分析:

值得注意的還有ref2share.py,定義了提取關(guān)鍵字,適用于先提取后檢測(cè)的情況:

sinks = ['nvram_safe_set', 'nvram_bufset', 'setenv']
digest = ['strcpy', 'sprintf', 'memcpy', 'strcat']

heuristicIgnoreFunctions = ['strcpy', 'strncpy', 'strcat', 'memcpy']

needCheckConstantStr = {
'system': 0,
'fwrite': 0,
'___system': 0,
'bstar_system': 0,
'popen': 0,
'execve': 0,
'strcpy': 1,
'strcat': 1,
'strncpy': 1,
'memcpy': 1,
'twsystem': 0
}

SaTC輸出目錄含義如下:

  • keyword_extract_result/detail/Clustering_result_v2.result

前端關(guān)鍵字在bin中的匹配情況。為Input Entry Recognition模塊的輸入;

  • ghidra_extract_result/{bin}/*

ghidra腳本的分析結(jié)果。為Input Sensitive Taint Analysise模塊的輸入;

  • result-{bin}-{ghidra_script}-{random}.txt

污點(diǎn)分析結(jié)果。

其他結(jié)果含義如下:

|-- ghidra_extract_result # ghidra尋找函數(shù)調(diào)用路徑的分析結(jié)果, 啟用`--ghidra_script`選項(xiàng)會(huì)輸出該目錄
| |-- httpd # 每個(gè)被分析的bin都會(huì)生成一個(gè)同名文件夾
| |-- httpd # 被分析的bin
| |-- httpd_ref2sink_bof.result # 定位bof類型的sink函數(shù)路徑
| |-- httpd_ref2sink_cmdi.result # 定位cmdi類型的sink函數(shù)路徑
|-- keyword_extract_result # 關(guān)鍵字提取結(jié)果
| |-- detail # 前端關(guān)鍵字提取結(jié)果(詳細(xì)分析結(jié)果)
| | |-- API_detail.result # 提取的API詳細(xì)結(jié)果
| | |-- API_remove_detail.result # 被過(guò)濾掉的API信息
| | |-- api_split.result # 模糊匹配的API結(jié)果
| | |-- Clustering_result_v2.result # 詳細(xì)分析結(jié)果(不關(guān)心其他過(guò)程關(guān)心此文件即可)
| | |-- File_detail.result # 記錄了從單獨(dú)文件中提取的關(guān)鍵字
| | |-- from_bin_add_para.result # 在二進(jìn)制匹配過(guò)程中新增的關(guān)鍵字
| | |-- from_bin_add_para.result_v2 # 同上,V2版本
| | |-- Not_Analysise_JS_File.result # 未被分析的JS文件
| | |-- Prar_detail.result # 提取的Prar詳細(xì)結(jié)果
| | |-- Prar_remove_detail.result # 被過(guò)濾掉的Prar結(jié)果
| |-- info.txt # 記錄前端關(guān)鍵字提取時(shí)間等信息
| |-- simple # 前端關(guān)鍵字提取結(jié)果, 比較簡(jiǎn)單
| |-- API_simple.result # 在全部二進(jìn)制中出現(xiàn)的全部API名稱
| |-- Prar_simple.result # 在全部二進(jìn)制中出現(xiàn)等的全部Prar
|-- result-httpd-ref2sink_cmdi-ctW8.txt # 污點(diǎn)分析結(jié)果,啟用`--taint-check` 和 `--ghidra_script`選項(xiàng)才會(huì)生成該文件
  • Rhabdomancer

Rhabdomancer結(jié)構(gòu)十分簡(jiǎn)單,通過(guò)tier0,tier1,tier2定義三類Bad函數(shù):

bad.put("[BAD 0]", tier0);
bad.put("[BAD 1]", tier1);
bad.put("[BAD 2]", tier2);
  • tier0:
// these functions are generally considered insecure
// see also
List tier0 = new ArrayList<>(List.of(
// strcpy family
"strcpy", "_strcpy", "strcpyA", "strcpyW", "wcscpy", "_wcscpy", "_tcscpy", "mbscpy", "_mbscpy",
"StrCpy", "StrCpyA", "StrCpyW",
"lstrcpy", "lstrcpyA", "lstrcpyW", "_tccpy", "_mbccpy", "_ftcscpy",
....
  • tier1:
// these functions are interesting and should be checked for insecure use cases
List tier1 = new ArrayList<>(List.of(
// strncpy needs explicit null-termination: buf[sizeof(buf) – 1] = '\\0'
"strncpy", "_strncpy", "wcsncpy", "_tcsncpy", "_mbsncpy", "_mbsnbcpy",
"StrCpyN", "StrCpyNA", "StrCpyNW", "StrNCpy", "strcpynA", "StrNCpyA", "StrNCpyW",
"lstrcpyn", "lstrcpynA", "lstrcpynW", "_csncpy", "wcscpyn",
"stpncpy", "wcpncpy",......
  • tier2:
// code paths involving these functions should be carefully checked
List tier2 = new ArrayList<>(List.of(
// check for insecure use of environment vars
"getenv",
// check for insecure use of arguments
"getopt", "getopt_long",
// check for insecure use of memory allocation functions
// check if size arg can contain negative numbers or zero, return value must be checked
"malloc", "xmalloc",
"calloc", // potential implicit overflow due to integer wrapping
"realloc", "xrealloc", "reallocf", // doesn't initialize memory to zero; realloc(0) is equivalent to free
"valloc", "pvalloc", "memalign", "aligned_alloc", ......

通過(guò)getFunctions和listCalls函數(shù)實(shí)現(xiàn)迭代查找:

// enumerate candidate points at each tier
Iterator>> i = bad.entrySet().iterator();
while (i.hasNext()) {
funcs.clear();
Map.Entry> entry = i.next();
printf("\\n%s\\n\\n", entry.getKey());
entry.getValue().forEach(s -> getFunctions(s, funcs));
funcs.forEach(f -> listCalls(f, entry.getKey() + " " + f.getName()));
}

3.2 進(jìn)一步工作

上述二進(jìn)制輔助工具各有優(yōu)勢(shì),一定程度上提高了分析效率,但在實(shí)際研究中有時(shí)也需要二次開發(fā)加強(qiáng)針對(duì)性,對(duì)于污點(diǎn)的選擇、判斷和回溯準(zhǔn)確性和效率仍是需要重點(diǎn)研究?jī)?yōu)化的方向。

可以將二進(jìn)制輔助工具與固件分析平臺(tái)結(jié)合進(jìn)一步提高自動(dòng)化(懶),如FACT,實(shí)際上FACT已包含cwe_checker作為插件,只是功能較為單一,感興趣的可參考筆者之前的一篇文章FACT二次開發(fā)指北【5】。

四、參考資料

【1】IOT 固件安全 All in One 

【2】Sharing More and Checking Less: Leveraging Common Input Keywords to Detect Bugs in Embedded Systems

【3】 Automating binary vulnerability discovery with Ghidra and Semgrep

【4】 BinAbsInspector研究筆記

【5】FACT二次開發(fā)指北

【6】開源二進(jìn)制文件靜態(tài)漏洞分析工具BinAbsInspector安裝使用

【7】CTF All In One


文章名稱:淺析IOT二進(jìn)制靜態(tài)輔助方法
網(wǎng)站鏈接:http://www.5511xx.com/article/dhhpoii.html