Уязвимость в MySQL: простой SELECT дает неограниченные права на исполнение

В понедельник была опубликована информация от польского исследователя Давида Голунски о двух критических уязвимостях, которые он обнаружил. Уязвимости относятся ко всем версиям MySQL, включая последние (5.5, 5.6 и 5.7), а так же к клонам MySQL — MariaDB и Percona DB.

Что за уязвимость?

Уязвимость позволяет запустить стороннюю библиотеку с root-правами, а для её эксплуатации необходим доступ к СУБД с возможностью выполнять операции SELECT и FILE. Эта уязвимость получила код CVE-2016-6662. После её исправления Давид пообещал сообщить о ещё одной уязвимости (которая должна получить код CVE-2016-6663), которая позволяет делать то же самое, но уже без прав FILE.

Самое главное — патчи уже есть?

Да, патчи уже есть: 5.5.52, 5.6.33 and 5.7.15.

Отлично. А как это работает?

Через изменение конфигурационных файлов с помощью операций логирования. Выглядит это примерно так:

set global general_log_file = '/etc/my.cnf';
set global general_log = on;
select '

[mysqld]
malloc_lib=/tmp/mysql_exploit_lib.so

[separator]

';
set global general_log = off;

После чего в файле /etc/my.conf появятся строки:

[mysqld_safe]
malloc_lib=/tmp/mysql_exploit_lib.so

И при следующем запуске MySQL указанная библиотека будет запущена от имени суперпользователя. Заметим, что в целом идея атак через правку my.conf не нова. Так, например, в 2003 году в выпуске 3.23.55 уже исправлялась эксплуатация через SELECT * INFO OUTFILE '/var/lib/mysql/my.cnf'. Упоминание этого можно найти в описании обновления одного сервиса.

И что, уже даже есть готовый эксплойт?

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

Но это же не полноценная уязвимость, а лишь возможность злоупотребить правами

Да, многие придерживаются такой же точки зрения. Тем не менее, права на выполнение запроса SELECT и на запуск исполняемого файла с root-правами — сильно разные вещи, и возможность такого “злоупотребления” должна быть устранена. Заметим, что уже сейчас есть возможность не перезаписывать существующий конфигурационный файл в директории, права на работу с которой есть только у root’а, а создать новый в папке /var/lib/mysql, права на запись в которую (естественно) есть у пользователя mysql по умолчанию.

Каким образом исправили уязвимость?

Теперь для mysql_safe аргумент --malloc-lib должен принадлежать к одной из следующих директорий: /usr/lib, /usr/lib64, /usr/lib/i386-linux-gnu или /usr/lib/x86_64-linux-gnu. Опции --mysqld и --mysqld-version могут теперь применяться только к запуску из командной строки, и не могу быть описаны в конфигурационных файлах. Кроме этого, файлы с расширениями .ini или .cnf теперь не могут быть использованы для записи функциями логирования.