SOC Prime Bias: 重大

26 May 2026 16:01 UTC

Void Dokkaebi、Cythonコンパイル済みInvisibleFerretマルウェアを使用

Author Photo
SOC Prime Team linkedin icon フォローする
Void Dokkaebi、Cythonコンパイル済みInvisibleFerretマルウェアを使用
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

概要

北朝鮮に関連する脅威アクター、Void Dokkaebiは、InvisibleFerretマルウェアをCythonでコンパイルしてネイティブの .pyd and .so バイナリに強化しました。この変更により、マルウェアはPythonスクリプトのみを対象とする検出を回避しつつ、認証情報の盗難、キーロギング、クリップボードのキャプチャ、暗号通貨ウォレットのハイジャックなどのコア機能を保持します。BeaverTailはマルチステージローダーとして機能し、コンパイルされたモジュールを取得して実行します。このキャンペーンは、ウォレット認証情報、署名キー、その他の高価値な秘密を持つ可能性のあるソフトウェア開発者と暗号通貨ユーザーを対象としています。

調査

研究者は感染チェーン全体を分析し、可読なPythonスクリプトからCythonコンパイルされた拡張モジュールへの明確な移行が確認されました。また、Base64エンコード、XOR暗号化、文字列操作の分割と交換を含むいくつかの難読化手法を文書化しました。調査中に、ハードコードされたIPアドレス、ポート、ファイル名を抽出し、一時的なPython .mod スクリプトが悪意のあるバイナリをロードするために使用されていることも観察されました。文字列分析により、ビルド環境の痕跡やブラウザベースの暗号通貨ウォレット拡張への参照も明らかになりました。

緩和策

防御者はスクリプトに焦点を当てた検出を超えて、疑わしい .pyd and .so ファイルが異常な場所に現れること、および一時的な .mod ローダースクリプトを監視する必要があります。観察されたファイル名、 ip-api.comへの外部要求、暗号通貨ウォレット拡張に関与するダウンロードも追加の検出機会です。実行後に一時的なローダースクリプトを削除または隔離することも、永続性の機会を減らすのに役立ちます。

対応策

関連する指標が検出された場合、影響を受けたエンドポイントを直ちに隔離し、特定されたコマンド アンド コントロール IP アドレスへの外部トラフィックをブロックし、リストされたバイナリとスケジュールされたタスクアーティファクトを追跡します。調査者は、取得した .mod スクリプトを分析し、埋め込まれたペイロードを抽出して、実行チェーンをよりよく理解するべきです。露出した暗号通貨の認証情報、ウォレットの秘密、または署名キーは遅滞なくリフレッシュするべきです。

攻撃フロー

この部分はまだ更新中です。通知を受け取るためにサインアップしてください

通知を受け取る

シミュレーション実行

前提条件: テレメトリー & ベースラインプレチェックが成功していること。

理由: このセクションでは検出ルールをトリガーすることを目的とした敵対的技術 (TTP) の正確な実行について詳述します。コマンドと物語は特定されたTTPを直接反映し、検出ロジックによって期待される正確なテレメトリーを生成することを目指します。曖昧または無関係な例は誤診につながります。

  • 攻撃の説明 & コマンド:
    攻撃者はCythonでコンパイルされたモジュールセット(mod.pyd, pad.pyd, brw.pyd)を入手し、認証情報収集およびC2通信を実装しています。永続化を達成するために、攻撃者はこれらのモジュールを現在のユーザーのVS Code構成ディレクトリ(%USERPROFILE%.vscode)にコピーします。VS Codeは定期的にこのフォルダをスキャンして拡張機能を検索し、後に悪意のあるPythonスクリプトによって悪意のあるモジュールがロードされることになります。このコピー操作は、Sigmaルールと一致するSysmon FileCreateイベントを生成します。

  • 回帰テストスクリプト:

    # -------------------------------------------------
    # InvisibleFerret Cythonモジュールのドロップシミュレーション
    # -------------------------------------------------
    $vscodePath = "$env:USERPROFILE.vscode"
    # 対象フォルダが存在することを確認
    if (-not (Test-Path -Path $vscodePath)) {
        New-Item -ItemType Directory -Path $vscodePath | Out-Null
    }
    
    # シミュレートされた悪意のあるバイナリ(ランダムなゴミデータ内容)
    $modules = @("mod.pyd","pad.pyd","brw.pyd")
    foreach ($mod in $modules) {
        $dest = Join-Path -Path $vscodePath -ChildPath $mod
        # コンパイル済み拡張を模した1KBのランダムバイトを書き込み
        $bytes = New-Object byte[] 1024
        (New-Object System.Random).NextBytes($bytes)
        [System.IO.File]::WriteAllBytes($dest, $bytes)
        Write-Host "Created $dest"
    }
  • クリーンアップコマンド:

    # -------------------------------------------------
    # シミュレートされた悪意のあるファイルのクリーンアップ
    # -------------------------------------------------
    $vscodePath = "$env:USERPROFILE.vscode"
    $modules = @("mod.pyd","pad.pyd","brw.pyd")
    foreach ($mod in $modules) {
        $file = Join-Path -Path $vscodePath -ChildPath $mod
        if (Test-Path $file) {
            Remove-Item -Path $file -Force
            Write-Host "Removed $file"
        }
    }