
Блог о CVE-2026-59827, небезопасная десериализация вывода запросов H2
GHSA-w95f-x9v9-wv36 | CVSS 9.9 Critical | CWE-502: Десериализация недоверенных данных
CVE-2026-59827 — это критическая уязвимость удаленного выполнения кода в Metabase, популярной платформе бизнес-аналитики и аналитики данных с открытым исходным кодом. Проблема связана с тем, как Metabase обрабатывает результаты запросов, возвращаемые через H2-соединение с базой данных. Когда нативный SQL-запрос к источнику H2 возвращает столбец с типом OTHER, Metabase десериализует сырые байты этого столбца в Java-объект без проверки. Таким образом, аутентифицированный пользователь, имеющий возможность выполнять нативные запросы, может внедрить вредоносную сериализованную нагрузку в результирующий набор и вызвать произвольное выполнение кода на сервере, где работает Metabase.
Уязвимости присвоен CVSS-балл 9.9, что отражает минимальные предварительные условия и полное выполнение кода на стороне сервера при успешной эксплуатации.
Metabase выпускает две параллельные редакции из одного цикла релизов. Версии открытого исходного кода используют префикс 0 — например, v0.61.1. Версии корпоративной (коммерческой) редакции используют префикс 1 — например, v1.61.1. Обе редакции имеют общую кодовую базу и выпускаются вместе, поэтому уязвимость, затрагивающая v1.61.0, в равной степени затрагивает v0.61.0. В этой статье номера версий записаны с префиксом 1.xx (корпоративная), но каждая затронутая версия напрямую отображается на версию 0.xx с открытым исходным кодом заменой начальной 1 на 0.
CVE-2026-59826 и CVE-2026-59827 были раскрыты вместе в июле 2026 года. Они имеют пересекающиеся диапазоны версий, но разные точки исправления.
Затронуты корпоративные версии 1.58.0–1.58.14, 1.59.0–1.59.11, 1.60.0–1.60.6.2 и 1.61.0–1.61.1.3. Соответствующие версии с открытым исходным кодом: 0.58.0–0.58.14, 0.59.0–0.59.11, 0.60.0–0.60.6.2 и 0.61.0–0.61.1.3.
Внутренний патч был выпущен как 1.61.1.4 (корпоративная) и 0.61.1.4 (открытая). Первое публично доступное исправленное обновление в линейке 1.61 — это 1.61.2 (v1.61.2.x / v0.61.2.x). Облачные экземпляры Metabase были исправлены автоматически провайдером.
Затронуты корпоративные версии 1.55.0–1.58.15.0, 1.59.0–1.59.11, 1.60.0–1.60.6.2 и 1.61.0–вся линейка 1.61.1.x. Первый полностью исправленный публичный релиз — 1.61.2 (v1.61.2.x / v0.61.2.x). Область CVE-2026-59826 шире, охватывая ветку 1.55, что отражает более давнее присутствие недостаточно проверенного пути кода, связанного с созданием базы данных.
Механизм сериализации Java позволяет преобразовать объект в памяти в плоскую последовательность байтов, сохранить или передать её, а затем восстановить, вызвав ObjectInputStream.readObject(). Критическое свойство этого механизма состоит в том, что при восстановлении выполняется код. Конструкторы классов, переопределения readObject и финализаторы — всё это выполняется во время десериализации. Если читаемые байты поступают из недоверенного источника, злоумышленник может подделать их так, чтобы запустить произвольные вызовы методов через последовательность существующих легитимных классов, уже загруженных в JVM. Такие последовательности называются gadget-цепочками.
Gadget-цепочки не требуют внедрения нового кода в приложение. Они эксплуатируют связи существующих библиотечных классов, нормальные методы которых при вызове в нужном порядке во время десериализации в конечном итоге достигают точки выполнения, такой как Runtime.exec(). Инструменты вроде ysoserial существуют именно для генерации таких нагрузок для широко используемых библиотек, таких как Apache Commons Collections, Spring Framework и других.
H2 — это встраиваемая реляционная база данных на чистой Java. Она определяет специальный тип столбца SQL под названием OTHER, который действует как проходное отверстие для произвольных Java-объектов. Когда H2 сохраняет значение в столбце OTHER, он записывает байты, созданные ObjectOutputStream. При чтении значения он вызывает ObjectInputStream.readObject(), чтобы восстановить объект. Сырые сериализованные байты также можно напрямую передать в запросе, используя шестнадцатеричный синтаксис H2:
SELECT CAST(X'ACED0005...' AS OTHER);
-- или
SELECT X'ACED0005...'::OTHER;
Префикс ACED с последующим 0005 — это магическое число и версия протокола потока сериализации Java. Любая шестнадцатеричная строка, начинающаяся с ACED0005, является потоком сериализованных Java-объектов.
Когда H2 обрабатывает этот запрос, он десериализует шестнадцатеричные байты на стороне базы данных. Полученный объект затем передается обратно вызывающему приложению через JDBC ResultSet. Если приложение проверяет значение столбца — например, для форматирования при выводе, — оно может запустить дополнительную обработку. Именно это и делает Metabase в уязвимом пути кода.
Metabase получает JDBC ResultSet от драйвера H2 и проверяет метаданные столбцов, чтобы решить, как отображать каждое значение пользователю. Когда он встречает столбец с типом JDBC Types.OTHER (также известным как JAVA_OBJECT), уязвимые версии Metabase пытаются десериализовать сырые байты, чтобы получить отображаемое представление. Этот вызов десериализации, ObjectInputStream.readObject(), выполняется без какой-либо фильтрации по белому списку или проверки класса.
Последовательность событий:
OTHER, содержащий сфабрикованную сериализованную нагрузку.JAVA_OBJECT в ResultSet.OTHER и вызывает readObject() для байтов.Runtime.exec() и выполняя команду злоумышленника от имени пользователя ОС, под которым запущен процесс Metabase.Исправленные версии решают проблему путем проверки метаданных результатов JDBC перед попыткой десериализации. Если столбец имеет тип JAVA_OBJECT, Metabase теперь полностью отвергает его, а не пытается разобрать.
Для эксплуатации требуется аутентификация. Злоумышленник должен иметь учетную запись Metabase с разрешением на выполнение нативных запросов к базе данных на основе H2. Учетные записи администратора удовлетворяют этому условию по умолчанию. Обычные пользовательские учетные записи также могут удовлетворять этому требованию, если администратор предоставил им разрешение на данные нативных запросов для соответствующей базы данных.
Metabase удалил поддержку добавления H2 в качестве нового соединения для хранилища данных в версии 0.46.6.4, выпущенной в 2023 году. Попытка зарегистрировать новое H2-соединение через интерфейс администратора возвращает ошибку «H2 не поддерживается как хранилище данных». Это удаление было ответом на более ранние уязвимости H2 и предназначалось для устранения риска подключения к контролируемым злоумышленником экземплярам H2.