systemadmin.es > DBA > El peligro del permiso FILE de MySQL

El peligro del permiso FILE de MySQL

Mediante el permiso FILE permitimos que desde una sentencia SQL se lea y se escriba en el sistema de ficheros del servidor MySQL de acuerdo con los permisos del usuario que se ejecute (normalmente existe un usuario dedicado llamado mysql o mysqld)

Podemos otorgar dicho privilegio mediante GRANT FILE:

mysql> grant file on *.* to usuario@'localhost';
Query OK, 0 rows affected (0.00 sec)

Dicho privilegio es global por usuario, por lo que lo podemos ver mediante la columna File_priv de la tabla mysql.user:

mysql> select User,Host,File_priv from user where User="usuario" limit 1\G
*************************** 1. row ***************************
     User: usuario
     Host: localhost
File_priv: Y
1 row in set (0.00 sec)

Una vez obtenido dicho permiso se pueden leer ficheros mediante LOAD DATA INFILE y la función LOAD_FILE(), además de escribir mediante SELECT … INTO OUTFILE.

Ambos casos resultan peligrosos, ya que se puede utilizar para obtener datos que el usuario mysql pueda leer como para escribir ficheros nuevos.

Por ejemplo, mediante la siguiente query podemos generar un fichero PHP:

mysql> select "<?php phpinfo(); ?>" into outfile 'info.php';
Query OK, 1 row affected (0.00 sec)

mysql> ^DBye
# cat info.php
<?php phpinfo(); ?>

En este caso se ha generado el fichero en el datadir del MySQL:

# ls -la /proc/$(pgrep mysqld)/cwd
lrwxrwxrwx 1 root root 0 Mar 15 13:46 /proc/3196/cwd -> /var/mysql

Pero podemos indicar cualquier otra parte del sistema de ficheros mediante una ruta absoluta.

Existe una pequeña medida de seguridad, y es que no permite la sobrescritura de ningún fichero:

mysql> select "<?php phpinfo(); ?>" into outfile 'info.php';
ERROR 1086 (HY000): File 'info.php' already exists

Relacionados

3 comments to “El peligro del permiso FILE de MySQL”

  1. Hay un caso concreto que esa funcionalidad me viene bien. No sé si llamarla “chapuza”. Tengo integrados unos disparadores en una tabla que llama a un procedimiento que graba en un directorio concreto el cambio. Ese directorio está auditado y, mediante un demonio conectado por socket al audit, compruebo el evento y leo el fichero, acto seguido lo borro. Es un experimento que tengo hecho para sincronizar en tiempo real un ldap con los datos que hay en un mysql.

  2. Esta claro que también se le pueden sacar utilidades, pero el peligro de fondo sigue estando allí: En realidad la seguridad suele estar reñida con la funcionalidad

  3. No creo que deban alarmarse tanto con esta característica de MySQL, por que apparmor se encarga de controlar donde lee y escribe el demonio de MySQL.

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>