脆弱性の連鎖を利用したCODESYSアプリケーションへのバックドア攻撃

脆弱性の連鎖を利用したCODESYSアプリケーションへのバックドア攻撃

図1. CODESYSエコシステム

CODESYSは、産業用コントローラのプログラミングのためのメーカー非依存の開発環境であり、オートメーション業界で広く採用されています。 数百社のデバイスメーカーが自社のハードウェアにCODESYSランタイムを組み込んでおり、これによりCODESYSは世界で最も普及しているソフトPLCプラットフォームの一つとなっています。ソフトPLCとは、専用の産業用モジュールではなく汎用ハードウェア上で動作するソフトウェアベースのプログラマブル・ロジック・コントローラ(PLC)であり、エンジニアが求めるIEC 61131-3準拠のプログラミング環境を提供しつつ、柔軟性と低コストを実現します。

CODESYSエコシステムは、主に2つのコンポーネントで構成されています。1つは、エンジニアが制御アプリケーションの作成、コンパイル、デプロイを行うWindowsベースのIDEである「CODESYS Development System」であり、もう1つは、図1に示すように、ターゲットデバイス上でそれらのアプリケーションを実行する「CODESYS Controlランタイム」です。このランタイムは、リアルタイムI/O処理、フィールドデバイスとの通信、およびOPC UAやCODESYS独自のゲートウェイプロトコルなどのネットワークサービスを処理します。

Networks 研究者は、CODESYS Controlランタイムに影響を与える3つの脆弱性を特定し、直ちにCODESYS Groupに通知するとともに、ベンダーが問題を再現・修正できるよう技術的な詳細情報を提供しました。報告されたすべての脆弱性は、CODESYS Controlランタイムバージョン4.21.0.0およびCODESYS ランタイムツールキットバージョン3.5.22.0で修正されています。

これらの問題を総合すると、有効なサービスレベルの認証情報を持つ認証済み攻撃者が、正当な制御アプリケーションをバックドアが仕込まれたものに置き換え、最終的にはデバイスの完全な制御権を掌握する可能性がある。

開示プロセスを通じて緊密に協力してくださったCODESYSのセキュリティチームに感謝いたします。同チームは報告されたすべての脆弱性に対し迅速に対処し、ユーザーに周知するため3件のアドバイザリを公開しました。運用者はベンダーのガイダンスに従い、推奨される更新プログラムを直ちに適用する必要があります。

ベンダーからの注意喚起:

リサーチ範囲

図2. Raspberry Pi用CODESYS Control

本研究では、CODESYS Controlランタイム、特に「CODESYS Control for Raspberry Pi SL」バージョンを対象とした。このバージョンは低コストのARMハードウェア上で動作し、CODESYS Controlの全機能セットを提供しているため、セキュリティ分析を行う上で、入手しやすく代表的なターゲットとなっている。

「CODESYS Control for Raspberry Pi SL」は商用製品ですが、CODESYSでは1回のセッションにつき2時間、制限なく使用できる評価モードを提供しています。この時間が経過するとランタイムは停止するため、再起動する必要があります。この時間制限を除き、評価モードには機能上の制限はなく、すべてのコードパスやネットワークサービスをテストに利用できます。

今回のテストはRaspberry Pi版を対象に行われましたが、発見された脆弱性は、より広範なCODESYS Controlランタイムに影響を及ぼします。影響を受ける製品の完全なリストについては、上記リンク先のベンダーアドバイザリをご参照ください。

攻撃シナリオ

CODESYSを搭載したPLCは、製造ラインやエネルギーシステムから、水処理施設やビルオートメーションに至るまで、幅広い産業環境で導入されています。いずれの場合も、PLCは物理的なプロセスを制御するアプリケーションを実行し、バルブの位置調整、モーターの速度制御、あるいはロボットの動作シーケンスを管理します。したがって、制御アプリケーションが侵害されると、生産停止から安全でない稼働状態に至るまで、現実世界において深刻な被害を引き起こす可能性があります。

このセクションでは、Nozomi Networks が発見した脆弱性により、限定的な権限を持つ認証済み攻撃者が、CODESYS Control ランタイムを実行しているデバイスを完全に制御できてしまう可能性について説明します。

この攻撃を実行するには、攻撃者がCODESYSランタイムの有効なサービスレベルの認証情報を保持している必要があります。通常、標準的な運用管理措置によって不正アクセスは防止されるはずですが、攻撃者はいくつかの方法でこうした認証情報を入手することが可能です。具体的には、脆弱なパスワードやデフォルトのパスワードを悪用する方法、認証情報が保存されているエンジニアリングワークステーションを侵害する方法、あるいは、すでにSoft PLCへのローカルアクセス権を持っている場合は、CVE-2025-41658を悪用してCODESYSのパスワードハッシュを含むファイルを読み取る方法などがあります。

つまり、この攻撃の核心となる経路は、過度に広範なサービス権限を悪用するものであり、攻撃者がその認証情報を入手してしまえば、プロジェクトを改ざんしたり復元したりするためにローカルOSへのアクセスは必須ではありませんが、それらを入手する手段の一つとなり得ます。

図3. CODESYS 攻撃シナリオ

図3は攻撃の流れを示しています。サービスユーザーとして認証されると、攻撃者は以下の手順を実行します:

  1. ブートアプリケーションをダウンロードします。攻撃者は、CODESYS Development System を使用して、バックアップ機能を通じてブートアプリケーションをダウンロードします。
  2. ‍暗号関連データへのアクセス。攻撃者はCVE-2025-41659を悪用して、Soft PLCに保存されている暗号関連データにアクセスします。これには、データの取得や、必要に応じて信頼された認証局のデータをアップロードする機能も含まれます。
  3. オプションの暗号保護機能を無効にする。CODESYSは、アプリケーション向けのコード暗号化やコード署名などのオプションの保護機能をサポートしています。攻撃者は、関連する暗号素材にアクセスすることで、ブートアプリケーションを復号・再暗号化することができ、署名が強制されている場合には、攻撃者が制御する信頼できる素材を使用して、改変されたコードに再署名を行うことができます。
  4. ブートアプリケーションを改ざんする。攻撃者は、コンパイル済みのアプリケーションバイナリを改変し、自身が制御するマシンコードを埋め込む。暗号化や署名による保護が有効になっている場合でも、事前に取得した暗号素材を使用することで、これらを回避することができる。
  5. 改ざんされたブートアプリケーションを復元する。攻撃者はCVE-2025-41660を悪用し、バックアップ機能を利用して改ざんされたブートアプリケーションをデバイスに復元し、正規のアプリケーションを上書きする。
  6. 再起動を待ちます。サービスユーザーはアプリケーションを直接再起動することはできません。攻撃者は、オペレーターがアプリケーションを再起動するか、システムが再起動するのを待たなければなりません。アプリケーションが実行されると、注入されたコードはroot権限で実行され、これはCODESYS Controlランタイムと同じ権限レベルとなります。
  7. 管理者権限への昇格。基盤となるオペレーティングシステムでルート権限を取得することで、攻撃者はCODESYSランタイムのユーザーデータベースを改ざんし、自身に管理者権限を付与することで、デバイスを完全に制御できるようになります。

この攻撃チェーンは、サービスレベルのアクセス権さえあれば、デバイスおよびホストOSに対する完全な管理権限へと権限を昇格させることができることを示しています。以下のセクションでは、この攻撃チェーンを可能にする関連する実行時の内部構造、プロジェクトの構成、および信頼境界について解説します。

脆弱性のリストと影響を受けるバージョン

以下の表は、今回の調査Nozomi Networks Controlランタイムで発見したすべての脆弱性をまとめたものです:

CVE ID CWE CVSS v3.1 ベーススコア CVSS v3.1 ベクトル
41658 誤ったデフォルトの権限 5.5 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
41659 重要リソースに対する権限の割り当てが不適切です 8.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L
41660 領域間のリソース転送の不備 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

脆弱性の潜在的影響

CODESYS Controlランタイムで発見された脆弱性は、MITRE ATT&CK for ICSフレームワークに記載されているいくつかの手法と一致しています。特に該当する3つの例を以下にまとめます。

T0839: モジュールファームウェア

CVE-2025-41659 と CVE-2025-41660 を組み合わせて利用することで、低権限のアクセス権を持つ攻撃者は、正規の制御アプリケーションをバックドアが仕込まれたバージョンに置き換えることができます。また、暗号素材へのアクセスにより、暗号化や署名といったオプションの保護機能が無効化され、改変されたアプリケーションがデプロイメント・ワークフローにおいて正規のものとして認識されるようになります。

T0831: 制御の操作

制御アプリケーションに任意のコードが注入されると、攻撃者はPLCによって制御されている物理的なプロセスを操作できるようになります。これには、設定値の変更、安全インターロックの無効化、アクチュエータの動作の改変、あるいはセンサーの測定値の改ざんなどが含まれます。コンベア、ポンプ、ロボットアーム、空調設備(HVAC)などの機器において、こうした操作は、安全上の問題や損害をもたらす事態を引き起こす可能性があります。

T0882: 運用情報の窃取

CVE-2025-41659 の脆弱性により、低権限のユーザーがデバイス上の暗号化素材にアクセスできるようになり、コンパイル済みの制御ロジック、構成データ、および組み込みの認証情報や運用パラメータの抽出が可能になります。さらに広く言えば、これらの素材へのアクセスは、展開されたコードを保護するために使用されるオプションの信頼メカニズムを弱体化させる可能性もあります。 さらに、CVE-2025-41658 により、Soft PLC 上の任意のローカルユーザーが CODESYS のパスワードハッシュを含むファイルにアクセスできるようになり、オフラインでの認証情報の抽出が可能になります。この情報により、制御プロセスの構成が明らかになり、さらなる侵害を助長する可能性があります。

攻撃の連鎖を理解する

次のセクションでは、攻撃者がサービスレベルのアクセス権を悪用し、バックアップやプロジェクト管理機能から、デバイスの完全な乗っ取りへと至る手法について解説します。そのために、まずCODESYSランタイムがコードをどのように保護しているか、デプロイされたアプリケーションがどのように保存・復元されるか、そしてなぜそれらの仕組みがあっても、実際にはサービスユーザーがプロジェクトを改ざんできてしまうのかについて検証します。

影響を受けた問題はすでに修正されているため、本稿では、攻撃の連鎖を理解するために必要なセキュリティ上の影響とリバースエンジニアリングの知見に焦点を当て、攻撃者が攻撃を再現しやすくなるような低レベルの脆弱性の詳細については意図的に省略しています。

CODESYS Controlの実行ファイルには、リバースエンジニアリングやデバッグに対する保護機能が組み込まれています。したがって、アプリケーションを解析するには、これらのメカニズムに対処する必要がありますが、独自の実装詳細が漏れるのを防ぐため、その詳細な説明は割愛します。

プロジェクトの形式:プロジェクトがアップロードされるとどうなるか

分析環境の準備が整ったところで、次のステップは、CODESYS Development Systemがどのようにプロジェクトを作成し、デバイスにアップロードするのかを確認することでした。

CODESYS開発システムでは、ラダー図などのIEC 61131-3準拠言語を使用してデバイスのプログラミングを行うことができます。デバイスに簡単なプログラムをアップロードすることで、その展開プロセスが実際にどのように機能するかを確認できます。

この場合、ラダー図アプリケーションはApplicationName.app という名前のファイルにコンパイルされ、チェックサムファイルApplicationName.crc と共に/var/opt/codesys/PlcLogic/ディレクトリに転送されます。後者のファイルには、メインアプリケーションのCRC値が含まれています。

「Application」という名前のアプリケーションの場合、デバイス上に生成されるファイルは以下の通りです:

root@codesysrasp:/var/opt/codesys/PlcLogic/Application # ls –lah
合計 208K

drwxr-xr-x 2 root root 4.0K 3月 16日 18:22 .
drwxr-xr-x 8 root root 4.0K 3月 16日 18:22 ..
-rw-r--r-- 1 root root 195K 3月 16日 18:22 Application.app
-rw-r--r-- 1 root root 20 3月 16日 18:22 Application.crc

ここでは.appファイル形式について詳しく説明しませんが、実行可能なマシンコードが含まれているという点だけ知っておけば十分です。CODESYS開発システムは、IEC 61131-3コードを直接マシンコードにコンパイルし、そのコードは前述のcodesyscontrolプロセスによって実行時に読み込まれ、実行されます。新しいプロセスは生成されず、codesyscontrolがコードを読み込み、自身のプロセス内で実行します。

この事実は、セキュリティ上の重要な意味を持ちます。すなわち、codesyscontrolランタイムが動作しているマシンにIEC 61131-3コードを展開することは、そのデバイス上でroot権限でコードを実行することになるからです。

これは管理者にとっては想定内のことです。CODESYSランタイムでは、IEC 61131-3コードから呼び出し可能な生のCモジュールでさえ、デバイス上で実行することが可能です。より重要な問題は、管理者以外のユーザーが同じ実行モデルを悪用できるかどうかです。

権限レベル

図4. CODESYS ファイルシステムの権限

CODESYSランタイムは、4つの(デフォルトの)権限レベルをサポートしています:

  • 管理者
  • 開発者
  • サービス
  • 観る

各レベルには、システム内のさまざまなオブジェクトに対する異なるアクセス権限が設定されています。各オブジェクトに対して、レベルごとに以下の権限を設定できます(該当する場合):

  • 追加/削除
  • 編集
  • 表示
  • 実行

管理者はすべてのアクセス権をカスタマイズできますが、デフォルト値が設定されています。

図5は、ファイルシステムオブジェクトのデフォルトの権限を示しています。これらは/var/opt/codesysフォルダに対するルートファイルシステムの権限であり、各サブフォルダやファイルはデフォルトでこれらを継承しますが、それぞれ個別にカスタマイズすることも可能です。

ここで重要な疑問が生じます。サービス利用者がアプリケーションをダウンロードし、変更を加えて再アップロードすることを、何が阻止しているのでしょうか?

サービス利用者は、バックアップの作成や復元を行うことができるため、アプリケーションフォルダへの書き込み権限を持っています。この書き込み権限こそが攻撃の鍵となるため、次のステップとして、バックアップの仕組みと、それがどのように悪用され得るかを検証します。

バックアップ

図5. CODESYSの制御バックアップ機能

図6に示すように、CODESYS開発システムからアプリケーションをバックアップすることができます。バックアップされたファイルは、拡張子が.tbfのファイルとなります。このファイルは、メタデータファイルに加え、Application.app およびApplication.crcファイルを含むZIPアーカイブです:

user@/home/user $ file mybackup.tbf
mybackup.tbf: Zipアーカイブデータ、v2.0で作成、v2.0以上で解凍、最終更新日 2026年3月18日 11:45:38、解凍後のサイズ 193、方式=deflate

user@/home/user $ unzip mybackup.tbf
アーカイブ: mybackup.tbf
展開中: meta.info
警告: mybackup.tbf はパス区切り文字としてバックスラッシュを使用しているようです
展開中: $PlcLogic$/Application/Application.app
展開中: $PlcLogic$/Application/Application.crc

user@/home/user $ tree .
.
\-- $PlcLogic$
| \-- Application
| \-- Application.app
| \-- Application.crc
\-- meta.info
\-- mybackup.tbf

3つのディレクトリ、4つのファイル

バックアップは単なるzipアーカイブであるため、攻撃経路は明らかである。なお、.crcファイルには暗号化された署名のない単純なCRC32チェックサムが含まれているため、改変後に再計算するのは極めて容易である。

暗号化や署名といったオプションの暗号保護機能が使用されている場合でも、CVE-2025-41659 により、攻撃者はそれらの保護機能を回避するために必要な情報にアクセスできてしまう可能性があります。

ルートコードの実行:サービス権限から管理者権限への昇格

大まかに言えば、サービス利用者は次のようにバックアップおよび復元ワークフローを悪用する可能性があります:

  1. デバイスからバックアップをダウンロードします。
  2. 解凍して、アプリケーションのバイナリを確認してください。
  3. リバース・ルートシェルを生成するシェルコードを注入する。
  4. 変更されたアプリケーションに合わせて、.crcファイルを再計算してください。
  5. デバイス上で改ざんされたバックアップを復元してください。

実証実験では、シェルコードをアプリケーションのエントリポイントに配置し、最初の命令を上書きしました。実際の攻撃者は、より目立たない注入ポイント、例えばめったに実行されない分岐にフックをかけるなどを選択することで、アプリケーションの主要な機能を損なうことなく、改ざんを検知されにくくすることができるでしょう。

攻撃者が唯一できないことは、アプリケーションを再起動することです。バックドアが仕込まれたコードを実行するには、アプリケーションの再起動が必要だからです。したがって、攻撃者はバックドアが作動するまで、誰かがアプリケーションを再起動するか(あるいはシステムを再起動するか)を待たなければなりません。

これらの手順を完了し、再起動を待った後、シェルコードが実行され、攻撃者はroot権限のリバースシェルを取得する:

user@/home/user $ nc -lvp 4369
[any] 4369 で待機中 ...
192.168.42.100: ホストの逆引きに失敗しました: 未知のホスト
(UNKNOWN) [192.168.42.100] から [192.168.42.2] への接続 57558
whoami
root
pwd
/var/opt/codesys
ls
OPCUAServer
PlcLogic
SysFileMap.cfg
bacstac.ini
cert
cmact_licenses
codesyscontrol.log

この時点で権限昇格は完了し、攻撃者はCODESYSランタイムのローカル状態を改ざんし、自身に管理者権限を付与することができるようになる。

なお、オプションの暗号化保護機能があっても、必ずしもこの攻撃を防ぐことができるとは限らない点に留意が必要である。「攻撃シナリオ」で説明されているように、CVE-2025-41659の脆弱性を悪用することで、攻撃者はアプリケーションの復号および再暗号化に必要な素材にアクセスできるほか、署名が強制されている場合には、信頼できる署名素材を挿入し、変更されたコードを復元する前に再署名を行うことも可能となる。

この攻撃チェーンで悪用された脆弱性はすべて、CODESYSによって修正済みです。これらの修正の一環として、CODESYSはPLCコードの展開や実行前に、デフォルトでコード署名を必須とするようにしました。その結果、バックアップの作成や復元機能を引き続き必要とするサービスユーザーであっても、検知されずにアプリケーションコードを改ざんすることはできなくなりました。

修復

CODESYSは、CODESYS開発システムおよびCODESYS Controlランタイム向けのセキュリティパッチを通じて、これらの脆弱性に対処しました。資産の所有者および運用者には、以下の対応を強く推奨します:

  • 影響を受けるSoft PLCを、最新バージョンのCODESYS Controlランタイムに更新してください。
  • ネットワークのセグメンテーションを実施し、システムの露出を制限する。
  • ネットワークトラフィックを監視し、脆弱性のある資産が存在しないかを確認する。

組織が、脆弱性のあるランタイムを実行しているデバイスが自社の環境内に存在するかどうかを迅速に特定できるよう、資産管理Nozomi Networks IoT 高度な機能を活用できます。このプラットフォームは、ネットワークトラフィックやホストの活動に関する詳細な可視性を提供し、OT にわたる効果的な脆弱性および脅威の検出を可能にします。

図6. Nozomi Vantage における脆弱性のあるデバイスの検出Vantage

この積極的な監視により、セキュリティチームは脆弱性や攻撃に迅速かつ効果的に対応でき、重要ネットワークを標的とした攻撃の影響を最小限に抑えます。Nozomi Networks IoT 詳細と実際の動作を確認するには、今すぐデモをご請求ください