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) Проверяйте таймеры, счётчики и парные входы/выходы