特に、CVE-2017-14469や今回のCVE-2021-22659のような脆弱性は、ロックウェル・オートメーションで広く使用されているMicrologix 1400コントローラを標的としています。OPSWAT フェローシップ・プログラムの学生は、制御された環境でこの脆弱性をテストし、セキュリティの必要性を強調しました。
このブログでは、攻撃者がこの脆弱性を悪用してシステムをクラッシュさせる方法や、適切な入力検証の欠如を利用してPLCの操作を妨害する方法を、学生たちがどのように実演したかを紹介する。
PLCとは?ロックウェル・オートメーションのMicrologix 1400の説明
PLC (プログラマブル・ロジック・コントローラ) は、機械やその他の産業作業を制御してプロセスを自動化するために設計された産業用コンピュータです。過酷な環境でも動作し、センサ入力に基づいて特定のタスクを実行するようにプログラムされています。ロックウェル・オートメーションのMicroLogix 1400コントローラは、中小規模のアプリケーションで一般的に使用されるコンパクトなモジュール式PLCです。コスト効率と柔軟性で知られ、さまざまな通信プロトコルをサポートし、デバイスとのインターフェイス用にデジタルおよびアナログI/Oオプションを提供します。
プログラミングは通常、ラダーロジッ クを使用してロックウェル・オートメーションのソ フトウェアを使用し、制御シーケンスを作成 できます。MicroLogix 1400は汎用性が高く、マシン制御やプロセスオートメーションなどのタスクに適しています。モジュール式であるため、ユーザは特定のアプリケーション要件に基づいてシステムを拡張し、カスタマイズすることができます。
CVE-2021-22659の紹介
2021年1月、ロックウェル・オートメーションは、インドのVeermata Jijabai Technological Institute(VJTI)COE-CNDSのParul Sindhwad氏とFaruk Kazi博士から、MicroLogix™ 1400コントローラの脆弱性に関する報告を受けました。彼らは、バージョン 21.6 以前のセキュリティ上の欠陥を特定し、リモートの認証されていない攻撃者が特別に細工した Modbus パケットを送信することで、攻撃者がレジスタ内のランダムな値を取得または変更できる可能性があることを明らかにしました。悪用された場合、バッファオーバーフローが発生し、サービス拒否状態に陥る可能性があります。FAULT LED が赤色に点滅し、通信が切断される。サービス拒否状態からの回復には、ユーザーがフォルトをクリアする必要がある。
NVD はこのセキュリティ脆弱性を「深刻度が高い」と評価した。
攻撃フェイズ
脆弱な MicroLogix 1400 PLC にネットワークアクセスできるリモートの認証されていない攻撃者が、特別に細工したパケットを送信してレジスタの値を変更する可能性があります。これにより、デバイスにサービス拒否状態が発生し、システムが破壊されてダウンタイムが発生する可能性があります。このようなインシデントが発生すると、組織の製造オペレーションやその他のビジネス活動に大きな支障をきたす可能性があります。
Modbusプロトコル
1979年にModicon社によって開発されたModbusプロトコルは、インテリジェント機器間のクライアント-サーバ通信を確立するために設計されたメッセージング構造です。元々はModiconのPLCで使用するために設計されましたが、その後、産業用電子機器間の通信のための標準通信プロトコルとなりました。
Modbusプロトコルにはイーサネット用(Modbus TCP)とシリアル回線用(Modbus RTUとModbus ASCII)があります。Modbus RTU(RemoteTerminal Unit)はシリアル通信を通して直接バイナリ形式でデータを送信し、Modbus TCP(TransmissionControl Protocol)はTCP/IPネットワーク上で送信するためにModbusプロトコルデータをTCPパケットに埋め込みます。
Modbus メッセージ構造
Modbusは、クライアントがModbusデバイスにリクエストを送信し、デバイスがレスポンスを提供するリクエスト・レスポンス・プロトコルです。
プライマリからセカンダリに送信されるModbusメッセージは、セカンダリのアドレス、"コマンド"("リード・レジスタ "や "ライト・レジスタ "など)、データ、チェック・サム(LRCまたはCRC)を含みます。
データ・アドレスはデータを読み込んだり変更したりする際にModbusのクエリ・メッセージで使用されます。Modbus は 4 つのデータタイプを定義しています:コイル、入力ステータス、入力レジスタ、保持レジスタです。そのうち2つはコイルとディスクリート入力と呼ばれるオン・オフ(1ビット)の値を格納し、2つはレジスタと呼ばれる16ビット・ワードとして数値を格納します。それぞれ読み出し専用または読み出し/書き込みが可能です。
データタイプ | アクセス | 説明 |
コイル | 読み書き | シングルビット出力。 |
ディスクリート入力 | 読み取り専用 | シングルビット入力。 |
入力レジスタ | 読み取り専用 | 16ビット入力レジスタ。 |
ホールディング・レジスタ | 読み書き | 16ビット出力レジスタ。 |
Modbusファンクションコードには3つのカテゴリーがあります:
- パブリック・ファンクション・コード - ユーザー定義コードを除き、1~127まで。
- ユーザー定義ファンクションコード - 65~72と100~110の2種類。
- Reserved Function Codes(リザーブド・ファンクション・コード) - 一部の企業がレガシー製品に使用しており、一般には利用できない。
機能タイプ | 機能名 | 機能コード | ||
データ・アクセス | ビットアクセス | 物理ディスクリート入力 | ディスクリート入力を読む | 2 |
内部ビットまたは物理コイル | コイルを読む シングルコイルの書き込み 複数のコイルを書き込む | 1 5 15 | ||
16ビットアクセス | 物理入力レジスタ | 入力レジスタの読み出し | 4 | |
内部レジスタまたは物理出力レジスタ | 複数の保持レジスタの読み出し 単一保持レジスタの書き込み 複数の保持レジスタを書き込む 複数のレジスタの読み書き マスク書き込みレジスタ 読み取りFIFOキュー | 3 6 16 23 22 24 | ||
ファイル・レコード・アクセス | ファイルレコードの読み込み ファイルレコードの書き込み | 20 21 | ||
診断 | 例外ステータスを読む 診断 コムイベントカウンター取得 イベントログ取得 レポート・スレーブID デバイス識別情報の読み取り | 7 8 11 12 17 43 | ||
その他 | カプセル化インターフェース・トランスポート | 43 |
機能タイプデータ・アクセス サブタイプ:ビット・アクセスビットアクセス カテゴリ物理ディスクリート入力 関数名:Read Discrete Inputsリード・ディスクリート入力 関数コード:2 |
機能タイプデータ・アクセス サブタイプ:ビット・アクセスビットアクセス カテゴリ内部ビットまたは物理コイル 関数名:Read CoilsRead Coils 関数コード:1 |
機能タイプデータ・アクセス サブタイプ:ビット・アクセスビットアクセス カテゴリ内部ビットまたは物理コイル 関数名:Write Single Coil 関数コード:5 |
機能タイプデータ・アクセス サブタイプ:ビット・アクセスビットアクセス カテゴリ内部ビットまたは物理コイル 関数名:Write Multiple Coils 関数コード:1515 |
機能タイプデータ・アクセス サブタイプ:16ビットアクセス カテゴリ物理入力レジスタ 関数名Read Input Registers 関数コード:4 |
機能タイプデータ・アクセス サブタイプ:16ビットアクセス カテゴリ内部レジスタまたは物理出力レジスタ 関数名:Read Multiple Holding Registers複数保持レジスタの読み出し 関数コード:3 |
機能タイプデータ・アクセス サブタイプ:16ビットアクセス カテゴリ内部レジスタまたは物理出力レジスタ 関数名:Write Single Holding Register 関数コード:66 |
機能タイプデータ・アクセス サブタイプ:16ビットアクセス カテゴリ内部レジスタまたは物理出力レジスタ 関数名:Write Multiple Holding Registers 関数コード:16 |
機能タイプデータ・アクセス サブタイプ:16ビットアクセス カテゴリ内部レジスタまたは物理出力レジスタ 関数名:Read/Write Multiple RegistersRead/Write Multiple Registers 関数コード:23 |
機能タイプデータ・アクセス サブタイプ:16ビットアクセス カテゴリ内部レジスタまたは物理出力レジスタ ファンクション名:マスクライトレジスタ ファンクションコード:2222 |
機能タイプデータ・アクセス サブタイプ:16ビットアクセス カテゴリ内部レジスタまたは物理出力レジスタ 関数名:Read FIFO QueueリードFIFOキュー 関数コード:24 |
機能タイプデータアクセス サブタイプ:ファイルレコードアクセス 関数名Read File Record 関数コード:20 |
機能タイプデータアクセス サブタイプ:File Record Access 関数名:Write File Record 関数コード:2121 |
機能タイプDiagnostics 関数名:Read Exception Status 関数コード:7 |
機能タイプDiagnostics 機能名:Diagnostic 機能コード:8 |
関数の種類Diagnostics 関数名:Get Com Event Counter 関数コード:11 |
関数の種類Diagnostics 関数名:Get Com Event Log 関数コード:12 |
機能タイプDiagnostics 機能名:Report Slave ID 機能コード:17 |
機能タイプDiagnostics 機能名:Read Device Identification ファンクションコード:43 |
機能タイプ:その他 機能名:Encapsulated Interface Transport 機能コード:43 |
搾取
脆弱性分析
OPSWAT Graduate Fellowsは分析を通じて、Modbus TCP通信中に、プロトコルに送信パケットの認証と暗号化が欠けていることを発見しました。さらに、MicroLogix 1400 PLC の入力検証は適切に実装されていません。その結果、リモートの攻撃者はパケットスニッフィングによって Modbus TCP パケットを解析し、Modbus TCP プロトコルを介して認証なしで PLC に任意のリクエストを送信できます。MicroLogix 1400 PLC デバイスには入力検証機能がないため、リモートの認証済み攻撃者がランダムな値のパケットを大量に送信し、PLC をクラッシュさせる可能性があります。
レジスタの上書き
最初に、PLC のレジスタの読み書きで使用される Modbus TCP パケットをキャプチャしようとしました。このため、MicroLogix 1400 PLC のレジスタの読み書きを容易にする Modbus Poll というアプリケーションによって生成されたパケットを調べました。
Wiresharkを使ってネットワーク・インターフェースからのすべてのパケットをキャプチャすることで、1つのレジスタを書き込むためのModbus TCPパケットを特定することができました:
スニッフィングしたパケットの構造に基づいて、ターゲット PLC のレジスタの書き込みを要求する TCP パケットを送信する簡単な Python スクリプトを開発した。このシナリオでは、PLC の IP アドレスは192.168.93.89 である。
悪意のある未認証パケットを受信した後、PLC のレジスタが変更された。

Micro Logix 1400 では、ほとんどの数学命令は 3 つのパラメータを使用します:ソースA、ソースB、デスティネーション
ソースAとソースBの値は、N13:3とN13:4という2つの16ビット・レジスタから得ることができる。さらに、N13:3とN13:4のようなこれらの16ビット・レジスタの値は、-32,768から+32,767の範囲内に制約されている。N13:3 および N13:4 の値が大きいと、マッチ命令の結果がデータ型の最大範囲を超えてしまい、 PLC がクラッシュする可能性がある。したがって、PLC をクラッシュさせるには、N13:3 と N13:4 を含むすべてのレジスタに大きなランダム値を書き込む必要がある。これを実現するために、Python スクリプトを以下のように変更しました:
攻撃のシミュレーション
実際の攻撃をシミュレートするため、OPSWAT フェローは、攻撃者と PLC が同じネットワーク上にあり、互いに通信できるという前提で、OPSWAT CIP ラボにある MicroLogix 1400 PLC のクラッシュを誘発しようとしました。
OPSWAT Labs の MicroLogix 1400 PLC の通常の動作状態では、PLC が REMOTE RUN モードのとき、すべてのレジスタ値が有効で、そのデータ タイプの指定範囲内にあり、ユーザプログラムが正しく機能していることを示しています。
Pythonスクリプトを実行すると、多数のModbus TCPパケットがPLCに送信され、認証なしですべてのレジスタに大きなランダム値の書き込みが要求されます:
これらの悪意のあるパケット要求を受信した後、N13:3とN13:4を含む全てのレジスタの値が16,990に設定される。N13:3およびN13:4レジスタに対するADD演算の結果は、16ビットレジスタの有効範囲を超える。この問題によって整数のオーバーフローが発生し、FAULTED 状態で示されるように、フォルトが発生して PLC の動作が中断される。
OPSWAT フェローが、CVE-2021-22659 を悪用して MicroLogix 1400 PLC をクラッシュさせることに成功しました。
修復
CVE-2021-22659のような脆弱性に直面した場合、OTおよびサイバーフィジカルシステムを保護するためには、包括的な修復が極めて重要である。以下に、攻撃の拡散を防ぐために採用できる主な戦略を示します:
- 既知のCVEの検出:CVE-2021-22659のような脆弱性がないか、定期的にネットワークをスキャンする。
- 異常動作の監視Micrologix 1400 PLCへの通信頻度が異常に増加した場合、不正なデータ転送が行われている可能性があります。
- 新しいデバイス接続の識別:システムは、新しいデバイスが PLC に接続されたことを検出する必要があります。
- ネットワークのセグメンテーション:影響を受けるデバイスを隔離することで、攻撃の横方向への拡散を防ぎ、影響を最小限に抑えることができる。
OPSWAT MetaDefender OT Security 、CVEを検出し、異常な動作のためにネットワークを継続的に監視し、不正な接続を識別することによって、これらのニーズに対応します。AIを使用して、通常のトラフィックパターンを学習し、ベースラインの動作を確立し、異常を警告するポリシーを実装します。これにより、潜在的な脅威に対して即座に情報に基づいた対応が可能になります。
CVE-2021-22659を悪用した攻撃の場合、MetaDefender OT Security MetaDefender Industrial Firewall 統合し、設定されたルールに基づいて不審な通信をブロックします。ファイアウォールはAIを使って通常のトラフィックパターンを学習し、不正な接続を防ぐためのポリシーを実施します。
これらの検知、アラート、ネットワークセグメンテーション機能を組み合わせることで、MetaDefender OT Security 産業環境の理想的な防御メカニズムとなり、運用技術環境におけるサイバー脅威のリスクと影響を大幅に低減します。
OPSWAT深層防御型サイバーセキュリティ・プラットフォームがどのように貴社の態勢を強化し、成熟させることができるかをご覧ください。無料デモをご希望の方は、今すぐエキスパートにご相談ください。