ITエンジニアなら知っておくべき『MySQL』の脆弱性とセキュリティ対策
『MySQL』とは、世界で最も利用されているデータベース管理システムです。
大容量のデータに対しても高速で動作し、高機能なため実用性が高く、独立系ソフトウェアベンダから大手企業まで、幅広く使用されています。
ところが、2016年に入って致命的な脆弱性が発見されました。
ここでは『MySQL』の特徴と新たに発見された脆弱性、そのセキュリティ対策についてご紹介します。
Contents [hide]
オラクル社のオープンソースMySQL
MySQLは大容量のデータに対して高速で動作し、かつ機能も優れているため、ユーザーからのアクセスが多い大規模Webサイトやシステムに対応することが可能です。
世界的に有名な「Yahoo!」「Google」「Nokia」「YouTube」などの大手企業でも採用されているほどです。
また、オープンソースなので、非商用利用であれば無償で使用することができ、プログラミング初心者でも導入しやすいデータベースとしても人気です。
データベース管理システムを使わないWebサイトやアプリはほとんどありません。
MySQLを学習していれば、仕事獲得にもつながりやすいのです。
2016年9月に報告されたMySQLの致命的な脆弱性
しかし、2016年9月12日にMySQLに存在する深刻な脆弱性が、個人リサーチャーDawid Golunski氏により公表されました。
Golunski氏がオラクル社に報告してから40日以上が経過したことと、2社が対応を行ったことなどから、脆弱性の詳細を公開したとされています。
公表の際、脆弱利用の概念実証(Proof of Concept、POC)コードも提供されました。
影響を受けるMySQLのバージョンは5.7.15、5.6.33、5.5.52。
確認された脆弱性は2つあり、そのうち公表された1つの脆弱性は、「CVE-2016-6662」として識別されています。
悪用されると、攻撃者は権限を取得せずにMySQLの環境設定ファイルを作成でき、効率的なサーバー乗っ取りが可能になります。
もう1つの脆弱性「CVE-2016-6663」は、この時点では公表されていません。
2016年11月に新たに発覚したMySQLの脆弱性
2016年11月2日、Golunski氏は新たな脆弱性を公表しました。
1つは9月に公表されていた「CVE-2016-6663」に関する詳細が明らかにされました。
低特権アカウントの権限を昇格させてデータベースシステムユーザとしてふるまうことができるようになり、勝手なコードを実行することができてしまうというものです。
影響を受けたシステムの制御権を乗っ取り、最終的にはサーバー自体が乗っ取られる危険性があるとされています。
影響を受けるMySQLのバージョンは5.5.51と5.6.32。
もう1つはMariaDB の mysqld_safe スクリプトの処理に root 権限を奪われる問題「CVE-2016-6664」です。
オラクルによるMySQLのパッチ提供
オラクルはセキュリティ脆弱性に対するパッチを四半期ごと(1月、4月、7月、10月の17日に最も近い火曜日)に公開しています。
2016年9月に脆弱性が公表された時点ではパッチがありませんでした。
そのため、mysqld_safeで shared_libraryを読み込まないなど一次的回避策が取られていました。
2016年10月18日に「CVE-2016-6662」と「CVE-2016-6663」に関するパッチを提供しましたが、これらはGolunski氏に報告されることなく行われています。
「CVE-2016-6664」については、MariaDBが近いうちにリリースすると公表しています。
DLL読み込みに関する脆弱性
2018年2月に、DLL読み込みに関する脆弱性が複数発見されました。
この脆弱性は、脆弱性のあるプログラムと同じディレクトリに、悪意あるDLLがダウンロードされたりした場合に発動します。
この原因は、多くの場合「プログラム実行時にあらかじめ読み込まれるDLLの存在」と、「DLL検索時の優先順位」に起因します。
対策としては、開発者側とユーザー側のそれぞれで行う必要があります。
開発者側でとるべき対応策
ケース1:自己解凍ファイルなど、ダウンロードしたファイルをそのまま実行することが想定される場合
自己解凍ファイルが利用する実行ファイルについて、あらかじめ読み込まれるDLLを最小限にします。
ケース2:開発側がプログラム実行の為の環境を設定できる場合
ダウンロードしたプログラムをそのまま実行するのではなく、インストールの手順を経て実行させるようにします。
ケース3:配布するインストーラーが実行ファイルになる場合
インストーラー作成プログラムにケース1・ケース2の対策を施し、インストーラーを実行ファイル(.exe形式)ではなく、マイクロソフトインストーラー(MSI)形式のものにします。
ユーザー側でとれる自衛策
ユーザー側でとれる対策の一例として、実行ファイルをダウンロードするときは以下の手順を踏みましょう。
- 新しくディレクトリ(フォルダ)を作成する
- 新しく作成したディレクトリ(フォルダ)に、ダウンロードしたファイル類を移動する
- 新しく作成したディレクトリの中で実行ファイルを実行する
SQLインジェクション
SQLインジェクションとは、アプリケーションのデータベースに不正なSQL文が流入し、開発者の意図しない動作をさせてしまう攻撃のことです。
例えば、このようにユーザーにIDとパスワードを入力させるSQL文があった場合
$sql = “SELECT * FROM `victim_table` WHERE `id` = $id and `pass` = $pass”;
ID欄にこのように入力されてしまうと、パスワードを入力せずにログインされてしまいます。
$sql = “SELECT * FROM `victim_table` WHERE `id` = 999 OR 1 = 1; ? 以降はコメントになります and `pass` = $pass”;
他にも、SQL文の書き換えによって、サービス不能攻撃(Dos攻撃)を受けたり、テーブルを削除されてしまう恐れなどもあります。
- SQLインジェクションに関して、以下のような対策が推称されています。
- SQL文の組み立ては全てプレースホルダで実装する。※1
- SQL文の構成を文字列連結により行う場合は、アプリケーションの変数をSQL文のリテラルとして正しく構成する。※2
- ウェブアプリケーションに渡されるパラメータにSQL文を直接指定しない。
- ユーザーの入力データへのエスケープ処理の実施。
※1プレースホルダとは、パラメータ部分を?などの記号で示しておき、後に、そこへ実際の値を機械的な処理で割り当てる方法。
※2リテラルとは、プログラムのソースコードにおいて使用される、数値や文字列を直接に記述した定数のこと。
データベースを使って開発するときには、SQLインジェクションの脅威に十分な対策をしましょう。
MySQLのセキュリティ対策と今後の行方
MySQLは利用率が高いため、MySQLの脆弱性は広範囲に影響を与える恐れがあります。
パッチが公開されたらすぐに適用すること、バージョンアップが可能なタイミングで最新版へのバージョンアップを実施することが望ましいでしょう。
米Oracleは四半期に1度、セキュリティアップデート「Critical Patch Update(CPU)」をリリースしています。
MySQLに関する情報も多いので、チェックしておきましょう。
ITエンジニア向けセキュリティ対策情報
MySQLを使うエンジニアであれば、構築するウェブサイトやネットワーク、最近では情報家電の開発者などにも、幅広い分野で情報セキュリティ対策が求められます。
セキュリティ診断を行うツールもありますので、積極的に情報収集を行ないチェックを怠らないようにしましょう。