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

Счётчики и таймеры написанные для программ ПЛК должны быть проверены на корректность, в том числе на обработку обратных отсчётов и значений меньше нуля.

Описание

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

Если удаленные средства, такие как HMI, записывают значения в таймер или счетчик, то:

  • нельзя позволять HMI напрямую писать в таймер или счетчик, а только после прохождения проверки

  • нужно проверить предустановки и значения тайм-аута в ПЛК

Проверка уставок для таймеров и счетчиков легко выполняется непосредственно в ПЛК, поскольку ПЛК “знает” состояние процесса и контекста. Он может проверять, “что” и “когда” он получает.

Пример

Во время запуска ПЛК -- таймерам и счетчикам обычно задаются определённые уставки.

Если есть таймер, который запускает сигнал тревоги через 1.3 секунды, но этот таймер злонамеренно настроен на 5 минут, то сигнал тревоги может не сработать.

Если есть счетчик, который заставляет процесс останавливаться, когда он достигает 10 000, но он установлен на 11 000 во время запуска, то процесс может не остановиться.

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

Если ввод/вывод, таймеры или предустановки записываются непосредственно и не проверяются (уровень проверки ПЛК игнорируется), то HMI (или другие сетевые устройства) получает необоснованный уровень доверия.

Надёжность

ПЛК может контролировать, когда оператор случайно устанавливает неверные значения таймера или счетчика.

Поддержка

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

7) Проверяйте и предупреждайте парные входы/выходы 

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

Описание

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

Валидацию проще всего выполнить непосредственно в ПЛК, потому что он знает о состоянии процесса и контексте. Парные сигналы легче распознать и отследить, если они имеют последовательные адреса (например, вход 1 и вход 2).

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

Пример

Примеры парных сигналов:

  • ПУСК и СТОП

    • Независимый пуск и стоп: настройте пуск и стоп как дискретные выходы вместо того, чтобы иметь один выход, который можно включать / выключать. По своей конструкции это не допускает одновременных срабатываний. Для злоумышленника гораздо сложнее быстро включать/выключать, если нужно установить два разных выхода.

    • Таймер для перезапуска: также рассмотрите возможность добавления таймера для перезапуска после подачи сигнала об остановке, чтобы избежать быстрого переключения сигналов пуск и стоп.

  • ВПЕРЁД и НАЗАД

  • ОТКРЫТЬ и ЗАКРЫТЬ

Примеры переключения парных сигналов, которые могут быть опасными:

Если ПЛК принимает дискретный вход, это дает злоумышленнику простой вариант нанести физический ущерб исполнительным элементам. Быстрое переключение выходов может вызвать реальный ущерб. Проведённый Национальной лабораторией Айдахо Aurora Generator Test в 2007 году продемонстрировал, что переключение выходов вне синхронизации приводит к повреждению автоматического выключателя.

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

  1. Если программы ПЛК не учитывают вариант, когда оба парных входных сигнала будут поданы одновременно, то это хороший вариант для атаки.

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

  3. Это позволяет избежать сценария атаки, при котором приводы могут быть повреждены.

Надёжность

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

  2. Быстрое переключение пуск и стоп может произойти по ошибке, поэтому это также предотвращает случайные повреждения.

От себя

Блокировки (Interlocks)

Многие устройства для предотвращения несчастных случаев имеют специальные входы - интерлоки. В основном это сухие контакты или дискретные входы (5, 12 или 24 В), которые необходимо замкнуть или подать напряжение для разрешения работы устройства.

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

Рекомендую использовать небольшую задержку(500 мс) между включением-выключением интерлоков и других управляющих сигналов.

Что хочу

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

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

Безопасность ПЛК: 4,5) Используйте переменные-флаги, хеши и контрольные суммы для проверки целостности проекта

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

Комментарии (2)


  1. madshizofrenik
    01.11.2021 13:08

    Мне кажется можно рассмотреть еще одну ситуацию, опишу вкратце:

    HMI - Сигнал ON (INT).

    Через ФБ перекладывается в PLC - Сигнал ON (BOOL).

    Поле - DO1 (ON), DO2 (OFF).

    Перекладка выглядит так: DO1 := ON, DO2 := NOT ON.

    Собственно риск при перезагрузке ПЛК, после инициализации переменных в DO1 по умолчанию кинуть "0", соответственно в DO2 упадет "1". И выключится то, что должно быть включено. Тут думаю надо при инициализации как минимум проверять на текущее состояние объекта.


    1. Owal_Owl
      01.11.2021 14:25
      +1

      Зачем на HMI кидать регистр (int) если можно отделаться bool? Чем меньше у вас возможностей что-то сломать - тем лучше!
      Передавать в HMI регистр и потом вытаскивать с него биты - худшее решение что только можно придумать в малых системах.
      Состояние, аварии, предупреждения. Но контроль кидать в регистр - моветон. Хотя все управление ПЧ завязано именно на этом.

      То что вы описали - явный пример OR\XOR.
      По сути у вас любой цикл в ПЛК начинается с проверки текущего состояния I\O, после чего начинается цикл. (На любом ПЛК)
      Если же у вас есть риск аварийного отключения без возможности контроля при перезапуске (что тоже странно, см. пункт выше), то тогда есть смысл дополнительно делать контроль состояния. Но по большому счету вы дублируете уже ранее созданную логику.
      Просто примите за данность что 1 - это 1, достаточно сделать простейшую обработку и он точно никогда лишний раз не включит никакой DO AO без вашего ведома.

      По сабжу: странно все это. Вроде прописные истины, но segnetics так любит делать кнопку пуск/стоп через Д-триггер и потом мучайся, лови эту единицу по фронту.