README.md

Демонстрация атаки на цепочку поставок в АСУ ТП

English version

Демонстрация атаки на цепочку поставок (supply chain attack) в симуляции автоматизированной системы управления технологическими процессами (АСУ ТП). Сравнивается поведение АСУ ТП на KasperskyOS и Linux при эксплуатации уязвимости.

Список программ

  • virtual_valve – программа, реализующая компонент VirtualValve в АСУ ТП. Представляет собой эмулятор вентиля с состояниями открыто/закрыто. Принимает запросы по IPC от программы valve_control на переключение своего состояния.
  • valve_control – программа, реализующая компонент ValveControl в АСУ ТП. Представляет собой эмулятор контроллера вентиля. Циклически отправляет запросы по IPC к программе virtual_valve для управления состоянием вентиля.
  • log_sender – программа, реализующая компонент LogSender в АСУ ТП. Непрерывно журналирует диагностических данные АСУ ТП и отправляет их по сети на удалённый компьютер. Является индикатором нормальной работы АСУ ТП. Сетевой порт, используемый для отправки системных логов программой log_sender, настраивается через параметр -DLOG_SENDER_PORT в файле ./log_sender/CMakeLists.txt (значение по умолчанию — 8123).
  • network – программа для настройки сетевого интерфейса.
  • dnet_hw – специализированный сетевой драйвер с преднамеренно внедренной уязвимостью, реализующий компонент DriverNetwork в АСУ ТП. Драйвер критически завершает работу при получении “магического” пакета (специально сформированного вредоносного сетевого пакета).

Сценарий демонстрации

В штатном режиме работы АСУ ТП компонент ValveControl циклически управляет вентилем VirtualValve, переключая его состояния. Компонент LogSender непрерывно собирает и отправляет диагностических данные АСУ ТП по сети.

При отправке специально сформированного вредоносного пакета через сетевой интерфейс Ethernet происходит эксплуатация уязвимости в драйвере NetworkDriver. Как результат:

  • в Linux атака вызывает критическую ошибку ядра и полный отказ АСУ ТП c остановкой всех компонентов;
  • в KasperskyOS атака приводит лишь к отказу компонента NetworkDriver и прекращению сетевой передачи диагностических данных компонентом LogSender, при этом остальные компоненты АСУ ТП продолжают функционировать в штатном режиме.

Подготовка стенда

Демонстрация запускается на аппаратной платформе Radxa ROCK 3A.

Настройка UART

Для вывода диагностических данных с Radxa ROCK 3A на хостовый компьютер используется UART (Universal Asynchronous Receiver-Transmitter). Чтобы настроить UART, необходимо ознакомиться со следующими инструкциями:

Настройка сети

Настройка сети для Radxa ROCK 3A может быть выполнена любым доступным способом. Например, с подключением через USB-Ethernet адаптер:

  1. Подключите адаптер к хостовому компьютеру и соедините его с Radxa ROCK 3A.
  2. На хостовом компьютере назначьте адаптеру статический IP-адрес, выполнив следующую команду:

    sudo ip addr add 10.0.2.35/24 dev <имя_адаптера>

  3. Настройте Radxa ROCK 3A в зависимости от используемой ОС:

    • Для KasperskyOS IP-адрес 10.0.2.15 уже предустановлен.
    • Для Linux необходимо подключиться к Radxa ROCK 3A через UART и назначить IP-адрес командой:

      sudo ip addr add 10.0.2.15/24 dev eth0

Подготовка загрузочной SD-карты

Для установки операционной системы на Radxa ROCK 3A необходимо записать загрузочный образ системы на SD-карту. Для этого на Linux следуйте следующим инструкциям:

  1. Выполните команду для просмотра информации о всех блочных устройствах системы:

    lsblk
    
  2. В выводе команды найдите устройство, соответствующее вашей SD-карте, вида /dev/sd[X].
  3. Запишите загрузочный образ на устройство, выполнив команду:

    # В следующей команде path_to_img – путь к файлу образа,
    # [X] – последний символ в имени блочного устройства для SD-карты.
    sudo dd bs=64k if=./path/to/image.img  of=/dev/sd[X]
    

Для Windows используйте утилиты для записи образа на устройство, например, Rufus или Balena Etcher.

Установка KasperskyOS CE SDK

Установите версию 1.4.0 KasperskyOS CE SDK c поддержкой аппаратной платформы Radxa ROCK 3A и соберите необходимые драйвера для Radxa ROCK 3A, выполнив следующие команды:

# Замените <lang> на одно из двух значений: en или ru.
sudo dpkg -i KasperskyOS-Community-Edition-RadxaRock3a-1.4.0.102_<lang>.deb
sudo apt --fix-broken install
sudo /opt/KasperskyOS-Community-Edition-RadxaRock3a-1.4.0.102/drivers/cross-build.sh -s /opt/KasperskyOS-Community-Edition-RadxaRock3a-1.4.0.102/
sudo /opt/KasperskyOS-Community-Edition-RadxaRock3a-1.4.0.102/common/radxa_prepare_sdcard_image.sh

Сборка и запуск решения на KasperskyOS

  1. Перейдите в директорию проекта и запустите команды конфигурации CMake:

    export SDK_PREFIX=/opt/KasperskyOS-Community-Edition-RadxaRock3a-1.4.0.102/
    export PATH="$SDK_PREFIX/toolchain/bin:$PATH"
    cmake -G "Unix Makefiles" -B./.build -DCMAKE_TOOLCHAIN_FILE=/opt/KasperskyOS-Community-Edition-RadxaRock3a-1.4.0.102/toolchain/share/toolchain-aarch64-kos.cmake
    
  2. Соберите загрузочный образ, выполнив команды:

    # Сборка всех программ (предупреждения можно игнорировать)
    cmake --build ./.build --target all
    
    # Сборка загрузочного образа
    cmake --build ./.build --target sd-image
    
  3. Запишите собранный образ на SD-карту:

    # Замените /dev/sd[X] на ваше устройство
    sudo dd bs=64k if=./.build/hdd.img  of=/dev/sd[X]
    
  4. Подключите загрузочную SD-карту к Radxa ROCK 3A. Подайте питание на Radxa ROCK 3A и дождитесь, пока запустится решение KasperskyOS, в котором будут работать компоненты АСУ ТП.

    Посмотреть диагностических данные, отправляемые программой log_sender, можно выполнив команду:

    nc 10.0.2.15 8123
    
  5. Инициируйте атаку, отправив “магический” пакет командой:

    echo "~~MAGIC~~" | nc 10.0.2.15 8123
    
  6. Ожидаемое поведение АСУ ТП:

    1. Драйвер NetworkDriver обрабатывает “магический” пакет.
    2. Уязвимость вызывает критическую ошибку в работе драйвера.
    3. NetworkDriver аварийно завершает работу с сообщением в системный журнал.
    4. Компоненты АСУ ТП ValveControl, VirtualValve и ядро KasperskyOS продолжают штатную работу, LogSender прекращает отправку диагностических данных по сети.

    Инцидент локализован на уровне драйвера и критические компоненты АСУ ТП не затронуты, работоспособность АСУ ТП сохраняется.

Сборка и запуск решения на Linux

  1. Подготовьте SD-карту для Radxa ROCK 3A, выполнив команду:

    # Замените /dev/sd[X] на ваше устройство
    wget https://github.com/radxa-build/rock-3a/releases/download/b25/rock-3a_debian_bullseye_cli_b25.img.xz
    xz -dc rock-3a_debian_bullseye_cli_b25.img.xz | sudo dd of=/dev/sd[X] bs=1M status=progress conv=fsync
    
  2. Настройка сети между управляющим компьютером и Radxa ROCK 3A. Подключитесь к Radxa ROCK 3A со стандартными учетными данными:

    Login: rock
    Password: rock
    

    Настройте сетевой интерфейс, выполнив команду:

    sudo ip addr add 10.0.2.15/24 dev eth0
    
  3. В соответствии с инструкцией соберите ядро Linux для Radxa ROCK 3A с применением патча с уязвимостью ./linux-network-driver-crash.patch:

    git clone --recurse-submodules https://github.com/radxa-repo/bsp.git
    cd bsp
    ./bsp linux rk356x --no-build
    cd .src/linux
    git apply <path_to_project>/linux-network-driver-crash.patch
    ./bsp --no-prepare-source linux rk356x -r 999
    
  4. Установите собранное ядро по инструкции.

    # На хостовой системе
    scp linux-image-5.10.160-999-rk356x_5.10.160-999_arm64.deb rock@10.0.2.15:~
    Password: rock
    
    # На целевой системе
    sudo dpkg -i linux-image-5.10.160-999-rk356x_5.10.160-999_arm64.deb
    sudo reboot
    
  5. Соберите этот проект для Linux и скопируйте на Radxa ROCK 3A файлы для симуляции АСУ ТП:

    export CC=aarch64-linux-gnu-gcc
    cmake -G "Unix Makefiles" -B./.build-linux
    cmake --build ./.build-linux --target all
    scp .build-linux/{log_sender/LogSender,valve_control/ValveControl,virtual_valve/VirtualValve} rock@10.0.2.15:~
    
  6. Запустите симуляцию АСУ ТП на Radxa ROCK 3A:

    ./VirtualValve &
    ./ValveControl &
    ./LogSender &
    

    Посмотреть диагностических данные, отправляемые программой log_sender, можно выполнив команду:

    nc 10.0.2.15 8123
    
  7. Инициируйте атаку, отправив “магический” пакет командой:

    echo "~~MAGIC~~" | nc 10.0.2.15 8123
    
  8. Ожидаемое поведение системы:

    • Аварийное завершение ядра Linux, на которой развернуты компоненты АСУ ТП.
    • Прекращение работы всех компонентов АСУ ТП.

Уведомления о товарных знаках

Зарегистрированные товарные знаки и знаки обслуживания являются собственностью их правообладателей.

Linux – товарный знак Linus Torvalds, зарегистрированный в США и в других странах.

© 2025 АО “Лаборатория Касперского”

Описание

DoS for an entire system through a driver crash

Конвейеры
0 успешных
0 с ошибкой