Как стать автором
Обновить

Безопасность ПЛК: 8,9) Проверяйте входные переменные, следите за косвенными обращениями

Время на прочтение6 мин
Количество просмотров2K
Автор оригинала: plc-security.com

8) Проверяйте таймеры и счётчики 

Доступ к переменным ПЛК должен быть ограничен. Значение с HMI, вышедшее за допустимые пределы, должно быть корректно обработано или оператор должен получить об этом сообщение.

Описание

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

Если переменная ПЛК получает значение, выходящее за границы, реализуйте следующую логику: 

  • введите значение по умолчанию для этой переменной, которое не оказывает отрицательного воздействия на процесс и может использоваться как флаг для предупреждений  

  • введите последнее правильное значение для этого значения и зарегистрируйте событие для дальнейшего анализа. 

Примеры

Пример 1 
Операция требует, чтобы пользователь ввел значение давления клапана на HMI. Допустимый диапазон для этого значения 0-100, и ввод пользователя на HMI передаётся к переменной V1 в ПЛК. В этом случае: 

  1. Вход HMI в переменную V1 имеет ограниченный диапазон от 0 до 100 (десятичный), запрограммированный в HMI. 

  2. В ПЛК есть проверка: 

IF V1 < 0 OR IF V1 > 100, SET V1 = 0. 

Это обеспечит корректный ответ на недопустимый ввод этой переменной.  

Пример 2 
Операция требует ввода пользователем пороговых значений измерения для переменной, которая всегда должна быть в диапазоне типа INT2. Пользовательский ввод передается из HMI в переменную V2 в ПЛК, которая представляет собой 16-битный регистр. 

  1. Вход HMI в переменную V2 имеет ограниченный диапазон от -32768 до 32767 (десятичный), запрограммированный в HMI.  

  2. ПЛК имеет проверку типов данных, которая устанавливает переменную переполнения (V3), которая переходит в TRUE в случае выхода V2 за пределы типа данных: 

IF V2 = -32768 OR IF V2 = 32767 AND V3 != 0, 
SET V2 = 0 AND SET V3 = 0 AND SET DataTypeOverflowAlarm = TRUE. 

Пример 3 
Контролируйте параметры и значения для ПИД-регуляторов для устранения ошибок масштабирования и конвертации величин, вызывающих проблемы управления. Неправильная установка значений может привести к нежелательным последствиям. 

Безопасность

  1. Хотя HMI обычно обеспечивают некоторую проверку ввода, злоумышленник всегда может создавать и воспроизводить модифицированные пакеты для отправки произвольных значений переменных в те ПЛК, которые открыты для внешнего воздействия.  

  2. Протоколы ПЛК обычно подаются как "открытые" протоколы и опубликованы для широкой публики, поэтому создание вредоносных программ, использующих "открытую" информацию протокола не является сложной задачей. Определение размещения переменных ПЛК обычно происходит посредством анализа трафика во время разведывательных фаз атаки, обеспечивая тем самым злоумышленника необходимой информацией для создания вредоносных пакетов к ПЛК и тем самым манипулировать процессом с помощью неавторизованных инструментов. Проверка значений, переданных в ПЛК перед внедрением этих данных в процесс гарантирует соблюдение диапазонов значений и устраняет недопустимые значения путем принудительной установки безопасных значений. 

9) Следите за косвенными обращениями 

Следите за обращением к элементам массива, чтобы избежать ошибку неучтённой единицы.

Описание

Косвенное обращение – это использование значения регистра как адрес на другой регистр. Есть много причин использовать косвенные указания. 

Примеры необходимых косвенных обращений: 

  • Частотно-регулируемые приводы, которые запускают разные действия для разных частот, используя таблицы поиска.  

  • Решить, какой насос запустить первым, исходя из их текущего времени работы. 

ПЛК обычно не имеют флага «конца массива», поэтому неплохо создать его в программно; цель - избежать незапланированных операций в ПЛК. 

Пример

Программирование на Instruction List (IL) 
Этот подход может быть преобразован в несколько функциональных блоков и, возможно, даже повторно использован для многих проектов. 

1 Создайте массив-маску 

Проверьте, имеет ли массив двоичный размер. Если он не имеет двоичного размера, создайте маску следующего размера в двоичном масштабе. например, если вам нужно 5 регистров (не двоичного размера): 

[21 31 41 51 61] 

определите массив из 8 элементов: 

[x x 21 31 41 51 61 x] 

Затем возьмите значение индекса, которое нужно выбрать для косвенного обращения - в этом примере оно равно 3. 

Предостережение: Индекс начинается с 0! 

[21 31 41 51 61] 

Индекс: 3 

Добавьте к нему смещение, компенсирующее отравленный(запрещённый для использования) конец. Смещение может быть 1 или выше, в данном случае оно равно 2: 

[x x 21 31 41 51 61 x] 

Индекс со смещением: 3 + 2 = 5

А затем выполните битовое AND между индеком, включающим смещение, и маской равной размеру массива.  

В этом примере размер массива равен 8, следовательно, поэтому маска будет равна 0x07. Маска гарантирует, что максимальный индекс, который вы можете получить, равен 7, например: 

6 AND 0x07 вернёт 6;
7 AND 0x07 вернёт 7;
8 AND 0x07 вернёт 0;
9 AND 0x07 вернёт 1;

Это гарантирует, что вы всегда будете обращаться к значению в массиве. 

2 Вставьте отравленные концы

Отравление(обозначение) концов опционально. Вы могли бы обнаружить манипуляции без отравления, но отравление помогает уловить ошибки, связанные с неучтённой единицей, потому что вы возвращаете значение, которое не имеет смысла. 

Дело в том, что в индексе 0 массива должно быть недопустимое значение – например, -1 или 65535. Это “отравленный конец”. Аналогично, на последних элементах массива вы делаете то же самое: 

Итак, для приведенного выше массива отравленная версия может выглядеть следующим образом: 

[-1 -1 21 31 41 51 61 -1] 

3 Запишите значение косвенного адреса без маски 

Затем запишите значение косвенного адреса без маски и смещения:  

В этом примере вы бы записали 51 для индекса 3. 

[21 31 41 51 61] 
Индекс 3 

4 Выполнение битового AND с маской и сравнение значений (=проверка границ) 

Сравните записанное значение со значением после того, как вы выполнили логическое И. 

4а Случай A: Правильное указание 

Первое, отступ: 
Index + Offset = 3 + 2 = 5 

Второе, маска: 
5 AND 0x07 = 5 

Третье, проверка значения: 
[-1 -1 21 31 41 51 61 -1] 
Индекс с отступом: 5 
Value = 51 равно записанному значению, всё хорошо. 

4b Случай B: Манипуляции с указанием 

Если бы у вас сейчас была манипулируемое указание, скажем 7, давайте посмотрим, что произойдет: 

Первое, отступ: 
Index + Offset = 7 + 2 = 9 

Второе, маска: 
9 AND 0x07 = 1 

Третье, проверка значения: 
[-1 -1 21 31 41 51 61 -1] 

Индекс с отступом: 1 
Value = -1 не равно записанному значению, а также указывает на ваш отравленный конец, чтобы вы знали, что вашим косвенным обращением манипулируют. 

5 Индикация предупреждения о неисправности 

Если проверенное значение отличается от вашего зарегистрированного, то вы знаете, что что-то не так. Затем проверьте значение индекса. Если это отравленное значение, вам следует поднять вопрос о качестве программного обеспечения. Это скорее всего указывает на ошибку неучтённое единицы. 

Безопасность

Большинство ПЛК не имеют функций обработки индексов, которые выходят за пределы границ массива. Есть два потенциально опасных сценария: 

Во-первых, если косвенное обращение приводит к чтению из неправильного регистра, программа выполняется с неправильными значениями. 

Во-вторых, если неправильное косвенное обращение приводит к записи в неправильный регистр, программа перезаписывает код или значения, которые вы хотите сохранить. 

В обоих случаях, ошибки косвенного обращения трудно обнаружить, и они могут иметь серьезные последствия. Они возникают по ошибке программиста, но также могут быть вставлены злонамеренно. 

Надёжность

Выявляются непредвиденные человеческие ошибки в программировании. 

От себя

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

Жду ваше мнение и опыт относительно данного пункта в комментариях. Всего будет 20 пунктов из "Top 20 Secure PLC Coding Practices", надеюсь на каждый получить как можно больше комментариев, чтобы составить свой список рекомендаций по программированию для ПЛК.

Безопасность ПЛК: 6,7) Проверяйте таймеры, счётчики и парные входы/выходы

Теги:
Хабы:
Всего голосов 4: ↑4 и ↓0+4
Комментарии15

Публикации

Истории

Работа

Ближайшие события