SOC Prime Bias: 中程度

12 2月 2026 12:14

GACハイジャック

Author Photo
Ruslan Mikhalov SOC Primeの脅威リサーチ責任者 linkedin icon フォローする
GACハイジャック
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

概要

この記事は、脅威アクターがローカル管理者アクセス権を持つ場合に、.NETアセンブリをグローバルアセンブリキャッシュ(GAC)で改ざんし、信頼された実行パスからコードを実行できる方法を説明します。MIGUIControls.dllのようなDLLを入れ替えることで、攻撃者は持続性を確立し、正当なプロセスの下で悪意のあるペイロードを引き起こすことができます。この方法は、GACの場所に書き込むための特権を必要とし、ネイティブイメージを削除してランタイムが変更されたアセンブリをロードするようにすることを含む場合があります。

調査

概念実証ユーティリティ(GAC-POC.exe)は、正当なDLLをコピーし、Mono.Cecilでメッセージボックスを表示するようにパッチを当て、変更されたバージョンをGACに書き戻すことでワークフローを示しています。観測可能なアクションには、GACへの書き込み操作、ngen.exeを使用したネイティブイメージの削除、更新されたアセンブリがロードされたときに発生する後続のプロセス生成活動が含まれます。

緩和

GACディレクトリの詳細なプロセス生成監査(イベントID4688)およびファイルシステム監査(イベントID4663)を有効にします。ngen.exeの疑わしい使用、mscorsvw.exeの実行、GACパスでの予期しないDLL書き込み活動にアラートを設定します。ローカル管理者アクセスの制限およびGACに格納されているアセンブリのコード署名検証または整合性チェックを強制することで、露出を減らします。

対応

GAC-POC.exeの実行、予期しないアセンブリの変更、ネイティブイメージの削除が検出された場合、ホストを隔離し、フォレンジックアーティファクトを保存し、既知の良好なベースラインからGACアセンブリを復元します。攻撃者が管理者権限を取得した方法と追加の持続性が確立されたかどうかを判断するために範囲を特定し続けます。

“graph TB %% クラス定義セクション classDef technique fill:#ffcc99 classDef process fill:#c2f0c2 classDef malware fill:#ffeb99 %% ノード定義 tech_valid_accounts[“<b>技術</b> – <b>T1078.003 有効なアカウント: ローカルアカウント</b><br/><b>説明</b>: 攻撃者は管理者を含むローカルアカウントの資格情報を取得して悪用し、不正なアクセスを獲得します。”] class tech_valid_accounts technique tech_hijack_exec[“<b>技術</b> – <b>T1574.014 実行フローのハイジャック: AppDomainManager</b><br/><b>説明</b>: 攻撃者はグローバルアセンブリキャッシュで.NET AppDomainManagerアセンブリを置換または改造し、.NETアプリケーションの実行フローをハイジャックします。”] class tech_hijack_exec technique tech_dll_injection[“<b>技術</b> – <b>T1055.001 ダイナミックリンクライブラリのインジェクション</b><br/><b>説明</b>: 攻撃者は信頼されたプロセスに悪意のあるDLLを注入して、そのプロセスのコンテキストでコードを実行します。”] class tech_dll_injection technique process_task_sched[“<b>プロセス</b> – タスクスケジューラーMMCスナップイン<br/><b>役割</b>: タスクをスケジュールするために使用される信頼されたシステムコンポーネントです。”] class process_task_sched process malicious_dll[“<b>マルウェア</b> – 悪意のあるDLL(例:ペイロード)<br/><b>目的</b>: インジェクション後に悪意のあるアクションを実行します。”] class malicious_dll malware %% 攻撃フローを示す接続 tech_valid_accounts u002du002d>|enables| tech_hijack_exec tech_hijack_exec u002du002d>|leads to| tech_dll_injection tech_dll_injection u002du002d>|uses| process_task_sched process_task_sched u002du002d>|loads| malicious_dll “

攻撃フロー

シミュレーションの実行

前提条件: テレメトリとベースラインの準備段階の確認が完了していること。

  • 攻撃のストーリーとコマンド:

    攻撃者は、悪意のあるアセンブリ(GAC‑PoC.exe)を準備しており、グローバルアセンブリキャッシュに配置されると、一致する強い名前を解決する任意の.NETプロセスによってロードされます。即時実行をトリガーし、検出ルールが正確なコマンドラインを確認できるようにするため、攻撃者はアセンブリを直接実行し、さらに ngen.exe を呼び出して悪意のあるDLLを事前コンパイルし、GACハイジャックにおけるステルス性を向上させる一般的なステップを実行します。これらのアクションは、監視対象の文字列を含む特有の4688イベントを生成します。

    1. 悪意のあるアセンブリを書き込み可能なディレクトリにコピーします (例: C:Temp).
    2. 概念実証のバイナリを実行し、ハイジャックを実証します。 to demonstrate the hijack.
    3. Run ngen.exe 悪意のあるアセンブリに対して GAC配置後によく見られるネイティブイメージ生成ステップをシミュレートします。
  • 回帰テストスクリプト:

    # -------------------------------------------------
    # GACハイジャック検出検証スクリプト
    # -------------------------------------------------
    # 前提条件: テストアカウントがローカル管理者権限を持つことを確認
    # し、プレフライトステップでWindows監査ポリシーが有効
    # になっていることを確認
    # -------------------------------------------------
    
    # 1. 悪意のある実行可能ファイルをデプロイ(シミュレーション)
    $tempDir = "C:Temp"
    if (-not (Test-Path $tempDir)) { New-Item -Path $tempDir -ItemType Directory | Out-Null }
    
    $gacPoCPath = Join-Path $tempDir "GAC-PoC.exe"
    
    # ペイロードをシミュレート – ログに書き込む小さな実行可能ファイルを作成
    # 実際のテストでは本物のファイルをコピーします
    Write-Output "偽ペイロードのプレースホルダー" | Out-File "$gacPoCPath.txt"
    # 実演のために、cmd /c echo(コマンドラインにもファイル名が表示されます)を呼び出します
    & cmd.exe /c "echo GAC-PoCシミュレーション実行中 > NUL"
    
    # 2. GAC-PoC.exeを直接実行
    Write-Host "[*] GAC-PoC.exeを実行中"
    Start-Process -FilePath $gacPoCPath -WindowStyle Hidden -PassThru | Out-Null
    
    # 3. 同じバイナリに対してngen.exeを呼び出す
    $ngenPath = "$env:WINDIRMicrosoft.NETFramework64v4.0.30319ngen.exe"
    if (Test-Path $ngenPath) {
        Write-Host "[*] GAC-PoC.exeに対してngen.exeを実行中"
        & $ngenPath install $gacPoCPath
    } else {
        Write-Warning "ngen.exeがこのホスト上にありません – ステップをスキップしています。"
    }
    
    # 4. アナリスト用に完了をログ
    Write-Host "[+] シミュレーション完了。SIEMでイベントID 4688アラートを確認。"
  • クリーンアップコマンド:

    # -------------------------------------------------
    # GACハイジャック検証後のクリーンアップ
    # -------------------------------------------------
    $tempDir = "C:Temp"
    $gacPoCPath = Join-Path $tempDir "GAC-PoC.exe"
    
    if (Test-Path $gacPoCPath) {
        Remove-Item -Path $gacPoCPath -Force
        Write-Host "[*] GAC-PoC.exeを削除しました"
    }
    
    # 生成されたネイティブイメージ(もしあれば)を削除します。
    $ngenPath = "$env:WINDIRMicrosoft.NETFramework64v4.0.30319ngen.exe"
    if (Test-Path $ngenPath) {
        & $ngenPath uninstall $gacPoCPath 2>$null
        Write-Host "[*] ネイティブイメージをアンインストール(もし存在した場合)。"
    }
    
    # 空の場合は一時フォルダをオプションで削除
    if ((Get-ChildItem $tempDir).Count -eq 0) {
        Remove-Item -Path $tempDir -Force
        Write-Host "[*] 一時ディレクトリ$tempDirを削除しました"
    }
    
    Write-Host "[+] クリーンアップ完了。"