Skip to main content
網路安全

什麼是程序注入​​​?技術與預防

本文將介紹程序記憶體注入的基本原理。我們將討論其運作方式、您可以如何因應,以及如何在未來防止此類攻擊。

作者 SentinelOne
什麼是程序注入​​​?技術與預防

程序注入是網路安全中最重要的技術之一。此技術的運作方式是將程式碼投放到另一個已在執行中的程序位址空間,並在該空間中執行該程式碼。從安全角度來看,這確實是一場災難,因為它允許程式碼在目標程序的權限下執行,而這可能藉由使用目標程序現有的權限提升、偵測機制等來繞過安全控制。

程序注入是一種威脅向量,已催生出許多在網際網路上肆虐的惡意軟體,以及進階持續性威脅(APT)。雖然這在軟體開發環境中是用於偵錯或擴充應用程式的有效技術,但威脅行為者經常利用它在未經授權的情況下執行程式碼、規避持久化,並保持不被偵測。

本文分析程序注入的原理、其核心機制、常見技術、偵測方法,以及如何防範。我們也將探討一些基本概念,例如記憶體操作、注入技術、偵測方法,以及攻擊的實際範例。

什麼是程序注入?

程序注入允許將程式碼注入到另一個正在執行中的程序記憶體空間。在此技術中,攻擊者藉由將自己的程式碼寫入該程序的位址空間,迫使目標程序執行任意程式碼。被注入的程式碼會在易受攻擊程序的內容與權限下執行,因此會繼承其所有存取權限以及在系統上的信任等級。

程序注入的核心包含以下技術元件:取得程序控制代碼、在目標程序中配置記憶體、程式碼寫入操作,以及執行觸發機制。它們使用 Windows API 函式,例如 OpenProcess()、VirtualAllocEx()、WriteProcessMemory() 和 CreateRemoteThread() 來執行注入程序。

為什麼程序注入很危險?

有幾個技術層面使這類攻擊相對危險。從被注入執行緒執行的程式碼具有與目標程序相同的權限,實際上會導致對系統的提升存取。由於不安全的程式碼僅存在於記憶體中,因此此方法可繞過任何基於檔案的安全掃描。

它也會對系統的穩定性與安全性造成嚴重影響。注入操作可能導致目標程序當機,並在整個系統中引入不穩定性。它們藉由終止安全產品程序、從受保護的應用程式竊取資料,以及建立可規避常見清除技術的持續性系統存取來達成此目的。

程序記憶體基礎

程序注入技術的技術基礎,在於理解程序記憶體結構與操作。Windows OS 記憶體管理模型中有一些內部特性,既能啟用也會限制程序之間的記憶體互動與存取。它們會立即改變程序注入的運作方式,以及防禦者偵測與防護的方式。

虛擬記憶體與程序位址空間

每個 Windows 程序都有自己的虛擬位址空間,與在同一系統上執行的其他程序隔離。對於 32 位元程序,此虛擬位址空間的範圍是 0 到 0x7FFFFFFF;對於 64 位元程序,則是 0 到 0x7FFFFFFFFFF。從虛擬位址到實體記憶體位置的對應,是由 Windows 記憶體管理員藉助分頁技術完成。

程序在其位址空間中有多個區域,例如程序可執行程式碼、已載入的 DLL、堆積配置,以及堆疊空間。這些區域具有特定功能與資料類型。Windows 具有頁表,用於描述記憶體頁框所在位置,以及它們是否位於虛擬位址空間中。

記憶體權限與保護

記憶體區域具有存取權限,用於描述程序應如何與其互動。這些權限包括:

  • PAGE_EXECUTE:記憶體可作為程式碼執行
  • PAGE_READ:記憶體可讀取
  • PAGE_WRITE:記憶體可寫入
  • PAGE_EXECUTE_READ:記憶體可執行且可讀取
  • PAGE_EXECUTE_READWRITE:記憶體可執行、讀取及寫入

這些權限由 Windows 記憶體管理員在頁面層級強制執行。如果應用程式(或程序)嘗試以不被允許的方式存取記憶體,系統就會引發存取違規。

記憶體操作的關鍵 Windows API

Windows 有一些用於記憶體操作的重要 API。這些 API 是程序注入的基礎構件。這些函式的「Ex」版本用於外部程序,而一般版本則用於呼叫程序的記憶體空間。了解這些 API 有助於偵測與追蹤潛在的注入活動。

  • VirtualAlloc/VirtualAllocEx: 在程序中保留並認可記憶體
  • VirtualProtect/VirtualProtectEx: 變更記憶體區域權限
  • ReadProcessMemory: 從另一個程序的記憶體空間讀取資料
  • WriteProcessMemory: 將資料寫入另一個程序的記憶體空間
  • VirtualFree/VirtualFreeEx: 釋放已配置的記憶體區域

程序注入技術的類型

程序注入包含多種不同技術,這些技術都利用某種形式的程式碼執行於目標程序。Windows API 呼叫與記憶體操作上的這些差異,為每種技術形成獨特的操作模式與偵測特徵。

分析這些技術可為安全團隊提供良好協助,以識別並回應特定的注入方法。

1. DLL 注入

DLL 注入是迫使程序載入惡意 DLL 檔案的過程。它使用一組 API 函式:OpenProcess()、VirtualAllocEx() 和 CreateRemoteThread()。此程序首先在目標程序內保留記憶體,以儲存 DLL 的路徑。接著,它啟動一個遠端執行緒,呼叫 LoadLibrary() 並將該路徑作為參數,以指示目標程序載入惡意 DLL。

被注入的 DLL 可完整存取目標程序的函式/程序,以及目標程序整個記憶體空間與目標已載入至記憶體中的所有其他模組的記憶體位址。

2. 程式碼注入

程式碼注入 是一種將惡意程式碼注入程序記憶體空間並在其中執行的攻擊形式。這只是將程式碼寫入程序記憶體空間的位址。這是一種多步驟技術,包括取得程序控制代碼、使用 VirtualAllocEx() 配置記憶體、使用 WriteProcessMemory() 寫入程式碼,最後再使用 CreateRemoteThread() 執行它。

其執行的程式碼具有其所執行之目標程序的權限,並會繼承所有安全權限與存取權。

3. 執行緒執行劫持

執行緒執行劫持會暫停目標程序中的執行緒,變更其執行內容以指向攻擊者程式碼,然後繼續執行。在此技術中,攻擊者會使用 SuspendThread()、GetThreadContext()、SetThreadContext() 和 ResumeThread() API。

由於它使用的是合法執行緒,因此更難被偵測,因為遭劫持的執行緒會以其現有權限執行惡意程式碼。

4. APC(非同步程序呼叫)注入

APC 注入會將惡意程式碼排入佇列,並在線程進入警示狀態時執行。此方法使用 QueueUserAPC() 將程式碼排入執行緒。當執行緒處理其 APC 佇列時,注入到執行緒中的程式碼就會被執行,而這通常發生在特定系統呼叫或等待作業期間。此方法非常適合會反覆進入可變狀態的執行緒。

5. 反射式 DLL 注入

反射式 DLL 注入的方法是在 Windows 載入器的協助下載入 DLL,且不會寫入檔案系統成品。這是一個自訂 DLL,內含如何在記憶體中對其進行對應與定址的指示。此技巧涉及將載入器程式碼和 DLL 注入目標程序記憶體中,並執行載入器以準備 DLL。它可避開一般 DLL 載入機制與監控的偵測。

6. 程序鏤空

Process Hollowing 是一種隱匿性的注入技術,攻擊者會先建立一個處於暫停狀態的合法程序(使用 CreateProcess 搭配 CREATE_SUSPENDED),解除對應其原始記憶體空間的映射(透過 NtUnmapViewOfSection/ZwUnmapViewOfSection),配置新的記憶體(VirtualAllocEx),寫入惡意程式碼(WriteProcessMemory),修正 PE 標頭與重定位,更新 Process Environment Block (PEB),最後在恢復執行(ResumeThread)之前重新導向進入點(SetThreadContext)。這使惡意程式碼能夠在合法程序的身分與權限下執行。

程序注入如何運作?

程序注入會遵循一系列步驟,嘗試在目標程序中執行程式碼。無論採用何種注入方法,技術實作都會遵循某些步驟,以操控程序記憶體並改變程序流程的執行方式。

第一步是目標程序識別與存取取得作業。惡意程序使用 OpenProcess() 取得目標程序的控制代碼。此控制代碼所需的存取權限包括 PROCESS_CREATE_THREAD、PROCESS_QUERY_INFORMATION、PROCESS_VM_OPERATION、PROCESS_VM_WRITE 和 PROCESS_VM_READ。

第二個關鍵步驟是在目標程序中配置記憶體。VirtualAllocEx() 會透過保留並認可虛擬記憶體頁面,在目標程序位址空間中配置記憶體空間。

第三步是將 shellcode 複製到已配置的記憶體區域。WriteProcessMemory() 會將程式碼位元組從來源緩衝區複製到目標程序記憶體區域。此作業應考量對齊與大小需求。

最後的執行觸發步驟代表最終的核心元件。每種技術都會採用某種機制:

  • CreateRemoteThread() 會建立新執行緒來執行注入的程式碼
  • QueueUserAPC() 會在現有執行緒中排入程式碼執行
  • SetThreadContext() 會修改現有執行緒的執行流程
  • 直接修改函式指標或掛鉤

一旦開始執行,注入的程式碼就會在目標程序的內容中執行,並可存取目標程序的資源與安全性權杖。接著,此程式碼便可執行其設計要執行的任何操作,並以目標程序的權限與信任等級執行。

如何偵測程序注入攻擊?

程序注入難以偵測,因為它涉及系統的多個元件與行為。為了識別注入活動,安全系統必須監控記憶體移動、API 呼叫以及所有程序行為。

這些偵測方法結合起來,形成整體偵測策略。

記憶體模式分析

記憶體分析著重於在程序的記憶體區域中搜尋常見模式。這是因為安全工具會掃描這些程序記憶體區域,以檢查程序記憶體的權限設定與預期內容。其中包括偵測異常的可執行區域,以及程序內不符合其典型內容特徵的頁面等。

記憶體掃描器會尋找偏離原始程序二進位檔的情況,方法包括監控通常為靜態的程序記憶體結構變更,或尋找動態程式碼區段。

API 呼叫監控

Windows API 監控可偵測可疑的記憶體操控呼叫序列。安全工具會監控 OpenProcess() 的程序存取、VirtualAllocEx() 的記憶體配置,以及 WriteProcessMemory() 的記憶體寫入。若建立或操控執行緒,例如 CreateRemoteThread(),這將是明確的注入跡象。

也應監控透過 SuspendThread() 和 SetThreadContext() 等 API 對程序與執行緒狀態所做的變更,因為這些通常出現在注入鏈中。

行為指標

監控程序行為是為了識別暗示這些注入嘗試的非預期活動模式。入侵偵測系統會觀察相對穩定執行中的程序內之執行緒,以及程序記憶體對應的變更,以追蹤此類程序。

這些行為,加上對匯入位址表的修改以及跨程序記憶體作業,都是與偵測相關的重要指標。

偵測工具

發現程序注入需要具備深度監控能力的安全工具。程序監視器會監控 API 呼叫與系統動作以進行即時分析,而記憶體分析工具則會對程序記憶體空間進行深入分析。事件日誌分析器可讓團隊記錄系統內安全事件的歷史,以便從過去的角度取得觀點。

企業偵測與回應(EDR)解決方案,例如 SentinelOne,會結合各種監控方式與分析能力。還有一些系統管理工具,例如 process monitor 和 process explorer,可詳細顯示程序以及每個程序的記憶體配置。

如何防止程序注入攻擊?

程序注入的防護無法僅靠單一安全控制提供,而是涉及系統、程序與程式碼層級的控制。這些緩解措施著重於限制程序注入能力,以及讓潛在目標程序更難被注入。

系統層級防護

系統層級的預防措施始於正確管理存取與權限。系統應設定程序建立與操控權限,以限制非管理員使用者,使其只能在系統上開啟敏感程序的控制代碼。這些限制會透過使用者帳戶控制(UAC)與 AppLocker 原則來強制執行,以管理哪些程序可以執行以及其權限等級。

程式碼簽署

另一個重要的防護層是強制執行程式碼簽署。模組在載入時應驗證其數位簽章,而簽署不當或未簽署的程式碼應由系統拒絕。Windows Defender Application Control (WDAC) 原則會強制執行程式碼完整性需求,並停用未簽署 DLL 與可執行檔的載入。

記憶體保護

記憶體保護機制是防禦的重要組成部分。資料執行防止(DEP)可防止從資料頁面執行程式碼,而位址空間配置隨機化(ASLR)則使鎖定特定記憶體變得困難。

中度受保護程序的緩解措施包括控制流程防護(CFG),其會檢查間接呼叫的目標,以及 Protected Process Light (PPL,),其會根據成員簽章等級限制程序開啟現有程序的能力。

應用程式強化

即使是應用程式強化,安全團隊也需要遵循安全編碼實務與編譯器選項。開發人員應設定安全功能,例如 /DYNAMICBASE 和 /NXCOMPAT、實作例外處理,並在應用程式偵錯過程中驗證記憶體作業。

Callout Background Image Gradient

AI-Powered Cybersecurity

Elevate your security posture with real-time detection, machine-speed response, and total visibility of your entire digital environment.

結論

程序注入會將惡意程式碼注入記憶體空間,並與其他正在執行的程序並存。攻擊者會強迫目標程序執行任意程式碼,並將其自身程式碼寫入位址空間。它之所以如此危險,是因為它可以規避傳統威脅偵測技術。您需要使用進階安全解決方案與防護策略來加以偵測。

其中包括記憶體保護、行為控制、存取控制及其他措施。了解程序注入技術的運作機制,可讓組織適當地強化其系統,並更有效地部署安全控制。

程序注入常見問題

程序注入是一種攻擊,攻擊者會將程式碼複製到某個程序的記憶體中並執行。這使惡意行為者能夠在目標程序中執行其自身的程式碼,從而規避安全措施。

程序注入是一種主要用於隱藏活動與維持持久性,以及以更高權限執行程式碼的技術。如果 Windows DLL 透過正常程序被注入到另一個程序中,所執行的程式碼將以與目標程序相同的信任等級執行操作,並具有相同的存取權限,因此更難讓安全工具偵測到惡意行為。

偵測程序注入需要監控記憶體、API 與程序行為。靜態程式分析器會透過尋找異常記憶體配置、執行緒建立以及異常程序操控 API 序列等模式,來標記此類注入嘗試。

程序注入主要由惡意軟體使用,但在某些情境中,這項技術也可合法使用,例如除錯、惡意軟體分析、監控技術,以及擴充應用程式的功能。

在 APT(進階持續性威脅) 類型的攻擊活動中,程序注入在實現持久性與避免偵測方面扮演關鍵角色。APT 行為者使用進階注入技術來取得對受感染系統的永久存取權,並確保他們在長期行動期間不會被發現。

深入了解 網路安全

Decorative background gradient

體驗最先進的資安平台

了解全球最智慧、最自主的資安平台如何在今日及未來保護您的組織。
Dark dashboard UI with purple-highlighted nav, summary cards showing 149, 7, 78, 56, 1.2 h, and a status table with linked purple text