README.md
Rendering markdown...
version: '3.8'
networks:
ics-untrusted:
driver: bridge
ipam:
config:
- subnet: 192.168.96.0/24
gateway: 192.168.96.254
ics-protected:
driver: bridge
ipam:
config:
- subnet: 192.168.95.0/24
gateway: 192.168.95.254
services:
gateway:
build: ./gateway
image: ics-gateway
container_name: ics-gateway
hostname: gateway
privileged: true
cap_add:
- NET_ADMIN
- NET_RAW
devices:
- /dev/net/tun:/dev/net/tun
- /dev/kvm:/dev/kvm # For x86 KVM acceleration
networks:
ics-untrusted:
ipv4_address: 192.168.96.10
ics-protected:
ipv4_address: 192.168.95.10
ports:
- "502:502"
volumes:
- ./logs:/logs
environment:
- GATEWAY_ARCH=arm # Change to 'x86' for x86 gateway with KVM
depends_on:
- plc
stdin_open: true
tty: true
plc:
build:
context: ./plc
target: asan
image: frosty-goop-poc:asan
container_name: ics-plc
hostname: plc
networks:
ics-protected:
ipv4_address: 192.168.95.2
ports:
- "5020:502"
volumes:
- ./logs:/logs
environment:
- LOG_FILE=/logs/plc.log
- ASAN_OPTIONS=detect_leaks=0:abort_on_error=0:print_legend=0:color=always
- TERM=xterm-256color
stdin_open: true
tty: true
plc-14462:
build:
context: ./plc
target: normal
image: frosty-goop-poc:normal
container_name: ics-plc-14462
hostname: plc-14462
ports:
- "5022:502"
volumes:
- ./logs:/logs
environment:
- LOG_FILE=/logs/plc-14462.log
- TERM=xterm-256color
stdin_open: true
tty: true
profiles:
- cve14462
# =============================================================================
# Snort IDS Profiles (VULNERABLE to CVE-2022-20685)
# =============================================================================
# Uses NFQUEUE inline mode - true IPS that blocks traffic when it hangs
# Demonstrates packet-forwarding architecture vs seL4's protocol-break
#
# Traffic flow:
# Host:503 → Container:502 → iptables DNAT → NFQUEUE → Snort → PLC:502
#
# Default (used by demo scripts):
# docker compose up snort
#
# Profiles for benchmarking:
# docker compose --profile snort-quickdraw up
# docker compose --profile snort-talos up
# docker compose --profile snort-modbus up
# docker compose --profile snort-combined up
# =============================================================================
# Default Snort service - uses Quickdraw (industry standard)
# Used by demo.sh and demo-snort.sh scripts
snort:
build: ./snort
image: ics-snort
container_name: ics-snort
hostname: snort
privileged: true
cap_add:
- NET_ADMIN
- NET_RAW
networks:
ics-untrusted:
ipv4_address: 192.168.96.20
ics-protected:
ipv4_address: 192.168.95.20
ports:
- "503:502"
volumes:
- ./logs:/logs
depends_on:
- plc
environment:
- SNORT_PROFILE=quickdraw
- TERM=xterm-256color
stdin_open: true
tty: true
# Snort with Quickdraw rules (Digital Bond industry standard)
snort-quickdraw:
build: ./snort
image: ics-snort
container_name: ics-snort-quickdraw
hostname: snort-quickdraw
privileged: true
cap_add:
- NET_ADMIN
- NET_RAW
networks:
ics-untrusted:
ipv4_address: 192.168.96.20
ics-protected:
ipv4_address: 192.168.95.20
ports:
- "503:502"
volumes:
- ./logs:/logs
depends_on:
- plc
environment:
- SNORT_PROFILE=quickdraw
- TERM=xterm-256color
stdin_open: true
tty: true
profiles:
- snort-quickdraw
# Snort with Talos-style rules (native modbus_func keywords)
snort-talos:
build: ./snort
image: ics-snort
container_name: ics-snort-talos
hostname: snort-talos
privileged: true
cap_add:
- NET_ADMIN
- NET_RAW
networks:
ics-untrusted:
ipv4_address: 192.168.96.20
ics-protected:
ipv4_address: 192.168.95.20
ports:
- "503:502"
volumes:
- ./logs:/logs
depends_on:
- plc
environment:
- SNORT_PROFILE=talos
- TERM=xterm-256color
stdin_open: true
tty: true
profiles:
- snort-talos
# Snort with our custom modbus rules only (CVE detection)
snort-modbus:
build: ./snort
image: ics-snort
container_name: ics-snort-modbus
hostname: snort-modbus
privileged: true
cap_add:
- NET_ADMIN
- NET_RAW
networks:
ics-untrusted:
ipv4_address: 192.168.96.20
ics-protected:
ipv4_address: 192.168.95.20
ports:
- "503:502"
volumes:
- ./logs:/logs
depends_on:
- plc
environment:
- SNORT_PROFILE=modbus
- TERM=xterm-256color
stdin_open: true
tty: true
profiles:
- snort-modbus
# Snort with combined rules (Quickdraw + Modbus + Talos)
snort-combined:
build: ./snort
image: ics-snort
container_name: ics-snort-combined
hostname: snort-combined
privileged: true
cap_add:
- NET_ADMIN
- NET_RAW
networks:
ics-untrusted:
ipv4_address: 192.168.96.20
ics-protected:
ipv4_address: 192.168.95.20
ports:
- "503:502"
volumes:
- ./logs:/logs
depends_on:
- plc
environment:
- SNORT_PROFILE=combined
- TERM=xterm-256color
stdin_open: true
tty: true
profiles:
- snort-combined