攻撃者が新たな ICS 攻撃フレームワーク「TRITON」を展開し、重要インフラの運用を妨害

ICS Reference Architecture news

序章

Mandiantは最近、攻撃者が産業用安全システムを操作するように設計されたマルウェアを展開した重要インフラストラクチャ組織でのインシデントに対応しました。標的となったシステムは、産業プロセスの緊急シャットダウン機能を提供していました。私たちは、攻撃者が物理的な損傷を引き起こし、操作を不注意にシャットダウンする機能を開発していたことを、ある程度の確信を持って評価しています。 TRITON と呼ばれるこのマルウェアは、Triconex Safety Instrumented System (SIS) コントローラーとやり取りするために構築された攻撃フレームワークです。このインシデントが攻撃者によるものであるとは断定していませんが、この活動は国家が攻撃の準備をしていることと一致していると考えています。

TRITON は、 産業用制御システム (ICS)を標的とした、公的に特定された限られた数の悪意のあるソフトウェア ファミリの 1 つです。これは、2010 年にイランに対して使用されたStuxnetと、2016 年にウクライナに対して Sandworm チームによって展開されたと思われる Industroyer に続くものです。TRITON は、安全メカニズムが意図した機能を実行するのを妨げ、物理的な結果をもたらす可能性があるという点で、これらの攻撃と一致しています。 .

マルウェアファミリー

メインモジュール

説明

トリトン

トリログ.exe

libraries.zip を利用するメインの実行可能ファイル

library.zip

Triconex コントローラとの対話用のカスタム通信ライブラリ。

表 1: TRITON マルウェアの説明

インシデントの概要

攻撃者は SIS エンジニアリング ワークステーションへのリモート アクセスを取得し、TRITON 攻撃フレームワークを展開して SIS コントローラーを再プログラムしました。インシデントの間、一部の SIS コントローラーがフェイルセーフ状態になり、産業プロセスが自動的にシャットダウンされ、資産所有者が調査を開始するようになりました。調査の結果、冗長処理ユニット間のアプリケーション コードが検証チェックに失敗すると、SIS コントローラーが安全なシャットダウンを開始し、MP 診断エラー メッセージが表示されたことが判明しました。

次の理由から、攻撃者が物理的な損傷を引き起こす能力を開発している間に、不注意で操作をシャットダウンしたと、ある程度の確信を持って評価しています。

  • SIS を変更すると、SIS が正しく機能しなくなり、物理的な結果につながる障害の可能性が高くなります。
  • TRITON は、環境内の SIS コントローラーのアプリケーション メモリを変更するために使用されました。これにより、検証チェックが失敗する可能性がありました。
  • TRITONを使用していた期間に発生しました。
  • 既存または外部の条件が単独で、インシデント発生時に障害を引き起こした可能性は低いです。

帰属

FireEyeは、このアクティビティを現在追跡しているアクターに関連付けていません。ただし、攻撃者が国家によって後援されていることは、ある程度の自信を持って評価しています。重要なインフラストラクチャが標的にされていること、攻撃者が執拗に攻撃を続けていること、明確な金銭的目標がないこと、および攻撃フレームワークを作成するために必要な技術リソースが不足していることは、十分なリソースを備えた国家の攻撃者であることを示唆しています。具体的には、次の事実がこの評価を裏付けています。

攻撃者は SIS を標的にしており、物理的な結果をもたらす影響の大きい攻撃を引き起こすことに関心があることを示唆しています。これは、サイバー犯罪グループには通常見られない攻撃目標です。

攻撃者は、SIS システムへのアクセスを取得した直後に TRITON を展開しました。これは、広く利用されていないハードウェアとソフトウェアへのアクセスを必要とするツールを事前に構築してテストしたことを示しています。また、TRITON は独自の TriStation プロトコルを使用して通信するように設計されていますが、このプロトコルは公に文書化されておらず、敵対者がこのプロトコルを独自にリバース エンジニアリングしたことを示唆しています。

システムを混乱、劣化、または破壊するために重要なインフラストラクチャを標的にすることは、ロシア、イラン、北朝鮮、米国、およびイスラエルの国家アクターによって世界中で行われている多数の攻撃および偵察活動と一致しています。この性質の侵入は、標的となるシステムを妨害するという差し迫った意図を必ずしも示すものではなく、不測の事態への準備である可能性があります。

プロセス制御と安全計装システムの背景

ICS Reference Architecture
図 1: ICS リファレンス アーキテクチャ

最新の産業用プロセス制御および自動化システムは、さまざまな高度な制御システムと安全機能に依存しています。これらのシステムと機能は、多くの場合、 産業用制御システム (ICS)または運用技術 (OT) と呼ばれます。

分散制御システム (DCS) は、人間のオペレーターに産業プロセスをリモートで監視および制御する機能を提供します。これは、コンピュータ、ソフトウェア アプリケーション、およびコントローラで構成されるコンピュータ化された制御システムです。エンジニアリング ワークステーションは、制御システム アプリケーションおよびその他の制御システム機器の構成、メンテナンス、および診断に使用されるコンピュータです。

SISは、制御下のプロセスの状態を独立して監視する自律制御システムです。プロセスが危険な状態を定義するパラメータを超えた場合、SIS はプロセスを安全な状態に戻そうとするか、プロセスの安全なシャットダウンを自動的に実行します。 SIS と DCS の制御が失敗した場合、最終的な防衛線は産業施設の設計であり、機器の機械的保護 (ラプチャー ディスクなど)、物理的なアラーム、緊急対応手順、および危険な状況を軽減するその他のメカニズムが含まれます。

資産所有者は、プラントの DCS と SIS を接続するためにさまざまなアプローチを採用しています。従来のアプローチは、通信インフラストラクチャと制御戦略の両方の分離の原則に依存しています。少なくとも過去 10 年間、低コスト、使いやすさ、DCS と SIS 間の情報交換から得られる利点など、さまざまな理由から、DCS と SIS の設計を統合する傾向がありました。 TRITON は、DCS と SIS ネットワーク ホスト間の双方向通信を可能にする統合設計に関連するリスクを明確に示していると考えています。

安全計装システムの脅威モデルと攻撃シナリオ

サイバーセキュリティと安全の時間的関係
図 2: サイバー セキュリティと安全性の時間的関係

ICS に対する破壊的攻撃の攻撃ライフサイクルは、他のタイプのサイバー攻撃と似ていますが、いくつかの重要な違いがあります。まず、攻撃者の使命は、データを盗むことではなく、運用プロセスを妨害することです。第二に、攻撃者は OT 偵察を実行し、制御されている産業プロセスを理解し、それをうまく操作するのに十分な専門的なエンジニアリング知識を持っている必要があります。

図 2 は、プロセス制御環境におけるサイバー セキュリティと安全制御の関係を表しています。サイバーセキュリティ対策が失敗したとしても、物理的な被害を防ぐための安全制御が設計されています。物理的な影響を最大化するために、サイバー攻撃者は安全制御を回避する必要もあります。

以下の SIS 脅威モデルは、SIS の侵害に成功した攻撃者が利用できるいくつかのオプションを強調しています。

攻撃オプション 1: SIS を使用してプロセスをシャットダウンする

  • 攻撃者は、SIS ロジックを再プログラムして、実際には安全な状態にあるプロセスをトリップさせてシャットダウンさせることができます。つまり、誤検知をトリガーします。
  • 意味: シャットダウン後のプロセスのダウンタイムと複雑なプラント起動手順による財務上の損失。

攻撃オプション 2: SIS を再プログラムして安全でない状態を許可する

  • 攻撃者は、SIS ロジックを再プログラムして、安全でない状態を持続させることができます。
  • 含意: 危険な状況が、SIS 機能の損失による物理的結果 (機器、製品、環境、および人の安全への影響など) を引き起こすリスクの増加。

攻撃オプション 3: DCS を使用して危険な状態または危険を作成しながら、SIS を再プログラムして危険な状態を許可する

  • 攻撃者は、SIS が適切に機能するのを妨げながら、DCS からプロセスを安全でない状態に操作することができます。
  • 含意: 人間の安全、環境、または機器への損傷への影響。その程度は、プロセスおよびプラント設計の物理的制約に依存します。

攻撃者の意図の分析

攻撃者の長期的な目的は、物理的な結果を引き起こす能力を開発することであったと、中程度の確信を持って評価します。これは、攻撃者が最初に DCS で信頼できる足がかりを得て、プロセスを操作したりプラントをシャットダウンしたりする能力を開発できた可能性があるが、代わりに SIS システムの侵害に進んだという事実に基づいています。 DCS と SIS システムの両方を危険にさらすと、攻撃者は物理的および機械的なセーフガードによって許容される最大の損害を引き起こす攻撃を開発して実行することができます。

SIS ネットワークに侵入すると、攻撃者は事前に構築された TRITON 攻撃フレームワークを使用して、TriStation プロトコルを使用して SIS コントローラーとやり取りしました。攻撃者は、停止コマンドを発行するか、意図的に欠陥のあるコードを SIS コントローラーにアップロードして失敗させることにより、プロセスのシャットダウンを引き起こした可能性があります。代わりに、攻撃者は、このターゲット環境で SIS コントローラーの機能する制御ロジックを開発して提供するために、一定期間にわたっていくつかの試みを行いました。これらの試みは、攻撃スクリプトの条件付きチェックの 1 つが原因で失敗したように見えますが、攻撃者は努力を続けました。これは、攻撃者がプロセスのシャットダウンを超えて特定の結果を引き起こすことを意図していたことを示唆しています。

特筆すべきは、ICS への長期にわたる侵入の証拠を何度か観察したことです。これらの侵入は、最終的には運用の中断や無効化には使用されませんでした。たとえば、Sandworm Team などのロシアのオペレーターは、何年もの間、混乱を引き起こすことなく Western ICS を侵害してきました。

マルウェアの機能の概要

TRITON 攻撃ツールは、プログラムの読み取りと書き込み、個々の機能の読み取りと書き込み、SIS コントローラーの状態のクエリなど、多くの機能を備えて構築されています。ただし、これらの機能の一部のみが trilog.exe サンプルで利用されていました (たとえば、攻撃者は TRITON の広範な偵察機能をすべて利用していませんでした)。

TRITON マルウェアには、Triconex SIS コントローラーと通信し (停止などの特定のコマンドを送信したり、メモリ コンテンツを読み取ったりするなど)、攻撃者が定義したペイロードを使用してそれらをリモートで再プログラムする機能が含まれていました。 Mandiant が分析した TRITON サンプルは、攻撃者が提供したプログラムを Triconex コントローラの実行テーブルに追加しました。このサンプルは、コントローラーが障害や例外なく動作し続けることを期待して、正当なプログラムをそのまま残しました。コントローラーが故障した場合、TRITON はコントローラーを実行状態に戻そうとします。コントローラが定義された時間枠内に回復しなかった場合、このサンプルは悪意のあるプログラムを無効なデータで上書きしてその痕跡を隠します。

推奨事項

インシデントで実証された機能から防御したい資産所有者は、次の制御を検討する必要があります。

  • 技術的に実行可能な場合は、安全システム ネットワークをプロセス制御および情報システム ネットワークから分離します。 SIS コントローラをプログラミングできるエンジニアリング ワークステーションは、他の DCS プロセス制御または情報システム ネットワークにデュアルホーム接続しないでください。
  • 安全コントローラをプログラムする機能を物理的に制御するハードウェア機能を活用します。これらは通常、物理キーによって制御されるスイッチの形をとります。 Triconex コントローラでは、スケジュールされたプログラミング イベント中以外はキーを PROGRAM モードのままにしないでください。
  • 重要な役職の変更に関する変更管理手順を実装します。現在の鍵の状態を定期的に監査します。
  • SIS によって提供されるデータに依存するアプリケーションには、双方向のネットワーク接続ではなく、単方向のゲートウェイを使用します。
  • TCP/IP 経由で SIS システムに到達できるすべてのサーバーまたはワークステーション エンドポイントに、厳密なアクセス制御とアプリケーション ホワイトリストを実装します。
  • 予期しない通信フローやその他の異常なアクティビティがないか、ICS ネットワーク トラフィックを監視します。
Triconex キー スイッチ (出典)
図 3: Triconex キー スイッチ (ソース)

付録: テクニカル分析

TRITONのアーキテクチャと攻撃シナリオ
図 4: TRITON のアーキテクチャと攻撃シナリオ

TRITON は、Microsoft Windows オペレーティング システムを実行する SIS エンジニアリング ワークステーションに展開されました。このマルウェアは、正当な Triconex Trilog アプリケーションを装うように命名されました。このアプリケーションは、ログを確認するために使用され、TriStation アプリケーション スイートの一部です。このマルウェアは、標準の Python ライブラリ、オープン ソース ライブラリ、攻撃者が開発した Triconex コントローラとやり取りするための Triconex 攻撃フレームワークを含む zip ファイルに依存する、Py2EXE でコンパイルされた Python スクリプトとして配信されました。実行可能ファイルとともに、 inject.bin (悪意のある関数コード)imain.bin (悪意のある制御ロジック)の 2 つのバイナリ ファイルが、コントローラーのペイロードとして展開されました。これらのファイル名は、Py2EXE でコンパイルされた Python スクリプトでハードコーディングされています。

Trilog.exe は、コマンド ラインから 1 つのオプションを取得しました。これは、ターゲットの Triconex デバイスの単一の IP アドレスでした。 Triconex のデバイスを検出するために、基礎となる TRITON ライブラリの機能を活用していませんでした。代わりに、trilog.exe のインスタンスを、環境内の各ターゲット コントローラーに対して個別に呼び出す必要がありました。 trilog.exe が呼び出されると、コントローラのステータスがチェックされ、TriStation プロトコルによって公開された構成情報が読み取られます。コントローラーが実行状態にある場合、trilog.exe は 2 つのペイロード ファイルinject.binimain.binをエンコードし、それらを通信ライブラリに渡して、コントローラーのプログラム メモリと実行テーブルに追加します。

ペイロード ファイルが Triconex コントローラのメモリに挿入されると、スクリプトはカウントダウンを開始し、定期的にコントローラのステータスをチェックしました。エラーが検出された場合、通信ライブラリのメソッドSafeAppendProgramModは、TriStation プロトコル コマンドを使用してコントローラを以前の状態にリセットしようとしました。これが失敗した場合、trilog.exe は小さな「ダミー」プログラムをメモリに書き込もうとしました。これは、Triconex コントローラー上の攻撃者コードの存在を隠すためのアンチ フォレンジック手法であると判断されます。

Mandiant は資産所有者と協力して、有効な Triconex コントローラーを備えたラボ環境で trilog.exe を実行し、マルウェアの条件付きチェックを発見して、ペイロード バイナリが環境内に持続するのを防ぎました。 Mandiant は、攻撃スクリプトに修正パッチを適用してこのチェックを削除した後、ペイロード バイナリがコントローラー メモリに保持され、コントローラーが引き続き実行されることを確認しました。

TRITON は、コントローラを構成するために、正当な TriStation アプリケーションによって使用されるプロトコルである TriStation プロトコルを実装します。

ツハイ マルウェアの作成者によって作成された高レベルのインターフェイスであり、攻撃者のオペレーターが TRITON フレームワークを使用して攻撃スクリプトを実装できるようにします。偵察と攻撃の両方の機能を公開します。関数は通常、ユーザーからバイナリ データを受け取り、コードの「署名」とチェックサムを処理してから、データを下位レベルのライブラリに渡してネットワーク上でシリアル化します。

別の攻撃者が作成したモジュールであるTsBase TsHiによって呼び出される関数が含まれており、攻撃者の意図したアクションを適切な TriStation プロトコル関数コードに変換します。特定の関数では、データを適切な形式にパックおよびパディングします。

TsLowは、TriStation UDP ワイヤ プロトコルを実装する追加の攻撃者モジュールです。 TsBaseライブラリは、主にts_execメソッドに依存しています。このメソッドは、関数コードと予想される応答コードを受け取り、UDP 経由でコマンド ペイロードをシリアル化します。コントローラーからの応答を期待値と照合し、成功を示す結果データ構造または失敗を表すFalseオブジェクトを返します。

TsLowは、ターゲット コントローラーへの接続を確認するために使用される connect メソッドも公開します。ターゲットなしで呼び出された場合、デバイス検出機能の detect_ip が実行されます。これは、IP ブロードキャストを使用して TriStation プロトコル上で「ping」メッセージを活用し、スクリプトが呼び出された場所からルーター経由で到達可能なコントローラーを見つけます。

指標

ファイル名

ハッシュ

トリログ.exe

MD5: 6c39c3f4a08d3d78f2eb973a94bd7718
SHA-256:
e8542c07b2af63ee7e72ce5d97d91036c5da56e2b091aa2afe737b224305d230

imain.bin

MD5: 437f135ba179959a580412e564d3107f
SHA-256:
08c34c6ac9186b61d9f29a77ef5e618067e0bc9fe85cab1ad25dc6049c376949

inject.bin

MD5: 0544d425c7555dc4e9d76b571f31f500
SHA-256:
5fc4b0076eac7aa7815302b0c3158076e3569086c4c6aa2f71cd258238440d14

library.zip

MD5: 0face841f7b2953e7c29c064d6886523
SHA-256:
bef59b9a3e00a14956e0cd4a1f3e7524448cbe5d3cc1295d95a15b83a3579c59

TS_cnames.pyc

MD5: e98f4f3505f05bf90e17554fbc97bba9
SHA-256:
2c1d3d0a9c6f76726994b88589219cb8d9c39dd9924bc8d2d02bf41d955fe326

TsBase.pyc

MD5: 288166952f934146be172f6353e9a1f5
SHA-256:
1a2ab4df156ccd685f795baee7df49f8e701f271d3e5676b507112e30ce03c42

TsHi.pyc

MD5: 27c69aa39024d21ea109cc9c9d944a04
SHA-256:
758598370c3b84c6fbb452e3d7119f700f970ed566171e879d3cb41102154272

TsLow.pyc

MD5: f6b3a73c8c87506acda430671360ce15
SHA-256:
5c776a33568f4c16fee7140c249c0d2b1e0798a96c7a01bfd2d5684e58c9bb32

sh.pyc

MD5: 8b675db417cc8b23f4c43f3de5c83438
SHA-256:
c96ed56bf7ee85a4398cc43a98b4db86d3da311c619f17c8540ae424ca6546e1

検出

ルール TRITON_ICS_FRAMEWORK
{
メタ:
author = “nicholas.carr @itsreallynick”
md5 = “0face841f7b2953e7c29c064d6886523”
description = “Mandiant ICS インシデント対応中に TRITON フレームワークが回復しました”
文字列:
$python_compiled = “.pyc” nocase ascii wide
$python_module_01 = “__module__” nocase ascii wide
$python_module_02 = “<モジュール>” nocase ascii wide
$python_script_01 = “import Ts” nocase ascii wide
$python_script_02 = “def ts_” nocase ascii wide

$py_cnames_01 = “TS_cnames.py” nocase ascii wide
$py_cnames_02 = “TRICON” nocase ascii wide
$py_cnames_03 = “TriStation ” nocase ascii wide
$py_cnames_04 = “シャーシ” nocase ascii wide

$py_tslibs_01 = “GetCpStatus” nocase ascii wide
$py_tslibs_02 = “ts_” ASCII ワイド
$py_tslibs_03 = “シーケンス” nocase ascii wide
$py_tslibs_04 = /import Ts(Hi|Low|Base)/ nocase ascii wide
$py_tslibs_05 = /modules?version/ nocase ascii wide
$py_tslibs_06 = “悪い” nocase ASCII wide
$py_tslibs_07 = “prog_cnt” nocase ascii wide

$py_tsbase_01 = “TsBase.py” nocase ascii wide
$py_tsbase_02 = “.TsBase(” nocase ascii wide

$py_tshi_01 = “TsHi.py” nocase ascii wide
$py_tshi_02 = “keystate” nocase ascii wide
$py_tshi_03 = “GetProjectInfo” nocase ascii wide
$py_tshi_04 = “GetProgramTable” nocase ascii wide
$py_tshi_05 = “SafeAppendProgramMod” nocase ascii wide
$py_tshi_06 = “.TsHi(” ascii nocase wide

$py_tslow_01 = “TsLow.py” nocase ascii wide
$py_tslow_02 = “print_last_error” ascii nocase wide
$py_tslow_03 = “.TsLow(” ascii nocase wide
$py_tslow_04 = “tcm_” ASCII ワイド
$py_tslow_05 = “TCM が見つかりました” nocase ascii wide

$py_crc_01 = “crc.pyc” nocase ascii wide
$py_crc_02 = “CRC16_MODBUS” ascii ワイド
$py_crc_03 = “Kotov Alaxander” nocase ascii wide
$py_crc_04 = “CRC_CCITT_XMODEM” ascii ワイド
$py_crc_05 = “crc16ret” ascii ワイド
$py_crc_06 = “CRC16_CCITT_x1D0F” ascii ワイド
$py_crc_07 = /CRC16_CCITT[^_]/ ASCII ワイド

$py_sh_01 = “sh.pyc” nocase ascii wide

$py_keyword_01 = “FAILURE” アスキー ワイド
$py_keyword_02 = “シンボル テーブル” nocase ascii wide

$py_TRIDENT_01 = “inject.bin” ascii nocase wide
$py_TRIDENT_02 = “imain.bin” ascii nocase wide

調子:
($python_*) の 2 つと ($py_*) の 7 つ、ファイルサイズ < 3MB
}

参照: https://www.mandiant.com/resources/blog/attackers-deploy-new-ics-attack-framework-triton

Comments

Copied title and URL