MySQLのmysql_real_escape_string()にSQLインジェクション可能な脆弱性
概要
MySQLの複数のバージョンで、リモートから攻撃可能な脆弱性が見つかっている。この脆弱性を利用する事により、データベースが参照及び改ざんされる可能性があると発表された。
MySQLを使用しているアプリケーションに対して、一重引用符のエスケープ文字列(\')を含むSQLを入力すると、サニタイジング処理などに使用されるmysql_real_escape_string() 関数のセキュリティが迂回される可能性があり、これにより、任意のSQLがデータベース上で実行される可能性があります。この脆弱性は、PostgreSQLでも見つかっており、早急な対策が必要。
この脆弱性はマルチバイトのサーバエンコーディングを使用している(UTF-8、EUC_JP等)場合に発生する。日本語を扱うデータベースはこれに該当するだろう。
対象バージョン
mysql 4.1.0~mysql 4.1.19
mysql 5.0.15~mysql 5.0.21
影響
ユーザからの入力がMySQLサーバに渡される際に(ログイン処理や検索フォームなど)、適切なサニタイジング処理を行っていても、SQLインジェクションが可能となり、これにより、リモートから任意のSQLが実行され、データ操作(書換え/削除等)、データ閲覧(情報漏洩)などが行われる危険性がある。 また、ユーザー認証(ユーザーパスワードの照合など)にデータベースを利用している際には、認証処理を回避される危険性がある。
なお、MySQL 3.23 および 4.0 は本脆弱性の影響を受けない。
回避方法
NO_BACKSLASH_ESCAPES SQLモードを使用することで暫定的に対処が可能である(このモードはMySQL 5.0.1以降で導入された)。NO_BACKSLASH_ESCAPESにより、SQL互換モードが有効になり、バックスラッシュが特殊文字として扱われなくなるため、SQLを無害化できる。
このモードを現在の接続で有効にするには、下記のSQLステートメントを実行する。
SET sql_mode='NO_BACKSLASH_ESCAPES';
また、下記を実行して、全てのクライアントに対して当該モードを適用することも可能。
SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES';
このモードを、サーバの起動時に自動的に有効にするには、「--sql-mode=NO_BACKSLASH_ESCAPES」コマンドラインを使用するか、サーバオプションファイル(システムによってmy.cnfまたはmy.ini)に「sql-mode= NO_BACKSLASH_ESCAPES」を設定する。
当サーバの対応
対応済みバージョンであるMySQL 4.1.20、5.0.22及び5.1.11-betaがリリースされているのでアップデートを行う。現行サーバのMySQLは5.0系列となっているので5.0.22へと変更する。
参考
技術資料
ダウンロード
その他
公開コンテンツには使用していないので詳細は省くが、
PostgreSQL 8.1.4
PostgreSQL 8.0.8
PostgreSQL 7.4.13
PostgreSQL 7.3.15
についても同様の脆弱性が確認されているので、
PostgreSQL 8.1.4
PostgreSQL 8.0.8
PostgreSQL 7.4.13
PostgreSQL 7.3.15
にアップグレードが必要。