Вірус, що живе виключно в ПЛК

Натрапив на цікаву статтю з приводу інформаційної безпеки у сфері промислової автоматизації. Так як сабж не був знайдений в російськомовному сегменті інтернету, було прийнято рішення про переведення статті на великий і могутній російську мову. В цілому, мова піде про досить банальних речах. Так як це мій перший переклад, деколи може зустрітися тужний спогад про Promt'е. Зауваження і виправлення приймаються в ЛС або в коментарі.

Дана стаття не носить характер «присвоєння» авторства. Лише переклад і трохи власних думок на цей рахунок.

Автори: Ralf Spenneberg, Maik Brüggemann, 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

Користувацька програма складається з 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

5.2 Пошук і визначення мети

Вірус починає сканированние для пошуку можливих цілей. ПЛК Siemens SIMATIC можуть бути пізнані за 102 порту TCP. Цей порт може бути закритий за допомогою зовнішнього файрвола. Жоден інший сервіс не використовує цей порт. S7-1200 ініціалізує TCP-з'єднання використовуючи TCON. Використання даної команди показано в лістингу 3, рядок 4. IP адреса і порт прописуються в лінії 9.

Як тільки блок викликаний – ПЛК буде намагатися встановити зв'язок. Це відбувається асинхронно. У наступних циклах відбувається підтвердження стану з'єднання. Поворотне значення DONE (рядок 5) – сигналізує встановилося з'єднання. Якщо TRUE — інфікування триває. Якщо IP-адреса і порт недоступні жодна помилка не виводитися. Кожен цикл збільшує показання лічильника на 1.

image

Якщо після 200 циклів з'єднання не було встановлено, черв'як виконує наступний код. Хоча з'єднання не було встановлено, блок TDISCON викликається для того щоб звільнити ліню для наступного з'єднання. У лінії 13, инкрементируется IP адресу. Тим самим, всі 24 підмережі скануються на наявність відкритого порту 102/TCP.

image

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

5.3.3. Атрибутивні блоки (Блоки атрибути)

Дані формуються згідно з такими атрибутами блоку. Малюнок 6 показує перші атрибути попередньої картинки. Кожен атрибут починається з байта 0хА3. Цей блок містить рядок. Рядок починається з її довжини і містить значення.

image

5.3.4 Кодування значень

У блоках-атрибути, значення кодуються спеціальним чином. Значення може мати змінну довжину. Перші біти кожного байта, переміщуються в початок наступного байта. Картинка 7 пояснює декодування ідентифікатора атрибута і довжини поля з попереднього прикладу. Якщо значення зберігатися всередині блоку-атрибута, то кодування не застосовується.

image

5.3.5. Механізм анти-повтору

S7CommPlus протокол визначає анти-повтор. Для цього ПЛК відправляє випадкові значення в 25 байті у відповідному повідомленні. Значення определно між 0х06 і 0х7f. Байт анти-повтору вираховується по наступній формулі.

image

Всі подальші повідомлення надсилаються TIAPortal, повинні використовувати байт-антиповтора в їх 24 байті. Виділені сірим блоки-атрибути також повинні бути відображені.

image

5.3.6. Передача програми

Для передачі програми використовується спеціальне повідомлення. (Малюнок 10). Кожне повідомлення переносить один POU-елемент. Номер блоку вказує місце в пам'яті ПЛК.

image

Кілька атрибутів блоків складають заголовок повідомлення. Додатково до фактичного байт-коду, S7 записується мета-инфмормация. Ця мета інформація визначає необхідну пам'ять (необхідну), дату створення блоку, номер блоку, використовуваний мову, вихідні код і функції захисту. TIA Portal може використовувати цю інформацію для перевірки коду.

5.3.7. Визначення необхідних повідомлень

Протягом пересилання користувальницької програми відбуватися обмін деякими повідомлення які не є обов'язковими для процесу.
Ці, невідповідні повідомлення, призводять до збільшення пам'яті, яка потрібна для вірусу, тому їх можна пропустити. Картинка 11 показує необхідні повідомлення для вдалій ін'єкції.

Передача розпочато. Щоб уникнути повторного зараження, вірус перевіряє мета і намагається завантажити копію себе. Завантаження додаткового коду можлива тільки після зупинки ПЛК. Коли програма завантажена, ПЛК запускається знову.

image

5.3.8. Загальна реалізація

Ґрунтуючись на аналізі протоколу, передача програми може бути записана, змінена і відправлена знову на ПЛК. Всі необхідні повідомлення відомі.

Для зберігання команд у вірусі використовуємо статичний блок глобальних даних (DB). Додаткові DB використовується для зберігання тимчасових змінних і як приймально/передавальний буфер даних. Постійний блок даний зберігає всі повідомлення необхідні для інфекції. Цей блок не може бути згенерований використовуючи TIA Portla і повинен бути написаний вручну.

image

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

9.Функції захисту
ПЛК S7-1200v3 пропонує 3 різних функції захисту. Ми проаналізуємо кожну з них і оцінимо, чи захистять вони ПЛК від ін'єкції вірусу. Аналіз основа на TIA Portl V11, Update 5 і S7-1200v3 з прошивкою 3.0.2

9.1. Knowhow захист

Knowhow захист захищає власну програму від неавторизованого доступу, без вірного пароля неавторизований доступ і модифікація блоків програми неможлива. Knowhow захист реалізується використовуючи блоки-атрибути. Ці блоки записуються в ПЛК протягом завантаження програми. Блоки відображені на зображенні 15. Збережений хеш пароля, який формується на основі пароля P, обчислюється за такою формулою:

image

TIA Portal оцінює блок-атрибут. Якщо прапорець встановлений – TIA Portal дозволяє зчитувати і записувати до відповідним блокам інформацію без правильного пароля. Вихідні код ПЛК шифрується за допомогою AES128-CBC. Це запобігає доступ до коду. На малюнку 16 показаний зашифрований вихідний код.

image

9.1.1. Уразливість методу
Відсутність перевірки цілісності. Блок може бути лічений і змінений незважаючи на knowhow захист. Захист реалізується засобами TIA Portala, а не ПЛК. При використанні самостійно написаних інструментів для читання і запису блоків на ПЛК, надається будь доступ. Навіть прапор knowhow захисту може бути скинутий в результаті доступу з допомогою TIAPortal. AES-key може бути отриманий або витягнуто. Ключ для шифрованимя може бути отриманий з хеш пароля. Хеш пароля може бути прочитаний за допомогою самостійно написаного програмного забезпечення. Ключ обчислюється за такою формулою:

image

* виправлено виробником SSA-833048

Висновок: Дана захист не допомагає проти вірусу.

9.2.Захист від копіювання
Захист від копіювання забороняє дублювання програми користувача на другий ПЛК. Серійний номер цільового ПЛК зберігатися в користувальницької програми, для запобігання завантаження через TIA Portal, користувацької програми в інший ПЛК. Серійний номер зберігатися в окремому блоці-атрибуті.

9.2.1. Уразливість методу
Цілісність блоку атрибута не захищена. Зберігається серійний номер може бути змінений або переміщено або видалено. ПЛК не перевіряє серійний номер самостійно. Перевірка реалізується тільки за допомогою TIA Portal.

* виправлено виробником SSA-833048

Висновок: Дана захист не допомагає проти вірусу.

9.3. Захист доступу

Захист доступу запобігає доступ до ПЛК використовуючи S7CommPlus протокол без пароля. Доступно 3 різних рівня захисту. В таблиці відображені різні рівні захисту:

image

Аутентифікація використовує механізм – відповідь на запит.

Висновок: Захист доступу може захистити ПЛК від атаки вірусу. Захист від запису перешкоджає будь-якому зміни коду в ПЛК. Використання механізму відповіді на запит відносно безпечно. Якщо ваш пароль не відомий, черв'як не може інфікувати ПЛК. За замовчуванням захист доступу відключена.

10. Висновок
У даній роботі ми демонструємо можливості хробака для ПЛК. Такий вірусу являє собою нову загрозу в промислових мережах. Традиційно такі мережі добре захищені від атаки ззовні. З введенням в дію вже зараженого хробаком PLC робить інші пристрої не тільки метою атаки, але й джерелами атаки. Інфіковані ПЛК можуть поширюватися дистриб'юторами, або зараження може відбуватися протягом транспортування. Черв'як може поширитися всередині контролера і не вимагає яких-небудь стандартних ПК або серверів. Тим самим він не може бути виявлений антивірусом. Більш того, оператор має дуже мало можливостей для виявлення шкідливого коду в ПЛК.

Від автора перекладу
Як відомо, на кожну хитру гайку знайдеться свій болт з різьбою. Особисто автор вважає, що проблема безпеки промислової автоматизації злегка роздута, через відсутність єдиної уніфікованої середовища для виконання шкідливого коду на різних ПЛК різних виробників. Орієнтація на Siemens, Allen-Bradley, Honeywell, B&R і т. п. виробників ставить завдання написання вірусу під строго певний пристрій.

В цілому, принцип поширення вірусу всередині мережі складається з контролерів базових станцій та інженерних панелей управління — заслуговує окремої уваги. До того ж, приклад StuxNet'а ніби і показав світові можливу ситуацію розвитку подій. Як і навіщо була реалізована атака — навряд чи дізнаємося. Але всі так люблять приводити його в приклад…

В сучасних реаліях бобільшу загрозу представляє беззалаберность при виконання робіт і подальшому обслуговуванні. Так само сильне поширення отримує сама професія «Програміст АСУ ТП», «Програміст контролерів АСУ ТП» і т. п. що призводить до зростаючого кількості низькокваліфікованих кадрів.

Так що поки нас лякають майбутнім промисловим Скайнтом, ми повинні залишатися уважними до виконуваного коду.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.