Демонстрация атаки на цепочку поставок в АСУ ТП
Демонстрация атаки на цепочку поставок (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 адаптер:
- Подключите адаптер к хостовому компьютеру и соедините его с Radxa ROCK 3A.
На хостовом компьютере назначьте адаптеру статический IP-адрес, выполнив следующую команду:
sudo ip addr add 10.0.2.35/24 dev <имя_адаптера>
Настройте 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
- Для KasperskyOS IP-адрес
Подготовка загрузочной SD-карты
Для установки операционной системы на Radxa ROCK 3A необходимо записать загрузочный образ системы на SD-карту. Для этого на Linux следуйте следующим инструкциям:
Выполните команду для просмотра информации о всех блочных устройствах системы:
lsblk
- В выводе команды найдите устройство, соответствующее вашей SD-карте, вида
/dev/sd[X]
. Запишите загрузочный образ на устройство, выполнив команду:
# В следующей команде 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.3.0 KasperskyOS CE SDK c поддержкой аппаратной платформы Radxa ROCK 3A и соберите необходимые драйвера для Radxa ROCK 3A, выполнив следующие команды:
# Замените <lang> на одно из двух значений: en или ru.
sudo dpkg -i KasperskyOS-Community-Edition-RadxaRock3a-1.3.0.111_<lang>.deb
sudo apt --fix-broken install
sudo /opt/KasperskyOS-Community-Edition-RadxaRock3a-1.3.0.111/drivers/cross-build.sh -s /opt/KasperskyOS-Community-Edition-RadxaRock3a-1.3.0.111/
sudo /opt/KasperskyOS-Community-Edition-RadxaRock3a-1.3.0.111/common/radxa_prepare_sdcard_image.sh
Сборка и запуск решения на KasperskyOS
Перейдите в директорию проекта и запустите команды конфигурации
CMake
:export SDK_PREFIX=/opt/KasperskyOS-Community-Edition-RadxaRock3a-1.3.0.111/ export PATH="$SDK_PREFIX/toolchain/bin:$PATH" cmake -G "Unix Makefiles" -B./.build -DCMAKE_TOOLCHAIN_FILE=/opt/KasperskyOS-Community-Edition-RadxaRock3a-1.3.0.111/toolchain/share/toolchain-aarch64-kos.cmake
Соберите загрузочный образ, выполнив команды:
# Сборка всех программ (предупреждения можно игнорировать) cmake --build ./.build --target all # Сборка загрузочного образа cmake --build ./.build --target sd-image
Запишите собранный образ на SD-карту:
# Замените /dev/sd[X] на ваше устройство sudo dd bs=64k if=./.build/hdd.img of=/dev/sd[X]
Подключите загрузочную SD-карту к Radxa ROCK 3A. Подайте питание на Radxa ROCK 3A и дождитесь, пока запустится решение KasperskyOS, в котором будут работать компоненты АСУ ТП.
Посмотреть диагностических данные, отправляемые программой
log_sender
, можно выполнив команду:nc 10.0.2.15 8123
Инициируйте атаку, отправив “магический” пакет командой:
echo "~~MAGIC~~" | nc 10.0.2.15 8123
Ожидаемое поведение АСУ ТП:
- Драйвер
NetworkDriver
обрабатывает “магический” пакет. - Уязвимость вызывает критическую ошибку в работе драйвера.
NetworkDriver
аварийно завершает работу с сообщением в системный журнал.- Компоненты АСУ ТП
ValveControl
,VirtualValve
и ядро KasperskyOS продолжают штатную работу,LogSender
прекращает отправку диагностических данных по сети.
Инцидент локализован на уровне драйвера и критические компоненты АСУ ТП не затронуты, работоспособность АСУ ТП сохраняется.
- Драйвер
Сборка и запуск решения на Linux
Подготовьте 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
Настройка сети между управляющим компьютером и Radxa ROCK 3A. Подключитесь к Radxa ROCK 3A со стандартными учетными данными:
Login: rock Password: rock
Настройте сетевой интерфейс, выполнив команду:
sudo ip addr add 10.0.2.15/24 dev eth0
В соответствии с инструкцией соберите ядро 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
Установите собранное ядро по инструкции.
# На хостовой системе 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
Соберите этот проект для 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:~
Запустите симуляцию АСУ ТП на Radxa ROCK 3A:
./VirtualValve & ./ValveControl & ./LogSender &
Посмотреть диагностических данные, отправляемые программой
log_sender
, можно выполнив команду:nc 10.0.2.15 8123
Инициируйте атаку, отправив “магический” пакет командой:
echo "~~MAGIC~~" | nc 10.0.2.15 8123
Ожидаемое поведение системы:
- Аварийное завершение ядра Linux, на которой развернуты компоненты АСУ ТП.
- Прекращение работы всех компонентов АСУ ТП.
Уведомления о товарных знаках
Зарегистрированные товарные знаки и знаки обслуживания являются собственностью их правообладателей.
Linux – товарный знак Linus Torvalds, зарегистрированный в США и в других странах.
© 2025 АО “Лаборатория Касперского”