[HOWTO] CSSI の脆弱性に関する MTS/ASP コードの点検

この記事は、以前は次の ID で公開されていました: JP253121
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
概要
この資料では、クロスサイト スクリプティングのセキュリティ問題 (CSSI) の影響を受けるおそれがある、Microsoft Transaction Server および Active Server Pages (ASP) のアプリケーションを発見および修正する方法について説明します。入力が正しく検証され、正しい書式設定が行われていれば、アプリケーションを攻撃から守ることができます。
詳細
CSSI の問題は、アプリケーションによるデータ検証と書式設定の処理方法に起因するため、プレゼンテーション層から検査していくのが最適です。

この層は通常、ASP ページで構成されます。また場合によっては、ASP ページの HTML 表示を支援するコンポーネントがいくつか含まれることもあります。

後者の場合、アプリケーションを CSSI から守るために、ASP のみのアプリケーションと同じ操作を実行する必要がありますが、その物理的な実装が原因で、検証や書式設定を行うコードの一部は、ASP ページや、コンポーネントの内部で実行される点に注意することが重要です。CSSI と ASP の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
253119 HOWTO: Review ASP Code for CSSI Vulnerability
CSSI の影響を受けるおそれがある ASP アプリケーションを発見および修正するには、次の手順が有効です。
  1. 表示される HTML を生成する、ASP やコンポーネントのコードを探します。一般的には、次の 2 つのケースがあります。
    • コンポーネントが HTML 文字列を作成して返し、それを ASP がResponse オブジェクトに直接書き込む。
    • コンポーネントが Response.Write を内部で呼び出して、ページに直接書き込む。通常、Response オブジェクトの参照は、GetObjectContext.Item("Response") を呼び出すことにより、ObjectContext から取得されます。
  2. HTML 出力にアプリケーションのデータが含まれるかどうかを判断します。このデータは、データベース、ファイル、Cookie、ほかのオブジェクト変数など、さまざまなデータ ソースから取得されたものです。
  3. 適切な解決方法を決定します。何らかの入力を使って HTML を生成する ASP やコンポーネントのコードを見つけた場合は、その特定のアプリケーションに応じた適切な解決方法を決定する必要があります。解決方法としては、無効なデータの検証と選別や、データのエンコードなどがあります (これら以外にも解決方法はあります)。

書式設定の指針

書式設定を注意して行わなければならない個所を特定する際に、次の指針が参考になります。

情報をページに書き込む際、特定のアプリケーション データには HTMLEncode を実行する必要があります。HTML ページにそのまま出力することが意図されたタグについては、HTMLEncode を実行しないことが重要です。このため、コンポーネントの関数が HTML を返す場合、HTMLEncode はその内部で実行する必要があります。

コンポーネントからの文字列に対して HTMLEncode を実行するには、ASP サーバー オブジェクトへの参照が必要になります。この参照は、MTS の ObjectContext.Items コレクションから取得することができます。
sGoodHTML = GetObjectContext.Item("Server").HTMLEncode(sRawData)

: 次のコードは、レコードセットから取得した値を使って、表の行を生成します。このコードでは、出力がエンコードされません。
Do While Not oRecordset.EOF     sHTML = sHTML & "<TR>"      sHTML = sHTML & "<TD>" & oRecordset("FirstName") & "</TD>"     sHTML = sHTML & "<TD>" & oRecordset("Address") & "</TD>"     sHTML = sHTML & "</TR>" Loop
このコードを修正する場合は、次のように、全体の HTML 文字列ではなく、個々の値に HTMLEncode を実行する点に注意してください。
Dim oServer As ASPTypeLibrary.ServerSet oServer = GetObjectContext.Item("Server")Do While Not oRecordset.EOF     sHTML = sHTML & "<TR>"      sHTML = sHTML & "<TD>" & oServer.HTMLEncode( oRecordset("FirstName")) & "</TD>"     sHTML = sHTML & "<TD>" & oServer.HTMLEncode( oRecordset("Address")) & "</TD>"     sHTML = sHTML & "</TR>" LoopSet oServer = Nothing
中間に oServer オブジェクト参照を使用している点に注意してください。これは、アーリーバインディングを利用して、毎回 ObjectContext.Item の参照を解決しなくても済むようにするためのものです。オブジェクトを ASPTypeLibrary.Server として宣言するには、[Microsoft Active Server Pages Object Library] への参照設定を含める必要があります。

次の指針を考慮するようにしてください。
  • ビジネス コンポーネントでは、HTMLEncode を呼び出さないでください (それらが HTML を生成している場合を除きます)。これは、プレゼンテーション層の仕事です。
  • 一般に、HTMLEncode や何らかの ASP オブジェクトを使用するコンポーネントは、物理的に Internet Information Server (IIS) と同じコンピュータ上で実行する必要があります。
  • 解決方法としては、入力パラメータの検証や、入力パラメータの書式設定などがあります (ただし、これらに限りません)。
関連情報
関連情報については、Carnegie Mellon University の Computer Emergency Response Team (CERT) による、次の勧告を参照してください。関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
252985 HOWTO: Prevent Cross-Site Scripting Security Issues For Web Applications
253119 HOWTO: Review ASP Code for CSSI Vulnerability
253120 HOWTO: Review Visual InterDev Generated Code for CSSI Vulnerability
253117 HOWTO: Prevent Internet Explorer and Outlook Express CSSI Vulnerability
253117[IE51] クロスサイト スクリプト問題の予防策

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

kbCSSI
プロパティ

文書番号:253121 - 最終更新日: 02/06/2014 01:25:31 - リビジョン: 1.0

  • Microsoft Transaction Services 2.0
  • kbnosurvey kbarchive kbcssi kbhowto KB253121
フィードバック