免責
- 取り敢えずわかっている範囲で書いただけなので、手元で再現やパッチの正当性は確認していません。
- 自己責任でどうぞ。
- これ(2016/09/22 22:00)以降新しい情報が出てきても、おそらくもう更新しません。
CVE-2016-6662 についてはこちら
- MySQLに重大な脆弱性見つかる、パッチ存在せずデフォルトで影響 - ITmedia ニュース
- oss-sec: CVE-2016-6662 - MySQL Remote Root Code Execution / Privilege Escalation ( 0day )
この脆弱性を再現させるために必要なもの
-
(未検証) 5.5.52, 5.6.33, 5.7.15は影響を受けないかも知れません。詳しくは図のさらに下に。- 手元で再現させてはいませんが、 オリジナルの脆弱性報告 の影響を受けるバージョンがしゃらっと "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)
- Thank you tokuhirom-san,
@yoku0825 @soudai1025 exploitコードを見ると、.TRGにDUMPFILEしているので、トリガーを発火させる人にSUPER_privあれば良いのでは?つまり、リモート攻撃者にはFILE権限だけあれば良いですよね?
— tokuhirom (@tokuhirom) 2016年9月13日
MySQLの対応(?)
-
公式な見解ではありません。
-
変なパスから
malloc-lib
をPRELOADしないようにmysqld_safe
にパッチが当たっている模様。- Merge branch 'mysql-5.6' into mysql-5.7 · mysql/mysql-server@f75735e
- 手元の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の定期パッチで対応」となっているのはこういうこと?
直近に出たマイナーリリースを定例パッチだったことにする感じです。 https://t.co/OCc0fgCjj3
— SH2 (@sh2nd) 2016年9月13日
取り敢えず最新版にしておけばCVE-2016-6662のケースにしておけば防げるのかも (未検証)- 5.5.52とそれ以降, 5.6.33とそれ以降, 5.7.15とそれ以降は影響を受けないようです。
- MySQL-Exploit-Remote-Root-Code-Execution-Privesc-CVE-2016-6662.html
- ただし
malloc-lib
以外にも
my.cnfに任意の文字列書けるということは、skip-grantも可能
— masahiro nagano (@kazeburo) 2016年9月13日
対策
- 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