Уязвимость в mysqldump, позволяющая выполнить код при восстановлении бэкапа

11.03.2017 08:51

Во входящей в состав MySQL утилите mysqldump, используемой для создания резервных копий, выявлена уязвимость (CVE-2016-5483), позволяющая организовать выполнение произвольных shell-команд или привилегированных конструкций SQL во время восстановления резервной копии при помощи утилиты mysql. Код выполнятся с правами администратора, запустившего mysql. Атаку может совершить пользователь СУБД, имеющий права на создание таблиц, например после успешной атаки по подставновке SQL-кода через уязвимое web-приложение.

Проблема вызвана особенностью добавления комментариев с названиями таблиц в выводе mysqldump. Атакующий имеет возможность создать таблицу с переводом строки в имени, что приведёт к тому, что в область комментария попадёт только начало имени, а хвост будет перенесён на другую строку и выполнен при загрузке дампа. Например, атакующий может создать таблицу с именем, разнесённым на три строки:

   CREATE TABLE `evil    \! id   select user(),@@version/*` (test text);  
При создании резервной копии в дампе, полученном от mysqldump, будет сохранено (часть имени вынесена за пределы комментария):
   --   -- Table structure for table `evil   \! id   select user(),@@version/*`  
При восстановлении резервной копии администратором будут запущены команды "\! id" и "select user(),@@version/*":
   $ mysql test < backup.sql   uid=0(root) gid=0(root) groups=0(root) <-- attacker shell command    user()  @@version    root@localhost  10.1.18-MariaDB <-- attacker sql query  

Проблеме подвержены все версии MySQL, в которых уязвимость остаётся неисправленной, а также выпуски MariaDB до 5.5.53 и 10.1. Обновления пакетов с MariaDB уже выпущены Debian и Ubuntu. Уязвимость была обнаружена осенью, но уведомление компании Oracle осталось без ответа, поэтому спустя 90 дней исследователи опубликовали сведения об уязвимости в открытом доступе. В качестве обходного метода защиты предлагается при создании бэкапов запускать утилиту mysqldump с опцией "--skip-comments", воспользоваться альтернативными инструментами резервного копирования MySQL или запретить доступ пользователей СУБД к выполнению операций "create table".