IISのRDSおよびJetセキュリティ問題

Windows NT World 2000年3月号
月刊セキュリティレポート No.3

本文書は、Windows NT World誌に寄稿した記事の原稿を、IDGジャパン編集部殿の許可を得た上で掲載したものです。








 IISのMDAC/RDSセキュリティ問題を利用したIIS Webサイトに対する攻撃が、インターネット上で発生しているとの報告がCERT/CCからアナウンスされた。
図1  IISのMDAC/RDSアタックを警告するCERT/CCのWebページ
図1 IISのMDAC/RDSアタックを警告するCERT/CCのWebページ


 IIS4.0を使用しているWebサイトは、自サイトに問題があるかどうかを確認の上、もし問題がある場合は早急に対策を施す必要がある。

 またRDS問題と並び非常に重要視すべきものとして、Webサーバ上におけるJetデータベースエンジンの脆弱性(Office ODBC問題)があげられる。Jetの問題は前回の記事でデスクトップPC上での脅威として取り上げたが、MS Accessデータベース(mdbファイル)にアクセスするようなWebアプリケーションを使用している場合、Webサーバも同様にこの問題の脅威にさらされることになる。RDS問題を利用した攻撃も、このJetの問題を併用することでさらに危険なものになっている。

 これらの問題は、リモートからHTTPでアクセスすることにより、Webサーバ上で任意のプログラムをシステム権限で実行させることが可能なものであるため、非常に危険性が高い。ただしこれらは決して新しい問題ではなく、以前からセキュリティ・コミュニティで指摘され、マイクロソフトも既にフィックスまたはワークアラウンドを提示している。すなわち、適切に対処すれば防ぐことが可能な問題である。


MDAC/RDSセキュリティ問題とは


 MDAC/RDS問題はそもそも1998年7月にMicrosoft Security Bulletin MS98-004として報告されたものだが、その後1999年7月にマイクロソフトはさらに詳細なセキュリティ情報(MS99-025)を公開した。(日本語のマイクロソフトセキュリティ情報はおよびを参照)

 この問題は、MDAC(Microsoft Data Access Components)に含まれるRDS(Remote Data Services)の中のDataFactory objectに起因する。問題自身がやや複雑なため、ここでは最も危険な「リモートによるIISサーバ上でのプログラム起動」に焦点をあて、少し単純化して解説する。詳細は上記マイクロソフトからのセキュリティ情報を参照されたい。

 RDS問題は基本的にはIISと無関係である。しかしIIS4.0(Windows NT 4.0 Option Pack)をインストールする際に、脆弱性を持ったRDSを含むMDACがデフォルトでインストールされるため、IIS4.0のWebサイトはRDS問題に影響を受ける危険性が高い。もしあなたの管理するIIS Webサーバに "msadc" という仮想ディレクトリが存在するならば、そのサーバはRDS問題を抱えている可能性がある。

 RDSはWebブラウザがIISを介して各種のデータリソース(Accessデータベース、SQLサーバ等)にアクセスする機能を提供する。そのため、RDSのDataFactoryオブジェクトを不正に利用することにより、内部的なデータリソースに対するアクセスがインターネット経由で可能となる。ただし、もちろんリソースに関する内部情報(DSN名称、ログイン名、パスワード等)が必要であるため、攻撃者がそれらを予め知っていることが前提となる。すなわちRDS問題の本質は、「既知の内部リソースへのインターネット経由でのアクセス」であると言える。

 これだけならさほど大きな脅威ではないと感じられるかも知れない。しかしRDS問題とJetデータベースエンジンの脆弱性を併用することにより、Webサーバ上で任意のプログラムを起動することが可能となる。すなわちRDS問題は、IISサーバ上でJet問題を引き起こすための引き金になりうるということだ。


公開された攻撃コード


 RDS問題およびIISサーバ上でのJet問題の詳細については、.rain.forest.puppy.氏が詳細な技術文書をWebで公開している。
 技術文書の中で彼は、この問題を利用したIIS攻撃用のデモンストレーションコード(Perlスクリプト)も公開している。

彼の攻撃コードは、おおむね次のような構造になっている。

  1. msadcs.dllの存在を確認(GET /msadc/msadcs.dll を実行)
  2. btcustmr.mdb(IISのヘルプの一部)への接続を試行
  3. /scripts/tools/makedsn.exeでDSN作成を試行
  4. 一般的な各種DSNに対する接続を試行
  5. 一般的なmdbファイルに対する接続を試行
  6. DSN名称の辞書攻撃


 上記2以降は、RDSを利用して接続することが可能なmdbデータリソースをさまざまな方法を用いて探し出し、それに対するアクセスを試みている。標準的なIISインストールサイトではbtcustmr.mdbが存在するため、3以降のステップが実行されるケースは少ないだろう。さて問題は、mdbデータリソースに対してどのようなアクセスを行なっているか、である。

 前回の記事でも解説した通り、VBA Shell問題の脆弱性を持つJetデータベースエンジンは、データベースクエリの際にOSのコマンドを指定することができる。上記攻撃コードでは、mdbデータリソースに対し、

Select * from Customers where City='|shell("cmd /c コマンド")|'

 といった検索のアクセスを実行している。これにより、指定した「コマンド」がIISサーバ上でシステム権限で起動してしまうことになる。
図2  RDSを利用した攻撃の概念図。IISホスト上で指定した「コマンド」を実行
図2 RDSを利用した攻撃の概念図
IISホスト上で指定した「コマンド」を実行



通常のWebアプリケーションにも問題が


 IISサーバにおけるJetデータベースエンジンの問題は、RDSに関連したものに限らない。mdbファイルにアクセスするようなWebアプリケーションをインターネットで公開している場合、ユーザが入力する検索文字列をそのままSQL文に埋め込んでしまうと、任意のプログラムが起動してしまう危険性がある。
search.asp
ASPサンプルコード(フォーム入力をチェックしていないため危険)
<html>
<head><title>Search</title></head>

<body>

<%
if Request.Form="" then
%>

<h2>Search</h2>

<form method="POST" action="search.asp">

Enter word: <input type="text" name="word" size=50><p>

<input type="submit" value="search"><input type="reset" value="reset">

</form>

<%
else
word=Request.Form("word")
%>

<h2>Results</h2>

Word: <% = word %><p>

<%

dim db
dim rs
dim sql
set db=Server.CreateObject("ADODB.Connection")
db.Open "btcustmr"
sql="select * from Customers where City='" & word & "'"
set rs=db.Execute(sql)

do while not rs.EOF
Response.Write rs("City") & "<p>"
rs.MoveNext
loop

db.Close
set rs=Nothing
set db=Nothing
%>
<%
end if
%>

</body>
</html>
リスト1


 リスト1は、検索文字列をフォーム入力し、mdbファイル(\WINNT\Help\iis\htm\tutorial\btcustmr.mdbをシステムDSN「btcustmr」として登録)を検索する簡単なASPサンプルコードである。このASPファイルにWebブラウザからアクセスして、検索文字列を入力するフィールドに対し、

|shell("cmd /c echo aaa > c:\aaa.txt")|

 と入力してみる。
図3  ASPサンプルコードに対するアクセス例。Cドライブ上にファイルを作成する
図3 ASPサンプルコードに対するアクセス例
Cドライブ上にファイルを作成する


するとIISサーバ上に c:\aaa.txt というファイルが生成される。すなわちIISはJetデータベースエンジンに、

Select * from Customers where City='|shell("cmd /c echo aaa > c:\aaa.txt")|'

 という検索を指示し、Jetはshell関数を呼び出して "cmd /c echo aaa > c:\aaa.txt" を実行するのである。
図4  ASPサンプルコードを利用した攻撃の概念図
図4 ASPサンプルコードを利用した攻撃の概念図


このサンプルコードでは単純に "City='....'" という検索条件だが、例えば "City like '%.....%'" といった検索であったとしても入力文字列を工夫することでshell関数を呼び出させることは可能である。

 これはJetデータベースエンジンの問題であると同時に、Webアプリケーションの問題でもある。ユーザがフォーム入力する文字列をそのまま受け入れて処理することは、この例に限らず危険な場合が多い。基本的にすべてのフォーム入力文字列は、不正なコードが含まれていないかどうかをアプリケーションでチェックすべきである。


効果的な対策方法


 RDS問題の対策は、RDSの機能を使用しないのであれば単純である。IISサーバからRDSを削除すればよい。MS99-025のFAQにはこの場合の対策として、

/msadc 仮想ディレクトリを削除する

 または

 次のレジストリキーを、IISサーバーから削除する

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
    W3SVC\Parameters\ADCLaunch\RDSServer.DataFactory
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
    W3SVC\Parameters\ADCLaunch\AdvancedDataFactory
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
    W3SVC\Parameters\ADCLaunch\VbBusObj.VbBusObjCls
 と書かれている。不必要なデフォルト仮想ディレクトリを削除するのはIISの場合、基本と言える。その基本に忠実である限り、RDS問題は発生しない。

 IISサーバ上でRDSの機能を使用する場合はMDACを2.0以上にアップグレードし、レジストリを設定して「セーフモード」を有効にする必要がある。詳細はMS99-025のFAQを参照していただきたい。

 さて問題はJetデータベースエンジンの脆弱性である。RDS問題の対策を適切に施したとしても、Jetデータベースエンジンを使用する(すなわちAccessデータベースを利用する)ようなWebアプリケーションが存在し、かつユーザが入力する文字列を基にしてSQL文を構築しているような場合、JetのVBA Shell問題の影響を受ける危険性がある。

 基本は前述した通り、サーバ側のWebアプリケーション(ASP等)でユーザ入力文字列をチェックすることであろう。受け入れるべき文字コードのみを受け入れる、あるいは危険な文字コードを排除するといったロジックを組み入れる必要がある。マイクロソフトが提供しているIIS4.0のセキュリティチェックリストにも「ASP コードの <FORM> 入力をチェックする」の項で触れられている。

 一般に出回っている市販あるいはフリーのWebアプリケーション(Web掲示板等)の中にも、この問題の影響を受けるものがあるかも知れないので、使用に先立って確認する必要があるだろう。Webアプリケーションを修正して入力文字列をチェックすることが困難な場合(バイナリ提供のアプリケーション等)は、前回の記事で紹介したOffice ODBC問題の修正モジュールをIISサーバに適用することで基本的にはJet問題を回避することができる。

 繰り返しになるが、今回解説したRDS問題およびJet問題はリモートから任意のプログラムを起動させることが可能であり、また実際に動作するコードや手法が広く知られているため、非常に危険である。特にJet問題についてはWebアプリケーションに依存するため、自サイトが影響を受けるかどうか、未確認である場合が多いのではないだろうか。AccessデータベースにアクセスするようなWebアプリケーションをお使いのサイト管理者は、今一度ソースコードを確認されたい。

 なおIIS4.0のセキュアなインストール方法については、Port139の伊原氏がWebサイトで公開しておられるIIS 4.0 インストール。マイクロソフトのIIS4.0セキュリティチェックリストと併せて参照されることをお勧めする。


2000年12月執筆
セントラル・コンピュータ・サービス株式会社
塩月 誠人