8) Проверяйте таймеры и счётчики
Доступ к переменным ПЛК должен быть ограничен. Значение с HMI, вышедшее за допустимые пределы, должно быть корректно обработано или оператор должен получить об этом сообщение.
Описание
Входная проверка должна включать в себя проверку на допустимый рабочий диапазон.
Если переменная ПЛК получает значение, выходящее за границы, реализуйте следующую логику:
введите значение по умолчанию для этой переменной, которое не оказывает отрицательного воздействия на процесс и может использоваться как флаг для предупреждений
введите последнее правильное значение для этого значения и зарегистрируйте событие для дальнейшего анализа.
Примеры
Пример 1
Операция требует, чтобы пользователь ввел значение давления клапана на HMI. Допустимый диапазон для этого значения 0-100, и ввод пользователя на HMI передаётся к переменной V1 в ПЛК. В этом случае:
Вход HMI в переменную V1 имеет ограниченный диапазон от 0 до 100 (десятичный), запрограммированный в HMI.
В ПЛК есть проверка:
IF V1 < 0 OR IF V1 > 100, SET V1 = 0.
Это обеспечит корректный ответ на недопустимый ввод этой переменной.
Пример 2
Операция требует ввода пользователем пороговых значений измерения для переменной, которая всегда должна быть в диапазоне типа INT2. Пользовательский ввод передается из HMI в переменную V2 в ПЛК, которая представляет собой 16-битный регистр.
Вход HMI в переменную V2 имеет ограниченный диапазон от -32768 до 32767 (десятичный), запрограммированный в HMI.
ПЛК имеет проверку типов данных, которая устанавливает переменную переполнения (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
Контролируйте параметры и значения для ПИД-регуляторов для устранения ошибок масштабирования и конвертации величин, вызывающих проблемы управления. Неправильная установка значений может привести к нежелательным последствиям.
Безопасность
Хотя HMI обычно обеспечивают некоторую проверку ввода, злоумышленник всегда может создавать и воспроизводить модифицированные пакеты для отправки произвольных значений переменных в те ПЛК, которые открыты для внешнего воздействия.
Протоколы ПЛК обычно подаются как "открытые" протоколы и опубликованы для широкой публики, поэтому создание вредоносных программ, использующих "открытую" информацию протокола не является сложной задачей. Определение размещения переменных ПЛК обычно происходит посредством анализа трафика во время разведывательных фаз атаки, обеспечивая тем самым злоумышленника необходимой информацией для создания вредоносных пакетов к ПЛК и тем самым манипулировать процессом с помощью неавторизованных инструментов. Проверка значений, переданных в ПЛК перед внедрением этих данных в процесс гарантирует соблюдение диапазонов значений и устраняет недопустимые значения путем принудительной установки безопасных значений.
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) Проверяйте таймеры, счётчики и парные входы/выходы
Комментарии (15)
kozlyuk
04.11.2021 13:10+2Логика "если пришел некорректный запрос, попытайтесь сделать хоть что-нибудь" граничит с вредными советами на мой прикладной взгляд. Есть какая-то особенность ПЛК, что при некорректной команде нельзя просто ничего не делать с переменными и объектом управления?
petro_64
05.11.2021 10:56+1Принимать давление клапана за 0 если что-то не понравилось в вводе без предупреждений выглядит не очень безопасно для системы в целом, так и взорваться недолго. Почему не выводить вменяемую осмысленную ошибку и не прерывать работу в случае ввода некорректного значения?
Zalechi
Что такое ПЛК, ПИД и HMI?
Serge78rus
ПЛК — программируемый логический контроллер
ПИД — пропорционально-интегрирующий-дифференциирующий регулятор
HMI — человеко-машинный интерфейс
Зачем Вы беретесь читать техническую статью в достаточно специфической области, причем ориентированную отнюдь не на самых начинающих, если даже не удосужились ознакомиться с элементарной терминологией в этой области?
Zalechi
То есть по Вашему, когда я листаю feed хабра, я должен делать предельный выбор/отдавать себе отчет перед нажатием кнопки "читать"?
В таком случае я 99% статей на хабре не пойму, однако реальность состоит в том, что я открываю 99% статей и понимаю их содержание, ибо авторы описывают термины аббревиатуры или ссылаются на статьи в которых онное обозначено.
Serge78rus
Авторы описывают термины и аббревиатуры, если они не относятся к общепринятым. Здесь же Вы задались вопросами по общепринятым базовым терминам. Ведь читая статью, например по C++, Вы не будете задавать вопросы что такое класс, функция и т.д., если конечно это статья уж не совсем для начинающих.
Zalechi
В том то и дело, что класс и функция это интуитивно понятные вещи, тем более для айтишника. И даже в продвинутых статьях, первое появление аббревиатуры описывается за скобками.
Поймите - это не удоьно читать, ибо я впервые сталкиваюсь с темой, в каждом предложении должен открывать соседнюю вкладку.
То есть это очень ОЧЕНЬ узкоспециализированный материал получается, ну тогда бы поставили это уточнение в плашку в начале статьи.
Ладно короче. Дело ваше
Serge78rus
Вот у Вас в профиле написано «Network engineer». Вы в любой статье по безопасности сетей будете ожидать расшифровки терминов ICMP, TCP, UDP и т.д.?
Zalechi
Вам примеры скинуть, как люди пишут? Они пишут: .. отправка данных осуществляется протоколом ТЦП, который ведет контроль доставки сообещений следующими методамм...
Вот пример о протоколе, который мне не был знаком: https://habr.com/ru/company/southbridge/blog/575464/
Error1024
Ну да, ведь лучше чтобы на Хабре было 100500 статей, про «hello world» и «как войти в айти», от продажников курсов, там все разжёвывается.
Zalechi
Лучше оформлять статьи в соответствии с рекомендациями на соответствующей странице для Авторов Хабра.
Efi-fi Автор
Все аббревиатуры легко гуглятся, поэтому не вижу смысла приводить расшифровку, кроме того их понимание -- основа в области промышленной автоматизации.Также это серия публикаций и если читать от начала, то таких вопросов у вас будет меньше.
Очень рад, что вы решились прочитать данную статью. Для полного понимания статьи потребуется опыт программирования ПЛК, так ка это "достаточно специфическая область".
Zalechi
В том то и дело, что вы не ведете ссылки на серию публикаций, как принято на Хабре. Ведь вы это не для себя делайте, а для читателя.
Делайте как знайте.
Efi-fi Автор
В конце каждой публикации ссылки предыдущую и следующую (когда выходит - добавляю).
Zalechi
Послушайте, Вы не должны мне отчитываться. Может я какой-то не такой, и мне не стоило залетать в статью, но я просто описал вам свои ощущения.