OpENer คือสแต็ก EtherNet/IP™ สำหรับอุปกรณ์อะแดปเตอร์ I/O; รองรับ I/O หลายตัวและการเชื่อมต่อที่ชัดเจน รวมออบเจ็กต์และบริการเพื่อสร้างผลิตภัณฑ์ที่สอดคล้องกับ EtherNet/IP™ ซึ่งกำหนดไว้ในข้อกำหนด ETHERNET/IP และเผยแพร่โดย ODVA (http://www.odva.org)
ผู้ใช้และนักพัฒนาของ OpENer สามารถเข้าร่วม Google Groups ที่เกี่ยวข้องเพื่อแลกเปลี่ยนประสบการณ์ หารือเกี่ยวกับการใช้งาน OpENer และเพื่อแนะนำคุณลักษณะใหม่และออบเจ็กต์ CIP ซึ่งจะเป็นประโยชน์สำหรับชุมชน
รายชื่อผู้รับจดหมายของนักพัฒนา: https://groups.google.com/forum/#!forum/eip-stack-group-opener-developers
รายชื่อผู้รับจดหมายของผู้ใช้: https://groups.google.com/forum/#!forum/eip-stack-group-opener-users
OpenENer ได้รับการพัฒนาให้พกพาสะดวก เวอร์ชันเริ่มต้นกำหนดเป้าหมายพีซีที่มีระบบปฏิบัติการ POSIX และอินเทอร์เฟซเครือข่ายซ็อกเก็ต BSD เพื่อทดสอบเวอร์ชันนี้ เราขอแนะนำให้ใช้ Linux PC หรือ Windows ที่ติดตั้ง Cygwin (http://www.cygwin.com) คุณจะต้องติดตั้งสิ่งต่อไปนี้:
สำหรับอาคารปกติ ควรติดตั้งสิ่งเหล่านี้บนการติดตั้ง Linux ส่วนใหญ่ และเป็นส่วนหนึ่งของแพ็คเกจการพัฒนาของ Cygwin
หากคุณต้องการรันการทดสอบหน่วย คุณจะต้องดาวน์โหลด CppUTest ผ่าน https://github.com/cpputest/cpputest
สำหรับการกำหนดค่าโปรเจ็กต์ เราขอแนะนำให้ใช้ CMake GUI (เช่น แพ็คเกจ cmake-gui บน Linux หรือตัวติดตั้งสำหรับ Windows ที่ CMake)
setup_posix.sh
เรียกใช้คำสั่ง make
เรียกใช้ OpenENer:
./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 ไฟล์ปฏิบัติการของคุณจะปรากฏในโฟลเดอร์ย่อย Debug หรือ Release
เรียกใช้ OpenENer ผ่าน
OpENer
เช่น OpENer 3
เพื่อให้ได้ดัชนีอินเทอร์เฟซที่ถูกต้อง ให้ป้อนคำสั่ง route print
ใน command prompt และค้นหาที่อยู่ MAC ของอินเทอร์เฟซเครือข่ายที่คุณเลือกที่จุดเริ่มต้นของเอาต์พุต หมายเลขซ้ายสุดคือดัชนีอินเทอร์เฟซที่เกี่ยวข้อง
ไฟล์การตั้งค่า POSIX สามารถใช้ซ้ำกับ Cygwin ได้ โปรดทราบว่าคุณไม่สามารถใช้โหมด RT ได้ และคุณจะต้องลบโค้ดที่รับผิดชอบในการตรวจสอบและรับความสามารถที่จำเป็น เนื่องจาก libcap ไม่พร้อมใช้งานใน Cygwin วิธีที่ง่ายกว่าและได้รับการสนับสนุนมากขึ้นในการสร้าง OpENer สำหรับ Windows คือการใช้ MinGW หรือ Visual Studio
setup_mingw.bat
ในบรรทัดคำสั่ง dos (ไม่ใช่เปลือกทุบตี) หากต้องการการติดตาม ให้ใช้สิ่งต่อไปนี้ (โดยที่พารามิเตอร์ cmake ต้องอยู่ในเครื่องหมายคำพูด) หรือเปลี่ยนไฟล์ ./source/CMakeList.txt setup_mingw.bat "-DOpENer_TRACES:BOOL=TRUE"
เอกสารประกอบการทำงานของ OpENer เป็นส่วนหนึ่งของซอร์สโค้ด แพ็กเกจต้นทางมีเอกสารประกอบที่สร้างขึ้นในไดเร็กทอรี doc/api_doc หากคุณใช้เวอร์ชัน GIT คุณจะต้องมีโปรแกรม Doxygen เพื่อสร้างเอกสาร HTML คุณสามารถสร้างเอกสารคู่มือได้โดยการเรียกใช้ doxygen จากบรรทัดคำสั่งในไดเร็กทอรีหลักของตัวเปิด
Fuzzing เป็นวิธีการทดสอบอัตโนมัติที่นำข้อมูลอินพุตที่หลากหลายไปยังโปรแกรมเพื่อตรวจสอบเอาต์พุต เป็นวิธีทดสอบความน่าเชื่อถือโดยรวมตลอดจนระบุจุดบกพร่องด้านความปลอดภัยที่อาจเกิดขึ้น
fuzzer ที่เราใช้คือ AFL ซึ่งเป็น fuzzer ที่ใช้เทคนิคแนะนำรันไทม์เพื่อสร้างอินพุตสำหรับโปรแกรมที่ทดสอบ จากการคาดการณ์ระดับสูงของแอฟมีดังนี้:
หากต้องการเริ่มคลุมเครือโปรเจ็กต์นี้ด้วย 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
โดยปกติแล้วในการสร้างข้อขัดข้องขึ้นมาอีกครั้ง ก็เพียงพอที่จะส่ง testcase อีกครั้งโดยใช้ cat testcase | nc IP_ADDR 44818
อย่างไรก็ตาม เนื่องจาก CIP ทำงานบนเลเยอร์ EtherNet/IP จึงจะต้องลงทะเบียนเซสชันที่ถูกต้องก่อน ดังนั้นเราจึงจำเป็นต้องใช้สคริปต์เฉพาะ: python fuzz/scripts/send_testcase.py IP testcase_path
ตรวจสอบเครือข่ายที่คุณสร้างด้วย: docker network ตรวจสอบ mac_vlan_network
เครือข่ายจะกำหนด IP ให้กับคอนเทนเนอร์นักเทียบท่า และเครื่องสแกนภายนอกจะสามารถสื่อสารกับพวกเขาได้ หากต้องการเข้าถึงคอนเทนเนอร์จากภายในโฮสต์นักเทียบท่า คุณจะต้องสร้างบริดจ์
สร้าง Dockerfile สิ่งนี้ใช้ 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 กับคอนเทนเนอร์และสร้างและรื้อถอนได้อย่างง่ายดาย: version: "3.3" services: dockerimagename: network_mode: mac_vlan_network image: dockeruser/dockerimagename
โปรดทราบว่าในการเข้าสู่ระบบคอนเทนเนอร์ที่ทำงานอยู่ คุณจะต้องเปิดเผยพอร์ตในไฟล์ dockerfile และ dockercompose และตั้งค่าบริดจ์เครือข่าย
คำสั่งนักเทียบท่าเพื่อเริ่มและหยุดหลายอินสแตนซ์ของคอนเทนเนอร์ OpENer: เริ่มต้นอินสแตนซ์อิมเมจนักเทียบท่า 128 ตัว: docker-compose up --scale dockerimagename=128 -d ปิดอินสแตนซ์ทั้งหมด: docker-compose down
สำหรับการย้าย OpENer ไปยังแพลตฟอร์มใหม่ โปรดดูส่วนการย้ายในเอกสารประกอบของ Doxygen
วิธีที่ง่ายที่สุดคือการแยกพื้นที่เก็บข้อมูล จากนั้นสร้างสาขาฟีเจอร์/แก้ไขข้อบกพร่อง หลังจากเสร็จสิ้นคุณสมบัติ/แก้ไขข้อบกพร่องของคุณแล้ว ให้สร้างคำขอดึงและอธิบายการเปลี่ยนแปลงของคุณ นอกจากนี้ โปรดอัปเดตและ/หรือเพิ่มความคิดเห็น doxygen ในส่วนโค้ดที่ให้มา โปรดปฏิบัติตามแบบแผนการเข้ารหัสตามที่กำหนดไว้ใน source/doc/coding_rules วิธีที่ง่ายที่สุดในการปฏิบัติตามการแปลงการเยื้องคือการตั้งค่าที่ไม่น่าเชื่อถือเป็นตัวกรอง git ในพื้นที่เก็บข้อมูล OpENer ซึ่งสามารถทำได้โดยใช้คำสั่งต่อไปนี้:
git config filter.uncrustify.clean "/path/to/uncrustify/uncrustify -c uncrustify.cfg --mtime --no-backup"
git config filter.uncrustify.smudge "cat"