- Cisco Talos は、脅威ハンティング活動中に、ウクライナから送信された機密情報らしきドキュメントを発見しました。このドキュメントに悪意のある VBA コードが含まれていたことから、組織を感染させるルアー(おとり文書)として使用されていると考えられます。
- 調査の結果、ある珍しいマルチモジュールウイルスの動作によって、この悪意のあるコードが追加されたことが判明しました。このウイルスは、.NET の相互運用(Interop)機能を利用して送り込まれ、Word ドキュメントに感染します。
- 2015 年以降、OfflRouter というこのウイルスの動作がウクライナで確認されています。VirusTotal に 100 を超えるオリジナルの感染ドキュメントがウクライナからアップロードされていること、またドキュメントがアップロードされた日付から判断すると、ウクライナの一部の組織のネットワークでは、まだこのウイルスが動作しています。
- 感染メカニズムの選択が通常とは異なること、検証が明らかに不足していること、コードに誤りがあることから、独創的ではあるものの比較的経験の浅い開発者が OfflRouter を作成したと Talos は判断しています。
- 作成者の設計上の選択によってウイルスの拡散がごく少数の組織に限定された可能性がありますが、一方では、この選択が要因となり、非常に長い間ウイルスが検出されずに動作を続けられたことになります。
Cisco Talos は、定期的な脅威ハンティングの一環として、オープンソースリポジトリにアップロードされているファイルを監視し、政府および軍事組織を標的としている可能のあるルアーを検出しています。ルアーは正規のファイルを使用して作成され、悪意のある動作を引き起こすコンテンツが追加されています。攻撃者はよくルアーを使用します。
たとえば Gamaredon グループが使用するルアーは、外部参照テンプレートを設定した悪意のあるドキュメントであり、ウクライナ語で書かれています。これが最初の感染経路です。Talos はこれまでに、軍事組織を狙ったウクライナ語とポーランド語のルアーを発見しています。PowerPoint や Excel の正規ファイルに見せかけて「Picasso Loader」を起動させるもので、これによりリモートアクセス型トロイの木馬(RAT)が攻撃対象のシステムにインストールされます。
2023 年 7 月、攻撃者は、ビリニュスでの NATO 首脳会議に関連するルアーを使用して、Ramcom というリモートアクセス型トロイの木馬 のインストールを試みました。これらは、おとり文書であるルアーを発見することが脅威インテリジェンス活動にとって不可欠である理由の一例にすぎません。
2024 年 2 月に Talos は、ウクライナの地方政府組織とウクライナ国家警察から送信されていると思われる複数のドキュメントが VirusTotal にアップロードされていることを発見しました。これらのドキュメントに「ctrlpanel.exe」という実行ファイルをドロップして実行する VBA コードが含まれていることに疑念を抱き、詳細な調査を開始しました。
その結果、ウクライナの政府組織と警察の活動に関する機密情報と思しきドキュメントが 100 個以上アップロードされていることを突き止めました。コードの分析結果は予想外のものでした。アップロードされたドキュメントが感染していたのは、高度な攻撃者が使用するルアーではなく、2015 年に作成された OfflRouter というマルチコンポーネントの VBA マクロウイルスだったのです。このウイルスはウクライナ国内で動作を続けており、一般にアクセス可能なドキュメントリポジトリに機密文書らしきものがアップロードされる原因になっています。
攻撃者の特定につながる情報
このウイルスはウクライナ国内で動作していますが、同地域の作成者によって生み出された形跡はありません。ウイルスの名前を示す ctrlpanel.exe の「E:\Projects\OfflRouter2\OfflRouter2\obj\Release\ctrlpanel.pdb」というデータベースのデバッグ文字列も、作成者が英語話者ではないことを示唆していません。
感染メカニズムの選択、VBA コードの生成、コード内の複数の誤り、検証の明らかな不足から、独創的ではあるものの経験の浅いプログラマが作成者だと Talos では推定しています。
開発時の選択によって、このウイルスは特定の地域に限定され、およそ 10 年間も動作し続けることができました。
OfflRouter はウクライナ国内に限定
スロバキア政府の Computer Security Incident Response Team(CSIRT)チーム が以前行った調査によると、2018 年にはすでにウクライナの国家警察の Web サイトで複数の感染ドキュメントが公開されていました。
新たに発見された感染ドキュメントはウクライナ語で書かれています。このウイルスがウクライナ国外ではほとんど見られないのは、それが理由かもしれません。このマルウェアには電子メールによる拡散機能がないため、ドキュメントとリムーバブルメディア(感染ドキュメントが入った USB メモリスティックなど)を共有することによってのみ拡散されます。電子メールによる拡散機能がないことや、最初のドキュメントがウクライナ語であったことも、このウイルスがウクライナ国内にとどまった理由といえるでしょう。
最近ウクライナから VirusTotal にアップロードされたドキュメントの 1 つ。
このウイルスの標的はファイル名の拡張子が .doc(OLE2 ドキュメントのデフォルトの拡張子)のドキュメントのみなので、他のファイル名拡張子を持つファイルには感染しません。Word の最新バージョンのデフォルトのファイル名拡張子が .docx ということもあり、感染するドキュメントはほとんどありません。
おそらくこれは作成者のミスによるものですが、わずかな可能性として考えられるのは、このマルウェアが(内部的には Office Open XML ドキュメントとして構造化されていても)拡張子が .doc のドキュメントをまだ使用している一部のウクライナの組織を明確に標的に定めて作成されたものであるということです。
このウイルスが効率よく拡散するのを防いでいる問題は他にもあるのですが、そのほとんどは、実行モジュール ctrlpanel.exe で見つかっています。このモジュールは、コードの VBA 部分によってドロップされ実行されます。
ウイルスが実行されると、Windows 起動時に実行されるように、レジストリキー HKLM\Software\Microsoft\Windows\CurrentVersion\Run に値 Ctrlpanel を設定します。内部のグローバル文字列 _RootDir が値として使用されますが、この文字列には ctrlpanel.exe の格納先フォルダのみが含まれ、フルパスが含まれていないため、この自動起動手段は失敗します。
この .NET モジュールを使用するドキュメントの感染プロセス全体には興味深い点があります。VBA コードは感染プロセスの一部として生成されますが、このとき、モジュール内のハードコーディングされた文字列から取得したコードと ctrlpanel.exe バイナリのエンコードされたバイトとが組み合わされます。この結果、生成されるコードはどの感染サイクルでも同じになるため、検出がかなり容易になります。.NET コード内に VBA コードジェネレータがあれば、感染ドキュメントの検出がより難しくなる可能性があります。
一度起動されると、実行モジュールがメモリ内で動作し続け、スレッドタイマーを使用して 2 つのバックグラウンドワーカー オブジェクトを実行します。1 つ目のオブジェクトがドキュメントを感染させ、2 つ目のオブジェクトが .NET モジュール用のプラグインモジュールの有無をチェックします。
感染を担うバックグラウンドワーカーは、マウントされているドライブを列挙し、感染させるドキュメントの検索を試行します。検索には、文字列検索パターン「*.doc」をパラメータとして指定した Directory.Getfiles 関数が使用されます。
この関数のパラメータの 1 つに SearchOption パラメータがあり、これを使用してサブディレクトリ内も検索するか、ルートフォルダ内のみを検索するかを指定します。このモジュールは、固定ドライブの場合はルートフォルダのみを検索するようになっていますが、通常このような選択は行いません。というのも、ルートフォルダに感染対象となるドキュメントがある可能性は極めて低いからです。
リムーバブルドライブについてはサブフォルダもすべて検索対象となるため、成功率が高くなると考えられます。最後に、Word の最近使った文書のリストをチェックして感染を試行し、この段階で、固定ドライブ上の他のドキュメントにウイルスが拡散することになります。
ドキュメントのファイル名拡張子の選択は .doc に限定。
OfflRouter の VBA コードがメインの実行モジュールをドロップして実行
マクロが有効になっている場合、ドキュメントが開かれたときに、ウイルスの VBA 部分が実行されます。さらにこの部分には、実行モジュール ctrlpanel.exe をドロップして実行するコードが含まれています。
VBA 部分がウイルスの実行モジュールを作成して実行。
マクロコードの先頭で、ファイルがすでに存在するかどうかをチェックする関数を定義し、存在しない場合は書き込み用のファイルを開いて CheckHashX 関数を呼び出します。一見、この関数には変数「Y」の値をリセットするジャンクコードが含まれているように見えます。ところが、変数 Y はオーバーライドされるセッター関数を持つプライベートプロパティとして定義されており、変数を代入することで、開かれている実行モジュール C:\Users\Public\ctrlpanel.exe の末尾に、指定した値が追加されるようになっています。代入のように見えるコード行はすべて、割り当てられた値をファイルの末尾に追加します。このようにして実行モジュールが記述されます。
実行モジュールが連続ブロックとしてではなく(変数に代入されているように見える)一連の整数値として格納されているので、おそらくこの手法は、埋め込まれたモジュールの検出を多少難しくするために実装されたと考えられます。
より経験値の高いアナリストからすると、このコードはポリモーフィック型エンジンによって生成されるガベージコードのように見えます。また、なぜ作成者はコード生成を疑似ランダム化に拡張しなかったのかという疑問が生じます。
感染した Word ドキュメントが、他のドキュメントを感染させる .NET コンポーネントをドロップ。
VBA と実行モジュールで構成され、感染ロジックが PE 実行 .NET モジュールに含まれているという点で、このウイルスは独特です。
プロパティ Y のオーバーライドされるセッター関数により、ファイルへの書き込みが行われる。
ctrlpanel.exe .NET モジュール
ctrlpanel.exe で使用されている独自の感染方法は、.NET VBProject インターフェイスの Microsoft.Vbe.Interop および Word アプリケーションの機能の操作を可能にする Microsoft.Office.Interop.Word の Office Interop クラスを介して行われます。
Interop.Word クラスを使用して Document クラスをインスタンス化することで、VBA マクロコードへのアクセスと、Word の標準 VBA 関数を使用した標的ドキュメントファイルへのコードの追加が可能になります。
.NET モジュールの ctrlpanel.exe が起動すると、システム上で別のモジュールインスタンスがすでに実行されているかどうかを確認するために、ミューテックス ctrlpanelapppppp のオープンを試行します。ミューテックスが存在する場合は、プロセスを終了します。
他のモジュールインスタンスが実行されていない場合、ctrlpanel.exe は「ctrlpanelapppppp」というミューテックを作成し、レジストリの実行キーを設定してモジュールがシステムの起動時に実行されるようにします。最後に、2 つのタイマーを初期化して、関連するバックグラウンド タイマー コールバックである VBAClass_Timer_Callback と PluginClass_TimerCallback を実行します。これらは VBAClass と PluginClass の 2 つのクラスの Run 関数をそれぞれ開始するために実装されます。
ctrlpanel.exe の 2 つの実行スレッド。
VBAClass_Timer_Callback は VBAClass_Timer タイマーが作成されてから 1 秒後に、 PluginClass_Timer_Callback は PluginClass_Timer が作成されてから 3 秒後に呼び出されます。
実行モジュールのすべての機能は、VBAClass と PluginClass の 2 つのクラス、具体的にはそれぞれの Backgroundworker_DoWork 関数内で実装されています。
VBAClass が VBA コードを生成し、他の Word ドキュメントに感染させる
バックグラウンドワーカー関数は無限ループで実行されます。2 つの主要な部分から構成されており、それぞれの役割は、ドキュメントの感染と、感染させるドキュメントの検索です。ロジックについては上記のとおりです。
感染させるドキュメントの候補リストに沿って感染を繰り返し実行し、感染プロセスの重複を回避するためにドキュメントの感染マーカーをチェックするという独創的な方法が使用されています。つまりこの関数は、ドキュメント作成のメタデータをチェックし、作成時間を追加し、合計値を確認します。合計値が 0 の場合、ドキュメントはすでに感染しているとみなされます。
ファイルシステムの作成時間を感染マーカーとして使用。
感染させるドキュメントが Word 97-2003 のバイナリ形式(OLE2)で作成されている場合、マクロを有効にした Microsoft Office Open XML 形式(DOCX)で、同じ名前のドキュメントが保存されます。
この感染には、従来の VBA クラスの感染ルーチンが使用されます。最初の VBComponent の Visual Basic コードモジュールにアクセスし、関数 MyScript が生成するコードをドキュメントのコードモジュールに追加します。その後、感染したドキュメントが保存されます。
感染させる前にドキュメントを .docx に変換。
コード生成関数 MyScript には静的文字列と命令が含まれており、感染ドキュメントに追加するコードが動的に生成されます。この関数が読み取り用に独自の実行ファイル ctrlpanel.exe を開き、ファイルを 32 ビットずつ読み取って、VBA コードとして保存可能な 10 進数の文字列に変換します。32 ビットの繰り返し値(ほとんどの場合 0)ごとに for ループが作成され、ドロップされたファイルにこの繰り返し値が書き込まれます。この目的は明らかではありませんが、おそらくコードのサイズを少し小さくし、圧縮するためと考えられます。
32 ビットの繰り返し値を「圧縮」。
このコードは、4,096 バイトごとに新しい CheckHashX サブルーチンを作成して、コードをチャンクに分割します。この目的は不明です。
ファイルを感染させる VBA コードを動的に作成。
ファイルが感染した後、バックグラウンドワーカーは、作成時間(時、分、秒、ミリ秒)の値を 0 に設定して、感染マーカーファイルを追加します。
感染ファイルを元の場所にコピーしてから感染マーカーを設定。
PluginClass がプラグインの検出と読み込みを実行
ctrlpanel.exe はリムーバブルドライブ上にプラグインがあるか検索することもできます。これはドキュメントに感染する単純なウイルスとしては非常に珍しい仕様です。作成者には単純な VBA 感染よりもっと野心的な意図があったのかもしれません。
リムーバブルドライブでプラグインを検索することはほとんどありません。というのは、USB ドライブや CD-ROM などの物理メディアのシステムにプラグインを渡す必要があるからです。プラグインローダーはファイル名拡張子が .orp のファイルを検索し、Base64 デコード機能を使用してファイル名をデコードした後、Base64 デコード機能でファイルのコンテンツをデコードします。次に、デコードしていたファイル名に拡張子 .exe を付けてファイルを c:\users\public\tools フォルダにコピーし、最後にプラグインを実行します。
リムーバブルドライブで検出されたすべてのプラグインがデコードされ、C: ドライブにコピーされ、起動される。
感染したマシンにプラグインがすでに存在する場合、ctrlpanel.exe は Base64 エンコードを使用してプラグインをエンコードし、接続されているリムーバブルメディアのルートにファイル名拡張子を「.orp」にしてコピーし、新しく作成したファイルが Windows エクスプローラーのデフォルトでは表示されないように隠し属性に設定します。
侵入経路がドキュメントか実行モジュール ctrlpanel.exe かは不明
2 つのモジュールからなるウイルスの強みは、スタンドアロンの実行ファイルとしても、感染ドキュメントとしても拡散できることです。モジュールがスタンドアロンで動作し、ドキュメントを感染させる前に VBA コードの実行とデフォルトのファイル保存形式の変更(doc に変更)を許可するレジストリキーの設定ができるので、初めは実行ファイルとして拡散したほうが有効かもしれません。そうすれば、感染がやや見つかりにくくなる可能性があります。
次のレジストリキーが設定されます。
HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Word\Security\AccessVBOM(外部アプリケーションによる Visual Basic オブジェクトモデルへのアクセスを許可)
HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Word\Security\VBAWarnings(マクロコードが含まれている可能性があるという警告を感染ドキュメントで無効化)
HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Word\Options\DefaultFormat(デフォルトのファイル形式を DOC に設定)
カバレッジ
今回の脅威は、以下の製品で検出してブロックすることが可能です。
Cisco Secure Endpoint(旧 AMP for Endpoints)は、この記事で説明したマルウェアの実行を阻止するのに最適です。Cisco Secure Endpoint の無料トライアルはこちらからお申し込みください。
Cisco Secure Email(旧 E メールセキュリティ)は、攻撃の一環として攻撃者が送りつける不正な電子メールをブロックします。Cisco Secure Email の無料トライアルはこちらからお申し込みください。
Threat Defense Virtual、適応型セキュリティアプライアンス、Meraki MX など、Cisco Secure Firewall(旧次世代ファイアウォールおよび Firepower NGFW)アプライアンスは、この脅威に関連する悪意のあるアクティビティを検出できます。
Cisco Secure Network/Cloud Analytics(Stealthwatch/Stealthwatch Cloud)は、ネットワークトラフィックを自動的に分析し、接続されているすべてのデバイスで、望ましくない可能性があるアクティビティをユーザーに警告します。
Cisco Secure Malware Analytics(旧 Threat Grid)は悪意のあるバイナリを特定し、Cisco Secure のすべての製品に保護機能を組み込みます。
Umbrella(シスコのセキュア インターネット ゲートウェイ(SIG))は、社内ネットワークの内外で悪意のあるドメイン、IP、URL への接続をブロックします。Umbrella の無料トライアルはこちらから お申し込みください。
Cisco Secure Web Appliance(旧 Web セキュリティアプライアンス)は、危険性のあるサイトを自動的にブロックし、ユーザーがアクセスする前に疑わしいサイトを検査します。
特定の環境および脅威データに対する追加の保護機能は、Firewall Management Center から入手できます。
Cisco Duo は、ユーザーに多要素認証を提供し、承認されたユーザーのみがネットワークにアクセスできるようにします。
オープンソースの Snort サブスクライバルールセットをお使いであれば、Snort.org で購入可能な最新のルールパックをダウンロードすることで、最新状態を維持できます。この脅威の Snort SID は次のとおりです。
次の ClamAV シグネチャが今回の脅威に関連するマルウェアアーティファクトを検出します。
Doc.Malware.Valyria-6714124-0
Win.Virus.OfflRouter-10025942-0
IOC
この調査の IOC は、こちら の GitHub リポジトリでも提供しています。
10e720fbcf797a2f40fbaa214b3402df14b7637404e5e91d7651bd13d28a69d8 – .NET module ctrlpanel.exe
感染したドキュメント
2260989b5b723b0ccd1293e1ffcc7c0173c171963dfc03e9f6cd2649da8d0d2c
2b0927de637d11d957610dd9a60d11d46eaa3f15770fb474067fb86d93a41912
802342de0448d5c3b3aa6256e1650240ea53c77f8f762968c1abd8c967f9efd0
016d90f337bd55dfcfbba8465a50e2261f0369cd448b4f020215f952a2a06bce
ミューテックス
ctrlpanelapppppp
本稿は 2024 年 04 月 17 日にTalos Group のブログに投稿された「OfflRouter virus causes Ukrainian users to upload confidential documents to VirusTotal」の抄訳です。