前回のブログでは、高度持続的脅威(APT)グループSandwormがウクライナの送電網を標的とするために使用した最新のツールIndustroyer2の概要を紹介しました。ESETの造語が示唆するように、このサンプルは、2016年12月の悪名高いウクライナの送電網への攻撃で使用された前身のIndustroyerと多くの共通点があります。このブログでは、2つのサンプルを並べて分析することで類似点を明らかにし、攻撃者の心理をより深く洞察できるようにします。
2つのサンプルを結びつける証拠を提示する前に、まずIndustroyer2の主なタスク、すなわちIEC-104情報オブジェクトアドレス(IOA)の操作に焦点を当てる。
IEC-101、IEC-104、IEC 61850、OPC Data Accessを標的としたIndustroyerとは異なり、Industroyer2はIEC-104のみを標的としたスタンドアロンの実行ファイルです。
サンプルの分析中、私たちは最近のマルウェアでは珍しいことに出くわしました:作者はその活動をわざわざ隠したり、難読化を行ったりしなかったのです。このマルウェアの中核はコンフィギュレーションで構成されており、コンフィギュレーションには、後述する他のパラメータに加え、操作するIOAのハードコード化されたリストが含まれています。このコンフィギュレーションは実行ファイルでは保護されておらず、通常のUnicode文字列として埋め込まれている。
このようにエンドポイントで検知することに関心がないことから、脅威行為者はターゲット環境に導入されているセキュリティ対策をかなり完全に理解していたことがうかがえる。同時に、ハードコードされた IOA のリストは、2 つのことを示しています:
- オペレーターはオペレーショナル・テクノロジー(OT )の環境を十分に理解していた。
- Industroyer2サンプルは、ターゲットデバイスに直接アクセスできる特権環境で実行するように設計されています。
最初のアクセスからIndustroyer2が起動するまでの期間は不明である。しかし、悪意のある活動から、アクセスから攻撃までの期間は数時間ではなく、数日以内であったと推測できる。
IEC-104コンフィギュレーション
我々が分析したサンプルには、3つの異なるステーションのハードコードされたコンフィギュレーションが含まれている。各ステーションのコンフィギュレーションは以下の通り:
- ステーション設定ヘッダー:ステーションのインタラクションを設定するヘッダー
- IOA構成フォーマット:複数のIOAとそれに対応するパラメータを含むテーブル
ステーション構成ヘッダー
あるステーションのコンフィギュレーションは以下のヘッダーを使用する:
10.x.y.z 2404 3 0 1 1 PService_PPD.exe 1 "D:︙OIKDevCounter" 0 1 0 1 0 0 44
10.x.y.z → 管理局ローカル IP アドレス
2404 → 管理局ポート
3 → ASDUアドレス
0 → 動作モード。0に設定すると、ハードコードされたIOAのテーブルが使われる。1に設定すると、開始IOA番号と終了IOA番号を指定する2つの引数が必要で、それを使って反復するIOAの範囲を設定する。
1 → 9つの引数を必要とするスイッチ:
a) 1 → 論理値:0, 1
b) PService_PPD.exe → 強制終了するプロセス名
c) 1 → ファイル名のリネームを行うかどうかを制御する:0 (リネーム省略), 1 (リネーム)
D:◆OIKDevCounter」→キル&リネーム対象の実行ファイルが格納されているフォルダ
e) 0 → ステーションとのインタラクションを開始する前に実行される、分単位のスリープ時間。
f) 1 → スリープ時間(秒
g) 0 → スリープ時間(秒
h) 0 → スリープ時間(秒
i) 1 → 論理値:0, 1
0 → 設定された場合、SCO/DCO のオン/オフが反転した状態で、再び各 IOA と相互作用する
44 → ヘッダーに続くIOAの数
IOA設定フォーマット
160921 1 0 1 1 2
- 160921 → IOAアドレス
- 1 → シングルまたはダブルのコマンドを設定:0(ダブル)、1(シングル)
- 0 → SCO/DCO の選択/実行を設定:0 (実行), 1 (選択)
- 1 → SCO/DCO のオン/オフを設定:0(オフ)、1(オン)
- 1 → 優先順位
- 2 → コンフィギュレーションリストのIOAエントリインデックス
オペレーション
PServiceControl.exeを終了し、コンフィギュレーションに基づいてPService_PPD.exeの名前を.MZに変更すると、IEC 104とのやりとりが開始されます(図2)。
悪意のあるサンプルから変電所に送信されるトラフィックは、サンプルのデバッグ出力では先頭にMASTER ->> SLVが付き、逆も同様です。相互作用は一連のTESTFRフレームで始まります:TESTFRは悪意のあるサンプルから送信され、TESTFR conフレームによって確認されます。TESTFRフレームは、2つのノード間に接続性の問題があるかどうかを確認するために使用されます。
これはデータ転送の有効化要求であり、確認として STARTDT con 返信を期待するものである。データ転送が有効になると、質問コマンド(C_IC_NA_1)が続く。
ハードコードされたステーション設定を使用してサンプルが実行する次のステップは、ステーション ごとにハードコードされた IOA のリストを繰り返し、各 IOA の設定に応じて C_SC_NA_1 または C_DC_NA_1 タイプのフレームを送信することです。上のコンフィギュレーションで詳述したように、IOA がシングルコマンドとダブルコマンドのどちらで使 用されるかを指定する以外に、シングル/ダブル(SCO/DCO)、オン/オフ、および選択/実行を制御する ために使用されるビットを指定することが可能である。
IndustroyerとIndustroyer2の比較:サイド・バイ・サイド分析
sha256 d69665f56ddef7ad4e71971f06432e59f1510a7194386e5f0e8926aea7b88e00 の Industroyer2 サンプルは、104.dll、sha256 7907dd95c1d36cf3dc842a1bd804f0db511a0f68f4b3d382c23a3c974a383cadと類似している。これは、同じ脅威行為者がソースコードにアクセスしていたことを強く示している。
以下のスクリーンショット(図3)は、両サンプルのデコンパイルされたメインスレッドを並べて比較することで、これらの類似点の例を示しています。左側は2016年のIndustroyerサンプルで、右側は2022年のIndustroyer2サンプルです。
Industroyerがメイン・スレッドに実装している「プロセス・キリング」機能は、Industroyer2では最終的にメイン・スレッドを生成するスレッドに組み込まれている。しかし、最も目立つのは、両方のサンプルで "main_config "と名前を変えた構造体を使用していることです。Industroyer2で見られる "main_config "構造体は、追加のフィールドを保持するように更新されているが、Industroyerの "blueprint "を共有している。
次のスクリーンショット(図4)には、STARTDTフレームの作成を担当するデコンパイルされた コードが含まれている。main_config "構造体が引数として関数から別の関数に渡されるなど、2つのサンプルの類似点が再び明確になっています。
この脅威者はステルス性を志向しておらず、マルウェアの活動やIndustroyerとIndustroyer2の類似性を難読化することに関心がないと結論づけることができる。
推薦の言葉
企業が保護を強化する方法をいくつか紹介しよう:
- 基本的なサイバー衛生:パスワードのリセット、従業員やベンダーのアカウント/ネットワークへのアクセスと権限のチェック、ネットワークをスキャンして開いているポートを見つけ、閉鎖/保護する、など。
- YARAルールを活用して、関連するマルウェア活動を検索し、アラートを生成する。
- 異常検知ツールを使用して、マルウェアの変更やバリエーション、OT 環境で発生した不規則なアクティビティを検知する。
- 自動ファイアウォールと異常検知ツールを併用し、さらなる攻撃コマンドを阻止する。
- ネットワーク内の不審な活動を脅威探索する。これにより、攻撃者を早期に発見できる可能性がある。
また、これらのセキュリティ対策がまだ実施されていない場合は、CISAの2017年勧告に従うことを推奨する。
Nozomi Networks OT 業界がネットワークを保護するために使用できる推奨事項とともに、状況を監視し、最新情報を提供し続ける。