漏洞分析——’mysql‘系统用户提权漏洞(CVE-2016-6663)分析

一、背景介绍

此漏洞被收集于网站www.exploit-db.com,漏洞编号为CVE-2016-6663,经杭州汉领信息公司所属汉武实验室评估后,认定其具有一定的研究价值,故由本人对其进行了漏洞验证以及原理分析。

1.1 漏洞描述

部分版本的MySQL、MariaDB、PerconaDB数据库存在一个竞态条件漏洞。一个本地普通用户如果拥有一个低权限的数据库用户,且此用户拥有对其数据库进行select,insert,create,drop操作的权限,则利用该漏洞可以将本地普通用户提权至数据库系统用户(mysql用户),此时本地普通用户将拥有访问受影响数据库的所有文件的权限。

1.2 受影响的数据库版本

经查阅相关专业文档,得出受漏洞影响的数据库版本如下:

MariaDB < 5.5.52

MySQL <= 5.5.51 <= 5.6.32 <= 5.7.14

Percona Server < 5.5.51 < 5.6.32 < 5.7.14

1.3 漏洞编号

CVE-2016-6663

二、漏洞分析

2.1 漏洞的产生原因

在拥有create权限的数据库用户在指定路径下建表(create table)后,运行REPAIR TABLE SQL语句时,会存在一个对临时文件的不安全的文件操作。

这一不安全的文件操作包括以下两步:

1.系统调用会检查table.MYD(由repair table产生)的权限。

2.系统通过chmod()将其权限复制到新创建的名为table.TMD的临时文件,这个临时文件中存贮着被修复的table。

这两个操作间存在竞态条件漏洞。如果攻击者在chmod()操作前删除(即赢得竞争)table.TMD并将其替换为一个指向/var/lib/mysql的符号链接,攻击者可以给该路径赋予任何权限。

(竞态条件漏洞:当多个进程同时访问和操作相同的数据时,会发生竞争条件,并且执行的结果取决于访问发生的特定顺序。如果特权程序存在竞争条件漏洞,攻击者可以运行并行进程来“竞争”特权程序,并打算更改程序的行为。)

例如:如果攻击者通过repair table语句预先将table.MYD设置为777的权限,在chmod()前将table.TMD替换为mysql的数据目录(/var/lib/mysql)的符号连接,那么mysql数据目录(/var/lib/mysql)就会被设置为777权限,这时攻击者就可以对该目录进行读写。

2.2 漏洞验证

实验环境:Debian 4.19.13-1kali1 x86_64 mysql版本:5.6.32

漏洞来源地址:http://legalhackers.com/exploits/CVE-2016-6663/mysql-privesc-race.c

实验系统用户为本地普通系统用户:

本地普通系统用户具有拥有create/insert/select/drop权限的普通数据库用户test,可操作数据库为test数据库。

运行exp:

运行结果:

2.3 漏洞危害

攻击者利用该漏洞可以执行任意代码并且可以提升权限到mysql系统用户。这会使他们有权限访问服务器上的所有的数据库文件,结合CVE-2016-6662或者CVE-2016-6664可以进一步提升权限到root用户(详情见下一篇——’root‘系统用户提权漏洞(CVE-2016-6664)分析)。

此漏洞可以被共享环境(每个用户都被分配了一个可以访问的数据库)下的恶意用户利用,还可以被通过web入侵的已经获得了低权限用户(如apache/www-data用户)的攻击者利用。

三、 解决方法

该漏洞可以通过更新版本,打上最新版本补丁来解决。

当然更好的选择是使用汉领信息2019年主推产品数据库应用防御系统(NGDAP)来预防,该产品通过对访问数据库的数据流进行采集、分析、识别,精准定位访问动作合法性,对正常的数据库访问以及业务系统访问不做任何处理,对非法、危险的数据库访问以及业务系统访问根据其危险级别做出如‘“告警”、“拒绝”等不同程度的处理,有效保障数据库服务器以及数据库服务器关联的业务系统安全运行。

通过该系统将repair table语句作出告警,能够让数据库管理员第一时间发现数据库系统是否被攻击并作出应对,极大降低漏洞风险。