OpENer は、I/O アダプター デバイス用の EtherNet/IP™ スタックです。複数の I/O と明示的な接続をサポートします。には、ETHERNET/IP 仕様で定義され、ODVA (http://www.odva.org) によって公開されている EtherNet/IP™ 準拠の製品を作成するためのオブジェクトとサービスが含まれています。
OpENer のユーザーと開発者は、経験を交換したり、OpENer の使用法について話し合ったり、コミュニティに役立つ新機能や CIP オブジェクトを提案したりするために、それぞれの Google グループに参加できます。
開発者メーリング リスト: https://groups.google.com/forum/#!forum/eip-stack-group-opener-developers
ユーザー メーリング リスト: https://groups.google.com/forum/#!forum/eip-stack-group-opener-users
OpENer は移植性が高いように開発されています。デフォルト バージョンは、POSIX オペレーティング システムと BSD ソケット ネットワーク インターフェイスを搭載した PC を対象としています。このバージョンをテストするには、Cygwin (http://www.cygwin.com) がインストールされている Linux PC または Windows をお勧めします。以下をインストールする必要があります。
通常の建物の場合。これらはほとんどの Linux インストールにインストールする必要があり、Cygwin の開発パッケージの一部です。
単体テストを実行したい場合は、https://github.com/cpputest/cpputest から CppUTest をダウンロードする必要もあります。
プロジェクトを構成するには、CMake GUI (Linux の cmake-gui パッケージ、または CMake で入手可能な Windows のインストーラーなど) の使用をお勧めします。
setup_posix.sh
を呼び出します。 make
コマンドを呼び出す
OpENer の呼び出し:
./src/ports/POSIX/OpENer
例: ./src/ports/POSIX/OpENer eth1
OpENer には、OpENer_RT オプションを介してリアルタイム対応の POSIX 起動機能も追加されました。これには、使用するカーネルに完全なプリエンプティブ RT パッチが適用され、アクティブ化されている必要があります。 OpENer_RT を使用する場合は、手順 2 の前にsudo setcap cap_ipc_lock,cap_sys_nice+ep ./src/ports/POSIX/OpENer
を実行して、OpENer CAP_SYS_NICE
と RT モードに必要なCAP_IPC_LOCK
機能を付与します。
OpENer は、CMake フラグ-DOPENER_INSTALL_AS_LIB
を設定することで、ライブラリとしてビルドおよびインストールすることもできます。共有ライブラリを構築するには、グローバル オプション-DBUILD_SHARED_LIBS=ON
も設定する必要があります。 Linux/POSIX プラットフォームでのみテストされています。
Build All
を選択して OpENer をコンパイルします。binwin32srcportsWIN32 に変更します。
Visual Studio でDebug
とRelease
構成のどちらを選択したかに応じて、実行可能ファイルはサブフォルダー Debug または Release のいずれかに表示されます。
経由で OpENer を呼び出します
OpENer
例: OpENer 3
正しいインターフェイス インデックスを取得するには、コマンド プロンプトでコマンドroute print
を入力し、出力の先頭で選択したネットワーク インターフェイスの MAC アドレスを検索します。一番左の数字は、対応するインターフェイスのインデックスです。
POSIX セットアップ ファイルは Cygwin で再利用できます。 Cygwin では libcap が利用できないため、RT モードは使用できず、必要な機能の確認と取得を担当するコードを削除する必要があることに注意してください。 Windows 用の OpENer を構築するより簡単でサポートされている方法は、MinGW または Visual Studio を使用することです。
setup_mingw.bat
実行します。 (bash シェルではありません)。トレースが必要な場合は、次のコマンドを使用するか (cmake パラメーターを引用符で囲む必要があります)、または ./source/CMakeList.txt ファイルを変更します。 setup_mingw.bat "-DOpENer_TRACES:BOOL=TRUE"
OpENer の機能のドキュメントはソース コードの一部です。ソース パッケージには、ディレクトリ doc/api_doc に生成されたドキュメントが含まれています。 GIT バージョンを使用する場合は、HTML ドキュメントを生成するためのプログラム Doxygen が必要になります。オープナーのメイン ディレクトリのコマンド ラインから doxygen を呼び出すことで、ドキュメントを生成できます。
ファジングは、出力を監視するためにさまざまな入力データをプログラムに送信する自動テスト方法です。これは、全体的な信頼性をテストし、潜在的なセキュリティ バグを特定する方法です。
私たちが使用しているファザーは AFL です。これは、ランタイム ガイド付き手法を使用してテスト対象プログラムの入力を作成するファザーです。高レベルの事前 AFL は次のように機能します。
AFL を使用してこのプロジェクトのファジングを開始するには、AFL を使用してプロジェクトをコンパイルする必要があります。まず、AFL がインストールされていることを確認してください。
sudo apt install build-essential
wget http://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz
tar xzf afl-latest.tgz
cd afl*
make && sudo make install
echo "AFL is ready at: $(which afl-fuzz)"
次に、AFL を使用して OpENer をコンパイルします。
OpENer/bin/posix
ディレクトリに移動します。./setup_posix_fuzz_afl.sh
make
実行します最後に、いくつかのテスト ケースを生成し、AFL を開始します。
# Generate inputs
mkdir inputs
echo 630000000000000000000000000000000000000000000000 | xxd -r -p > ./inputs/enip_req_list_identity
# You can also use the inputs we prepared from OpENer/fuzz/inputs
# Finally, let's fuzz!
afl-fuzz -i inputs -o findings ./src/ports/POSIX/OpENer
通常、クラッシュを再現するには、 cat testcase | nc IP_ADDR 44818
使用してテストケースを再送信するだけで十分です。 cat testcase | nc IP_ADDR 44818
ただし、CIP は EtherNet/IP 層上で実行されるため、最初に有効なセッションを登録する必要があります。したがって、専用のスクリプトを使用する必要があります: python fuzz/scripts/send_testcase.py IP testcase_path
docker network Inspection mac_vlan_network を使用して作成したネットワークを確認します。
ネットワークは IP を Docker コンテナに割り当て、外部スキャナが Docker コンテナと通信できるようになります。 Docker ホスト内からコンテナーにアクセスするには、ブリッジを作成する必要があります。
Dockerfileを作成します。これは、Ubuntu をベースイメージとして使用します。 OpENer をイメージ ルートにコピーし、必要なパッケージをインストールします。最後に、イメージの eth0 で OpENer を実行します。 #Filename: Dockerfile FROM ubuntu:20.04 ADD ./bin/posix/src/ports/POSIX/OpENer / RUN apt-get update && apt-get install -y --no-install- libcap-dev nmap ENTRYPOINT ["./OpENer", "eth0"] を推奨します
macvlan ネットワークをコンテナーに接続し、コンテナーを簡単に構築および破棄できるようにする docker-compose.yml を作成します。 バージョン: "3.3" サービス: dockerimagename: network_mode: mac_vlan_network image: dockeruser/dockerimagename
実行中のコンテナにログインするには、dockerfile および dockercompose ファイルでポートを公開し、ネットワーク ブリッジを設定する必要があることに注意してください。
OpENer コンテナの複数のインスタンスを起動および停止する Docker コマンド: 128 個の docker イメージ インスタンスを起動します: docker-compose up --scale dockerimagename=128 -d すべてのインスタンスをシャットダウンします: docker-compose down
OpENer を新しいプラットフォームに移植する場合は、Doxygen ドキュメントの移植セクションを参照してください。
最も簡単な方法は、リポジトリをフォークしてから、機能/バグ修正ブランチを作成することです。機能/バグ修正が完了したら、プル リクエストを作成し、変更内容を説明します。また、提供されたコード セクションを更新または doxygen コメントを追加してください。 source/doc/coding_rules で定義されているコーディング規則に従ってください。インデント変換に準拠する最も簡単な方法は、OpENer リポジトリで uncrustify を git フィルターとして設定することです。これは、次のコマンドで実行できます。
git config filter.uncrustify.clean "/path/to/uncrustify/uncrustify -c uncrustify.cfg --mtime --no-backup"
git config filter.uncrustify.smudge "cat"