MySQL Community Server 26.7.0 — высокий — INSTALL COMPONENT с квалифицированной схемой — обход plugin_dir
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-install-component-scheme
Класс: RCE Доступ: Удалённый
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
Стандартный file:// INSTALL COMPONENT оборачивается mysql_server_path_filter и принудительно помещается в plugin_dir. Нефильтрованный загрузчик libminchassis остаётся зарегистрированным как dynamic_loader_scheme_file.mysql_minimal_chassis. URN-схема file.mysql_minimal_chassis получает эту реализацию и выполняет dlopen абсолютного пути от имени UID mysqld. INSTALL PLUGIN / CREATE FUNCTION SONAME по-прежнему отклоняют /. Требуется INSERT в mysql.component (PR:H).
Лаборатория копирует стандартный component_query_attributes.so в /tmp/MYSQL-INSTALL-COMPONENT-SCHEME-WITNESS.so. Без пользовательского компонента.
| Поле | Значение |
|---|---|
| ID | CVE пока нет |
| Класс | RCE (компонент dlopen от имени mysqld; PR:H; лаборатория загрузила стандартный .so) |
| Доступ | Удалённый (аутентифицированный SQL; INSTALL COMPONENT / PR:H) |
| CWE | CWE-427 |
| CVSS | High: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| Продукт | MySQL Community Server mysqld |
| Затронуто | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Аутентификация | INSTALL COMPONENT (INSERT в mysql.component) |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | Только 127.0.0.1. Стандартный неиспользуемый компонент скопирован за пределы plugin_dir. |
Иметь права INSTALL COMPONENT. Разместить компонент .so за пределами plugin_dir (FILE DUMPFILE при secure_file_priv или локальная запись). INSTALL COMPONENT 'file.mysql_minimal_chassis:///abs/name' (без суффикса .so; загрузчик добавляет его). dlopen от имени UID mysqld. Тот же URN сохраняется в mysql.component и перезагружается при перезапуске.
file:///abs/name отклоняется (3529). INSTALL PLUGIN ... SONAME '/abs/...' отклоняется (1124). Квалифицированная схема — это остаток.
Та же охота на 26.7.0. set_default("dynamic_loader_scheme_file.mysql_server_path_filter") — это документированная граница. Нефильтрованная реализация остаётся зарегистрированной, чтобы обёртка могла её вызвать. get_scheme_service_from_urn берёт байты до :// в качестве схемы.
my_service<SERVICE_TYPE(dynamic_loader_scheme)> service(
(my_string("dynamic_loader_scheme_") + scheme).c_str(),
&imp_mysql_minimal_chassis_registry);
file.mysql_minimal_chassis — это реальная схема. component.test никогда её не пробует.
Ошибочные пути: URN с 3 слэшами (scheme:///tmp/...) загружался; 4 слэша не потребовались. Основа URN должна опускать .so.
cd lab
./run.sh
Образ mysql:26.7.0. Опубликован 127.0.0.1:18650. plugin_dir=/usr/lib64/mysql/plugin. Копирует стандартный component_query_attributes.so в /tmp/MYSQL-INSTALL-COMPONENT-SCHEME-WITNESS.so.
SUCCESS mysql-install-component-scheme file-slash-denied=yes qualified-load=yes component-urn=yes dump=26.7.0 image=mysql:26.7.0 MYSQL-INSTALL-COMPONENT-SCHEME-WITNESS
Не получать dynamic_loader_scheme_file.mysql_minimal_chassis из SQL URN. Сопоставлять только file с реализацией фильтрации путей. Отклонять схему, которая называет реализацию. Сохранять check_valid_path на каждом файловом загрузчике.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)components/libminchassis/dynamic_loader.cc get_scheme_service_from_urnsql/server_component/dynamic_loader_path_filter.cc