攻撃の防止

目次
casso11jp
目次
クロスサイト スクリプティングからの Web サイトの保護
クロスサイト スクリプティング(CSS)攻撃が発生するのは、ブラウザからの入力テキスト(通常は、ポストされたデータ、または URL 内のクエリ パラメータから得られたデータ)がブラウザによって表示される場合です。このとき、有効で実行可能なスクリプトを形成することが可能な文字を、フィルタ処理なしでブラウザ内で表示してしまうことが問題です。
疑いを抱いていないユーザに対して、攻撃用 URL を提示できます。ユーザがその URL をクリックした場合、アプリケーションはブラウザに対して表示を返すことがあります。その表示の中には、入力文字と共に、クエリ文字列の中に含まれている無効な文字に関するエラー メッセージがあります。ブラウザ上でこれらのパラメータに関する表示が実施された場合、望まれていなかったスクリプトがそのブラウザ上で実行される事態が発生する可能性があります。
たとえば、検索エンジンの Web ページでユーザが「news」と入力した場合、アプリケーションは通常、空白のフィールド、または以下のような応答を返すことがあります。
Your search for news returned the following:
攻撃用 URL への応答として、ブラウザは次のような応答を受け取ることがあります。
news<script>BadProgram</script>
二重引用符(")が ASCII 文字として入力された場合、BadCSSChars パラメータはそれを解釈しません。二重引用符を無効なクロサイト スクリプティング文字として含める場合は、ASCII 文字と同等の 16 進数値である %22 を入力します。例: <nete:proxyrules xmlns:nete="http://www.ca.com/" debug="yes">
BadCSSChars="%22"
Web エージェント FCC ページのクロスサイト スクリプティング攻撃の防止
Web エージェント FCC ページに対するクロスサイト スクリプティング攻撃を防ぐには、FCC 変数データが正しく表示されるように HTML エンコーディングを使用します。
HTML エンコーディングでは、文字が HTML 構文ではなく、そのリテラル値として扱われます。エンコーディングにより、有害なクロス サイト スクリプティング構文は、表示するリテラル テキストとして描画され、HTML フォームの描画中にブラウザによってコードが実行されないようになります。攻撃時に悪用される可能性のあるすべての構文をエンコードできます。
fcchtmlencoding パラメータは、以下の構文がある FCC 変数に挿入されたすべての値に HTML エンコーディング アルゴリズムを適用するようにエージェントに指示します。
$$varname$$
従来ブロックされている文字が FCC データで必要な場合は、fcchtmlencoding パラメータを有効にします。
  • fcchtmlencoding
    Web エージェント FCC ページに対するクロスサイト スクリプティング攻撃を防ぐために、HTML エンコーディングを有効にするかどうかを指定します。このパラメータは文字をブロックしません。
    値:
    Yes および No
    デフォルト:
    No
fcchtmlencoding パラメータは、すべての FCC フォームのすべての変数置換に適用されます。このパラメータを使用するエージェントは、1 つ以上の FCC フォームに対応できます。
FCC 変数に挿入された値の特定の文字に HTML エンコーディングを適用するには、以下のパラメータを使用します。
  • fcchtmlencodingchars
    特定の文字値を取得し、HTML エンコーディングを適用し、実際の値を FCC ファイル内のエンコードされた値に置き換えます。
重要:
fcchtmlencodingchars パラメータを使用するには、fcchtmlencoding パラメータを no に設定する必要があります。
FCC ファイル内の特定の変数に HTML エンコーディングを適用するには、以下の関数を使用します。
  • HTMLENCODE
    特定の変数値を取得し、HTML エンコーディングを適用し、実際の変数値を FCC ファイル内のエンコードされた値と置き換えます。
HTMLENCODE 関数の構文は、以下のとおりです。
$$htmlencode(varname)$$
クロスサイト スクリプティングをチェックするための Web エージェントの設定
URL に実行可能なスクリプトの一部になる可能性のある文字があるかどうかを確認するように Web エージェントに指示するには、以下のエージェント設定パラメータを[Yes]に設定します。
CSSChecking
このパラメータを有効にすることによって、クエリ文字列が含まれる完全な URL に以下のデフォルト文字セットのエスケープされたバージョンとエスケープされないバージョンがあるかどうかスキャンするように、Web エージェントを設定します。
    • 左山形かっこと右山形かっこ(< および >)
    • 引用符(')
デフォルト:
Yes
有効なターゲット ドメインの定義
悪意のある Web サイトにユーザをリダイレクトするフィッシング攻撃からリソースを保護するように エージェントを設定するには、以下の設定パラメータを設定します。
ValidTargetDomain
認証情報コレクタがユーザをリダイレクトすることを許可されるドメインを指定します。URL 内のドメインがこのパラメータ内で設定されたドメインに一致しない場合は、リダイレクトが拒否されます。
デフォルト:
No
フォーム クレデンシャル コレクタ(FCC)を含むすべての高度な認証方式が、このパラメータをサポートします。
ValidTargetDomain パラメータは、処理の間にターゲットの有効なドメインを識別します。ユーザをリダイレクトする前に、エージェントはリダイレクト URL の値と、このパラメータ内のドメインを比較します。このパラメータがない場合、エージェントはユーザをどのようなドメイン内のターゲットにもリダイレクトさせます。
ValidTargetDomain パラメータには、有効なドメインごとに 1 つの値を設定し、複数の値を含めることもできます。
ローカル エージェント設定では、以下の例のように、各ドメインについて、1 行に 1 つのエントリを指定します。
validtargetdomain=".xyzcompany.com"
validtargetdomain=".abccompany.com"
クロスサイト スクリプティング攻撃からの J2EE アプリケーションの保護
攻撃者が要求に非標準(長過ぎる) Unicode 文字を使用することにより、クロス サイト スクリプティング保護をバイパスするのを防ぐことができます。
以下の手順に従います。
  1. CSSChecking パラメータの値を yes に設定します。
  2. 以下のパラメータの値を yes に設定します。
    • DisallowUTF8NonCanonical
      攻撃者が要求に非標準(長過ぎる) Unicode (utf-8)文字を使用することにより、クロス サイト スクリプティング保護をバイパスするのを防ぎます。このパラメータの値が yes の場合、エージェントは非標準(長過ぎる) Unicode 文字が含まれる URL 要求をブロックします。
      デフォルト:
      Yes
CSS のデフォルト文字セットの上書き
デフォルトでは、エージェントは以下のデフォルトのクロス サイト スクリプティング文字セットを確認します。
  • 左山形かっこと右山形かっこ(
    <
    および
    >
  • 一重引用符(
    '
デフォルトの文字セットを上書きするには、BadCSSChars パラメータを使用します。
BadCSSChars
デフォルトのクロス サイト スクリプティングの代わりに独自の文字セットを使用します。希望する文字すべてからなる文字列全体を入力してください。
デフォルト:
 <,',> (文字はカンマで区切ります)
例:
<,> (この例では、エージェントは左山形かっこと右山形かっこのみを検索します)
値:
一連の文字を入力します。
制限:
以下のガイドラインに注意してください。
    • 文字の最大数は 4096 で、区切り文字であるカンマを含みます。
    • 文字の範囲をハイフンで区切って指定します。構文は
      starting_character
      -
      ending_character
      です。たとえば、文字の範囲として「
      a-z
      」と入力できます。
    • 二重引用符が(")が ASCII 文字として入力された場合、BadCSSChars パラメータはそれを解釈しません。二重引用符を無効なクロスサイト スクリプティング文字として含める場合は、ASCII 文字と同等の 16 進数値である %22 を入力します。例: BadCSSChars="%22" 
エージェントが文字セットに関する問題を検出すると、アクセス拒否メッセージをユーザに返し、エージェント エラー ログに以下のメッセージを記録します。
Caught Possible Cross Site Scripting Violation in URL. Exiting with HTTP 403 ACCESS FORBIDDEN.
一部のアプリケーションは、Web サーバ プラットフォームに関係なく、クエリ文字列の中で引用符を使用することを必要とします。たとえば、iNotes Web Access のような一部の Domino アプリケーションでは、一重引用符の使用を必要とします。
クエリ文字列内に引用符を必要とするアプリケーションを使用するには、BadCssChars パラメータから引用符を削除してください。
無効なクエリ文字の指定
URL のクエリ文字列部分に特定の文字を禁止するには、以下のパラメータを設定します。
BadQueryChars
Web エージェントによって、URL のクエリ文字列部分('?' の後)で禁止される文字を指定します。
デフォルト:
空(クエリ文字列に禁止される文字はありません)
制限:
デフォルトの 16 進数は、英文字に適用されます。その他の言語については、許可する言語の文字に対応する 16 進数をすべて削除します。対象となる言語(ただしこれらに限定されません)には、ポルトガル語(ブラジル)、フランス語、日本語、および中国語などがあります。
文字は実際にその文字を入力して指定できます。さらに、その文字の URL エンコード形式を入力することもできます。たとえば、文字 a を入力するか、または、そのエンコード値である %61 を入力できます。
最大 4096 文字まで指定できます(区切り文字として使用するカンマを含みます)。
文字の範囲をハイフンで区切って指定することもできます。構文は
starting_character
-
ending_character
です。たとえば、一連の文字として「a-z」と入力できます。
引用符(")を %22 の URL エンコード値で指定します。ASCII は使用
できません
例:
%25 は、クエリ内の URL エンコード文字をブロックします。
Web エージェントは、URL のクエリ文字列内の文字を BadQueryChars パラメータに定義された文字の ASCII 値と比較することにより、クエリ文字列に禁止された文字が含まれているかどうかを検索します。たとえば、以下のように処理されます。
  1. BadQueryChars パラメータに、以下に示すパーセント記号(%)の URL エンコード値が含まれているとします。
    %25
  2. Web エージェントは、以下のクエリ文字列が含まれる HTTP リクエストを受信します。
    xxx=%0d
  3. Web エージェントでは前述の例にある URL を検査しますが、URL エンコード値はデコード
    しません
    。たとえば、Web エージェントによって前述の例(手順 2)がキャリッジ リターン
    ではなく
    リテラル文字列 %0d として解釈されます。
  4. Web エージェントは BadQueryChars パラメータの値を検索し、それらを ASCII 値に変換します。たとえば、手順 1 の %25 はパーセント記号(%)に変換されます。
  5. Web エージェントは、URL 内の各文字を、BadQueryChars パラメータからデコードされた ASCII 値と比較します。
  6. その結果、ASCII パーセント記号(%)が以下の両方の場所に存在するため、Web エージェントによってリクエストがブロックされます。
    • URL のクエリ文字列
    • BadQueryChars パラメータのデコードされた(ASCII)値
クエリ文字列から特定の文字をブロックするには、BadQueryChars パラメータの値にブロックする文字を含めます。
無効な URL 文字の指定
URL リクエストの一部として使用できない一連の文字を指定することができます。それらの文字は、エージェントにより、無効な URL 文字として扱われます。このリスト内で指定されている文字または文字列を含む URL リクエストは、Web エージェントによって拒否されます。URL のうち、「?」文字より前の部分に対して、このチェックが実施されます。悪意のある Web クライアントがそのような文字を使用して
Single Sign-On
ルールを回避する場合があるので、Web エージェントはそのような文字が含まれる URL リクエストを拒否します。
Web エージェントが無効な URL 文字を含んでいる URL リクエストを拒否する場合、Web サーバは以下のメッセージのいずれかで応答します。
  • 内部サーバ エラー
  • Web ページが見つからないエラー(404)
エージェントが要求をどのように処理するかについては、Web エージェント ログを確認してください。
以下のパラメータを使用して文字を指定します。
BadUrlChars
URL リクエストに使用できない文字シーケンスを指定します。Web エージェントはこのパラメータ内のリストに対して、「?」文字の前にある URL 内の文字を確認します。指定された文字のいずれかが見つかった場合、Web エージェントは要求を拒否します。
以下の文字を指定できます。
    • 円記号(\)
    • ダブルスラッシュ(//)
    • ピリオドとスラッシュ(./)
    • スラッシュとピリオド(/.)
    • スラッシュとアスタリスク(/*)
    • アスタリスクとピリオド(*.)
    • ティルダ(
      ~
    • %2d
    • %20
    • %00-%1f
    • %7f-%ff
    • %25
複数の値はカンマで区切ります。スペースは使用
しないでください
無効な URL 文字は、その前に疑問符(?)が付いている場合にのみ、CGI パラメータの中で使用できます。
デフォルト:
無効(すべての文字が許可されます)。
制限:
  • デフォルトの 16 進数は、英文字に適用されます。その他の言語については、許可する言語の文字に対応する 16 進数をすべて削除します。対象となる言語(ただしこれらに限定されません)には、ポルトガル語(ブラジル)、フランス語、日本語、および中国語などがあります。
  • 文字は実際にその文字を入力して指定できます。さらに、その文字の URL エンコード形式を入力することもできます。たとえば、文字 a を入力するか、または、そのエンコード値である %61 を入力できます。
  • 最大 4096 文字まで指定できます(区切り文字として使用するカンマを含みます)。
  • 文字の範囲をハイフンで区切って指定することもできます。構文は
    starting_character
    -
    ending_character
    です。たとえば、一連の文字として「a-z」と入力できます。
  • 引用符(")を %22 の URL エンコード値で指定します。ASCII は使用
    できません
無効な URL 文字を指定するには、BadURLChars パラメータの値をブロックする文字が含まれるように編集します。
注:
Apache 2.0 リバース プロキシ サーバおよび Outlook Web Access(OWA)を設定する際は、必ず BadURLChars パラメータをオフにしてください。OWA では、電子メール件名中の文字が、BadURLChars パラメータでリストされていたとしても、無制限に許可されてしまうからです。
不正な形式の文字の有効化
クロスサイト スクリプティング攻撃では一般に以下の文字が使用されます。
  • 左山形かっこと右山形かっこ(< と >)
  • アンパサンド(&)
  • 引用符(")
認証のチャレンジ中に、ユーザへのフォームの表示にスクリプト コードを使用する場合は、以下のパラメータを有効にして、任意の特殊文字を HTML フォームに送信する前に、それらをブロックするように Web エージェントを設定します。
 
BadFormChars
フォーム上で出力としてそれらを使用する前に、Web エージェントでブロックする文字を指定します。有効かつ URL のエージェント名部分にこのパラメータで指定される 1 つ以上の文字がある場合、ログイン ページは以下のエラー メッセージを返します。
Internal Server Error
デフォルト:
無効(文字はブロックされません)
例:
<、>、&、%22
制限:
これらの文字はそのまま指定できます。
 
    • 最大 4096 文字まで指定できます(区切り文字として使用するカンマを含みます)。
    • 文字の範囲をハイフンで区切って指定することもできます。構文は starting_character-ending_character です。たとえば、一連の文字として「a-z」と入力できます。
    • 引用符(")を %22 の URL エンコード値で指定します。ASCII は使用できません。
以下の手順に従います。
  1. 管理 UI にログインします。
  2. このパラメータを有効にするエージェント設定オブジェクトを開きます。
  3. BadFormChars パラメータを先頭の # 文字を削除することによって有効にします。
    BadFormChars パラメータは、デフォルト値で有効になっています。
  4. (任意)使用しないすべての文字をリストから削除します。他の文字もこのリストに追加できます。文字が互いにカンマで区切られていることを確認します。
DNS サービス拒否攻撃の防御支援
IP アドレスに誤りのある有効な HTTP 要求を Web サーバが受信した場合、Web エージェントはその IP アドレスを完全修飾ドメイン名に解決しようとします。HTTP 要求のボリュームが大きい場合、サービス妨害状態が Web エージェントと、場合によっては DNS サーバに影響を与える可能性があります。以下のパラメータは、Web エージェントが DNS 参照を実行するかどうかを制御します。
DisableDNSLookup
Web エージェントが DNS の検索を実行することを防ぎます。これには、リバース(IP から FQDN)とフォワード(FQDN から IP)の両方の DNS ルックアップが含まれます。
デフォルト
: No
以下の手順に従います。
  1. DisableDNSLookup パラメータが s で終了
    しない
    ことを確認します。ACO テンプレートおよび LocalConfig.conf ファイルの旧バージョンの一部にはこのエラーが含まれている可能性があります。正しいパラメータは p で終了します。
  2. DisableDNSLookup パラメータの値を yes に設定します。
重要:
このパラメータの値が yes に設定された場合、Cookie ベースの機能が正しく動作するためには完全修飾ドメイン名が必要です。
拡張子のないリソースの保護
不正なユーザが拡張子のないリソースへのアクセスを取得するのを防ぐために、以下のパラメータを使用することができます。
OverrideIgnoreExtFilter
Web エージェントがすべての URI と比較する目的で使用するために、複数の文字列から成る 1 つのリストを指定します。これは、通常は拡張子が Web エージェントによって無視されるリソース、または拡張子のないファイルやアプリケーションの保護に役立ちます。URI がリスト内の文字列の 1 つと一致する場合、Web エージェントはポリシー サーバへの問い合わせを行い、そのリソースが保護されているかどうかを決定します。
パスを厳密に指定するのではなく一般的な文字列を指定することをお勧めします。一群のリソースを保護するために部分的な文字列を含めることもできます。たとえば、指定された文字列が /servlet/ の場合、以下のリソースが保護されます。
  • /dira/app1/servlet/app
  • /dirb/servlet/app1
  • /dirc/mydir/servlet/app2
デフォルト:
デフォルトなし
拡張子のないリソースを保護するには、OverrideIgnoreExtFilter パラメータの値に保護するリソース(期間のない)の文字列を追加します。エージェント設定オブジェクトを使用している場合は、文字列を追加するために複数値オプションを使用します。ローカル設定ファイルを使用している場合は、各文字列を個別の行に追加します。
POST 維持の無効化
POST 維持を使用する必要がない場合は、以下の ACO パラメータを使用して無効にすることができます。
PreservePostData
要求をリダイレクトする場合に Web エージェントが POST データを維持するかどうかを指定します。ユーザが、フォーム認証や証明書認証など、高度な認証を受ける場合、POST データは認証フェーズの間、維持されます。
デフォルト:
Yes
POST 維持を無効にするには、PreservePostData パラメータの値を no に設定します。
アプリケーションのセキュリティ保護
無許可のユーザは、Web エージェントが無視するように設定されている拡張子を含む虚偽のファイル名を URL の最後に追加することができます。追加すると、無許可のユーザがそのリソースにアクセスできるようになります。そのような試行へのアクセスを Web エージェントに拒否させるには、以下のパラメータを使用します。
casso11jp
SecureApps
エージェントが、権限のないユーザからの URL を許可することを防ぎます。Web エージェントが、特定の拡張子で終わるファイルに対するリクエストを無視するように設定されている場合は、偽の URL を作成してリソースにアクセスしようとする攻撃を受ける可能性があります。
たとえば、以下の URL を持つリソースがあるとします。
/scripts/myapp
以下の例のような偽の URL を作成して、アクセス権を取得しようとする攻撃を受ける可能性があります。
/scripts/myapp/junk.jpg
SecureApps パラメータの値が no の場合に、Web エージェントが .jpg ファイルのリクエストを無視するように設定されていると、/scripts/myapp/junk.jpg のリクエストは自動的に許可されます。
SecureApps パラメータの値が Yes に設定されており、URI が拡張子で終わる場合、Web エージェントは、URL が物理リソースにマップされているかどうかを判断します。たとえば、URI が /scripts/myapp/junk.jpg である場合、Web エージェントを Web サーバを呼び出して、URI を物理リソース junk.jpg にマップします。Web サーバがリソースを解決できない場合、エージェントはリクエストをブロックします。リクエストをブロックすることにより、不正な形式の URI を使用してエージェントが誤って /scripts/myapp へのアクセスを許可しないようにします。
デフォルト:
No
カスタム レスポンスが X-Frame Options に準拠していることを確認します
X-Frame-Options の HTTP ヘッダは、<frame> タグを使用して別の Web ページに埋め込まれている Web ページをブラウザがロードするかどうかを決定します。Web アプリケーションで X-Frame-Options レスポンス ヘッダを使用する場合、
XFrameOptions
ACO パラメータを設定することによって、Web エージェントのレスポンス(login.fcc 形式のレスポンスなど)が X-Frame-Options に準拠していることを確認します。このパラメータの値を指定すると、正しい X-Frame-Options ヘッダで Web エージェント レスポンスを設定します。
XFrameOption
XFrameOptions パラメータの利用可能な値は、X-Frame-Options レスポンス ヘッダの値と同じです。
値:
 DENY、SAMEORIGIN、ALLOW-FROM 
uri
X-Frame-Options は、RFC 7024 で記述します。
デフォルト:
なし(ヘッダは設定されません)
例:
XFRAMEOptions = SAMEORIGIN