АйТи Фреш
Главная / Статьи / Безопасность
Безопасность

Реальный patch level 1С-Битрикс: проверяем каждый модуль

Автор: Семёнов Евгений Сергеевич, директор ООО «АйТи-Фреш» · · ~7 мин чтения
Реальный patch level 1С-Битрикс: проверяем каждый модуль

Вижу знакомую картину: в панели зелёная галка, main выглядит свежим, а отвечающий за сайт администратор всё равно не может сказать, закрыта ли конкретная дыра в fileman, iblock или партнёрском импортере. Я, Семёнов Евгений Сергеевич, директор ООО «АйТи-Фреш», в такой ситуации не принимаю скриншот админки как доказательство. Ниже покажу, как снимаю фактический состав кода, сопоставляю каждую версию с security floor и отделяю реальную угрозу RCE или чтения файлов от общего тревожного шума.

Версия продукта есть, но общего security patch level — нет

Версия main — это версия Главного модуля, а не контрольная сумма всей установки. fileman, iblock, landing, sale, vote и десятки других модулей имеют собственные номера и собственные цепочки обновлений. Партнёрские решения живут ещё в одном контуре. Поэтому мой patch level выглядит не как «26.700.0», а как вектор: main=26.700.0; fileman=26.0.0; iblock=26.0.0; landing=26.1100.0; vendor.module=1.2.3. К этому вектору обязательно добавляются путь к реально загружаемому коду и результат проверки целостности.

Зелёный результат свежей проверки SiteUpdate полезен, но его область надо читать буквально: сервер обновлений не предложил платформенные обновления для текущего ключа, канала, редакции, зависимостей и, если включён, экспертного ограничения. Это хороший сигнал. Это не аттестация всех файлов сайта и не заключение по стороннему коду. Страница «Marketplace → Обновление решений» отдельная; срок поддержки платного решения тоже может закончиться отдельно, а само решение продолжит работать без права получить новый патч.

На 5 сентября 2026 года верхними записями официальной истории указаны main 26.700.0 и fileman 26.0.0. Я привожу их только как снимок даты статьи, не как вечные константы: завтра target может измениться, а конкретной редакции обновление может приходить другой цепочкой. Для безопасности важнее два числа по каждому модулю: установленная версия и минимальная исправленная версия из бюллетеня. Последнюю стабильную версию всё равно ставлю, но решение об аварийности принимаю по security floor и условиям эксплуатации уязвимости.

Я не объявляю сайт уязвимым только потому, что модуль не самый новый. Сначала нахожу бюллетень, границу исправления и необходимые права атакующего. Но версия ниже опубликованного security floor — уже факт, который нельзя закрасить зелёной иконкой.

Снимаем версии из рантайма и с диска

Первый слой — то, что считает установленным сам Bitrix Framework. Начать можно со страницы /bitrix/admin/module_admin.php, но для воспроизводимого отчёта я беру API. В таблице b_module хранится реестр ID, но не надёжный каталог версий: ModuleManager получает список установленных модулей, а getVersion() читает версию с диска. Для main это константа SM_VERSION из /bitrix/modules/main/classes/general/version.php; для остальных — массив VERSION в modules/<id>/install/version.php, причём стандартный поиск учитывает /local. Поэтому SQL вида SELECT ID FROM b_module нужен для флага installed, но искать там patch level бессмысленно.

На штатно работающем узле я запускаю короткую PHP-инвентаризацию от пользователя PHP-FPM. Она загружает пролог сайта, перебирает ModuleManager::getInstalledModules() и для каждого ID печатает ModuleManager::getVersion($id). DOCUMENT_ROOT подставляйте свой. Скрипт не оставляю в webroot: либо php -r, либо закрытый каталог администрирования. На хосте с признаками компрометации пролог не запускаю вообще — неизвестный init.php или автозагрузчик может выполнить чужой код; сначала делаю образ и разбираю файлы офлайн.

Второй слой — всё, что лежит в /bitrix/modules и /local/modules, включая незарегистрированные и забытые каталоги. Это принципиально. /local имеет приоритет при поиске файлов, поэтому старая копия с тем же ID способна затенить обновлённую. Кроме того, решение могло скопировать компоненты, ajax-обработчики или публичные файлы за пределы своего каталога. Я отдельно сравниваю оба дерева, список b_module и фактические HTTP-маршруты; слово «удалён» в интерфейсе без проверки диска меня не успокаивает.

Никогда не «лечите» отставание ручной правкой VERSION или SM_VERSION. Вы измените этикетку, а уязвимый код и непройденные миграции останутся на месте; следующая цепочка обновлений станет ещё менее предсказуемой.
Реальный patch level 1С-Битрикс: проверяем каждый модуль — схема

Сверяем не с ощущением свежести, а с бюллетенями

Для модулей платформы мой первичный источник — Центр информирования 1С-Битрикс, затем карточка уязвимости и история конкретного модуля. Примеры хорошо показывают, почему main нельзя использовать как прокси для всего сайта. В апреле 2026 года доступ к сведениям о почтовых настройках был исправлен в main 26.150.100. LFI при редактировании лендинга исправили в landing 25.1100.100. Три проблемы импорта и свойств инфоблока, включая чтение произвольных файлов, закрыты в iblock 24.300.100. А возможность пользователя с ограниченными правами копировать произвольные файлы через менеджер файлов исправлена в fileman 24.500.100. Это четыре независимые строки матрицы.

Исторический пример с понятным ущербом — CVE-2022-27228 в vote: 1С-Битрикс указывает исправление 21.0.100 и оценку 9.8. Произвольная запись файла при подходящей конфигурации могла стать выполнением PHP-кода. Но я не переношу этот ярлык на любую LFI и не обещаю, что версия сама отвечает на вопрос об эксплуатации. Иногда нужны права редактора или администратора, иногда опасный маршрут доступен без авторизации; это берётся только из карточки и модели доступа конкретного проекта.

Для Marketplace есть отдельный официальный реестр сторонних решений. На дату статьи в нём 42 записи. Например, «Универсальный импорт» АКРИТ отмечен как уязвимый до 1.79.0, INTEC core — до 1.2.30. Разработчик первого решения поясняет, что 1.79.0 добавляет проверку прав и sessid, защищает HTTP-воркеры токеном, ограничивает загрузку URL от SSRF и убирает выполнение пользовательской PHP-формулы; возможные последствия включали загрузку файлов, доступ к данным и несанкционированное выполнение кода. Вот это уже основание для срочного действия, а не догадка по цвету панели.

Отсутствие решения в реестре не означает доказанную безопасность. Реестр содержит известные и опубликованные случаи, а не полный SBOM-аудит всего Маркетплейса.

Стенд «ООО Вектор»: зелёный main и пять разных рисков

Покажу составной стенд, который я собирал руками по мотивам нескольких однотипных аудитов. «ООО Вектор» — условное название, это не раскрытый клиент и не заявление об инциденте конкретной компании. Конфигурация: интернет-магазин с примерно 80 тысячами сессий в сутки, 8 vCPU, 16 ГБ RAM, 120 ГБ SSD, Debian 12, nginx 1.22 перед Apache 2.4, PHP 8.2, MariaDB 10.11 и Redis 7. На диске было 67 каталогов модулей, в b_module — 58 ID, партнёрских решений — 14. Предыдущий подрядчик обновлял выборочно через экспертный режим, потому что боялся сломать шаблон.

На главной панели всё выглядело прилично: main 26.700.0, высокий уровень проактивной защиты, зелёный виджет. Полная таблица показала другое: fileman 22.200.100, landing 25.1100.0, iblock 24.200.0 и acrit.import 1.74.650. Все четыре были ниже опубликованных границ: fileman 24.500.100, landing 25.1100.100, iblock 24.300.100 и acrit.import 1.79.0. Ещё девять каталогов не числились установленными; три содержали PHP-обработчики, а один и тот же ID лежал и в /bitrix/modules, и в /local/modules. Сам этот факт не доказывал RCE, но доказал, что прежний отчёт о patch level был неполным.

Я заморозил изменения каталога на время согласованного снимка, восстановил БД и webroot на изолированном клоне и сначала обновил систему обновлений и весь согласованный набор платформенных зависимостей. После этого довёл fileman до 26.0.0, landing до 26.1100.0, iblock до 26.0.0, а acrit.import — до доступной тогда 1.80.300. Каждый переход прогнали на 27 проверках: вход администратора, поиск, карточка товара, корзина, заказ, оплата в тестовом контуре, обмен с 1С, импорт CSV/XML, агенты и cron. Дубликат из /local оказался старой ручной копией; после diff и проверки зависимостей мы вывели его из пути загрузки, а три неиспользуемых обработчика удалили из развёртывания с сохранением архива вне webroot.

Тестовый прогон занял 2 часа 18 минут, производственное окно — 34 минуты, режим обслуживания понадобился на 11 минут. Затем я сравнил файлы с чистыми пакетами, запустил штатные проверки, проверил новые и изменённые PHP-файлы и просмотрел 90 дней access/error-логов, задания cron, активные агенты и административные входы. Признаков компрометации не нашли — и это важный честный итог: старая версия означает риск, но не автоматически взлом. На выходе у «Вектора» появился подписанный JSON-снимок из 67 строк, ноль версий ниже известных security floor и еженедельная отдельная проверка Marketplace.

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

Версия совпала — теперь докажите, что совпадает код

Файл install/version.php — метка, а не криптографическое доказательство. Обновление партнёрского модуля копирует его ядро, но изменения БД, компонентов и публичных файлов зависят от updater.php разработчика. Официальная документация прямо предупреждает: прочие части сайта автоматически не обновляются, их должен привести в соответствие апдейтер. Из практики здесь ломается чаще всего: когда-то компонент скопировали в шаблон, потом исправили модуль, а рабочий ajax.php остался старым.

После патча я запускаю проверку модификаций ядра, а для всего дерева делаю собственный хеш-манифест и diff с заведомо чистой сборкой. Штатный «Контроль целостности» полезен только при хорошем исходном снимке: если эталон создан после заражения, он честно подтвердит неизменность уже заражённых файлов. Сканер безопасности и поиск троянов тоже нужны, но у них бывают ложные срабатывания и пропуски. Это датчики, не нотариус. Для партнёрского кода прошу пакет у разработчика или сверяю с чистой установкой той же версии на изолированном стенде.

Если нашлись неизвестные PHP-файлы, подозрительные агенты или обращения к опасным маршрутам, обычное обновление прекращает быть задачей сопровождения и становится реагированием на инцидент. Я изолирую узел, сохраняю образ и логи, определяю первое проникновение, восстанавливаю из доверенной точки, меняю пароли и ключи, проверяю cron, systemd, SSH authorized_keys, БД и соседние хосты. Патч закрывает вход, но не выселяет уже созданный web-shell.

Не запускайте публичный exploit «для проверки» на боевом сайте. Для подтверждения достаточно версии, целостности, конфигурационных предпосылок и безопасного теста на изолированной копии.

Регламент, который я оставляю администратору

Мой рабочий вариант простой: ежедневный read-only снимок ID, путей, версий и хешей исполняемого кода и конфигурации; еженедельная онлайн-проверка двух разделов обновлений и двух реестров уязвимостей; ежемесячное окно установки стабильных обновлений через staging. Для main 24.400.0 и новее при настроенном Composer доступна официальная CLI-команда из каталога /bitrix: php bitrix.php update:modules, в том числе с -m для списка платформенных модулей. Сначала смотрю php bitrix.php help update:modules: универсальный --dry-run документация не обещает. Команда показывает изменения и запрашивает подтверждение. Я не подаю ей yes вслепую и не обещаю через неё обновление партнёрских решений: для Marketplace документирован отдельный интерфейс «Обновление решений».

В первую очередь оплачивайте доступ к security-обновлениям, убирайте заброшенные интернет-доступные решения и закрывайте версии ниже опубликованных границ. На что можно временно забить: косметический changelog, beta-функции и модуль, которого нет ни в b_module, ни на диске, ни в скопированных компонентах, маршрутах, агентах и cron. Но это должно быть проверенное отсутствие, а не «кажется, мы им не пользуемся». WAF, запрет PHP в upload и IP-фильтр админки снижают риск на время окна, однако не заменяют исправленный код.

Наконец, храните снимок как артефакт, а не как таблицу в голове: дата проверки сервера обновлений, канал stable/beta, режим expert, срок лицензии, ссылка на бюллетень, версия до и после, хеш отчёта, номер резервной копии и результат восстановления. Тогда на вопрос руководителя «мы закрыли вот эту RCE?» вы отвечаете строкой с доказательствами. Если остаётся unknown, так и пишите unknown. Это профессиональнее зелёной галки и намного полезнее при реальном инциденте.

Критерий готовности у меня один: для каждой исполняемой сущности известны владелец, эффективный путь, версия, security floor, целостность и exposure. Пустая ячейка означает незавершённый аудит.

Частые вопросы

Можно ли считать версию main общей версией 1С-Битрикс?

Нет. Это версия Главного модуля и удобный ориентир совместимости. Security patch level всей установки — набор версий всех исполняемых модулей и решений плюс подтверждение эффективного пути и целостности файлов.

Достаточно открыть «Обновление платформы» и «Обновление решений»?

Для быстрой проверки — да, начать нужно там. Для доказуемого аудита — нет: добавьте выгрузку ModuleManager, обход /bitrix/modules и /local/modules, поиск дублей и сирот, два реестра уязвимостей и проверку фактически развёрнутых файлов.

Если модуль не установлен, его каталог можно игнорировать?

Не автоматически. Проверьте, не остались ли публичные обработчики, скопированные компоненты, cron и агенты. Если зависимостей нет, я предпочитаю удалить неиспользуемый код из развёртывания после резервной копии, а не хранить его в webroot.

Что делать, если патч Marketplace не предлагается?

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

Обновление гарантирует, что сайт не был взломан?

Нет. Оно закрывает известный путь эксплуатации в новой версии. Если уязвимый код был доступен раньше, отдельно проверьте логи, файлы, агентов, задания ОС и учётные данные; при индикаторах компрометации действуйте по процедуре incident response.

Проверим Битрикс по модулям
Если хотите получить не скриншот с зелёной галкой, а доказуемую матрицу patch level, я с командой «АйТи-Фреш» соберу инвентарь, сопоставлю его с бюллетенями и проверю целостность на изолированной копии. Вернём отчёт с приоритетами, планом безопасного обновления и отдельным перечнем того, что можно удалить или отложить.
Бесплатная консультация →
© ООО «АйТи-Фреш» · Москва · Все статьи