detecting-process-injection-techniques について
プロセスインジェクションを調査するインシデント対応担当者や検知ルール作成者向けのセキュリティスキルです。メモリフォレンジック、Sysmon イベント、ペイロード分析を組み合わせ、手法の分類や MITRE ATT&CK への対応付け、検知ルール作成を支援します。
主な機能
- 01メモリ内の注入コードを検出
- 02フォレンジック痕跡から手法を分類
- 03Sysmon と Windows イベントを分析
- 04注入ペイロードの抽出と調査
- 05MITRE ATT&CK への手法の対応付け
- 06注入検知ルールの作成
活用シーン
- 01EDR が検知した不審な API 呼び出しを調査
- 02信頼されたプロセスの異常な通信やファイル操作を調査
- 03EDR や SIEM 向けのプロセス注入検知を作成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill detecting-process-injection-techniquesインストール後、Claude Code で/detecting-process-injection-techniquesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
プロセスインジェクション手法の検出
使用する場面
- EDR が不審な API 呼び出しシーケンス(VirtualAllocEx + WriteProcessMemory + CreateRemoteThread)を検知した場合
- 正規のプロセス(explorer.exe、svchost.exe)に予期しないネットワーク接続やファイル操作が見られる場合
- メモリフォレンジックで、本来実行コードを含まないはずのメモリ領域に実行可能コードが見つかった場合
- マルウェアが信頼されたプロセス内に隠れる、環境寄生型攻撃を調査する場合
- EDR または SIEM のルールで特定のインジェクション手法を検出するロジックを構築する場合
標準的な DLL 読み込みの分析には使用しないでください。インジェクションとは、プロセスの協力なしにプロセス内へ不正なコードを配置することを指します。
前提条件
- インジェクションの痕跡をメモリフォレンジックで分析するための Volatility 3
- イベント ID 8(CreateRemoteThread)と 10(ProcessAccess)を設定した Sysmon
- インジェクション API 呼び出しをリアルタイムで監視するための API Monitor または x64dbg
- プロセスのメモリ領域を調査するための Process Hacker または Process Explorer
- Windows のメモリ管理(VirtualAlloc、VAD、ページ保護)に関する知識
- マルウェアを安全に実行・監視するための隔離分析環境
ワークフロー
ステップ 1:メモリフォレンジックによるインジェクションの特定
Volatility を使用して、プロセスメモリ内のインジェクションされたコードを検出します。
# malfind: Primary injection detection plugin
vol3 -f memory.dmp windows.malfind
# malfind detects:
# - Memory regions with PAGE_EXECUTE_READWRITE (RWX) protection
# - PE headers (MZ signature) in non-image VAD entries
# - Executable memory not backed by a file on disk
# Filter by specific process
vol3 -f memory.dmp windows.malfind --pid 852
# Dump injected memory regions for analysis
vol3 -f memory.dmp windows.malfind --dump
# Check VAD (Virtual Address Descriptor) tree for anomalies
vol3 -f memory.dmp windows.vadinfo --pid 852
# Detect hollowed processes (mapped image doesn't match disk)
vol3 -f memory.dmp windows.hollowfind
ステップ 2:インジェクション手法の分類
痕跡に基づいて、使用されたインジェクション手法を特定します。
Process Injection Techniques and Detection Artifacts:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. Classic DLL Injection
APIs: OpenProcess -> VirtualAllocEx -> WriteProcessMemory -> CreateRemoteThread
Artifact: Loaded DLL in target process not present in known-good baseline
Detection: New DLL in dlllist not matching disk hash, CreateRemoteThread event
2. Process Hollowing (RunPE)
APIs: CreateProcess(SUSPENDED) -> NtUnmapViewOfSection -> VirtualAllocEx ->
WriteProcessMemory -> SetThreadContext -> ResumeThread
Artifact: Process image in memory doesn't match file on disk
Detection: hollowfind plugin, mismatched PE headers vs disk file
3. APC Injection
APIs: OpenProcess -> VirtualAllocEx -> WriteProcessMemory -> QueueUserAPC
Artifact: Alertable thread has queued APC pointing to injected code
Detection: Thread start addresses outside known modules
4. Thread Hijacking
APIs: OpenProcess -> VirtualAllocEx -> WriteProcessMemory ->
SuspendThread -> GetThreadContext -> SetThreadContext -> ResumeThread
Artifact: Thread instruction pointer changed to injected code
Detection: Thread context modification, EIP/RIP outside module boundaries
5. Reflective DLL Injection
APIs: VirtualAllocEx -> WriteProcessMemory -> CreateRemoteThread (to reflective loader)
Artifact: DLL loaded in memory but NOT in loaded module list
Detection: malfind (PE in non-image memory), module not in ldrmodules
6. Process Doppelganging
APIs: NtCreateTransaction -> NtCreateFile(transacted) -> NtWriteFile ->
NtCreateSection -> NtRollbackTransaction -> NtCreateProcessEx
Artifact: Process created from transacted file that was rolled back
Detection: Process with no corresponding file on disk
7. AtomBombing
APIs: GlobalAddAtom -> NtQueueApcThread (with GlobalGetAtomName)
Artifact: Code stored in global atom table, APC triggers copy to target
Detection: Unusual atom table entries, APC injection indicators
ステップ 3:Sysmon イベントによるインジェクションの検出
Sysmon と Windows イベントログのデータを分析します。
# Sysmon Event ID 8: CreateRemoteThread
# Detect when one process creates a thread in another
wevtutil qe "Microsoft-Windows-Sysmon/Operational" \
/q:"*[System[EventID=8]]" /f:text /c:20
# Sysmon Event ID 10: ProcessAccess
# Detect suspicious access rights to other processes
# DesiredAccess containing PROCESS_VM_WRITE (0x0020) + PROCESS_CREATE_THREAD (0x0002)
wevtutil qe "Microsoft-Windows-Sysmon/Operational" \
/q:"*[System[EventID=10]]" /f:text /c:20
# Sysmon Event ID 1: Process Creation
# Detect process hollowing via suspicious parent-child relationships
wevtutil qe "Microsoft-Windows-Sysmon/Operational" \
/q:"*[System[EventID=1]]" /f:text /c:20
# Parse Sysmon events for injection indicators
import xml.etree.ElementTree as ET
import subprocess
# Query CreateRemoteThread events
result = subprocess.run(
["wevtutil", "qe", "Microsoft-Windows-Sysmon/Operational",
"/q:*[System[EventID=8]]", "/f:xml", "/c:100"],
capture_output=True, text=True
)
suspicious_injections = []
for event_xml in result.stdout.split("</Event>"):
if not event_xml.strip():
continue
try:
root = ET.fromstring(event_xml + "</Event>")
ns = {"e": "http://schemas.microsoft.com/win/2004/08/events/event"}
data = {}
for d in root.findall(".//e:EventData/e:Data", ns):
data[d.get("Name")] = d.text
source = data.get("SourceImage", "")
target = data.get("TargetImage", "")
# Flag injections from unusual sources into system processes
system_procs = ["svchost.exe", "explorer.exe", "lsass.exe", "winlogon.exe"]
if any(p in target.lower() for p in system_procs):
if not any(p in source.lower() for p in ["csrss.exe", "services.exe", "lsass.exe"]):
print(f"[!] Suspicious injection: {source} -> {target}")
suspicious_injections.append(data)
except:
pass
ステップ 4:インジェクションされたコードの分析
インジェクションされたペイロードを調査し、その目的を把握します。
# Dump injected code from Volatility malfind
vol3 -f memory.dmp windows.malfind --pid 852 --dump
# Analyze the dumped region
file malfind.*.dmp
# If it contains a PE (MZ header), analyze as a standalone executable
python3 << 'PYEOF'
import pefile
# Attempt to parse as PE
try:
pe = pefile.PE("malfind.852.0x400000.dmp")
print("Injected PE detected!")
print(f" Architecture: {'x64' if pe.FILE_HEADER.Machine == 0x8664 else 'x86'}")
print(f" Imports:")
if hasattr(pe, 'DIRECTORY_ENTRY_IMPORT'):
for entry in pe.DIRECTORY_ENTRY_IMPORT:
print(f" {entry.dll.decode()}: {len(entry.imports)} functions")
except:
print("Not a valid PE - likely shellcode")
# Analyze as shellcode
with open("malfind.852.0x400000.dmp", "rb") as f:
shellcode = f.read()
print(f" Size: {len(shellcode)} bytes")
print(f" First bytes: {shellcode[:32].hex()}")
PYEOF
# Disassemble shellcode
python3 -c "
from capstone import Cs, CS_ARCH_X86, CS_MODE_64
with open('malfind.852.0x400000.dmp', 'rb') as f:
code = f.read()[:256]
md = Cs(CS_ARCH_X86, CS_MODE_64)
for insn in md.disasm(code, 0x400000):
print(f' 0x{insn.address:X}: {insn.mnemonic} {insn.op_str}')
"
# Scan with YARA for known payloads
vol3 -f memory.dmp yarascan.YaraScan --pid 852 --yara-file malware_rules.yar
ステップ 5:MITRE ATT&CK へのマッピング
検出した手法を ATT&CK フレームワークで分類します。
MITRE ATT&CK Process Injection Sub-Techniques (T1055):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
T1055.001 Dynamic-link Library Injection
T1055.002 Portable Executable Injection
T1055.003 Thread Execution Hijacking
T1055.004 Asynchronous Procedure Call (APC)
T1055.005 Thread Local Storage
T1055.008 Ptrace System Calls (Linux)
T1055.009 Proc Memory (/proc/pid/mem - Linux)
T1055.011 Extra Window Memory Injection
T1055.012 Process Hollowing
T1055.013 Process Doppelganging
T1055.014 VDSO Hijacking (Linux)
T1055.015 ListPlanting
ステップ 6:検出シグネチャの作成
特定した手法に対する検出ルールを作成します。
# Sigma rule for CreateRemoteThread injection
title: Suspicious CreateRemoteThread into System Process
logsource:
product: windows
service: sysmon
detection:
selection:
EventID: 8
TargetImage|endswith:
- '\svchost.exe'
- '\explorer.exe'
- '\lsass.exe'
filter:
SourceImage|endswith:
- '\csrss.exe'
- '\services.exe'
- '\svchost.exe'
condition: selection and not filter
level: high
主な概念
| 用語 | 定義 |
|---|---|
| プロセスインジェクション | 通常、検出を回避して標的の信頼レベルを引き継ぐために、別のプロセスのアドレス空間内でコードを実行する手法です |
| プロセスホロウイング | 正規のプロセスを中断状態で作成し、そのメモリのマッピングを解除して悪意のあるコードを書き込み、実行を再開して正規のプロセスを装う手法です |
| リフレクティブ DLL インジェクション | Windows ローダーを使用せずに DLL をプロセスのメモリへ読み込む手法です。このため、読み込まれたモジュールの一覧に DLL は表示されません |
| APC インジェクション | 標的プロセスのスレッドに非同期プロシージャ呼び出しをキューイングし、スレッドがアラート可能な状態になったときにインジェクションされたコードを実行させる手法です |
| VAD(仮想アドレス記述子) | プロセス内のメモリ領域を記述する Windows カーネル構造体です。異常な VAD エントリ(RWX 権限、イメージではない PE)はインジェクションを示します |
| CreateRemoteThread | 別のプロセス内にスレッドを作成する Windows API です。従来型の DLL インジェクションや、その他多くのインジェクション手法で主要な仕組みとして使われます |
| PAGE_EXECUTE_READWRITE | 読み取り、書き込み、実行を許可するメモリ保護属性です。正規のアプリケーションで使われることはまれで、インジェクションされたコードによく見られる兆候です |
ツールとシステム
- Volatility (malfind):VAD 分析とイメージではないメモリ領域内の PE ヘッダーのスキャンにより、インジェクションされたコードを検出するメモリフォレンジック用プラグインです
- Sysmon:CreateRemoteThread(EID 8)や ProcessAccess(EID 10)など、詳細な Windows イベントログを提供するシステムモニターです
- Process Hacker:メモリ領域、スレッドスタック、インジェクションされたモジュールの詳細を表示する、高度なプロセス管理ツールです
- API Monitor:プロセスが行う API 呼び出しを監視・記録する Windows ツールです。インジェクションの一連の処理をリアルタイムで観察するのに役立ちます
- pe-sieve:実行中のプロセスをスキャンし、コードインジェクション、フッキング、ホロウイングの兆候を検出するツールです
よくあるシナリオ
シナリオ:空洞化された svchost.exe プロセスの調査
コンテキスト:EDR が、svchost.exe から外部 IP への HTTPS 接続を検知します。svchost.exe が通信する相手は Microsoft のサービスに限られるはずです。プロセスの空洞化を確認するには、メモリ解析が必要です。
アプローチ:
- 不審な svchost.exe プロセスのメモリダンプを取得します
- Volatility の
malfindを実行して、プロセスメモリ内の挿入された PE を検出します - メモリ内のイメージベースを、ディスク上の svchost.exe ファイルのハッシュと比較します
- プロセスの親(services.exe であるはずです)と作成時のパラメーターを確認します
- 空洞化された実行ファイルをメモリからダンプし、Ghidra で解析します
netscanを実行して、空洞化されたプロセスからのネットワーク接続を確認します- ダンプしたコードを YARA でスキャンし、マルウェアファミリーを特定します
落とし穴:
- すべての svchost.exe インスタンスが同一だと考えること(それぞれ異なるサービス DLL を読み込みます)
- 親プロセスを確認しないこと(空洞化されたプロセスでは、親プロセスが不正な場合がよくあります)
- プロセス名の一致だけに頼ること(攻撃者が svchost.exe を特に標的とするのは、複数のインスタンスが存在することが想定されているためです)
- すでに終了している可能性のある、インジェクション元のプロセスを見落とすこと
出力形式
PROCESS INJECTION ANALYSIS REPORT
====================================
Dump File: memory.dmp
Analysis Tool: Volatility 3.2 + Sysmon
INJECTION DETECTED
Target Process: svchost.exe (PID: 852)
Source Process: malware.exe (PID: 2184) [terminated]
Technique: Process Hollowing (T1055.012)
EVIDENCE
malfind Results:
PID 852 (svchost.exe):
Address: 0x00400000
Size: 184,320 bytes
Protection: PAGE_EXECUTE_READWRITE
Header: MZ (PE32 executable)
NOT backed by disk file
Process Verification:
Expected Image: C:\Windows\System32\svchost.exe (SHA-256: aaa...)
In-Memory Image: Unknown PE (SHA-256: bbb...)
Result: MISMATCH - HOLLOWED PROCESS
Sysmon Events:
[4688] malware.exe (PID 2184) created svchost.exe (PID 852) SUSPENDED
[10] malware.exe accessed svchost.exe with PROCESS_VM_WRITE
[8] malware.exe created remote thread in svchost.exe
INJECTED PAYLOAD ANALYSIS
SHA-256: bbb123def456...
YARA Match: CobaltStrike_Beacon_x64
Type: Cobalt Strike Beacon (HTTP)
C2: hxxps://185.220.101[.]42/updates
MITRE ATT&CK
T1055.012 Process Hollowing
T1071.001 Web Protocols (HTTPS C2)
T1036.005 Match Legitimate Name (svchost.exe)
コメント
Markdown 対応