mcpField
D
detecting-process-injection-techniques

detecting-process-injection-techniques

github.com/mukul975セキュリティ35.2k69 回インストール8 週間前に更新
リポジトリ

detecting-process-injection-techniques について

プロセスインジェクションを調査するインシデント対応担当者や検知ルール作成者向けのセキュリティスキルです。メモリフォレンジック、Sysmon イベント、ペイロード分析を組み合わせ、手法の分類や MITRE ATT&CK への対応付け、検知ルール作成を支援します。

主な機能

  1. 01メモリ内の注入コードを検出
  2. 02フォレンジック痕跡から手法を分類
  3. 03Sysmon と Windows イベントを分析
  4. 04注入ペイロードの抽出と調査
  5. 05MITRE ATT&CK への手法の対応付け
  6. 06注入検知ルールの作成

活用シーン

  1. 01EDR が検知した不審な API 呼び出しを調査
  2. 02信頼されたプロセスの異常な通信やファイル操作を調査
  3. 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 と一緒にインストールされる参考資料やスクリプト。

LICENSE
references/
api-reference.md
scripts/
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 のサービスに限られるはずです。プロセスの空洞化を確認するには、メモリ解析が必要です。

アプローチ:

  1. 不審な svchost.exe プロセスのメモリダンプを取得します
  2. Volatility の malfind を実行して、プロセスメモリ内の挿入された PE を検出します
  3. メモリ内のイメージベースを、ディスク上の svchost.exe ファイルのハッシュと比較します
  4. プロセスの親(services.exe であるはずです)と作成時のパラメーターを確認します
  5. 空洞化された実行ファイルをメモリからダンプし、Ghidra で解析します
  6. netscan を実行して、空洞化されたプロセスからのネットワーク接続を確認します
  7. ダンプしたコードを 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)

コメント