CVE-2016-6662 MySQL Remote Root Code Execution / Privilege Escalationについて

# 免責

- 取り敢えずわかっている範囲で書いただけなので、手元で再現やパッチの正当性は確認していません。
- 自己責任でどうぞ。
- これ(2016/09/22 22:00)以降新しい情報が出てきても、おそらくもう更新しません。

# CVE-2016-6662 についてはこちら

- [MySQLに重大な脆弱性見つかる、パッチ存在せずデフォルトで影響 - ITmedia ニュース](http://www.itmedia.co.jp/news/articles/1609/13/news055.html)
- [oss-sec: CVE-2016-6662 - MySQL Remote Root Code Execution / Privilege Escalation ( 0day )](http://seclists.org/oss-sec/2016/q3/481)



# この脆弱性を再現させるために必要なもの

- ~~(未検証) 5.5.52, 5.6.33, 5.7.15は影響を受けないかも知れません。詳しくは図のさらに下に。~~
  - 手元で再現させてはいませんが、 [オリジナルの脆弱性報告](http://legalhackers.com/advisories/MySQL-Exploit-Remote-Root-Code-Execution-Privesc-CVE-2016-6662.html) の影響を受けるバージョンがしゃらっと "5.7.14", "5.6.32", "5.5.51" に変わっている（記事を書き始めた時は "5.7.15", "5.6.33", "5.5.52" だった）ので、これ以降のバージョンは少なくともこの脆弱性を直接は受けないようです。

- **大前提として、任意のSQLを実行できる必要がある** （phpMyAdminのような「そういう機能」を提供するもの、または、SQLインジェクションなど？）
- MySQL 5.1とそれ以前(5.0, 4.1, ..)は mysqld_safe に `malloc-lib` オプションがないので直接この脆弱性の影響は受けない
  - とはいえFILE権限がデンジャーなのは変わらないので云々。
- 取り敢えず図を描いてみた（最終更新 2016/09/22 22:00）

![CVE-2016-6662.png](https://qiita-image-store.s3.amazonaws.com/0/32516/3aefe9f0-2344-1481-43e5-cf958db05070.png)

- Thank you tokuhirom-san,

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/yoku0825">@yoku0825</a> <a href="https://twitter.com/soudai1025">@soudai1025</a> exploitコードを見ると、.TRGにDUMPFILEしているので、トリガーを発火させる人にSUPER_privあれば良いのでは？つまり、リモート攻撃者にはFILE権限だけあれば良いですよね？</p>&mdash; tokuhirom (@tokuhirom) <a href="https://twitter.com/tokuhirom/status/775511618901856256">2016年9月13日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


# MySQLの対応（？）

- 公式な見解ではありません。

- 変なパスから `malloc-lib` をPRELOADしないように `mysqld_safe` にパッチが当たっている模様。
  - [Merge branch 'mysql-5.6' into mysql-5.7 · mysql/mysql-server@f75735e](https://github.com/mysql/mysql-server/commit/f75735e36e6569b9dae3b0605b1d5915a519260e#diff-144aa2f11374843c969d96b7b84247eaR348)
  - 手元の5.5.52, 5.6.33, 5.7.15にはこのパッチが取り込まれている様子
    - ちなみに8.0.0には取り込まれてません :-P

```
$ grep "/usr/lib/x86_64-linux-gnu" */bin/mysqld_safe
5.5.52/bin/mysqld_safe:  malloc_dirs="/usr/lib /usr/lib64 /usr/lib/i386-linux-gnu /usr/lib/x86_64-linux-gnu"
5.5.52/bin/mysqld_safe:        /usr/lib/x86_64-linux-gnu) ;;
5.6.33/bin/mysqld_safe:  malloc_dirs="/usr/lib /usr/lib64 /usr/lib/i386-linux-gnu /usr/lib/x86_64-linux-gnu"
5.6.33/bin/mysqld_safe:        /usr/lib/x86_64-linux-gnu) ;;
5.7.15/bin/mysqld_safe:  malloc_dirs="/usr/lib /usr/lib64 /usr/lib/i386-linux-gnu /usr/lib/x86_64-linux-gnu"
5.7.15/bin/mysqld_safe:        /usr/lib/x86_64-linux-gnu) ;;
```

- 「10/16の定期パッチで対応」となっているのはこういうこと？

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">直近に出たマイナーリリースを定例パッチだったことにする感じです。 <a href="https://t.co/OCc0fgCjj3">https://t.co/OCc0fgCjj3</a></p>&mdash; SH2 (@sh2nd) <a href="https://twitter.com/sh2nd/status/775514905336094720">2016年9月13日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


- ~~取り敢えず最新版にしておけばCVE-2016-6662のケースにしておけば防げるのかも (未検証)~~
- 5.5.52とそれ以降, 5.6.33とそれ以降, 5.7.15とそれ以降は影響を受けないようです。
  - [MySQL-Exploit-Remote-Root-Code-Execution-Privesc-CVE-2016-6662.html](http://legalhackers.com/advisories/MySQL-Exploit-Remote-Root-Code-Execution-Privesc-CVE-2016-6662.html)
  - ただし `malloc-lib` 以外にも

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">my.cnfに任意の文字列書けるということは、skip-grantも可能</p>&mdash; masahiro nagano (@kazeburo) <a href="https://twitter.com/kazeburo/status/775523720207093761">2016年9月13日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 対策

- File権限を持っているアカウントはIPを絞ったり不要そうならREVOKEする
- File権限がなくても、既に細工済みのライブラリーがないかどうかチェックした方がいい
  - 既にファイルがあった場合、Super権限だけで準備が整う
- mysqld_safeにオレオレパッチを当てて `LD_PRELOAD` を無効化しちゃうのも手？ （検証してないので自信はないです）
  - 最新版にあげられないなら、という感じか

```
$ diff -c bin/mysqld_safe{.orig,}
*** bin/mysqld_safe.orig        2016-08-25 21:51:47.000000000 +0900
--- bin/mysqld_safe     2016-09-13 10:26:26.017457895 +0900
***************
*** 371,377 ****
        ;;
    esac

!   add_mysqld_ld_preload "$malloc_lib"
  }


--- 371,377 ----
        ;;
    esac

!   #add_mysqld_ld_preload "$malloc_lib"
  }

```

# MariaDBのもっと筋の良い対応

- MariaDBは、general_logのファイル名にmy.cnfで終わる文字列を許可しないようにしているぽい。
- [MDEV-10465 general_log_file can be abused · MariaDB/server@470f259](https://github.com/MariaDB/server/commit/470f2598cca350b79531bf0b88463a47d94abec3)