Debian.pro

Блог для пользователей и администраторов Debian


mysql-server в Ubuntu, база test. Решето.

Пришёл ко мне сегодня сотрудник СИБ со списком рекомендаций по безопасности сервиса. Среди них фигурировала фраза «Убить юзера test без пароля для mysql».
«Внезапненько», подумал я и пошёл разбираться что за хрень. Машина новая, ssh только у меня и у сотрудника СИБ, традиционные управлялки БД там не применялись. Пошел я туда по ssh и действительно:

root@server:~# cat /etc/issue
Ubuntu 12.04.2 LTS \n \l

root@server:~# mysql -u test #без пароля
....
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Ещё крепче призадумался я… «Что за нах? Кто посмел? Какая бл*». Пошел потоптался по своим debian-серверам — там всё хорошо и такого пользователя нет. «Гм!». 30 секунд гугла и я наткнулся на эту статью.
Действительно, в дефолтной mysql-поставке существует база test, гранты на которую есть у всех пользователей (что во-первых позволяет цепляться к mysql с любым username без пароля — т.н. «анонимам», во вторых делать что-то с базой test). Казалось бы, что тут страшного? Mysql-щики люди умные и лишнего не допустят.

Но, само собой, любую подобную штуку можно проэксплуатировать. Самое банальное — убить место на диске INSERT’ами (тогда mysql перестанет работать). Мысля пошла дальше.
Грантов на FILE там нет… окееей. Вспоминаем, что несмотря даже на отсутствие гранта FILE можно почитать любой файл, на который стоят права 755 (ну или просто любой файл, который может читать системный аккаунт mysql) нехитрым образом такими запросами:

use test;
create table t (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, blob_col BLOB);
insert into t (id, blob_col) values ('1'),('123');
update t SET blob_col=LOAD_FILE('/etc/passwd') Where id=1;
select * from t;

Естественно, что содержимое файлика я увидел. Пойдя на первый попавшийся shared-хостинг я выгреб несколько htaccess-ов, пачку wp-config. На втором смог выдернуть /root/.my.cnf с рутовым паролем mysql-я внутри. Одним словом — п*ц.

К превеликому моему счастью, в дебиане такого пользователя по умолчанию нет.

Тут в общем-то стоит и закончить, остальное вы додумаете сами. «Убить» гранты на эту базу можно так:

DELETE FROM mysql.db WHERE Db LIKE 'test%';
FLUSH PRIVILEGES;

Ну и лучше дропнуть саму базу:

DROP DATABASE test;

Стоит проверить грантов в своём mysql:

mysql> select user,host from mysql.user;
+------------------+------------------------------------+
| user | host |
+------------------+------------------------------------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| debian-sys-maint | localhost |
| evaluation | localhost |
| root | localhost |
+------------------+------------------------------------+

Пустое поле в колонке User — и есть этот грант.

Удачи всем. Изучать mysql весело, да =(


Комментарии (20):

  1. Ivan1986 :

    Вообще не пользователь test, а база test
    пользователь с любым логином и с доступом только с локалхоста.

  2. Ммм… ваша правда. Поправлю.

    Спасибо.

  3. Ivan1986 :

    Вот тут вот есть подробнее
    http://dba.stackexchange.com/questions/13361/mysql-why-are-there-test-entries-in-mysql-db

    Меня терзают сомнения что это в каких-то свежих версиях мускуля после установке, потому как на новом сервере у меня такая-же фигня, а вот на старых все ок, после того как обновил с 5 до 5.5.
    Пополз ставить свежий sid на виртуалке, про результат отпишусь и возможно надо будит постить секьюрную багу в убунту или деб

  4. На 5.1 в убунте точно есть.
    В перконе нет.

  5. и 5.5, само собой.

    А судя по докам — https://dev.mysql.com/doc/refman/5.0/en/default-privileges.html — и в 5.0 тоже есть.

  6. Ivan1986 :

    судя по докам да, но у меня рабочий комп был поставлен когда была 5.0 — он таких выкрутасов не позволяет, а вот в дебиане пакет dfsg перепакованный — могли и вырезать.
    Если что — вы не против ссылки на эту статью в багтрекере дебиана/убунты?

  7. Там по-аглицки лучше писать — русское они читать не будут (а переводчик с этой статьёй не справится).

    Просто скопируйте им вот это:
    use test;
    create table t (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, blob_col BLOB);
    insert into t (id, blob_col) values (’1′),(’123′);
    update t SET blob_col=LOAD_FILE(‘/etc/passwd’) Where id=1;
    select * from t;

  8. Ivan1986 :

    В дебиане юзер есть, база есть, но вот файлы считать не могу

  9. А если создать в /tmp с chmod 777 файл?

  10. Ivan1986 :

    нет, не работает

  11. А чего говорит?

  12. Ivan1986 :

    null в базе и ничего не говорит

  13. Хым. А версии покажите?
    Правда, не факт, что смогу сразу посмотреть

    Вообще он ругаться должен на access. Хотя может уже привели в порядок.

  14. Ivan1986 :

    5.5.31-0wheezy1

  15. Да, действительно. В wheezy такая база есть, но файлы читать не получается.

  16. Kixiro :

    Похоже что в wheezy гайки закручены и file_load() может делать только root.

  17. kixiro :

    Опечатался LOAD_FILE….
    Будет работать, только если есть пользователь и у него File_priv=Y. Может в старых версиях ещё и создавался пользователь test?

  18. Нет, test точно не создавался отдельно.
    Просто подкрутили баги, теперь, видимо грант FILE влияет и на чтение файлов.

  19. denis :

    Вроде же есть прям в коробке скрипт mysql_secure_installation, который выносит подобную шнягу.

  20. Taz :

    cat /usr/bin/mysql_secure_installation и открыть глаза, полнрые удивления.

Написать комментарий