Данная статья не носит характер «присвоения» авторства. Только перевод и немного собственных мыслей на сей счет.
Авторы: Ralf Spenneberg, Maik Bruggemann, Hendrik Schwartke
Источник: OpenSource Security Ralf Spenneberg
Современные промышленные процессы управляются при помощи программируемых логических контроллеров (ПЛК). Множество ПЛК, продаваемых сегодня, имеют на своем борту Ethernet порты и могут связываться посредством IP. Взяв за основу Siemens SIMATIC S7-1200, мы продемонстрируем вирус. Данная уязвимость не требует каких-либо дополнительных ПК для распространения. Червь живет и работает только в ПЛК. Он сканирует сеть для новых целей (ПЛК), атакует их и воспроизводит себя на найденных целях. Основная, главная программа, запущенная на пораженном ПЛК, не модифицируется. Пораженное устройство начинает сканировать сеть в поисках новой цели. Мы проанализируем влияние вируса на цель и возможные методы уменьшения негативных последствий.
1. Введение
IT системы – критически важные компоненты в современных промышленных процессах. Эти процессы не были бы возможны без современных коммуникационных сетей. К сожалению, с применением IT систем и сетей связи в промышленных системах, пользователь подвергается атакам, которые давно известны в IT. Данные хакерские атаки могут нанести вред промышленным системам многими способами. Они могут привести к большим финансовым потерям, но в то же время могут оказывать негативное влияние на жизнь и здоровье окружающих. Эффективность этих атак была продемонстрирована Stuxnet’ом. ПЛК Siemens были модифицированы чтобы помешать Ирану в обогащение ядерного топлива. Вирус распространялся через ПК станции, эксплуатируя уязвимости MS Windows. ПО ПЛК было модифицировано таким образом, что центрифуги используемые в процессе были уничтожены. Червю требовался компьютер, что бы распространиться и атаковать ПЛК через ПК. Данная статья продемонстрирует вирус / червя, который распространяется только через ПЛК. ПК или сервер не требуется. Червь может быть занесен на станцию через уже скомпрометированный ПЛК. Вирус распространяется на следующие ПЛК путем копирования себя и заражая, тем самым, остальные ПЛК, работая, одновременно с пользовательской программой.
Эксперименты проводился на Siemens SIMATIC S7-1200v3. Вирус был написан на языке программирования ST.
2. Смежные направления исследования
2015 год, BlackHat, USA 2015 – продемонстрировали майлвар запущенный на ПЛК.
Они реализовали промежуточный сервер используя коммуникационные возможности ПЛК. Мы используем аналогичные возможности для реализации протокола, используемого для распространения вирусной программы. Используя этот протокол, червь может распространяться непосредственно от ПЛК к другому ПЛК. Дальнейшей поддержки со стороны системы червь не требует. Вместо использования уже хорошо известного Simatic S7-300, мы использовали в нашей работе новый S7-1200v3.
3. Немного об архитектуре ПЛК
Архитектура контроллера проста. Она основана на центральном процессорном модуле (ЦПУ) и дополнительных модулей расширения для цифровых и аналоговых входов/выходов. ЦПУ отвечает за запуск и управление операционной системой ПЛК и запускает пользовательскую программу. Так же, ЦПУ ответственен за связь (коммутацию) с дополнительными устройствами и управляет процессом.
Образ процесса хранит состояние всех входов/выходов. Программа пользователя запускается циклично. Состояние процесса обновляется ЦПУ в начале и в конце каждого цикла. Цикл ограничен временем цикла. Если предел достигнут, ПЛК останавливает пользовательскую программу и выдает ошибку.
![image](https://habrastorage.org/files/92b/926/197/92b92619745f4e8ea1d1181a9845fadd.png)
Пользовательская программа состоит из Program Organization Units (POU). Они содержат инструкции для контроля и управления ПЛК. Программа для Siemens SIMATIC S7-1200 состоит из:
— Organization Blocks — Организационный Блок (OB) – Куда вводится пользовательская программа.
— Data Block (DB) – Блок данных – глобальная память.
— Function (FC) – функции
— Function Block – функции с сохраняемой локальной памятью.
Так же данная статья использует системные функции TCON и TDISCON. При помощи этих функций можно инициализировать или разорвать TCP соединение с произвольной системой. Данные могут быть отправлены и получены при помощи команд TRCV и TSEND.
4. Компьютерные черви
Компьютерные черви известны с 1988 года и являются хорошо известным видом вредоносного программного обеспечения. Каждая вирусная атака может быть описана следующими фазами:
— определение возможной цели
— распространение до цели
— использование цели
— выполнение вредоносного кода
На ПЛК, червь должен выполнять те же функции. Статья демонстрирует реализацию каждого из необходимых шагов.
5. Реализация вируса для Siemens SIMATIC S7-1200
5.1 Архитектура
Как и любой другой червь, вирус был написан с некоторыми особенностями. В ходе разработки учитывались специфичные ограничения и условия ПЛК. Должно выполняться условие не нарушения максимального времени цикла. Вирус должен прерывать его выполнение на несколько миллисекунд. Выполнение может быть продолжено в течении следующих циклов. В начале каждого цикла, код вируса вызывался заново. Это позволило не нарушать максимальное время выполнения цикла.
Поэтапное выполнение кода показано на картинке ниже. Выполнение вируса начиналось с инициализации соединения с возможной целью. В первую очередь после соединение, вирус проверял, была ли цель уже инцифированна. Если инфицирование обнаружено не было, то вирус останавливает выполнение программы пользователя на цели дабы позволить выполнить трансфер его собственного кода.
После копирования, и непосредственного запуска инфицированного ПЛК, червь продолжает искать следующую возможную цель.
![image](https://habrastorage.org/files/b21/ee2/422/b21ee242289249f189aa9ee94a100421.png)
5.2 Поиск и определение цели
Вирус начинает сканированние для поиска возможных целей. ПЛК Siemens SIMATIC могут быть опознаны по 102 порту протокола TCP. Этот порт может быть закрыт при помощи внешнего файрвола. Ни один другой сервис не использует этот порт. S7-1200 инициализирует TCP подключение используя TCON. Использование данной команды показано в листинге 3, строка 4. IP адрес и порт прописываются в строке 9.
Как только блок вызван – ПЛК будет пытаться установить связь. Это происходит асинхронно. В следующих циклах происходит подтверждение состояния соединения. Возвратное значение DONE (строка 5) – сигнализирует установилось ли соединение. Если TRUE — инфицирование продолжается. Если IP адрес и порт недоступны – никакая ошибка не выводится. Каждый цикл увеличивает показание счетчика на 1.
![image](https://habrastorage.org/files/358/cb0/c27/358cb0c273a845a6872dcdd5aa1e6f5d.png)
Если после 200 циклов соединение не было установлено, червь выполняет следующий код. Хотя соединение не было установлено, блок TDISCON вызывается для того чтобы освободить линию для следующего соединение. В строке 13, инкрементируется IP адрес. Тем самым, все 24 подсети сканируются на наличие открытого порта 102/TCP.
![image](https://habrastorage.org/files/716/175/186/7161751861c24aeb80d3f94a4b369605.png)
5.3. Инфицирование
В течении фазы инфицирования, червь копирует себя на атакуемый ПЛК. Обычно ПО загружается на контроллер при использовании программы Siemens TIA-Portal. Червь мимикрирует под TIA-Portal и реализует проприетарный сименсовский протокол. Для анализа протокола и последующей его реализации мы использовали Wireshark.
5.3.1. Описание протокола передачи
В данной статье протокол будет назван S7CommPlus. Это бинарный протокол который задействует протоколы TPKT и ISO8073. Оба этих протокола использует порт 102/TCP.
Главные функции S7CommPlus:
- Управление ПЛК
- Старт/стоп ПЛК
- Чтение и запись переменных
- Трансфер программы (загрузка/выгрузка)
- Отладка
- Предоставление отладочной информации
- Уведомление об авариях
5.3.2. Код
Каждое сообщение используемое S7CommPlus имеет одинаковую структуру. На картинке №5 представлено первое сообщение в соединение. TIA Portal посылает это сообщение для инициализации соединения. Поясним общую структуру. Первые 2 выделенных поля представляют собой TPKT и ISO8073 протоколы. Их содержимое описано в соответствующей документации. Следующий байт 0х72 представляет собой начало сообщения от S7CommPlus. Номер версии различается между различными вариантами протокола. Длина поля не учитывает границы кадра. Если граница кадра отсутствует то последующие данные передаются в дополнительных сообщениях. После длины поля, передается тип ячейки. Подтип в дальнейшем определяет сообщения. Порядковый номер увеличивается на 1 для каждого сообщения. Дополнительные данные передаются в виде атрибутивных блоков (блоках атрибутах).
![image](https://habrastorage.org/files/c8d/31a/a2d/c8d31aa2d45d46ff87df3b4de2653f72.png)
5.3.3. Атрибутивные блоки (Блоки атрибуты)
Данные формируются согласно следующим атрибутам блока. Картинка 6 показывает первые атрибуты предыдущей картинки. Каждый атрибут начинается с байта 0хА3. Этот блок содержит строку. Строка начинается с её длины и содержит значение.
![image](https://habrastorage.org/files/7fa/d03/2c5/7fad032c5a37412c8ad8547f25c171f3.png)
5.3.4 Кодирование значений
В блоках-атрибутах, значения кодируются специальным образом. Значение может иметь переменную длину. Первые биты каждого байта, перемещаются в начало следующего байта. Картинка 7 объясняет декодирование идентификатора атрибута и длины поля с предыдущего примера. Если значение хранится внутри блока-атрибута, то кодирование не применяется.
![image](https://habrastorage.org/files/cf7/a5f/fcf/cf7a5ffcfc5940099ecd6d2321202b6c.png)
5.3.5. Механизм анти-повтора
S7CommPlus протокол определяет анти-повтор. Для этого ПЛК отправляет случайнее значение в 25 байте в ответном сообщении. Значение определено между 0х06 и 0х7f. Байт анти-повтора высчитывается по следующей формуле.
![image](https://habrastorage.org/files/580/456/2e7/5804562e73f140d492505013a458cdfd.png)
Все дальнейшие сообщение посылаемые TIAPortal, должны использовать байт-антиповтора в их 24 байте. Выделенные серым блоки-атрибуты также должны быть отображены.
![image](https://habrastorage.org/files/735/d66/350/735d6635080b45eabd02509bcb4bd2d4.png)
5.3.6. Передача программы
Для передачи программы используется специальное сообщение. (Картинка 10). Каждое сообщение переносит один POU-элемент. Номер блока указывает место в памяти ПЛК.
![image](https://habrastorage.org/files/551/488/cf2/551488cf2b79468eb9bc96a106676003.png)
Несколько блоков атрибутов составляют заголовок сообщения. Дополнительно к фактическому байт-коду, в S7 записывается мета-инфмормация. Эта мета информация определяет требуемую память (необходимую), дату создания блока, номер блока, используемый язык, исходные код и функции зашиты. TIA Portal может использовать эту информацию для проверки кода.
5.3.7. Определение необходимых сообщений
В течении пересылки пользовательской программы происходить обмен некоторыми сообщения которые не обязательны для процесса.
Эти, несоответствующие сообщения, приводят к увеличению памяти, которая требуется для вируса, поэтому их можно пропустить. Картинка 11 показывает необходимые сообщения для удачной инъекции.
Передача начата. Во избежание повторного заражения, вирус проверяет цель и пытается загрузить копию себя. Загрузка дополнительного кода возможна только после остановки ПЛК. Когда программа загружена, ПЛК запускается опять.
![image](https://habrastorage.org/files/11a/663/eab/11a663eab5d548cca8c6d0e32d366280.png)
5.3.8. Общая реализация
Основываясь на анализе протокола, передача программы может быть записана, изменена и отправлена опять на ПЛК. Все необходимые сообщения известны.
Для хранения команд в вирусе используем статичный блок глобальных данных (DB). Дополнительные DB используются для хранения временных переменных и как приемо/передаточный буфер данных. Постоянный блок данный хранит все сообщения необходимые для инфекции. Этот блок не может быть сгенерирован используя TIA Portla и должен быть написан вручную.
![image](https://habrastorage.org/files/502/ca0/4ab/502ca04abed445b68d8de53e3d0f6ca7.png)
6. Запуск вируса
Переданный код добавляется к программе пользователя уже запущенной на ПЛК. Дополнительные OB и требуемые DB добавлены. Код программы пользователя оригинален и не исправлялся. OB блок автоматически обнаружен ПЛК и выполнен.
habrastorage.org/files/7d7/479/d4c/7d7479d4c7ba4fbdbde958ed124016ca.png
7. Выполнение вредоносных функций
В течении функционирования вируса, мы реализуем различные функции для демонстрации возможности влияния вируса.
7.1. Command & Control Server
(Сервер управление и контроля)
Наш червь будет пытаться соединиться с C&C сервером. Протокол связи – TCP. Через C&C сервер можно организовать выполнение различных функций.
7.2. Socks4 proxy
После того как червь подключается к С&C серверу, соединения с дополнительными клиентами в сети ПЛК может быть инициировано с помощь встроенного Socks4 proxy.
7.3. Отказ сервиса
Работа (выполнение кода ПЛК) может быть остановлено из-за нарушения времени цикла. Червь выполняет (реализует) бесконечный цикл, запускающий состояние ошибки в ПЛК (DoS атака).
7.4 Манипуляция выходными сигналами
Червь может управлять выходными сигналами ПЛК. При использовании системной функции «POKE», различные переменные внутри процесса могут быть изменены.
8. Обнаружение вируса. Противодействие. Ресурсы для работы червя
8.1 Обнаружение вируса
8.1.1. TIA Portal
TIA Portal может сверять программу пользователя в ПЛК и может обнаруживать как изменения так добавления различных функций (POU элементов). (Картинка 14). Красным выделена область функций, которые используются вирусом. Анализ этих функций не представляется возможным, потому что TIA Portal только анализирует XML-код. Кроме того, за счет использования ошибок TIA Portala червь может вызвать краш приложения, аварийно завершив его работу.
8.1.2. Остановка ПЛК
Для осуществления инфицирвоания, ПЛК должен остановиться на, примерно, 10 секунд. Программа пользователя не будет выполняться в это время. Прерывание может быть замечено и залогированно в ПЛК.
8.1.3. Сетевой трафик
Червь генерирует необычный сетевой трафик. В течении фаз сканирования сети и инфицирования целей отправляется много подозрительных пакетов.
8.2 Противодействие
8.2.1. Перезапуск ПЛК
Так как вирус находится в памяти ПЛК и является частью пользовательской программы, то в результе рестарта или отключения электричества червь останется в устройстве.
8.2.2. Сброс к заводским настройкам
Через TIA Portal можно осуществить возврат к заводским настройкам что приведет к полному удалению данных с ПЛК, в том числе и червя.
8.2.3. Загрузка программы
Червь записан в блок OB9999, при перезаписи данного блока, червь будет удален.
8.3. Ресурсы для работы червя
8.3.1.Время цикла выполнения
Максимальное время выполнения цикла жестко задается в настройках. По умолчанию лимит стоит в 150 мс. Червь не должен нарушать этот предел. Мы измерили время цикла ПЛК без какой-либо пользовательской программы – оно составляет 0 мс. Затем мы заразили S7 с помощью нашего червя и измерили время цикла заново. Максимально измеренное врем цикла составляет 7мс. Это составляет 4,7% от допустимого предела.
8.3.2. Память
Червю требуется 38,5 кбайт РАМ для хранения. 9 КБ (23,3%) необходимо для выполнения вредоносного кода. Дополнительно необходимо 216,6 КБ флеш памяти. Таблица отображает доступную память в различных моделей.
![image](https://habrastorage.org/files/5e1/3c4/f89/5e13c4f89230446b98fa2cc952c839fd.png)
9.Функции защиты
ПЛК S7-1200v3 предлагает 3 различных функции защиты. Мы проанализируем каждую из них и оценим, защитят ли они ПЛК от инъекции вируса. Анализ основан на TIA Portl V11, Update 5 и S7-1200v3 с прошивкой 3.0.2
9.1. Knowhow защита
Knowhow защита защищает пользовательскую программу от неавторизированного доступа, без верного пароля неавторизированный доступ и модификация блоков программы невозможна. Knowhow защита реализуется используя блоки-атрибуты. Эти блоки записываются в ПЛК в течении загрузки программы. Блоки отображены на картинке 15. Сохраненный хэш пароля, формируемый на основе пароля P, вычисляется по следующей формуле:
![image](https://habrastorage.org/files/193/730/72d/19373072d83d44c19f233b7126e16279.png)
TIA Portal оценивает блок-атрибут. Если флаг установлен – TIA Portal запрещает считывать и записывать к соответствующим блокам информацию без правильного пароля. Исходные код ПЛК шифруется при помощи AES128-CBC. Это предотвращает доступ к коду. На рисунке 16 показан зашифрованный исходный код.
![image](https://habrastorage.org/files/99b/15b/cd9/99b15bcd96d84086bf978d8d04022852.png)
9.1.1. Уязвимость метода
Отсутствие проверки целостности. Блок может быть считан и изменен несмотря на knowhow защиту. Защита реализуется средствами TIA Portala, а не ПЛК. При использовании самостоятельно написанных инструментов для чтения и записи блоков на ПЛК, предоставляется любой доступ. Даже флаг knowhow защиты может быть сброшен в результате доступа с помощью TIAPortal. AES-key может быть получен или извлечен. Ключ для шифрованимя может быть получен из хеша пароля. Хеш пароля может быть прочитан при помощи самостоятельно написанного программного обеспечения. Ключ вычисляется по следующей формуле:
![image](https://habrastorage.org/files/46a/099/5a1/46a0995a1bb64592a2099cac38bd9338.png)
* исправлено производителем SSA-833048
Вывод: Данная защита не помогает против вируса.
9.2.Защита от копирования
Защита от копирования запрещает дублирование программы пользователя на второй ПЛК. Серийный номер целевого ПЛК хранится в пользовательской программе, для предотвращения загрузки через TIA Portal, пользовательской программы в другой ПЛК. Серийный номер хранится в отдельном блоке-атрибуте.
9.2.1. Уязвимость метода
Целостность блока атрибута не защищена. Хранимый серийный номер может быть изменен или перемещён, или удален. ПЛК не проверяет серийный номер самостоятельно. Проверка реализуется только при помощи TIA Portal.
* исправлено производителем SSA-833048
Вывод: Данная защита не помогает против вируса.
9.3. Защита доступа
Защита доступа предотвращает доступ к ПЛК используя S7CommPlus протокол без пароля. Доступно 3 различных уровня защиты. В таблице отображены различные уровни защиты:
![image](https://habrastorage.org/files/80a/c12/0e3/80ac120e35a24076b17834e84eb1fba3.png)
Аутентификация использует механизм – ответ на запрос.
Вывод: Защита доступа может защитить ПЛК от атаки вируса. Защита от записи препятствует любому изменения кода в ПЛК. Использование механизма ответа на запрос относительно безопасно. Если используемый пароль не известен, червь не может инфицировать ПЛК. По умолчанию защита доступа отключена.
10. Заключение
В данной работе мы демонстрируем возможности червя для ПЛК. Такой вирус представляет собой новую угрозу в промышленных сетях. Традиционно такие сети хорошо защищены от атаки извне. С введением в строй уже зараженного червём PLC делает другие устройства не только целью атаки, но и источниками атаки. Инфицированные ПЛК могут распространяться дистрибьютерами, или заражение может происходить в течении транспортировки. Червь может распространиться внутри контроллера и не требует каких-либо стандартных ПК или серверов. Тем самым он не может быть обнаружен антивирусом. Более того, оператор имеет очень мало возможностей для обнаружения вредоносного кода в ПЛК.
От автора перевода
Как известно, на каждую хитрую гайку, найдется свой болт с резьбой. Лично автор считает, что проблема безопасности промышленной автоматизации слегка раздута, по причине отсутствие единой унифицированной среды для выполнения вредоносного кода на различных ПЛК разных производителей. Ориентация на Siemens, Allen-Bradley, Honeywell, B&R и т.п. производителей ставит задачу написания вируса под строго определённое устройство.
В целом, принцип распространения вируса внутри сети состоящей из контроллеров, базовых/инженерных станций и панелей управления — заслуживает отдельного внимания. К тому же, пример StuxNet'а вроде и показал миру возможную ситуацию развития событий. Как и зачем была реализована атака — вряд ли узнаем. Но все так любят приводить его в пример…
В современных реалиях большую угрозу представляет беззалаберность при выполнение работ и последующем обслуживании. Так же сильное распространение получает сама профессия «Программист АСУ ТП», «Программист контроллеров АСУ ТП» и т.п. что приводит к растущему количеству низкоквалифицированных кадров.
Так что пока нас пугают будущим промышленным Скайнетом, мы должны оставаться внимательными к исполняемому коду.
Комментарии (9)
nuclear_skillet21011
31.05.2016 20:50+1Вот как всегда, как дельная толковая статья или перевод так никакой обратной связи. Автор Вы большой молодец, гигантское спасибо вам за труд! У меня возникло несколько мыслей и обязательно поэксперементирую для начала с этой же прошивкой. Если будет интересно я обязательно напишу об этом.
Corel_aka_DDK
01.06.2016 17:32Отписал в ЛС.
Сам планирую провести пару экспериментов, так что, думаю, материал будет.
Сравнить будет интересно.
Klukonin
01.06.2016 11:37у nuclear_skillet21011 лимит на сообщения, но он очень хочет поделиться.
Пишу от его имени интересную историю:
На днях вернулся из Сомали. Был там в лавке одного торговца электроникой. НА стене висела табличка, железная, с выгравированным на ней (подозреваю лазером, так-как сам лазер выдранный из привода старого DVDrom`a, установленный на передвигающихся направляющих, приходящих в движение от электро-моторчика(на вид от принтера Canon). Я спросил его что это? Он божился что — декомпилированый StuxNet. Я всё дорогу домой жалел, что на зеркалке моей батарейка была севшая.(Хоть и подозреваю что врёт)
Corel_aka_DDK
01.06.2016 17:34Весьма большая железка должна быть.
Кода там на 500+ кБ если верить различным источникам.
segrus
01.06.2016 19:44Поэтому у меня рабочий ноут без интернета, мышка с проводом, а шапочка из фольги. Ну и конечно контроллеры соседних линий не соединены.
Helms
07.06.2016 23:08В таких случаях versiondog выручит. Он без проблем сообщит об изменениях в коде в этот же день или час… как настроите…
Klukonin
StuxNet имел вполне конкретные цели — вывести из строя иранские центрифуги обогащения урана. То что сам механизм модульности позволяет использовать разный пэйлоад — это такой задел на будущие спецоперации.
Ну и да, тема промышленной безопасности актуальнее с каждым годом. тут нужно учитывать региональные особенности использования контроллеров, например, в России большую часть на заводах имеют Сименсы. Одной атакой вывести из строя одномоментно половину крупных заводов в стране — это очень вкусно для потенциального противника. Можно даже не заморачиваться с шахидами и бомбами.
Под выводом из строя имел в виду не просто вывод из строя ПЛК, на большинстве предприятия возможно ручное управление, вывод из строя может очуществляться путем подделки температурных порогов, например, или показаний давления/расхода. Закозлить домну, взорвать екости высокого давления, спалить печь — это все вполне реально. Особенно, с учетом того как АСУшники не любят обновлять ПО, либо его нельзя поменять, т.к. производство непрерывное.
З.Ы. Как-то видел на факультете постоянно обновляющиеся объявления «Требуются программисты STEP7. Оплата достойная». И телефон. *Facepalm*
Corel_aka_DDK
В целом, никто не отрицает этого факта, просто масштаб и техническая реализация позволяет учитывать остальные системы, получать с них данные и, так, для галочки, делать задел для будущего.
Сименсы — заводы.
АБ — нефтянка.
Одной атаки будет мало, но раз 5 пройтись каким-либо сборщиком информации о сети, можно попытаться написать универсального «монстра», но должны привлекаться весьма «умные» головы, что не всем подсилу. К тому же — разнопрофильные.
Ручное управление всегда делается в обход ПЛК, но не всегда оператор несет свой пост бдительно. Несмотря на инерционность процессов вред можно нанести простым увеличением скорости вращения вала/привода.
На хороших местах текучки не бывает. Если Вы пришли на «хорошее» место, значит кто-то оттуда сбежал с криками и матами. Но есть и исключения.