WP Cerber Security 9.9
English version: WP Cerber Security 9.9
Краткий обзор
Вышла WP Cerber 9.9, и этот релиз посвящен повышению отказоустойчивости. Мы внедрили механизм самовосстановления для настроек плагинов, устранили несколько уязвимостей в обфусцированном JavaScript-детекторе Traffic Inspector и исправили класс критических ошибок, которые могли привести к сбою сайта в некоторых средах хостинга. Если вы используете WP Cerber на активно посещаемом сайте или на устаревшем хостинге, это обновление значительно повысит надежность вашей установки.
Основные моменты
- Новое: Автоматическое резервное копирование и восстановление настроек плагина с четким отчетом о завершении восстановления.
- Безопасность: Многократное усиление защиты обфусцированного JavaScript-детектора, используемого Traffic Inspector, что позволяет исключить реальные пути обхода защиты.
- Надежность: WP Cerber теперь корректно работает в устаревших средах хостинга, где PHP не поддерживает современный драйвер базы данных mysqlnd.
- Исправлены ошибки: исправлена ошибка, приводившая к сбою сайта и повреждению настроек в PHP 8, а также регрессия в обнаружении JavaScript-кода, экранированного в шестнадцатеричном формате.
Новые функции
Автоматическое резервное копирование и восстановление настроек плагина
Это главная особенность релиза. Теперь WP Cerber хранит последнюю известную действительную копию своей конфигурации в хранилище типа «ключ-значение» плагина. Резервная копия обновляется после каждого успешного обновления настроек, импорта настроек, обновления плагина, а также в рамках ежедневной задачи обслуживания. Заменить существующую резервную копию могут только действительные конфигурации, поэтому некорректное состояние никогда не сможет перезаписать корректное.
Почему это важно? Если сохраненная в базе данных конфигурация плагина станет нечитаемой, WP Cerber обнаружит повреждение и автоматически восстановит конфигурацию из резервной копии. Вы сохраните правила брандмауэра, списки доступа и настройки уведомлений, вместо того чтобы незаметно возвращаться к заводским настройкам по умолчанию.
Процесс восстановления полностью прозрачен. О каждом результате сообщается через монитор проблем плагина:
- После успешного автоматического восстановления вы увидите закрываемое предупреждение, объясняющее, что произошло, какие действия были предприняты и что вам следует проверить. Уведомление исчезнет после того, как вы проверите и сохраните свои настройки.
- Если резервная копия отсутствует, недействительна или восстановление не удается, регистрируется критическая проблема с рекомендациями по ее устранению и соответствующими диагностическими метаданными, без раскрытия настроек сериализованных файлов или внутренних механизмов хранилища.
- Предотвращается появление противоречивых или дублирующихся сообщений, поэтому вы никогда не увидите конфликтующих уведомлений.
Если восстановление невозможно, сохраняется существующий резервный вариант по умолчанию, и эти настройки по умолчанию теперь сохраняются в базе данных, так что плагин запускается из детерминированного состояния. Мы также усилили защиту пути восстановления от устаревших кэшей параметров: поврежденное значение явно удаляется перед записью восстановленного значения, а резервная копия сохраняется и загружается в обход кэша объектов, поэтому доверяется только надежной записи в базе данных.
Предупреждение для хостов без драйвера mysqlnd
В виджете «Готовность системы» появилось новое предупреждение, указывающее на серверы, где расширение mysqli для PHP собрано с использованием устаревшей библиотеки libmysqlclient вместо современной mysqlnd. Это информационное сообщение подтверждает, что WP Cerber продолжает работать с совместимым резервным вариантом и рекомендует включить mysqlnd для полной совместимости и повышения производительности. Это дает вам конкретную, действенную диагностическую информацию, которую вы можете предоставить своему хостинг-провайдеру.
Изменения в системе безопасности и контроля доступа.
Усиленное обнаружение обфусцированного JavaScript в инспекторе трафика.
Инспектор трафика проверяет общедоступные поля запросов на наличие обфусцированного JavaScript, и в этом релизе устранены несколько пробелов в покрытии и векторов обхода в этом детекторе, при этом сохранена его модель с низким уровнем ложных срабатываний.
Расширен охват экранирующих последовательностей. Ранее детектор распознавал только шестнадцатеричные экранирующие последовательности \xNN в полностью экранированных строках. Теперь он также обнаруживает экранирующие последовательности Unicode \uNNNN и \u{...} , включая строки, в которых смешиваются поддерживаемые форматы. Декодирование ограничено кодовыми точками ASCII, а частичные экранирующие последовательности и произвольные выражения намеренно остаются вне области видимости, чтобы избежать ложных срабатываний.
Обнаружение примитивов, скрытых в вызовах fromCharCode(). Теперь полезные нагрузки, декодированные из явных конструкций String.fromCharCode() , проверяются на наличие примитивов выполнения, DOM, сети и системы, а не только внешних URL-адресов и IP-адресов. Декодирование ограничено проверенными десятичными и шестнадцатеричными литералами, поддерживает множественные вызовы, префиксы 0X в верхнем регистре и необязательные завершающие запятые, а также применяет семантику JavaScript ToUint16, так что декодированные значения соответствуют тому, что фактически отобразил бы браузер. Сопоставление примитивов с учетом токенов и границ идентификаторов означает, что обычные слова, такие как «description» и «evaluation», больше не сопоставляются с подстроками eval или script .
Предотвращение обхода защиты от переполнения целых чисел. String.fromCharCode() применяет ToUint16 к каждому аргументу, поэтому код ASCII плюс число, кратное 65536, дает один и тот же символ. Ранее детектор принимал только литералы до шести цифр, что означало, что переполненные значения из семи и более цифр полностью обходили обнаружение. Теперь детектор принимает беззнаковые десятичные и шестнадцатеричные литералы до Number.MAX_SAFE_INTEGER в JavaScript и детерминированно сокращает каждый токен до его кодовой единицы ToUint16, независимо от размера целого числа на платформе. Длина токена ограничена во время преобразования, поэтому слишком большой литерал не может приводить к неограниченной обработке каждой цифры в публичном запросе, что исключает потенциальный вектор DoS-атаки.
Отсутствует подавление с помощью одного некорректного токена. Ранее один недопустимый или неоднозначный токен приводил к потере всего декодированного вызова, поэтому злоумышленник мог добавить одно неподдерживаемое значение к и без того обнаруживаемой полезной нагрузке и подавить обнаружение. Теперь структурно корректный, но неподдерживаемый токен сопоставляется с сигнальным символом, а остальная часть вызова по-прежнему декодируется. Весь вызов пропускается только в том случае, если список аргументов имеет некорректный формат или не является числовым.
Разделённые комментариями полезные данные больше не являются слепой зоной. В процессе сжатия входных данных детектор удалял только общие пробелы, оставляя комментарии JavaScript нетронутыми и позволяя разделённым комментариями числовым аргументам, таким как String.fromCharCode(101,/*x*/118,97,108,40,49,41,59) , обходить обнаружение. Теперь детектор удаляет блочные комментарии JS, строковые комментарии и лексические пробелы вне строк в кавычках перед запуском эвристических алгоритмов, а также обрабатывает списки аргументов, занимающие несколько строк.
Для владельца сайта на WordPress практический результат очевиден: несколько реалистичных методов, которые злоумышленник мог бы использовать для внедрения обфусцированного JavaScript в обход Traffic Inspector, больше не работают, и детектор остается достаточно консервативным, чтобы не помечать легитимный трафик как подозрительный.
Улучшение надежности
Совместимость с устаревшими драйверами баз данных.
WP Cerber теперь корректно работает в средах хостинга, где PHP не предоставляет современный драйвер базы данных mysqlnd. Уровень базы данных проверяет доступность функции mysqli_fetch_all() перед тем, как использовать быстрый путь mysqlnd. Если она недоступна, наборы результатов извлекаются построчно с помощью совместимого метода, сохраняя порядок строк, форму результатов и существующий контракт обработки ошибок. Вместо фатальной ошибки вы получаете более медленный, но полностью функциональный резервный вариант, а также предупреждение, описанное выше.
Исправлены ошибки
Критическая ошибка на сайтах с поврежденными настройками (PHP 8)
Поврежденное, не подлежащее десериализации значение конфигурации в базе данных вызвало фатальную ошибку TypeError в функции array_merge() во время загрузки плагина в PHP 8, что привело к сбою всего сайта. Теперь при загрузке настроек проверяется сохраненное значение, и в случае невозможности его анализа возвращается к настройкам по умолчанию. Сбой регистрируется как постоянная критическая проблема и автоматически устраняется при повторном сохранении настроек администратором. Проблема повреждения возникает только тогда, когда непустое сохраненное значение действительно не удается десериализовать, поэтому пустое значение, которое просто означает, что настройки еще не существуют, никогда не вызывает ложной тревоги. В сочетании с новой функцией резервного копирования и восстановления это превращает сценарий сбоя сайта в сценарий самовосстановления.
Критическая ошибка на хостах без mysqlnd
Слой базы данных вызвал функцию mysqli_result::fetch_all() , которая требует наличия драйвера mysqlnd и отсутствует на хостах, работающих с mysqli и libmysqlclient, что привело к фатальной ошибке. Быстрый путь теперь защищен и переключается на построчную выборку, как описано в разделе надежности выше.
Регрессия в обнаружении экранированного в шестнадцатеричном формате JavaScript
В обфусцированном детекторе JavaScript произошла ошибка, из-за которой строки, состоящие исключительно из последовательностей \xNN не декодировались. На этапе нормализации использовалась trim() с маской символов, которая удаляла начальную обратную косую черту первого экранирующего символа вместе с открывающей кавычкой, в результате чего получалась строка нечетной длины, которую затем пропускал механизм декодирования. В результате шестнадцатерично экранированные примитивы, такие как eval , script и XMLHttpRequest , оставались необнаруженными в пути поля запроса Traffic Inspector, включенном по умолчанию. Теперь декодирование работает корректно, восстанавливая обнаружение этих обфусцированных примитивов.
Обход с помощью аргументов, отделенных от кода символов (Comment-Separated fromCharCode Arguments).
Допустимые числовые аргументы, разделенные комментариями, в вызовах функции fromCharCode() обходили проверку, поскольку комментарии JavaScript оставались нетронутыми во время сжатия входных данных. Эта проблема исправлена, как описано в разделе безопасности выше.
Краткое содержание
Версия 9.9 — это релиз, который, будем надеяться, вы никогда не заметите, и в этом вся суть. Ваши настройки теперь сохраняются после повреждения базы данных, а не исчезают. Особенность среды хостинга, которая раньше приводила к сбоям плагина, теперь корректно реагирует и точно указывает, что нужно попросить вашего хостинг-провайдера исправить. Для администратора повседневная работа — это та же самая знакомая панель управления, работающая на основе, которая самостоятельно восстанавливается после сбоев и проверяет вредоносный трафик с меньшим количеством «слепых зон».