OpENer es una pila EtherNet/IP™ para dispositivos adaptadores de E/S; admite múltiples E/S y conexiones explícitas; incluye objetos y servicios para fabricar productos compatibles con EtherNet/IP™ definidos en LA ESPECIFICACIÓN ETHERNET/IP y publicados por ODVA (http://www.odva.org).
Los usuarios y desarrolladores de OpENer pueden unirse a los respectivos grupos de Google para intercambiar experiencias, discutir el uso de OpENer y sugerir nuevas funciones y objetos CIP que serían útiles para la comunidad.
Lista de correo de desarrolladores: https://groups.google.com/forum/#!forum/eip-stack-group-opener-developers
Lista de correo de usuarios: https://groups.google.com/forum/#!forum/eip-stack-group-opener-users
OpENer ha sido desarrollado para ser altamente portátil. La versión predeterminada está dirigida a PC con un sistema operativo POSIX y una interfaz de red de socket BSD. Para probar esta versión recomendamos una PC con Linux o Windows con Cygwin (http://www.cygwin.com) instalado. Necesitará tener instalado lo siguiente:
para edificación normal. Estos deben instalarse en la mayoría de las instalaciones de Linux y son parte de los paquetes de desarrollo de Cygwin.
Si desea ejecutar las pruebas unitarias, también deberá descargar CppUTest a través de https://github.com/cpputest/cpputest
Para configurar el proyecto, recomendamos el uso de una GUI de CMake (por ejemplo, el paquete cmake-gui en Linux o el instalador para Windows disponible en CMake)
setup_posix.sh
Invocar el comando make
Invocar abridor:
./src/ports/POSIX/OpENer
por ejemplo ./src/ports/POSIX/OpENer eth1
OpENer ahora también tiene un inicio POSIX con capacidad en tiempo real a través de la opción OpENer_RT, que requiere que el kernel utilizado tenga todos los parches RT preventivos aplicados y activados. Si desea utilizar OpENer_RT, antes del paso 2, ejecute sudo setcap cap_ipc_lock,cap_sys_nice+ep ./src/ports/POSIX/OpENer
para otorgar a OpENEr CAP_SYS_NICE
y las capacidades CAP_IPC_LOCK
, que son necesarias para el modo RT.
OpENer también se puede construir e instalar como una biblioteca configurando el indicador CMake -DOPENER_INSTALL_AS_LIB
. Para crear una biblioteca compartida, también se debe configurar la opción global -DBUILD_SHARED_LIBS=ON
. Sólo ha sido probado bajo plataforma Linux/POSIX.
Build All
en Visual StudioCambie a binwin32srcportsWIN32
Dependiendo de si eligió la configuración Debug
o Release
en Visual Studio, su ejecutable aparecerá en la subcarpeta Depurar o Lanzar
Invocar OpENer vía
OpENer
por ejemplo OpENer 3
Para obtener el índice de interfaz correcto, ingrese la route print
en un símbolo del sistema y busque la dirección MAC de la interfaz de red elegida al comienzo de la salida. El número más a la izquierda es el índice de interfaz correspondiente.
El archivo de configuración POSIX se puede reutilizar para Cygwin. Tenga en cuenta que no puede utilizar el modo RT y tendrá que eliminar el código responsable de verificar y obtener las capacidades necesarias, ya que libcap no está disponible en Cygwin. La forma más fácil y compatible de crear OpENer para Windows es utilizar MinGW o Visual Studio.
setup_mingw.bat
en una línea de comando DOS. (No es un shell bash). Si desea realizar un seguimiento, utilice lo siguiente (donde el parámetro cmake debe estar entre comillas) o cambie el archivo ./source/CMakeList.txt. setup_mingw.bat "-DOpENer_TRACES:BOOL=TRUE"
La documentación de las funciones de OpENer es parte del código fuente. Los paquetes fuente contienen la documentación generada en el directorio doc/api_doc. Si utilizas la versión GIT necesitarás el programa Doxygen para generar la documentación HTML. Puede generar la documentación invocando doxygen desde la línea de comando en el directorio principal del abridor.
Fuzzing es un método de prueba automatizado que dirige datos de entrada variables a un programa para monitorear la salida. Es una forma de probar la confiabilidad general, así como de identificar posibles errores de seguridad.
El fuzzer que estamos usando es AFL, un fuzzer que utiliza técnicas guiadas en tiempo de ejecución para crear entradas para el programa probado. Desde una perspectiva de alto nivel, AFL funciona de la siguiente manera:
Para comenzar a modificar este proyecto con AFL, necesitarás compilarlo con AFL. Primero asegúrese de tener AFL instalado:
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)"
Luego, compila OpENer con AFL:
OpENer/bin/posix
./setup_posix_fuzz_afl.sh
make
Finalmente, genere algunos casos de prueba e inicie 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
Por lo general, para reproducir un bloqueo es suficiente retransmitir el caso de prueba usando cat testcase | nc IP_ADDR 44818
Sin embargo, dado que CIP se ejecuta sobre la capa EtherNet/IP, primero debe registrar una sesión válida. Por lo tanto, necesitamos usar un script dedicado: python fuzz/scripts/send_testcase.py IP testcase_path
Verifique la red que creó con: docker network inspeccione mac_vlan_network
La red asignará IP a los contenedores acoplables y un escáner externo podrá comunicarse con ellos. Para acceder a los contenedores desde el interior del host de la ventana acoplable, deberá crear un puente.
Cree un archivo Docker. Esto usa Ubuntu como imagen base. Copiará OpENer a la raíz de la imagen e instalará los paquetes necesarios. Por último, ejecute OpENer en eth0 de la imagen: #Nombre de archivo: Dockerfile FROM ubuntu:20.04 ADD ./bin/posix/src/ports/POSIX/OpENer / RUN apt-get update && apt-get install -y --no-install- recomienda libcap-dev nmap ENTRYPOINT ["./OpENer", "eth0"]
Cree un docker-compose.yml que le permitirá conectar la red macvlan a los contenedores y construirlos y desmantelarlos fácilmente: versión: "3.3" servicios: dockerimagename: network_mode: mac_vlan_network image: dockeruser/dockerimagename
Tenga en cuenta que para iniciar sesión en un contenedor en ejecución, debe exponer un puerto en los archivos dockerfile y dockercompose y configurar un puente de red.
Comandos de Docker para iniciar y detener múltiples instancias de los contenedores OpENer: Inicie 128 instancias de imagen de Docker: docker-compose up --scale dockerimagename=128 -d Apague todas las instancias: docker-compose down
Para portar OpENer a nuevas plataformas, consulte la sección de portabilidad en la documentación de Doxygen.
La forma más sencilla es bifurcar el repositorio y luego crear una rama de función/corrección de errores. Después de finalizar su característica/corrección de errores, cree una solicitud de extracción y explique sus cambios. Además, actualice y/o agregue comentarios de doxygen a las secciones de código proporcionadas. Siga las convenciones de codificación, tal como se definen en source/doc/coding_rules. La forma más sencilla de cumplir con la conversión de sangría es configurar uncrustify como filtro git en el repositorio de OpENer, lo que se puede hacer con los siguientes comandos:
git config filter.uncrustify.clean "/path/to/uncrustify/uncrustify -c uncrustify.cfg --mtime --no-backup"
git config filter.uncrustify.smudge "cat"