PROFINET IO デバイスは、OT ネットワークで広く使用されているリアルタイム Ethernet ベースの標準である PROFINET プロトコルで通信する産業用オートメーションコンポーネント(センサ、アクチュエータ、ドライブ、I/O ブロックなど)です。これらのデバイスは PLC との決定論的で低レイテンシのデータ交換を可能にし、サイクリック(リアルタイム)とアサイクリック(診断/設定)通信の両方をサポートします。OT ネットワークでは、製造、エネルギー、輸送などの分野における物理プロセスの制御と監視に不可欠であり、多くの場合、産業用イーサネット通信のバックボーンを形成しています。
このブログでは、RT-Labs が開発した IO 機器用 PROFINET プロトコルのオープンソース実装である P-Net C ライブラリを対象としたファジングキャンペーンで発見された 10 個の脆弱性について調査します。これらの欠陥は、OT 環境で一般的に使用される産業用通信プロトコルのセキュリティ態勢を評価するためのNozomi Networks Labsの継続的な取り組みの一環として発見されました。
RT-Labsチームは迅速かつ効果的に対応し、ライブラリの最新リリース(バージョン1.0.2)ですべての問題に対処しました。特筆すべきことに、私たちの報告後、RT-LabsはlibFuzzerを使用したファズテストを開発プロセスに統合し、ソフトウェアの全体的なセキュリティをさらに強化しました。
この後のセクションでは、私たちの調査から得られた重要なポイントを説明し、これらの脆弱性が産業用デバイスに与える潜在的な影響を探り、PROFINET スタックをファジングするために使用した方法論とツールを共有します。
リサーチ範囲
RT-Labsは産業用通信とオートメーションに重点を置いた組込みシステム用ソフトウェアソリューションを専門としています。同社のプラットフォームは、複雑なフィールドバス統合の開発を簡素化し、企業が製品の機能と性能に集中できるようにします。RT-Labsは、リアルタイム性とネットワーク性が要求される産業向けに統合通信ソリューションを提供し、ソフトウェアの品質と開発効率を高める高度なテスト自動化ツールを提供しています。
RT-Labsは、トヨタ自動車やABBを含む産業界の大手企業と協力し、開発者がコードベースの一部を探索し、貢献できるGitHubベースのオープンソース・イニシアチブを通じて、オープンなコラボレーションを推進している。
私たちの研究では、RT-Labs が開発した P-Net PROFINET ライブラリをターゲットとし、IO デバイス用の PROFINET プロトコルを実装しました。この C ベースのライブラリは非常に柔軟で OS に依存しないため、ベアメタルシステムや RT-Kernel のようなリアルタイムオペレーティングシステム、あるいは Linux にも適しています。唯一のプラットフォーム要件は、生のイーサネット・パケットを送受信できることです。P-Netライブラリの評価版はRT-LabsのGitHubで公開されており、今回の研究のベースとなった。
これらの脆弱性の影響
P-Net ライブラリのバージョン 1.0.1 を分析した結果、PROFINET プロトコルの UDP RPC 機能に関連する 10 件のメモリ破壊の脆弱性が確認されました。これらの問題は、対象となるデバイスへのネットワークアクセスを持つ認証されていない攻撃者によって悪用される可能性があります。これらの脆弱性が悪用されると、デバイスにアクセスできなくなったり、深刻な不安定性が発生したり、サービス拒否状態に陥ったりする可能性があります。
実際、CVE-2025-32399 を悪用すると、攻撃者は P-Net ライブラリを実行している CPU を強制的に無限ループに陥らせ、CPU リソースを 100% 消費させることができます。この状態は、特にバッテリー駆動の IO デバイスにとっては致命的であり、正常な動作を回復するために手動による介入が必要になる可能性があります。CVE-2025-32405として追跡されている別の脆弱性は、攻撃者が接続バッファの境界を超えて書き込むことを可能にし、メモリを破壊してデバイスを完全に使用不能にします。
これらのIOデバイスがOT ネットワーク内に一般的に配置されていることを考えると、このような誤動作は深刻な影響を及ぼし、産業用生産ライン全体の信頼性を中断または低下させる可能性がある。
脆弱性リストと影響を受けるバージョン
本脆弱性調査において、Nozomi Networks 研究所がP-Netライブラリバージョン1.0.1で発見した脆弱性の一覧は以下の通りです:
ファジング・キャンペーンのセットアップ
このセクションでは、P-Netライブラリのようなネットワーク・プロトコル・スタックをファズ・テストする際に直面する、アプローチと独自の課題について概説する。
幸いなことに、P-NetライブラリーはLinuxをサポートしており、コンパイル済みのデモIOデバイス・バイナリーがプロジェクトのGitHubページから入手できた。私たちの最初のステップは、このデモ・バイナリをダウンロードして実験し、攻撃者に悪用される可能性のあるネットワーク・サービスを特定するなど、リモート攻撃サーフェスを理解することだった。
実行時分析では、IO デーモンがポート 34964、49155 (PROFINET CMRPC プロトコルで使用) の UDP パケットと生の Ethernet トラフィックをリッスンしていることが確認されました (図 1)。

UDP ベースの RPC サービスが外部からアクセス可能であることから、私たちはこのサービスをファジング・キャンペーンの主要なターゲットとして選択しました。このようなターゲットをファジングする際の重要な要件は、決定論的かつ反復可能な方法でコードの意味のある部分を演習するテストハーネスを構築することである。
決定論はクラッシュの再現性と根本原因の分析に不可欠です。さらに、PROFINET はステートフルなプロトコルなので、ハーネスを終了する前にライブラリに複数のパケットを送信し、最初の浅い状態だけでなく、より深いプロトコルの状態を探索できるようにしたいと思います。
P-Netライブラリは、着信コネクションをリッスンするデーモンとしてRPC機能を実装しているため、デモ・バイナリはそのままではファジング・キャンペーンに使用できませんでした。そこで、ネットワーク・スタックが一定数のパケットを処理した後に終了するように、ソース・コードを修正する必要がありました。
幸いなことに、ライブラリにはGoogleTest(gtest)をベースにしたテスト・スイートが含まれており、RPCスタックを含むほとんどのネットワーク機能をモックしている。これにより、我々の作業は大幅に簡素化された。例えば、テスト・スイートの次のスニペットは、RPC Connect リクエストが正しくパースされることを確認するために、どのようにテストされるかを示しています。

主な機能は以下の通り:
- mock_set_pnal_udp_recvfrom_buffer
ライブラリによって処理されるネットワーク・パケットを設定することができる。
- ランスタック
準備されたパケットで PROFINET スタックを実行します。
これら2つの関数を使用することで、各パケットのペイロードを標準入力から読み込み、一連のUDPパケットを処理するシンプルなファジング・ハーネスを構築することができた。図3は、我々のハーネスのスケッチ実装を示している。

ハイライトされた機能は簡潔にするため省略した:
リードオール
標準入力から全データを読み込み、グローバル・バッファに保存する。ゲットネクスト
各UDPパケットを細分化する、あらかじめ定義されたトークンを使用して、読み取りデータを分割します。
標準入 力から入力を読み込み、単純な区切り文字(例:文字列 AAAA)を使って複数の UDP パケットに分割します。カスタムミューテーターを使うなど、より洗練された戦略を採用することも可能ですが、私たちの方法はPROFINETプロトコルを深く理解する必要性を回避します。その代わりに、ファザーが新しい多様なテストケースを生成できる、意味のある初期コーパスを持つことに依存しています。
最初のコーパスを生成するために、再びテスト・スイートからヒントを得て、テスト中にモック・インターフェースに供給されたパケットを抽出した。そして、私たちが選んだ区切り文字を使ってこれらのパケットを組み合わせ、ファジングに適した一連のUDPパケットを作成した。
ハーネスと初期コーパスの両方が揃ったことで、最も広く使われている効果的なオープンソース・ファザーの1つであるAFL++を使ったファジング・キャンペーンを開始するのに必要なものはすべて揃った。このツールは、カバレッジガイドファジング、強力なインスツルメンテーション技術、豊富なカスタマイズオプションで知られており、P-Netのような複雑なコードベースをターゲットにするのに理想的です。
キャンペーンを実行するには、AFL++を使ってテスト・バイナリをコンパイルし、それを以下の方法でファザーに与えるだけでよい:
私たちのアプローチの単純さにもかかわらず、この基本的なハーネスを使用して7つの脆弱性(CVE-2025-32396からCVE-2025-32402)を発見することができた。この結果に勇気づけられた私たちは、攻撃者がすでにデバイスとの接続を確立しているシナリオをシミュレートするために、定義済みの一連のパケットを常に含む第2のハーネスを開発することにしました。これにより、より深いプロトコルの状態をファジングすることができた。
以下は、この強化されたハーネスのスケッチである:

見てわかるように、ハーネスは前回のものとよく似ており、同じread_all関数とrun_stack関数を再利用しているが、今回はファザーによって生成されたパケットを処理する前に、確立された接続をシミュレートするために必要なパケットを事前に追加している。
この新しいハーネスを使って、ライブラリ内の他の3つの脆弱性(CVE-2025-32403、CVE-2025-32404、CVE-2025-32405)を発見することができた。
脆弱性スポットライト
このセクションでは、2 つ目のファジング・ハーネスを使用して発見した、CVE-2025-32405 として追跡されている脆弱性を取り上げます。この脆弱性により、認証されていないリモートの攻撃者は、IO デバイスと PLC 間のアプリケーション関係 (AR) に関するコンテキスト情報を格納するバッファの境界外に書き込むことができる。
具体的には、ライブラリがArVendorBlockリクエストを解析する際、カウンタをインクリメントし、それをインデックスとしてUDPパケットから配列にデータを書き込むことを発見した。攻撃者が十分な数のパケットを送信すると、インデックスが配列の制限を超え、境界外の書き込みにつながる可能性があります。以下は脆弱なコードのスニペットである:

修復
このブログでは、バージョン 1.0.1 までの P-Net PROFINET ライブラリに影響する 10 件のメモリ破壊の脆弱性の公開を発表しました。これらの脆弱性が悪用された場合、ライブラリを使用する組み込み IO 機器に対する深刻な攻撃が可能になります。
私たちの報告を受けて、P-Netの開発元であるRT-Labs社は、報告されたすべての問題を修正したバージョン1.0.2を速やかにリリースしました。さらに、私たちの報告を受けて、RT-Labs社はlibFuzzerを使用したファズ・テストを開発プロセスに統合し、ライブラリのセキュリティ体制を大幅に強化しました。
これらの脆弱性がセキュリティに与える影響を考慮すると、P-Netライブラリを使用しているすべての開発者および組織は、システムを確実に保護するために最新バージョンにアップグレードすることを強くお勧めします。