OpENer — это стек EtherNet/IP™ для адаптеров ввода-вывода; поддерживает множественный ввод-вывод и явные соединения; включает объекты и службы для создания продуктов, совместимых с EtherNet/IP™, определенных в СПЕЦИФИКАЦИИ ETHERNET/IP и опубликованных ODVA (http://www.odva.org).
Пользователи и разработчики OpENer могут присоединиться к соответствующим группам Google, чтобы обмениваться опытом, обсуждать использование OpENer и предлагать новые функции и объекты CIP, которые будут полезны сообществу.
Список рассылки для разработчиков: 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-сокета. Для тестирования этой версии мы рекомендуем ПК с Linux или Windows с установленным Cygwin (http://www.cygwin.com). Вам необходимо будет установить следующее:
для обычного здания. Они должны быть установлены в большинстве установок Linux и являются частью пакетов разработки Cygwin.
Если вы хотите запустить модульные тесты, вам также необходимо загрузить CppUTest через https://github.com/cpputest/cpputest.
Для настройки проекта мы рекомендуем использовать графический интерфейс CMake (например, пакет cmake-gui для Linux или установщик для Windows, доступный на CMake).
setup_posix.sh
Вызов команды make
Вызов OpENer:
./src/ports/POSIX/OpENer
например ./src/ports/POSIX/OpENer eth1
OpENer теперь также имеет возможность запуска POSIX в режиме реального времени с помощью опции OpENer_RT, которая требует, чтобы в используемом ядре были применены и активированы полные упреждающие исправления RT. Если вы хотите использовать OpENer_RT, перед шагом 2 выполните sudo setcap cap_ipc_lock,cap_sys_nice+ep ./src/ports/POSIX/OpENer
чтобы предоставить OpENer CAP_SYS_NICE
и возможности CAP_IPC_LOCK
, необходимые для режима RT.
OpENer также можно собрать и установить как библиотеку, установив флаг CMake -DOPENER_INSTALL_AS_LIB
. Для создания общей библиотеки также следует установить глобальную опцию -DBUILD_SHARED_LIBS=ON
. Он был протестирован только на платформе Linux/POSIX.
Build All
в Visual Studio.Перейдите в binwin32srcportsWIN32.
В зависимости от того, выбрали ли вы конфигурацию Debug
или Release
в Visual Studio, ваш исполняемый файл будет отображаться либо в подпапке «Отладка», либо в «Выпуск».
Вызов OpENer через
OpENer
например OpENer 3
Чтобы получить правильный индекс интерфейса, введите командный route print
в командной строке и найдите MAC-адрес выбранного вами сетевого интерфейса в начале вывода. Крайнее левое число — это соответствующий индекс интерфейса.
Файл установки POSIX можно повторно использовать для Cygwin. Обратите внимание, что вы не можете использовать режим RT и вам придется удалить код, отвечающий за проверку и получение необходимых возможностей, поскольку в Cygwin отсутствует libcap. Более простой и поддерживаемый способ сборки OpENer для Windows — использовать MinGW или Visual Studio.
setup_mingw.bat
в командной строке DOS. (Не оболочка bash). Если требуется трассировка, используйте следующее (где параметр cmake должен быть заключен в кавычки) или измените файл ./source/CMakeList.txt. setup_mingw.bat "-DOpENer_TRACES:BOOL=TRUE"
Документация по функциям OpENer является частью исходного кода. Исходные пакеты содержат сгенерированную документацию в каталоге doc/api_doc. Если вы используете версию GIT, вам понадобится программа Doxygen для создания документации HTML. Вы можете создать документацию, вызвав 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)"
Затем скомпилируйте OpENer с AFL:
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
Однако, поскольку CIP работает на уровне EtherNet/IP, он должен сначала зарегистрировать действительный сеанс. Поэтому нам нужно использовать специальный скрипт: python fuzz/scripts/send_testcase.py IP testcase_path
Проверьте сеть, которую вы создали, с помощью: docker network Inspect mac_vlan_network
Сеть назначит IP-адреса докер-контейнерам, и внешний сканер сможет с ними взаимодействовать. Чтобы получить доступ к контейнерам изнутри хоста докера, вам придется создать мост.
Создайте Docker-файл. В качестве базового образа используется Ubuntu. Он скопирует OpENer в корень образа и установит необходимые пакеты. Наконец запустите OpENer на eth0 образа: #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"]
Создайте файл docker-compose.yml, который позволит вам подключить сеть macvlan к контейнерам, легко создавать и разрушать их: версия: «3.3» сервисы: имя_докера: network_mode: образ mac_vlan_network: dockeruser/dockerimagename
Обратите внимание, что для входа в работающий контейнер вам необходимо открыть порт в файлах dockerfile и dockercompose и настроить сетевой мост.
Команды Docker для запуска и остановки нескольких экземпляров контейнеров OpENer: Запустите 128 экземпляров образа Docker: docker-compose up --scale dockerimagename=128 -d Завершите работу всех экземпляров: docker-compose down
Для портирования OpENer на новые платформы смотрите раздел портирования в документации Doxygen.
Самый простой способ — разветвить репозиторий, а затем создать ветку функций/исправлений ошибок. После завершения работы над функцией/исправлением ошибки создайте запрос на включение и объясните свои изменения. Также обновите и/или добавьте комментарии doxygen в предоставленные разделы кода. Пожалуйста, придерживайтесь соглашений по кодированию, определенных в source/doc/coding_rules. Самый простой способ обеспечить преобразование отступов — установить uncrustify как фильтр git в репозитории OpENer, что можно сделать с помощью следующих команд:
git config filter.uncrustify.clean "/path/to/uncrustify/uncrustify -c uncrustify.cfg --mtime --no-backup"
git config filter.uncrustify.smudge "cat"