偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何保護(hù)您的應(yīng)用程序免受堆噴射技術(shù)的影響

安全 應(yīng)用安全
本文不是關(guān)于堆溢出或堆利用的教程。在其中,我們探討了允許攻擊者利用應(yīng)用程序中的漏洞并執(zhí)行惡意代碼的堆噴射技術(shù)。我們定義什么是堆噴射,探索它的工作原理,并展示如何保護(hù)您的應(yīng)用程序免受它的影響。

為您的軟件建立強(qiáng)大的安全性至關(guān)重要。惡意行為者不斷使用各種類(lèi)型的惡意軟件和網(wǎng)絡(luò)安全攻擊來(lái)破壞所有平臺(tái)上的應(yīng)用程序。您需要了解最常見(jiàn)的攻擊并找到緩解它們的方法。

本文不是關(guān)于堆溢出或堆利用的教程。在其中,我們探討了允許攻擊者利用應(yīng)用程序中的漏洞并執(zhí)行惡意代碼的堆噴射技術(shù)。我們定義什么是堆噴射,探索它的工作原理,并展示如何保護(hù)您的應(yīng)用程序免受它的影響。

什么是堆噴射技術(shù),它是如何工作的?

堆噴射是一種用于促進(jìn)執(zhí)行任意代碼的漏洞利用技術(shù)。這個(gè)想法是在目標(biāo)應(yīng)用程序中的可預(yù)測(cè)地址上提供一個(gè)shellcode,以便使用漏洞執(zhí)行這個(gè) shellcode。該技術(shù)是由稱(chēng)為heap spray的漏洞利用源代碼的一部分實(shí)現(xiàn)的。

在實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存管理器時(shí),開(kāi)發(fā)人員面臨許多挑戰(zhàn),包括堆碎片。一個(gè)常見(jiàn)的解決方案是以固定大小的塊分配內(nèi)存。通常,堆管理器對(duì)塊的大小以及分配這些塊的一個(gè)或多個(gè)保留池有自己的偏好。堆噴射使目標(biāo)進(jìn)程連續(xù)地逐塊分配所需內(nèi)容的內(nèi)存,依靠將 shellcode 放置在所需地址的分配之一(不檢查任何條件)。

堆噴射本身不會(huì)利用任何安全問(wèn)題,但它可用于使現(xiàn)有漏洞更容易被利用。

必須了解攻擊者如何使用堆噴射技術(shù)來(lái)了解如何緩解它。以下是普通攻擊的樣子:

堆噴射如何影響進(jìn)程內(nèi)存

堆噴射攻擊有兩個(gè)主要階段:

1.內(nèi)存分配階段。一些流連續(xù)分配大量具有相同內(nèi)容的固定大小的內(nèi)存塊。

2.執(zhí)行階段。這些堆分配之一接收對(duì)進(jìn)程內(nèi)存的控制。

如您所見(jiàn),堆噴射漏洞利用技術(shù)看起來(lái)像連續(xù)的垃圾郵件,形式為大小相同且內(nèi)容相同的塊。如果堆噴射攻擊成功,控制權(quán)將傳遞給這些塊之一。

為了執(zhí)行這種攻擊,惡意行為者需要有機(jī)會(huì)在目標(biāo)進(jìn)程中分配大量所需大小的內(nèi)存,并用相同的內(nèi)容填充這些分配。這個(gè)要求可能看起來(lái)過(guò)于大膽,但最常見(jiàn)的堆噴射攻擊案例包括破壞Web 應(yīng)用程序漏洞。任何支持腳本語(yǔ)言的應(yīng)用程序(例如,帶有 Visual Basic 的 Microsoft Office)都是堆噴射攻擊的潛在受害者。

因此,在一個(gè)流的上下文中預(yù)期攻擊是有意義的,因?yàn)槟_本通常在單個(gè)流中執(zhí)行。

但是,攻擊者不僅可以使用腳本語(yǔ)言執(zhí)行堆噴射攻擊。其他方法包括將圖像文件加載到進(jìn)程中,并通過(guò)使用 HTML5 引入的技術(shù)以非常高的分配粒度噴射堆。

這里的問(wèn)題是哪個(gè)階段可疑,我們可以干預(yù)并試圖弄清楚是否存在正在進(jìn)行的攻擊?

內(nèi)存分配階段,當(dāng)一些流填滿(mǎn)大量?jī)?nèi)存時(shí),已經(jīng)很可疑了。但是,您應(yīng)該問(wèn)自己是否可能存在誤報(bào)。例如,您的應(yīng)用程序中可能存在確實(shí)在一個(gè)循環(huán)中分配內(nèi)存的腳本或代碼,例如數(shù)組或特殊內(nèi)存池。當(dāng)然,腳本在完全相同的堆塊中分配內(nèi)存的可能性很小。但是,它仍然不是堆噴射的關(guān)鍵要求。

相反,您應(yīng)該注意執(zhí)行階段,因?yàn)榉治鼋邮者M(jìn)程內(nèi)存控制權(quán)的堆分配總是有意義的。因此,我們的分析將特別關(guān)注包含潛在 shellcode 的分配內(nèi)存。

為了將堆噴射 shellcode 的執(zhí)行與普通JIT代碼生成區(qū)分開(kāi)來(lái),您可以分析分配某個(gè)內(nèi)存塊的最新流分配,包括流中的相鄰分配。請(qǐng)注意,堆中的內(nèi)存始終分配有執(zhí)行權(quán)限,這允許攻擊者使用堆噴射技術(shù)。

堆噴射緩解基礎(chǔ)知識(shí)

為了成功緩解堆噴射攻擊,我們需要管理接收內(nèi)存控制的過(guò)程,應(yīng)用鉤子,并使用額外的安全機(jī)制。

保護(hù)您的應(yīng)用程序免受堆噴射執(zhí)行的三個(gè)步驟是:

1.攔截NtAllocateVirtualMemory調(diào)用

2.在嘗試分配可執(zhí)行內(nèi)存期間使其無(wú)法執(zhí)行

3.注冊(cè)結(jié)構(gòu)化異常處理程序 (SEH) 以處理由于執(zhí)行不可執(zhí)行內(nèi)存而發(fā)生的異常

現(xiàn)在讓我們?cè)敿?xì)探討每個(gè)步驟。

接收對(duì)內(nèi)存的控制

我們既需要監(jiān)控目標(biāo)進(jìn)程如何分配內(nèi)存,又需要檢測(cè)動(dòng)態(tài)分配內(nèi)存的執(zhí)行情況。后者假設(shè)在堆噴射期間分配的內(nèi)存具有執(zhí)行權(quán)限。如果數(shù)據(jù)執(zhí)行保護(hù) ( DEP ) 處于活動(dòng)狀態(tài)(對(duì)于 x64,默認(rèn)情況下始終處于活動(dòng)狀態(tài))并且嘗試執(zhí)行沒(méi)有執(zhí)行權(quán)限分配的內(nèi)存,則會(huì)生成異常訪(fǎng)問(wèn)沖突。

惡意 shellcode 可以預(yù)期在沒(méi)有 DEP 的應(yīng)用程序中執(zhí)行(這不太可能),或者使用腳本引擎在默認(rèn)情況下具有執(zhí)行權(quán)限的堆中分配內(nèi)存。

我們可以通過(guò)攔截可執(zhí)行內(nèi)存的分配并以分配它的漏洞無(wú)法察覺(jué)的方式使其不可執(zhí)行來(lái)防止惡意代碼的執(zhí)行。因此,當(dāng)漏洞利用認(rèn)為噴射是安全的執(zhí)行并嘗試將控制權(quán)委托給噴射的堆時(shí),將觸發(fā)系統(tǒng)異常。然后,我們可以分析這個(gè)系統(tǒng)異常。

首先,讓我們從用戶(hù)模式進(jìn)程的角度來(lái)探索 Windows 中的內(nèi)存工作是什么樣的。以下是通常分配大量?jī)?nèi)存的方式:

在哪里:

  • HeapAlloc和RtlAllocateHeap是從堆中分配一塊內(nèi)存的函數(shù)。
  • NtAllocateVirtualMemory是一個(gè)低級(jí)函數(shù),它是 NTDLL 的一部分,不應(yīng)直接調(diào)用。
  • sysenter是用于切換到內(nèi)核模式的處理器指令。

如果我們?cè)O(shè)法替換NtAllocateVirtualMemory,我們將能夠攔截進(jìn)程內(nèi)存中的堆分配流量。

應(yīng)用掛鉤

為了攔截目標(biāo)函數(shù)NtAllocateVirtualMemory的執(zhí)行,我們將使用 mhook 庫(kù)。您可以選擇原始庫(kù)或改進(jìn)版本。

使用 mhook 庫(kù)很容易:您需要?jiǎng)?chuàng)建一個(gè)與目標(biāo)函數(shù)具有相同簽名的鉤子,并通過(guò)調(diào)用Mhook_SetHook來(lái)實(shí)現(xiàn)它。鉤子是通過(guò)在函數(shù)體上使用jmp指令覆蓋函數(shù)prolog來(lái)實(shí)現(xiàn)的。如果您已經(jīng)使用過(guò)鉤子,那么您應(yīng)該沒(méi)有任何困難。

安全機(jī)制

有兩種安全機(jī)制可以幫助我們緩解堆噴射攻擊:數(shù)據(jù)執(zhí)行預(yù)防和結(jié)構(gòu)化異常處理。

結(jié)構(gòu)化異常處理或 SEH是一種特定于 Windows 操作系統(tǒng)的錯(cuò)誤處理機(jī)制。當(dāng)發(fā)生錯(cuò)誤(例如,除以零)時(shí),應(yīng)用程序的控制權(quán)被重定向到內(nèi)核,內(nèi)核會(huì)找到一系列處理程序并逐個(gè)調(diào)用它們,直到其中一個(gè)處理程序?qū)惓?biāo)記為“已處理”。通常,內(nèi)核將允許流程從檢測(cè)到錯(cuò)誤的那一刻起繼續(xù)執(zhí)行。

從進(jìn)程的角度來(lái)看,DEP 看起來(lái)像是在內(nèi)存執(zhí)行時(shí)出現(xiàn) EXCEPTION_ACCESS_VIOLATION 錯(cuò)誤代碼的 SEH 異常。

對(duì)于 x86 應(yīng)用程序,我們有兩個(gè)陷阱:

DEP可以在系統(tǒng)參數(shù)中關(guān)閉。

  • 指向處理程序列表的指針存儲(chǔ)在堆棧中,它提供了兩個(gè)潛在的攻擊向量:處理程序指示器覆蓋和堆棧替換。
  • 在 x64 應(yīng)用程序中,不會(huì)出現(xiàn)這些問(wèn)題。

防止堆噴射攻擊

現(xiàn)在,讓我們開(kāi)始練習(xí)。為了減輕堆噴射攻擊,我們將采取以下步驟:

1.形成分配歷史

2.檢測(cè) shellcode 執(zhí)行

3.檢測(cè)噴霧

形成分配歷史

為了攔截動(dòng)態(tài)分配內(nèi)存的執(zhí)行,我們將 PAGE_EXECUTE_READWRITE 標(biāo)志更改為 PAGE_READWRITE。

讓我們創(chuàng)建一個(gè)結(jié)構(gòu)來(lái)保存分配:

接下來(lái),我們將為NtAllocateVirtualMemory定義一個(gè)鉤子。此掛鉤將重置 PAGE_EXECUTE_READWRITE 標(biāo)志并保存已重置標(biāo)志的分配:

一旦我們?cè)O(shè)置了鉤子,任何帶有 PAGE_EXECUTE_READWRITE 位的內(nèi)存分配都會(huì)被修改。當(dāng)試圖將控制權(quán)傳遞給該內(nèi)存時(shí),處理器將生成一個(gè)我們可以檢測(cè)和分析的異常。

在本文中,我們忽略了多線(xiàn)程問(wèn)題。然而,在現(xiàn)實(shí)生活中,最好單獨(dú)存儲(chǔ)每個(gè)流的分配,因?yàn)?shellcode 執(zhí)行預(yù)計(jì)是單線(xiàn)程的。

檢測(cè) shellcode 執(zhí)行

現(xiàn)在,我們將為 SEH 注冊(cè)一個(gè)處理程序。這就是這個(gè)處理程序通常的工作方式:

1.提取觸發(fā)異常的指令的地址。如果此地址屬于我們保存的區(qū)域之一,則此異常已由我們的操作觸發(fā)。否則,我們可以跳過(guò)它,讓系統(tǒng)繼續(xù)搜索相關(guān)的處理程序。

2.搜索堆噴射。如果動(dòng)態(tài)分配的內(nèi)存被可疑執(zhí)行,我們必須對(duì)檢測(cè)到的攻擊做出反應(yīng)。否則,我們需要恢復(fù)原樣,以便應(yīng)用程序可以繼續(xù)工作。

3.使用NtProtect函數(shù) (PAGE_EXECUTE_READWRITE)恢復(fù)區(qū)域的原始參數(shù)。

4.將控制權(quán)交還給工藝流程。

下面是一個(gè) shellcode 檢測(cè)的代碼示例:

目前,我們有一種機(jī)制可以監(jiān)控應(yīng)用程序中的 shellcode,并可以檢測(cè)其執(zhí)行時(shí)刻。在現(xiàn)實(shí)生活中,我們需要再執(zhí)行兩個(gè)步驟:

  • 攔截NtProtectVirtualMemory和NtFreeVirtualMemory函數(shù)。否則,我們將沒(méi)有機(jī)會(huì)監(jiān)控進(jìn)程內(nèi)存的相關(guān)狀態(tài)。這是一個(gè)碎片問(wèn)題:我們需要存儲(chǔ)和更新進(jìn)程的可執(zhí)行內(nèi)存的映射,這是一項(xiàng)不平凡的任務(wù)。例如,我們的應(yīng)用程序可以使用NtFree函數(shù)釋放我們保存區(qū)域中間的部分頁(yè)面,或者將它們的標(biāo)志更改為 NtProtect。我們需要跟蹤和監(jiān)控此類(lèi)案件。
  • 使用 Execute 分析所有可能的標(biāo)志(一組允許我們執(zhí)行內(nèi)存內(nèi)容的可能值),例如 PAGE_EXECUTE_WRITECOPY 標(biāo)志。

檢測(cè)堆噴射

使用上面的代碼,我們?cè)趧?dòng)態(tài)內(nèi)存執(zhí)行時(shí)停止了一個(gè)應(yīng)用程序,并獲得了最新分配的歷史記錄。我們將使用這些信息來(lái)確定我們的應(yīng)用程序是否受到攻擊。讓我們探索一下我們的堆噴射檢測(cè)技術(shù)的兩個(gè)步驟:

  • 首先,我們需要確定我們將存儲(chǔ)多少分配以及在發(fā)生異常時(shí)我們將分析其中的多少。請(qǐng)注意,我們對(duì)相同大小的分配感興趣。因此,如果流中的內(nèi)存以不同的大小分配,我們可以允許流繼續(xù)執(zhí)行,因?yàn)檫@不太可能是堆噴射攻擊。此外,在分配邊界之間存在空間的情況下,我們可以排除堆噴射攻擊的可能性,因?yàn)槎褔娚湟馕吨B續(xù)的內(nèi)存分配。
  • 接下來(lái),我們需要選擇堆噴射檢測(cè)的標(biāo)準(zhǔn)。檢測(cè)堆噴射的一種有效方法是在內(nèi)存分配中搜索相同的內(nèi)容。這個(gè)重復(fù)的內(nèi)容很可能是shellcode的副本。例如,假設(shè)我們有 10,000 個(gè)分配具有相同數(shù)據(jù)的相同位移。在這種情況下,最好從接收控制的當(dāng)前分配的位移開(kāi)始搜索。

用于識(shí)別堆噴射的建議算法

我們建議使用所描述的技術(shù)并注意以下四個(gè)標(biāo)準(zhǔn),以排除可能會(huì)顯著減慢您的應(yīng)用程序的不必要檢查:

1.為每個(gè)線(xiàn)程定義已保存的內(nèi)存分配數(shù)量。

2.設(shè)置已保存內(nèi)存分配的最小大小。攔截大小為一頁(yè)的分配將導(dǎo)致不合理地節(jié)省內(nèi)存。堆噴射通常使用為某個(gè)應(yīng)用程序的特定堆管理器選擇的巨大值進(jìn)行操作。數(shù)十頁(yè)和數(shù)百頁(yè)似乎更相關(guān)。

3.定義發(fā)生異常時(shí)將分析的最新分配數(shù)。如果我們處理過(guò)多的分配,它會(huì)降低應(yīng)用程序的效率,因?yàn)閷?duì)于動(dòng)態(tài)內(nèi)存的每次執(zhí)行,我們都必須讀取大區(qū)域的內(nèi)容。

4.設(shè)置 shellcode 的預(yù)期最小大小。如果我們要搜索的代碼太小,就會(huì)增加誤報(bào)的數(shù)量。

結(jié)論

我們探索了一種使用鉤子和內(nèi)存保護(hù)機(jī)制檢測(cè)堆噴射攻擊的方法。在我們的項(xiàng)目中,這種方法在測(cè)試和堆噴射檢測(cè)過(guò)程中顯示出出色的效果。

責(zé)任編輯:武曉燕 來(lái)源: 嘶吼網(wǎng)
相關(guān)推薦

2020-07-16 11:23:54

應(yīng)用程序數(shù)據(jù)安全

2022-11-07 10:27:08

2018-08-22 13:35:37

2021-11-29 18:10:30

網(wǎng)絡(luò)攻擊數(shù)據(jù)安全數(shù)據(jù)泄露

2020-08-25 14:03:20

應(yīng)用程序屏蔽應(yīng)用程序內(nèi)保護(hù)網(wǎng)絡(luò)攻擊

2022-11-14 13:46:24

2021-10-11 09:00:00

云原生Kubernetes安全

2014-12-03 09:23:25

2022-12-26 13:22:36

數(shù)據(jù)中心能源管理

2021-04-06 14:24:19

物聯(lián)網(wǎng)安全網(wǎng)絡(luò)攻擊網(wǎng)絡(luò)威脅

2023-10-04 19:01:44

微服務(wù)雪崩故障

2023-10-13 10:08:06

2011-03-30 13:28:26

2018-02-05 15:10:35

2019-09-19 10:08:26

人工智能機(jī)器學(xué)習(xí)技術(shù)

2022-06-02 10:41:45

智能家居設(shè)備安全移動(dòng)安全

2019-12-06 10:05:28

Windows 10手機(jī)應(yīng)用程序

2009-06-29 14:19:50

2012-03-01 11:47:01

2021-08-02 10:06:53

勒索軟件惡意軟件安全
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)