これまで記録されていなかったOXLOADERという名称のWindowsローダーが、悪意のあるGoogle広告を介してCASTLESTEALERという情報窃盗マルウェアを配信しており、静的エンジンやサンドボックスでの検出率が低い。ローダーは、複数の難読化レイヤー(制御フローの平坦化、不透明な述語、ブール演算と算術演算の混合)、自己修正復号スタブを使用し、Windowsの.relocセクションを悪用してシェルコードをステージングします。
Elastic Security Labsは、当社の顧客の1社を標的とした攻撃キャンペーンにおいて、OXLOADERを特定しました。CIS地域およびロシア語圏からの除外設定は、金銭目的のロシア語を話す攻撃者によるものであることを示唆しています。この家族に関する過去の報道は確認されていません。
重要なポイント
- Elastic Security Labsが新たなローダー(OXLOADER)を発見
- OXLOADERは、悪意のあるGoogle広告を介してCASTLESTEALERを配布するキャンペーンで確認されました。
- CIS地域除外とロシア語チェックは、ロシア語を話す金銭目的の脅威アクターを示唆している。
- 静止エンジンおよびサンドボックス爆発における検出率が低い
- Elastic Defendは、高度な防御機能を使用して攻撃チェーン全体を阻止します。
マルバタイジングがどのようにしてOXLOADERを被害者に届けたか
OXLOADERは、Node.jsを装った悪質なGoogle広告を通じて配布されています。被害者は中間ドメインを経由してStorjがホストするバッチスクリプトにリダイレクトされ、そこでOXLOADERがダウンロードされて実行される。
感染は、ユーザーがlts version of node.jsを検索し、スポンサー付きの検索結果をクリックしてnode-js[.]prentiva99[.]infoにアクセスしたことから始まりました。は、正規のNode.jsデプロイメントプラットフォームになりすますように設計された悪意のあるランディングページです。攻撃者は、米国在住の被害者を標的としたGoogle広告キャンペーンを実施しました。広告は4月23 、 2026に最後に表示され、サイトは現在オフラインになっています。広告主は、ウクライナを拠点とする認証済み名ВОЛОДИМИР ТЕРЕЩЕНКОで登録されています。これが実際の運営者本人なのか、フロントアカウントなのか、あるいは購入した身元情報なのかは依然として不明である。5月14 、 2026に、広告主とその関連広告キャンペーンはGoogleから完全に削除されました。
操作を行うと、ユーザーはapp[.]miloyannopoulos[.]com/download?subid1=downloadを経由してリダイレクトされ、ペイロードURL link[.]storjshare[.]io/raw/jux4e4ky5mruo4jkxsssp42sau4q/ruslan/BATPackageBuilderSetup.batに対して302 Foundで応答しました。これにより、 Storjの正規のリンク共有サービス上にホストされたWindowsバッチスクリプトが配信され、攻撃者はこれを悪用してドメインベースの評判フィルタリングを回避した。
バッチスクリプトは、偽のソフトウェアインストールウィザードのUIを表示し、PowerShellを介してStorj URL link.storjshare[.]io/raw/jwwvr4oskkkjsgevt774ta62ehya/ruslan/aBsvwbdas.exeから次の段階の実行可能ファイルを即座にダウンロードし、 -Verb RunAsを使用してそれを起動してUAC昇格プロンプトをトリガーします。
バッチスクリプトの実行後、Elastic Defend は悪意のある動作を検出しました (ポリシーは検出のみに設定されていました)。これにより、 Microsoft Common Language Runtime Loaded from Suspicious Memoryを含む複数の動作ルールがトリガーされ、 CASTLESTEALERと一致する .NET ベースのペイロードが示唆されました。
以下は、ペイロードのダウンロードからCASTLESTEALER展開までの攻撃チェーンの実行グラフです。
OXLOADERマルウェアローダー:技術分析
当チームが分析した最初のOXLOADERサンプルは、 rohitab.com の人気ツールである API Monitor になりすましていました。正規のコードが多数含まれており、コード隠蔽技術も用いられているため、このローダーは静的ファイルアナライザーの監視を逃れることができる。
OXLOADERが実行時に自身を解凍する方法
このマルウェアは、ユーザーコードが実行される前に、CRT初期化フェーズ中に実行を開始します。CRT関数cinit()はinitterm()を呼び出し、はC++初期化テーブル( __xc_a → __xc_z )を走査して各エントリを呼び出します。マルウェア開発者はこれらのエントリの1つを乗っ取り、 RegisterClipboardFormatW()呼び出しを行う関数を指し示してから、最初の復号化スタブに末尾ジャンプします。
ローダーは、複数の復号スタブを用いた自己改変技術を使用して自身を展開します。以下は、実行時に復号化スタブをパッチ適用してから、そのスタブにジャンプする例です。
パッチ適用後、ローダーは28,233バイトの領域を復号化する。各バイトは、反復処理ごとに更新される1バイトのXORキーを使用して復号化されます。復号化されたばかりの平文バイトがキーに追加され、そのキーを使用して次のバイトが復号化されます。この同様の復号処理は、合計3回実行され、それぞれ異なる領域で行われます。
静的検出を回避するために使用される難読化技術
OXLOADERは、制御フロー平坦化(CFF)、混合ブール演算(MBA)、不透明な述語、および非連続コード領域にわたる関数チャンキングという4つの階層的な難読化技術を使用して、IDA Proなどのバイナリ解析ツールにおける自動関数境界検出を破ります。関数は無条件ジャンプによって連結され、一部の領域には間接ジャンプによって到達され、そのターゲットアドレスはMBA演算によって実行時に計算される。その結果、IDA Proは関数境界を確実に再構築することができず、手動での修正が必要となる。
ローダーは、実行時に以下の文字列復号アルゴリズムを使用して様々な文字列を復号します。
uint32_t obf_xor_a1_with_a2_plus_33FDA(uint32_t a1, uint32_t a2) {
return a1 ^ (a2 + 0x33FDA);
}
コードが完全に解凍/復号化された後、マルウェアはこの文字列復号化関数とAdler-32 APIハッシュアルゴリズムを組み合わせて、インポートを動的に解決します。
OXLOADERはどのようにしてサンドボックスとVMの検出を回避するのですか?
OXLOADERはAPIを解決した後、マシンがクリーンな環境で実行されることを保証し、サンドボックス環境での実行を回避するために、さまざまなチェックを実行します。
| 確認 | メソド | しきい値 |
|---|---|---|
| エミュレーション | WNetAddConnection2W 不正なリソース | ERROR_BAD_NAME (0x43) を期待します |
| CPU数 | プロセス環境チェック | ≥ 3 CPU |
| ラム | GlobalMemoryStatusEx | ≥ 3 GBの物理メモリ |
| ディスプレイのリフレッシュレート | WMI Win32_VideoControllerクエリ | ≥ 20 Hz |
| 地理的地域 | GetUserGeoID | CISジオイドは除外します |
最初のチェックでは、 mpr!WNetAddConnection2Wを使用して、意図的に不正な形式のネットワーク リソース ( *72s@1s ) に接続しようとします。この手法は、フックしたり、無条件に接続成功を返したりする可能性のあるエミュレーション/サンドボックスを無効化するようです。マルウェア開発者は、TEBに直接アクセスしてLastErrorValueを取得することでこの呼び出しを検証します。ローダーはこのエラーコードがERROR_BAD_NAME (0x43)であることを想定しています。エラーコードがこの値以外の場合、マルウェアは失敗分岐に進み、実行を停止します。
2つ目のチェックは、プロセッサ数に基づくアンチサンドボックステストです。ローダーは、処理を続行するためにホストが少なくとも 3 CPUを持っていることを要求します。多くのサンドボックスや分析用仮想マシンは、リソースを節約するために1つか2つのCPUしか割り当てられていないため、このしきい値によってこれらの自動分析環境は除外されます。
次のチェックでは、 GlobalMemoryStatusEx()を使用して、ホストに少なくとも 3 GB の利用可能な物理メモリがあることを確認します。
さらに、WMI を使用してシステム ディスプレイのリフレッシュ レートを照会し、WQL ステートメントSELECT CurrentRefreshRate FROM Win32_VideoControllerを実行して、返された値 (ヘルツ単位) をしきい値 20 と比較します。物理モニターは通常、約 60 Hz以上を報告しますが、ヘッドレス構成およびデフォルト仮想化構成では通常 0 または1を報告し、 20 未満の値ではローダーが異常終了します。
地理的および言語的除外
最後の2つのチェックは、ホストがCIS諸国にある場合、またはロシア語に設定されている場合に実行を停止します。このカテゴリの最初のチェックでは、 GetUserGeoIDを使用してシステムの地理的領域を取得し、ハードコードされた CIS 諸国の GEOID のリストと比較します。
2 番目のチェックではGetUserDefaultUILanguage使用し、ロシア語版 Windows インストールの標準構成である LANGID ( 0x419 - Russian, Russia ) と照合します。
.reloc を介したシェルコードのステージングセクションとOCXファイル
すべてのチェックに合格した後、マルウェアはWindows DirectUI Engine DLL( C:\Windows\System32\dui70.dll )のコピーを作成し、 .ocx拡張子( PFHemkxVk.ocx )が付いたランダムに生成された名前を使用して一時的な場所に保存します。この拡張子の選択が、OXLOADERという姓の由来となった。
次に、OXLOADER はこのターゲット DLL ( PFHemkxVk.ocx ) 内に ( .xtext ) という名前の新しいセクションを作成します。
この新しいセクション( .xtext )は、悪意のあるコードの次の段階を保存および実行する準備として、RWX(読み取り/書き込み/実行)保護が設定されています。
この更新されたDLL( PFHemkxVk.ocx )は、 LoadLibraryAを介して既存のローダープロセスにロードされます。
通常の Windows 実行ファイルでは、 .relocセクションにはIMAGE_BASE_RELOCATIONブロックのテーブルが含まれており、イメージが推奨ベース以外のアドレスにロードされたときに、Windows ローダーが絶対アドレスをパッチするために適用します。このサンプルでは、マルウェア開発者は
を使用しています。ベース再配置エントリの代わりに、 .relocセクションに悪意のあるコードを格納します。これは静的解析における重大な危険信号です。正当なツールチェーンは.relocセクションにコードを出力しません。
.relocセクションのこのシェルコードは、OCX ファイル内の新しく作成されたセクション ( .xtext ) にコピーされ、ローダーはこのコードを呼び出します。
前述のとおり、この次の段階を解読するために、別の復号化スタブが使用されます。
DonutLoaderと.NETアセンブリを介したインメモリ情報窃盗配信
この次の段階のシェルコードは、 DonutLoaderによって構成されたペイロードです。DonutLoader は、.NET アセンブリ、DLL、および EXE を位置独立シェルコード (PIC) にラップしてメモリ内で実行するためのオープンソースのシェルコードジェネレータです。アンパック中、シェルコードは、鍵( 6E0A1F8F77F7011561F6F9CA96B71B8F )とIV( 956C6128E9362E075F8D006C93616A66 )を使用して、CTRモードのChaskey-LTSブロック暗号を使用して、ローダーの埋め込み構成と実行コンテキストを復号します。
復号化後、ペイロードは aPLib を介して解凍され、DonutLoader のRunPE()関数を介してブートストラップされます。最後のペイロードは、ハントレスが新たに発見した情報窃盗装置「CASTLESTEALER」である。この帰属は、以前のサンプルで発見された0xDEADBEEFマーカー間でC2通信に使用されたのと同じAESキーに基づいています。
2番目のOXLOADERバリアント:同じローダーだが、偽装プログラムが異なる
2つ目のOXLOADERの亜種は、API MonitorではなくNode.jsインストーラーを装っているが、ローダー機構は全く同じである。
5月13 、 2026に、リダイレクタエンドポイントapp.miloyannopoulos[.]com/download 、ランダムに選択された2つのLocationヘッダーフィールドのいずれかで応答することを発見しました。
https://link.storjshare[.]io/raw/jv5uebuqwzfpmtahj34q753ptykq/node/BATPackageBulderSetup.bathttps://link.storjshare[.]io/raw/jvsmdybqmvwep2oawbobp6ub7aza/node/node-v24.15.0-x64-86.exe
バッチインストールスクリプト( BATPackageBulderSetup.bat 、「Builder」にタイプミスあり)は、ほぼ変更なし。唯一の違いは、Storjペイロードリンクがnode-v24.15.0-x64-86.exeという名前の別のバイナリを指していたことです。
ペイロードは、ファイル名に「node」を残しつつ、無害なCMakeコードであるかのように装おうとする。これはおそらく、おとりのテーマを維持するためだろう。以前の「API Monitor」サンプルは、おそらく運営者による配布ミスだったと考えています。
実行時に、同じパターンが確認されました。メモリ内自己復号化に間接ジャンプが使用され、続いてmpr.dllがロードされ、 WNetAddConnection2Wが呼び出されます。以前に議論したローダー機構と同一であることを確認しました。このサンプルもCASTLESTEALERをロードします。
以下は、自己復号化が行われる部分の抜粋です。ダミーのCMake関連文字列が関数呼び出しの引数として渡され、呼び出し箇所の直後のメモリに小さな復号化スタブがパッチされるようです。実行はその後スタブにジャンプして後続の命令を復号化し、このプロセスはマルウェア本体が復号化されるまでさらに 2 回繰り返されます。
結論:なぜディフェンダーはOXLOADERを追跡すべきなのか
OXLOADERはまだ運用初期段階にあるが、その背後にある技術力から、このシリーズは注目に値すると言えるだろう。コードの難読化、VM対策、バイナリを偽装するために使用される無害に見えるコード、および独自のステージング技術は、分析を回避するための意図的なエンジニアリング上の選択を反映している。その投資は実を結び、静止エンジンや爆発試験における検出率が低く抑えられており、OXLOADERは追跡される前に活動できる時間的猶予を得ている。
MITRE ATT&CKによるREF8372
Elasticは、 MITRE ATT&CK フレームワークを使用して、脅威がエンタープライズネットワークに対して使用する一般的な戦術、手法、手順を文書化します。
戦術(Tactics)
戦術は、テクニックまたはサブテクニックの理由を表します。 それは敵の戦術的な目標であり、行動を実行する理由です。
- リソース開発(Resource Development)
- 初期アクセス(Initial Access)
- 実行
- 防御回避
- ディスカバリ
- コマンド&コントロール(Command and Control)
- 収集
- 抽出
手法
手法は、敵対者がアクションを実行することによって戦術的な目標を達成する方法を表します。
- インフラの取得:マルバタイジング
- ステージ機能: マルウェアのアップロード
- User Execution: Malicious File
- コマンドとスクリプト インタープリター: PowerShell
- 昇格制御メカニズムの悪用:ユーザーアカウント制御のバイパス
- 難読化されたファイルまたは情報:暗号化/エンコードされたファイル
- ファイルまたは情報の難読化解除/デコード(Deobfuscate/Decode Files or Information)
- 難読化されたファイルまたは情報:埋め込みペイロード
- マスカレード: 正当な名前または場所を一致させる
- ハイジャック実行フロー:DLLサイドローディング
- 仮想化/サンドボックス回避:システムチェック
- System Location Discovery: System Language Discovery
- リフレクティブコードのロード
REF8372の修復
予防
- 潜在的なブラウザ情報の検出
- ハードウェアブレークポイントによる潜在的な回避
- 不審なスレッドのコンテキスト操作
- 署名されていないDLLからのVirtualAlloc API呼び出し
- 疑わしいリモート メモリ割り当て
- 疑わしいスタック末尾バイトからの実行
- Microsoft Common Language Runtime Loaded from Suspicious Memory
- 不審なPowerShell実行
- コピーしたライブラリからのモジュールの破壊
ヤラ
Elasticセキュリティは、このアクティビティを識別するためのYARAルールを作成しました。
観測
この研究では、次の観測量について議論しました。
| すぐれた監視性 | タイプ | 名前 | 参考 |
|---|---|---|---|
node-js\[.\]prentiva99\[.\]info | ドメイン名 | マルバタイジングのランディングページ | |
app\[.\]miloyannopoulos\[.\]com | ドメイン名 | マルバタイジングリダイレクター | |
fdfc7831e5c24cfa80152860dfe8c056ba079f7df1393bf6bb7b18ed974eda37 | SHA-256の | BATPackageBuilderSetup.bat | OXLOADERダウンローダー&ランチャー |
de4f51649ec1a33071854aefe93ffb3fc225e19f802d8dd914676dd5dfef2615 | SHA-256の | BATPackageBulderSetup.bat | OXLOADERダウンローダー&ランチャー |
9a9939dff297997732aaade9b243d695632cbd64033c5fbcb9de3d09b7e6c28d | SHA-256の | apimonitor-x64.exe | OXローダー |
c85f2765a6c3c3f3907c17e57df12f8f68826f74bff3bbfd272af50666d065fe | SHA-256の | node-v24.15.0-x64-86.exe | OXローダー |
4ec9d9d4d10ad78fc6d7bda7cb17d52984878ccd2dd4302fd1cef152313b9741 | SHA-256の | キャッスルスティーラー | |
39019279686c820c3af5684012a0085a7e2109f612c9fab886dd0577ace5b5c6 | SHA-256の | キャッスルスティーラー | |
89.124.95\[.\]161 | ipv4 | キャッスルスティーラー C2 | |
89.124.115\[.\]82 | ipv4 | キャッスルスティーラー C2 |