サンプルの ASP コードがサーバー ファイルを表示するのに利用される

概要

この資料は、IIS 4.0 に含まれるサンプルコードにより、IIS コンピュータ上のスクリプトファイルが、クライアントに公開されてしまう現象について説明したものです。

現象

次の Active Server Page (ASP) サンプル ファイルを Internet Information Server (IIS) 4.0 を実行しているコンピュータにインストールすると、Web の訪問者はこれらのファイルを使用して、インストールされている ASP コードと同じ論理ディスクにある既知のファイルにアクセスしたり、読み取りを行える場合があります。このコードは、これらのファイルに対してシステムのアクセス制御リスト (ACL) を設定することでは保護されません。
  • IIS_DIRECTORY\Iissamples\Exair\Howitworks\Code.asp
  • IIS_DIRECTORY\Iissamples\Exair\Howitworks\Codebrws.asp
  • IIS_DIRECTORY\Iissamples\Sdk\Asp\Docs\Codebrws.asp
  • Program_Files\Common_Files\System\Msadc\Samples\Selector\Showcode.asp
ただし、Web の訪問者はファイルの変更、削除、または追加はできません。

原因

インストールされている ASP コードには、デモンストレーション以外の目的はなく、Web サイトへの訪問者が表示できるファイルを制限しません。

回避策

Showcode.asp、Code.asp、および CodeBrws.asp のすべてのコピーを運用環境のサーバーから削除するか、またはこれらの各ファイルに ACL を設定し、適切なユーザーだけがアクセス可能になるようにします。


: 通常のセキュリティの確保では、Web 訪問者が必要なファイルだけを見ることができ、その他のファイルへのアクセスは拒否されるように設定されているべきです。

解決方法

この問題に対する修正モジュールが弊社 FTP サイトから入手可能ですが、広範に渡るテストが行われていないため、この特定の問題が発生しているシステムにのみ適用してください。


この修正の日本語版のファイル属性は、次のもの以降になっているはずです。


日付 時間 サイズ ファイル名 プラットフォーム
-------------------------------------------------------------------------
99/05/17 09:10a 2,999 code.asp <X86>
99/05/17 10:17a 7,322 CodeBrw1.asp <X86>
99/05/17 10:17a 7,274 CodeBrw2.asp <X86>
99/05/17 09:10a 5,931 showcode.asp <X86>
99/05/17 09:10a 2,999 code.asp <ALPHA>
99/05/17 10:17a 7,322 CodeBrw1.asp <ALPHA>
99/05/17 10:17a 7,274 CodeBrw2.asp <ALPHA>
99/05/17 09:10a 5,931 showcode.asp <ALPHA>
この修正プログラムは、次のインターネット サイトに、Fix2450I.exe (Intel) または Fix2450A.exe (Alpha) として公開されています。

状況

弊社ではこれを Internet Information Server version 4.0 日本語版の問題と認識し、修正モジュールを作成いたしました。

詳細

マイクロソフトでは、お客様に対して、この脆弱性がお使いのシステムに与えるリスクの程度を評価して、修正モジュールをダウンロードしてインストールするかどうかを判断していただくことを強くお勧めします。


この修正モジュールは、Showcode.asp、Code.asp、および CodeBrws.asp が現在のディレクトリにあるファイルのみを表示するように制限することで、この脆弱性を修正します。ただし、ファイル表示機能を提供する必要のない Web サイトの運営者は、Showcode.asp、Code.asp および CodeBrws.asp のすべてのコピーをまとめてサーバーから削除するように選択できます。

これらの ASP ファイルがセキュリティ上のリスクを引き起こす場合がある環境

このセキュリティ問題は、次の条件がすべて満たされている場合に限り発生します。


  • サーバーにサンプル サイトがインストールされている。
  • サンプル サイトが ACL (アクセス制御リスト) で保護されていない。
  • Showcode.asp、Code.asp、および CodeBrws.asp と同じ論理ドライブに、影響を受けやすいデータが存在する。
  • 影響を受けやすいデータを含むファイルが、ACL で "Everyone" ユーザー グループに対して読み取り以上のアクセス権を許可している。
  • 悪意のあるユーザーが、影響を受けやすいデータを含むファイルのパスおよびファイル名を知っている。

修正モジュールのインストール

修正モジュール インストール プログラム (Fix2450I.exe [Intel] および Fix2450A.exe [Alpha]) は、既存の Showcode.asp、Code.asp、および CodeBrws.asp の各ファイルを自動的に置き換えます。


: 修正モジュール インストール パッケージの下にリストされている既定のインストール ディレクトリは、該当するシステムにインストールされたファイルを検索しようとします。修正モジュールをインストールしてから、ディスク全体を検索してこれらのファイルを検索し、これらのファイルのすべてのインスタンスが置き換えられたことを確認してください。IIS 4.0 が既定のディレクトリ以外のディレクトリにインストールされている場合は、該当するファイルをディスク全体で検索して、これらのファイルが削除および置き換えられていることを確認する必要があります。


  • IIS_DIRECTORY\Iissamples\Exair\Howitworks\Code.asp
  • IIS_DIRECTORY\Iissamples\Exair\Howitworks\Codebrws.asp
  • IIS_DIRECTORY\Iissamples\Sdk\Asp\docs\Codebrws.asp
  • Program_Files\Common_Files\System\Msadc\Samples\Selector\Showcode.asp
Internet Information Server 4.0 用のサンプル コードおよび Internet SDK の完全インストールを行うと、Showcode.asp、Code.asp、および CodeBrws.asp のさまざまなコピーが別のディレクトリにインストールされます。そのため、コピーを削除する場合、ディスク全体の検索を行ってすべてのファイルを検索します。


修正された ASP ファイルを配布修正モジュールから手動で抽出するには、次の手順を実行します。


  1. 配布ファイル (Fix2450I または Fix2450A の該当する方を) を一時的な場所にコピーします。.
  2. コマンド プロンプトを開き、そのディレクトリに変更します。
  3. コマンドラインに、"Fix2450I.EXE /T:c:\temp /C" または "Fix2450A.EXE /T:c:\temp /C" の該当する方を入力します。このコマンドによりファイルが c:\temp に抽出されます。
  4. さまざまなインストール ファイルが抽出されますが、該当するファイルは以下のとおりです。
  • Code.asp
  • CODEBRW1.ASP (このファイルは \iissamples\ExAir\HowItWorks ディレクトリにインストールされます。)
  • CODEBRW2.ASP (このファイルは \Iissamples\Sdk\asp\Docs\ ディレクトリにインストールされます。)
  • Showcode.asp
: Showcode.asp、Code.asp、および CodeBrws.asp では、ACL のアクセス権は常に管理者専用、または Web コンテンツ開発者限定のグループに設定されている必要があります。

修正モジュール内のコード変更

Showcode.asp、Code.asp、および CodeBrws.asp の各ファイルは "server.mappath" を、この関数に渡されるものに関する制限なしに使用します。Showcode.asp、Code.asp、および CodeBrws.asp は、ユーザーがパスおよびファイル名を入力するのを許可するので、悪意のあるユーザーが保護されていない (ACL が設定されていない) Showcode.asp、Code.asp、および CodeBrws.asp と同じ論理ディスクの既存ファイルに対して、アクセスしたり、読み取り (読み取り専用) を行うことができます。


Code.asp に追加されたコードは次のとおりです。


(注 : コードの行は折り返されている場合があります)

   <SCRIPT LANGUAGE=VBScript RUNAT=Server>
REM **************************************
REM intended behavior:
REM allow access to only .asp, .htm, .html, .inc files
REM in some directory starting from /IISSAMPLES
REM and without .. in the path
REM **************************************
FUNCTION fValidPath (ByVal strPath)
If InStr(1, strPath, "/iissamples/", 1) Then
' the beginning of the string looks good
Dim dwLen
Dim SomeKnownExtension
SomeKnownExtension = false
dwLen = Len(strPath)
If Not SomeKnownExtension Then
If InStr(dwLen-5,strPath,".html",1) Then
SomeKnownExtension = true
End If
End If
If Not SomeKnownExtension Then
If InStr(dwLen-4,strPath,".htm",1) Then
SomeKnownExtension = true
End If
End If
If Not SomeKnownExtension Then
If InStr(dwLen-4,strPath,".asp",1) Then
SomeKnownExtension = true
End If
End If
If Not SomeKnownExtension Then
If InStr(dwLen-4,strPath,".inc",1) Then
SomeKnownExtension = true
End If
End If
If Not SomeKnownExtension Then
fValidPath = 0
Exit Function
End If
' now the most important part: look for ..
If InStr(1,strPath,"..",1) Then
fValidPath = 0
Else
fValidPath = 1
End If
Else
fValidPath = 0
End If
END FUNCTION
</SCRIPT>
次のコードが Code.asp から削除されました。


(注 : コードの行は折り返されている場合があります)
< ' Function to determine if a file exists
Function FileExists(Source)
On Error Resume Next

strFilename = Server.MapPath(Source)
Set FileObject = Server.CreateObject("Scripting.FileSystemObject")

FileExists = False

' Attempt to open the file
Set oTempStream = FileObject.OpenTextFile(strFilename, 1, FALSE, TRUE )
If Err = 0 Then FileExists = True
End Function
%>
次のコードが ShowCode.asp に追加されました。


(注 : コードの行は折り返されている場合があります)
   REM *************** NOTICE ****************
REM * This file may only be used to view *
REM * source code of .asp files in the *
REM * AdvWorks or ASP Sample directory. *
REM * If you wish to change the security *
REM * on this, modify or remove this *
REM * function. *
REM ***************************************

REM **************************************
REM intended behavior:
REM allow access to only .asp, .htm, .html, .inc files
REM in some directory starting from /Msdac
REM and without .. in the path
REM **************************************

FUNCTION fValidPath (ByVal strPath)
If InStr(1, strPath, "/Msadc/", 1) Then
' the beginning of the string looks good
Dim dwLen
Dim SomeKnownExtension
SomeKnownExtension = false
dwLen = Len(strPath)
If Not SomeKnownExtension Then
If InStr(dwLen-5,strPath,".html",1) Then
SomeKnownExtension = true
End If
End If
If Not SomeKnownExtension Then
If InStr(dwLen-4,strPath,".htm",1) Then
SomeKnownExtension = true
End If
End If
If Not SomeKnownExtension Then
If InStr(dwLen-4,strPath,".asp",1) Then
SomeKnownExtension = true
End If
End If
If Not SomeKnownExtension Then
If InStr(dwLen-4,strPath,".inc",1) Then
SomeKnownExtension = true
End If
End If
If Not SomeKnownExtension Then
fValidPath = 0
Exit Function
End If
' now the most importan part: look for ..
If InStr(1,strPath,"..",1) Then
fValidPath = 0
Else
fValidPath = 1
End If
Else
fValidPath = 0
End If
END FUNCTION

</SCRIPT>

次のコードが CodeBrws.asp に追加されました。


(注 : コードの行は折り返されている場合があります)
   REM **************************************
REM intended behavior:
REM allow access to only .asp, .htm, .html, .inc files
REM in some directory starting from /IISSAMPLES
REM and without .. in the path
REM **************************************

FUNCTION fValidPath (ByVal strPath)
If InStr(1, strPath, "/iissamples/", 1) Then
' the beginning of the string looks good
Dim dwLen
Dim SomeKnownExtension
SomeKnownExtension = false
dwLen = Len(strPath)
If Not SomeKnownExtension Then
If InStr(dwLen-5,strPath,".html",1) Then
SomeKnownExtension = true
End If
End If
If Not SomeKnownExtension Then
If InStr(dwLen-4,strPath,".htm",1) Then
SomeKnownExtension = true
End If
End If
If Not SomeKnownExtension Then
If InStr(dwLen-4,strPath,".asp",1) Then
SomeKnownExtension = true
End If
End If
If Not SomeKnownExtension Then
If InStr(dwLen-4,strPath,".inc",1) Then
SomeKnownExtension = true
End If
End If
If Not SomeKnownExtension Then
fValidPath = 0
Exit Function
End If
' now the most importan part: look for ..
If InStr(1,strPath,"..",1) Then
fValidPath = 0
Else
fValidPath = 1
End If
Else
fValidPath = 0
End If
END FUNCTION
</SCRIPT>

Showcode.asp、Code.asp、および CodeBrws.asp と関連する MSDN サンプルの目的

Showcode.asp、Code.asp、および CodeBrws.asp の目的は、Web コンテンツ開発者に、サンプル サイトを機能させるコードを提示することです。この種類の機能は、MSDN サイトの Web 作成者のワークショップ (http://msdn.microsoft.com/workshop/c-frame.htm#/workshop/author/default.asp) でも使用されています。


コンテンツをサンプル サイトの 1 つに基づいて作成している場合は、コードを Showcode.asp、Code.asp、および CodeBrws.asp にロードするボタン (リンク) を削除して表示します。

運用サーバーへのサンプルおよびドキュメントのインストール

Internet Information Server 4.0 ユーザーの多くは、ドキュメントをインストールしないのと同様に、サンプル サイトを運用サーバーにインストールしません。これらは消費するディスク領域が増えるため、通常は運用サーバーでは必要ありません。単なるサンプルであることから、運用環境では安全でない場合があります。


サンプルを運用サーバーに含める必要がある場合は、アクセス権を開発者に限定することを考慮してください。

その他の参考資料

この問題の詳細については、次を参照してください。
Microsoft Security Bulletin MS99-013, "Patch Available for ViewCode.asp Vulnerability" (The Web-posted version of this bulletin),
http://www.microsoft.com/technet/security/Bulletin/MS99-013.mspx
マイクロソフト製品のセキュリティに関する詳細については、次のサイトを参照してください。

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID
232449 (最終更新日 2000-08-02) をもとに作成したものです。


プロパティ

文書番号:232449 - 最終更新日: 2007/08/14 - リビジョン: 1

フィードバック