[3月|マルウェア分析レポート]韓国企業を狙うVidarインフォスティーラー、APT28との関連の兆候
サンズラボの脅威分析チームは、毎月マルウェアを選定してレポートを作成しています。
サンズラボの脅威分析チームは、毎月マルウェアを選定してレポートを作成しています。
専門的な分析で把握したマルウェアの特徴、脅威の動向、関連情報などを共有し、安全なサイバー環境の実現を目指しています。
マルウェアの詳しい情報は、サイバー脅威インテリジェンスサービス<CTX>でご確認いただけます。
1. 概要
本レポートでは、個人情報や金融情報を窃取するVidarインフォスティーラーを詳しく分析します。
Vidarは2018年頃に初めて登場して以来、継続的に機能を高度化し、現在はMaaS(Malware as a Service)としてダークウェブで流通する情報窃取型マルウェアです。当初はArkeiトロイの木馬の派生として知られていましたが、その後、ブラウザーの保存情報、暗号資産ウォレット、FTPクライアント、クラウドプラットフォームの認証情報など、多様な機密データの収集・流出に最適化された構造へ進化しました。最近ではSteamやDiscordなどの認証トークンまで巧妙に窃取し、攻撃対象を広げています。
VidarはTelegramチャンネルやSteamプロフィールなどの正規WebサービスをC2の中継地点として利用し、実際のC2アドレスをリアルタイムに取得する設計です。攻撃者はマルウェアを再配布せずにC2インフラを容易に変更し、セキュリティ製品の遮断を回避できます。今回の検体もこの方式を採用し、韓国語のファイル名と文書アイコンで韓国のユーザーを標的に配布されました。EV(Extended Validation)コード署名付きの正規実行ファイルを装って疑念を避け、その後プロセスホロウイング(Process Hollowing)で子プロセス内にペイロードを隠し、検知と解析をさらに難しくします。
特に今回の検体は、ロシアと関連するAPT28が悪意のあるメールの送信や、乗っ取ったルーター経由での流出データ回収に使用したドメインと、同じインフラを共有しています。単なるMaaS利用にとどまらず、APTレベルの高度な脅威である可能性も考えられます。本レポートではVidarの全体構造、攻撃手法、検知回避技術、APT28との関連を中心に分析し、同様の脅威への今後の対応戦略に役立てることを目指します。
2. マルウェア情報
「파손사진 주문서(파손상태가 많이 안좋습니다 확인부탁드립니다).exe」や「저작권 관련 이미지 아이콘 UI 사용 내역.exe」といったファイル名で配布され、Hangulワープロのアイコンを使って文書ファイルと誤認させ、実行を促していました。特に、韓国のオンライン販売者に対し、商品が破損したため対応を求める内容のメールに添付して送られ、悪意のあるファイルを実行させていました。

[図1]悪意のあるファイルのアイコン
Go言語で作成されており、ユーザーに目立つ異常を見せずに内部でSetup.exeを実行します。GoはWindows、Linux、macOSなどへのクロスコンパイルに対応し、従来のCベースのマルウェアに比べて分析事例が少なく、解析ツールとの互換性も低めであるため、検知や静的解析が難しいという特徴があります。攻撃者がより密かに配布・運用できる環境を提供します。
Setup.exeは「NEW VECTOR LTD」名義のEVコード署名を含み、セキュリティ製品の検知回避やユーザーの信頼獲得に利用されています。正式な認証局DigiCertが発行した正規の証明書チェーンを含み、署名日時は2025年2月11日です。ただし、現在この証明書は有効ではなく、認証局(SSL.com)により失効していることが確認されました。

[図2]デジタル署名を検証できない証明書の情報
実行後も表面上は異常が見られませんが、バックグラウンドでブラウザーの保存情報、暗号資産ウォレット、システム情報などを収集して外部のC2へ送信します。プロセスホロウイングで子プロセスにペイロードを隠し、解析を困難にして悪意のある動作を継続する設計です。
3. マルウェアの動作フロー
文書を装った実行ファイルで初期感染を誘います。被害者が実行すると同一の子プロセスを作成し、内部で展開したペイロードをプロセスホロウイングで注入します。これにより検知を回避し、悪意のある動作を隠したまま継続します。
ペイロードを注入したプロセスは、攻撃者の命令を受信するための初期設定を行います。TelegramやSteam Communityなどの正規プラットフォームを中継地点として使い、ハードコードされたリンクに接続してHTMLを解析し、「ir7am」を手掛かりに実際のC2アドレスを抽出します。攻撃者はマルウェアを再配布せず、随時C2アドレスを変更できます。
C2アドレスを取得すると、感染したシステムから収集したブラウザーの保存情報、暗号資産ウォレット、システム情報、クラウド認証情報などを外部へ送ります。収集データは非同期送信処理で、最終的に抽出した実際のC2サーバーへ送信されます。

[図3]マルウェアの動作フロー
4. マルウェア分析
4.1. 悪意のあるペイロードのメモリへの読み込みと実行
配布されたマルウェアを実行すると、内蔵ペイロードが展開されてメモリに読み込まれます。実行ファイルと同じ名前の子プロセスを作成し、プロセスホロウイングでペイロードを注入します。この手法により悪意のある動作を隠し、検知を回避できます。

[図5]抽出した悪意のあるペイロードのHex Dump
4.2. C2サーバーアドレスの取得と接続
攻撃者の命令を受け取るため、正規プラットフォーム(Steam CommunityとTelegramチャンネル)を中継サーバーとして実際のC2アドレスを動的に取得します。手順は次のとおりです。
まず、内部にハードコードされたTelegramとSteam CommunityのURLを配列にまとめます。
各要素は、TelegramチャンネルまたはSteam Communityプロフィールのリンク、キーワード、User-Agent文字列で構成されます。
配列の内容は次のとおりです。
- Telegram/Steam Community: https://t.me/l793oy, https://steamcommunity.com/profiles/76561199829660832
- キーワード:ir7am
- User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Chrome/131.0.0.0 Safari/537.36 OPR/116.0.0.0

[図6]ハードコードされたURLの組み合わせ
次にURL一覧を順番にたどり、各URLへHTTPリクエストを送って応答を解析します。
受信したHTMLから「ir7am」とともに記載された実際のC2アドレスを解析・抽出します。分析ではTelegramページからhttps://b.b.goldenloafuae.com、Steam Communityページからhttps://116.202.4.223が確認されました。

[図7]TelegramとSteamプロフィールに記載された実際のC2アドレス
正規プラットフォームを中継に使うことで検知を回避し、攻撃者は掲載内容の変更だけで、マルウェアを再配布せずにC2を切り替えられます。
4.3. 被害システムの情報収集
感染したシステムから、さまざまな機密情報を幅広く収集します。
プログラムのバージョン、GUID、HWID、実行パスと作業ディレクトリ、Windowsのインストール情報、導入済みウイルス対策ソフト、コンピューター名、ユーザー名、画面解像度、キーボード言語、システム時刻、タイムゾーンなどを収集します。ハードウェア情報にはプロセッサーの種類、コア数、スレッド数、メモリ容量が含まれます。実行中のプロセス一覧と、レジストリ(HKEY_LOCAL_MACHINE、HKEY_CURRENT_USER)に登録されたソフトウェア情報も収集し、攻撃者が構成や使用環境を詳しく把握できるようにします。データはinformation.txtとしてメモリに保存され、圧縮・暗号化後にC2へ送られます。

[図8]実際のC2へ送信されたシステム情報の復号結果
4.4. ブラウザー保存情報の窃取
ブラウザーのプロファイルディレクトリを探索してユーザーデータを窃取します。
主な対象はCookies、Web Data、Historyなどのファイルで、通常は%LOCALAPPDATA%、%APPDATA%などの環境変数とユーザーのパス情報を使って場所を特定します。
FindFirstFileA()とFindNextFileA()でプロファイル内を検索し、対象ファイルを探します。見つかったファイルをメモリに読み込み、_cookies.db、_webdata.db、_history.dbなどの名前で圧縮・暗号化してC2へ送ります。窃取したCookieやセッション情報により、追加認証なしでオンラインアカウントへ直接アクセスできるため、プライバシー侵害や金銭被害につながる可能性が高くなります。

[図9]実際のC2へ送信されたブラウザーデータ
4.5. ファイル転送クライアントの認証情報窃取
4.5.1. FileZillaのFTP認証情報窃取
ローカルシステムでFileZillaの接続履歴を保存するrecentservers.xmlを探し、FTPログイン情報を抽出して外部へ送ります。
まず、環境変数%APPDATA%のパスにある\AppData\Roaming\FileZilla\recentservers.xmlをメモリへ読み込みます。strtok_s()と<Host>、<Port>、<User>、<Pass encoding="base64">などのタグを使ってXML文字列を解析し、FTPサーバーのアドレス、ポート、アカウント名、パスワードを抽出します。
FileZillaの設定ファイルではパスワードがbase64形式で保存されるため、内蔵デコード処理で平文へ戻します。抽出した認証情報は「Soft: FileZilla」を含む形式に整え、passwords.txtとして圧縮・暗号化し、外部のC2へ送信します。

[図10]FileZilla認証情報の流出データを整形するコード
FileZillaは広く使われるFTPクライアントです。認証情報を得た攻撃者は、被害者が管理・利用できるFTPサーバーへ不正接続できるようになり、Webサーバーの乗っ取り、バックドアの設置、サイト改ざんなどの二次被害につながる危険があります。
4.5.2. WinSCPのセッション認証情報窃取
WindowsレジストリからWinSCPのログイン情報を収集して流出させます。WinSCPはセッション設定をHKEY_CURRENT_USER\Software\Martin Prikryl\WinSCP 2\Sessionsに保存しており、マルウェアはここからユーザーごとのFTP/SFTP接続情報を探索します。
まずマスターパスワードの使用有無を確認し、設定されていない場合のみ収集します。その後、セッションキーを列挙して各セッションから次の情報を抽出します。
- HostName:接続先サーバーのアドレス
- PortNumber:ポート番号(未設定時は標準の22を使用)
- UserName:ログインアカウント
- Password:保存されたパスワード
抽出した認証情報は「Soft: WinSCP」を含む形式に整え、passwords.txtとして圧縮・暗号化し、外部のC2へ送ります。

[図11]WinSCP認証情報の流出データを整形するコード
4.6. Monero暗号資産ウォレットファイルの窃取
感染したシステムからMoneroのウォレット情報を収集し、外部へ流出させます。
まずWindowsレジストリのHKEY_CURRENT_USER\SOFTWARE\monero-project\monero-coreを開き、wallet_
path値を照会してユーザーのMoneroウォレットの場所を特定します。通常ここには.keys拡張子の鍵ファイルがあり、秘密鍵などの機密情報を含みます。マルウェアは.keysファイルの完全なパスを構成してコピーし、圧縮・暗号化してC2へ送信します。

4.7. Steamアカウント・設定情報の窃取
4.7.1. SteamのJWTトークン窃取
Steamの認証情報を窃取するため、メモリ内のJWT(JSON Web Token)を探索して収集・流出させます。まずsteam.exeのPID(Process ID)を特定し、仮想メモリを順番に走査します。対象はJWTの一般的なヘッダーをbase64化した「eyAidHlwIjogIkpXVCIs」で、復号すると{ "typ": "JWT",になります。コードはバイト列65 79 41 69 64 48 6C 77 49 6A 6F 67 49 6B 70 58 56 43 49 73を探し、その周辺のメモリブロックを読み取ります。そこに「N0ZWFt」があるか確認し、条件に合えば有効なJWTとみなします。トークンは圧縮・暗号化後にC2へ送られます。

[図13]プロセス内でJWTヘッダーを探索するコード
SteamはEdDSA(Edwards-curve Digital Signature Algorithm)署名付きJWTを認証とセッション維持に利用します。ログイン状態を識別し認証済みセッションを保つ重要な手段であり、窃取したJWTにより別途ログインせずユーザーになりすましてアクセスできます。攻撃者が入手すると、Steamアカウントへの不正接続、乗っ取り、アイテムの盗難などの二次被害につながります。
4.7.2. Steam設定ファイルの窃取
Steamクライアントの主要設定ファイルを探して窃取し、攻撃者のC2へ送信します。レジストリのHKEY_CURRENT_USER\Software\Valve\Steamにある「SteamPath」からインストール先を特定し、設定ファイルを含むconfigディレクトリを見つけます。

[図14]探索するSteam設定ファイルのパスを指定するコード
config.vdf、DialogConfig.vdf、DialogConfigOverlay*.vdf、libraryfolders.vdf、loginusers.vdfなどの機密情報を含むファイルを名前のパターンで探します。見つかったファイルはメモリに読み込み、圧縮・暗号化してC2へ送ります。
特にloginusers.vdfはSteamの自動ログイン情報を含むため、攻撃者がアカウントへ直接アクセスできるようになります。また、libraryfolders.vdfとconfig.vdfからは、インストール済みゲームや環境設定などの詳細情報も把握できます。
4.8. Discord認証トークンの窃取
被害者のDiscordクライアントのローカルストレージから認証トークンを収集し、外部へ送信します。
DiscordのLevelDBとLocal Stateを組み合わせ、AESで暗号化されたトークンを復号して送ります。%APPDATA%を取得し、\discord\Local Storage\leveldb\CURRENTの存在でDiscordの導入を確認します。パスが有効なら、leveldb内の.ldbと.logファイルを収集対象にします。

[図15]DiscordのLevelDB内のCURRENTパスを設定するコード
次に%APPDATA%\discord\Local StateからAES-GCMキーを抽出し、先にコピーしたleveldbファイルの認証トークンを復号します。固定識別子「dQw4w9WgXcQ」でトークン文字列を特定し、Base64デコードとAES復号により平文を取得します。token*.txt形式でメモリ上に構成し、圧縮・暗号化してC2へ送ります。

[図16]Discordトークンの識別コード
4.9. クラウド認証情報の窃取
被害者のシステム内でクラウドサービスの認証情報ファイルを探し、C2へ送信します。
主な対象はMicrosoft AzureやAmazon Web Services(AWS)で、Windowsの認証情報を保存するMicrosoft IdentityServiceディレクトリも含まれます。いずれもローカルの標準ディレクトリにアクセスキー、設定ファイル、トークンなどを保存しており、攻撃者はこれらのパスを中心に探索・流出を試みます。
主に次の3つのディレクトリを探索します。
- Azure CLI認証ディレクトリ:%USERPROFILE%\.azure\
Azure CLIでログインしたユーザーの認証情報と関連ファイルを保存する場所です。内部を再帰的に探索・収集してC2へ送ります。
- AWS CLI認証ディレクトリ:%USERPROFILE%\.aws\
AWS CLIの設定ファイル(credentials、config)があり、Access Key IDやSecret Access Keyなどを含むファイルを探して同様に流出させます。
- Microsoft IdentityServiceディレクトリ:%LOCALAPPDATA%\.IdentityService\
MicrosoftアカウントやAzure ADの認証トークン、キャッシュなどが保存されており、再帰的に探索して重要な認証情報を収集・流出させます。

[図17]探索対象ディレクトリのコード
発見したファイルは圧縮・暗号化してC2へ送ります。
窃取した認証情報は、被害者のクラウド資源への不正アクセスや、それを足掛かりとした追加攻撃に悪用される可能性があります。
4.10. 画面のキャプチャーと窃取
被害者の画面全体をキャプチャーし、JPEGに変換して外部のC2へ送ります。
GDI+(Graphics Device Interface+)ライブラリを利用し、まずInitializeGDIPlus()で環境を初期化してJPEG画像エンコーダーを検索・設定します。
GetDesktopWindow()とGetWindowRect()で画面全体のサイズを取得します。続いてGetDC()、CreateCompatibleDC()、CreateCompatibleBitmap()でキャプチャー用のメモリDC(Device Context)とビットマップを作成し、BitBlt()で画面内容をメモリDCへコピーしてスクリーンショットを取得します。

[図18]画面キャプチャーのコード
メモリストリームを作成し、指定したエンコーダーでキャプチャー画像をJPEGとして保存します。その画像はscreenshot.jpgという名前でC2へ送られます。
4.11. リモートの悪意のあるペイロードのダウンロードと実行
リモートサーバーから悪意のあるペイロードを取得し、被害者のシステムで実行します。保存先はC:\ProgramData\で、C2通信で受信したスタック値が0なら.exe、1なら.dllを拡張子に設定します。

[図19]ファイル拡張子の設定コード
C2から受信したURLを復号してペイロードをダウンロードし、設定したパスに保存します。完了するとShellExecuteExW()で直ちに実行します。.exeは直接実行し、.dllはrundll32.exeを使って特定のexport関数を間接的に呼び出します。セキュリティ製品のプロセスベースの検知を回避できる手法です。

[図20]rundll32.exeの指定コード
攻撃者は必要に応じてシステム内の悪意のある動作を拡張したり、追加ペイロードを遠隔で取得・実行したりできます。そのためシステムは継続的に追加の脅威へさらされ、こうした回避手法によって正確な検知と対応も難しくなります。
4.12. 悪意のある動作の痕跡削除
悪意のある動作を終えると、cmd.exeを呼び出して削除コマンドを実行し、システム内の痕跡を消します。
ShellExecuteExA()で実行するコマンドは、/c timeout /t 11で11秒待ってから削除します。条件分岐の一方はrd /s /q "C:\ProgramData\Data\" & exitでフォルダー全体を削除し、もう一方はdel /f /q *を追加して内部のファイルを強制削除した後、ディレクトリを削除します。
削除対象は、悪意のある動作に使用したC:\ProgramData\Data\に固定されています。
終了前に明確なディレクトリ削除処理を設けることで、ディスク上の痕跡を最小限に抑え、解析を妨げる設計とみられます。時間を置いて削除するため、実行中の悪意のあるプロセスが完全に終了してからファイルを消すことができ、周到な設計が確認できます。
ShellExecuteExA({ cbSize: sizeof(SHELLEXECUTEINFOA), fMask: ..., hwnd: NULL, lpVerb: "open", lpFile: "C:\\Windows\\system32\\cmd.exe", lpParameters: "/c timeout /t 11\" & rd /s /q \"C:\\ProgramData\\Data\\\" & exit", nShow: 0x3c, ... }); | ShellExecuteExA({ cbSize: sizeof(SHELLEXECUTEINFOA), fMask: ..., hwnd: NULL, lpVerb: "open", lpFile: "C:\\Windows\\system32\\cmd.exe", lpParameters: "/c timeout /t 11\" & rd /s /q \"C:\\ProgramData\\\" & del /f /q\" & exit", nShow: 0x3c, ... }); |
|---|
[表1]痕跡を削除するシェルコマンド
5. 収集・流出する情報
区分 | 詳細 | 対象プログラム |
|---|---|---|
Chromiumベースのブラウザー | - Cookie - Webデータ - 閲覧履歴 | Google Chrome、Google Chrome Canary、Chromium、Vivaldi、EpicPrivacyBrowser、CocCocなど |
システム情報 | - プログラムのバージョン情報 - システムのローカル時刻、タイムゾーン - MachineGuid - GUID - HWID - 実行パス - OS製品名 - ホスト名 - アカウント名 - 解像度 - キーボード一覧 - CPU - ソケット数 - コア数 - RAM - GPU - プロセス一覧 - インストール済みプログラム一覧 | Windows |
ファイル転送 クライアント | - ホスト - ポート - ユーザー - パスワード | FileZilla, WinSCP |
ローカルファイル型 ウォレット | - .keysファイル | Monero |
コミュニケーション プラットフォーム | - JWTトークン - 設定ファイル(config.vdf、DialogConfig. vdfなど) | Steam |
- LevelDBファイル、Local Stateファイル | Discord | |
- セッションキー - キャッシュデータ - ユーザーの会話情報 | Telegram | |
クラウド 認証情報 | - %USERPROFILE%\.azure\ - %USERPROFILE%\.aws\ - %LOCALAPPDATA%\.IdentityService\ | Microsoft Azure, Amazon Web Services |
スクリーンショット | - 画面全体 |
[表2]収集・流出する情報
6. 結論
分析対象はVidarインフォスティーラー系で、Hangul文書アイコンと韓国語のファイル名を使い、韓国のユーザーを標的に配布されました。
特に、商品の破損確認を求めるメールに添付され、韓国のオンライン販売者を狙っていました。EVコード署名を含む正規実行ファイルを装い、実行を促して検知を回避する設計です。起動後は同名の子プロセスを作り、プロセスホロウイングでメモリにペイロードを隠して、バックグラウンドで悪意のある動作を行います。
C2通信にはTelegramやSteam Communityなどを中継として使い、ハードコードされたリンクのHTMLを特定のキーワードで解析して現在のC2アドレスを取得します。攻撃者は再配布せず柔軟にC2を変更し、検知や遮断を回避できます。
収集対象はブラウザー情報、FTP設定、Steam・Discordのアカウント情報、暗号資産ウォレット、クラウド認証情報など広範です。特に、SteamのJWTとDiscordのAES-GCM暗号化トークンをメモリで直接復号・抽出する高度な手法が使われています。画面をキャプチャーして画像として流出させるスパイウェア機能、遠隔ペイロードの取得・実行、最終段階でファイルとディレクトリを自動削除する隠蔽機能も実装されています。
今回の検体はb.b.goldenloafuae.comをC2として使用しました。アラブ首長国連邦(UAE)に実在する製菓ブランド「Golden Loaf」のドメインであり、実サーバーまたはドメイン情報が乗っ取られたと判断されます。また、goldenloafuae.comは過去にロシア関連のAPT28が悪意のあるメールの送信や、乗っ取ったルーターを介する流出データ回収に利用しており、今回もAPT28との関連が示唆されます。実在企業のドメインを乗っ取る手法は、悪意のある通信を通常の通信に見せかけ、検知を回避するために利用されます。

[図21]APT28が使用したドメインgoldenloafuae.com
MaaSとして流通するVidarは、複数の攻撃者が同じペイロードを共有し、C2情報だけを変えて利用できる構造です。しかし今回のようにAPTの攻撃インフラが再利用された形跡は、単なるツール利用を超えて、特定の国や業界を狙う高度な攻撃である可能性を裏付けます。最近は実際の被害者が利用するオンラインコミュニティで「商品の破損確認依頼」メールへの注意喚起が広がり、韓国のオンライン販売者を中心に現実の被害が生じていることが分かります。類似の脅威が繰り返される可能性は高く、韓国企業とユーザーを守るため、継続的な脅威インテリジェンスの共有と多層防御の強化が必要です。


