セキュリティ対策Secure

サーバーの設定やサーバーアプリケーションのバージョンによっては、攻撃が有効にならないものも紹介していますが、重要性の高いデータを扱う際は多重防御の理念を基に違った角度から複数のセキュリティ対策を施すことを前提に紹介しています。

当Webショップで制作されるWebサイトには下記に示すようなセキュリティ対策が標準で施されています。また、多重防御の必要性については個々のケースで検討し施工されます。

クロスサイトスクリプティング

  • WEBアプリケーションのセキュリティ上の不備を利用し、悪意のあるスクリプトを入力フォームなどから混入させ、訪問者、もしくは、他サイトに攻撃をしたり、情報を盗み出すことを言う。入力された文字列を直接ブラウザに表示するのではなく、特殊文字を文字参照化することで一部を除き、防ぐことが出来る。CSS(カスケーディングスタイルシート)と区別するためにXSSと標記されることが多い。

    • クロスサイトスクリプティングへの意識の低さ、また、知識の希薄性から、外部入力値の検証、データベースまたはデータファイルへの書き込み直前のサニタイズ、データをHTMLへ書き出す際のサニタイズを適切に行わないことにより、攻撃者からの悪意ある入力値を実行してしまう結果となる。その攻撃方法は多岐にわたり、ここで紹介している攻撃方法も広義にクロスサイトスクリプティングと言えるものが多く、現在でも新しい攻撃方法が報告されている。ここでのセキュリティ対策は最も重要とされる基本的な対策であり、数多い攻撃の対策として有効である。
    • ページ内で扱うデータがどこから来てどこに向かい、どういった性質を持つデータであるかを常に意識し、データの性質に応じた適切なサニタイズを行う。
    • 外部入力値の有効範囲を限定、想定外の値が入力された場合はエラーとし、処理を継続しない。また、入力値の検証を必ずサーバー側で行う。
    • HTMLに展開されるデータ、または、データベース、データファイルなどに書き込まれるデータは、信頼の置けるデータであっても多重防御の理念の基に外部入力値同等のサニタイズを行う。

ディレクトリトラバーサル

  • 外部からの入力値により、対象のファイルパスを動的に生成する仕組みを狙い、「../」の上位ディレクトリを示す相対表記でディレクトリをさかのぼり、サーバーの非公開領域のフォルダやファイル、また公開領域においても意図していない(リンクの張られていない)ファイルに不正にアクセスする攻撃を言う。適正にサニタイズされていないWebアプリケーションでは、個人情報やパスワードなどの重要ファイルが流出する危険性が高まる。

    • 外部からの入力値、またはHTTPレスポンス経由でのデータを利用し、ファイルパスを生成するWebアプリケーションにおいて、入力値の検証、出力時のサニタイズが適切に施されていない場合、成立する攻撃手法である。
    • 外部からの入力値の使用目的に応じた適切なサニタイズを施す。
    • 対象のファイルパスが限定されているならば、ホワイトリストを作成し、入力値との照合を行う。
    • 入力値が相対パスでないかを検証するため"basename関数"を通してサニタイズする。

ディレクトリリスティング

  • URLにディレクトリ名が指定され、ディレクトリ内にインデックスファイルに相当するファイルが存在しない場合、ディレクトリ・リスティングという機能が働き、内部のファイルがリスト表示される。大変便利な機能ではあるがその中にパスワードや個人情報など機密ファイルが含まれている場合は、非常に危険な状態になる。ファイルのURLが知られてしまうことで強制ブラウジングが容易に行われることになる。機密ファイルは公開ディレクトリに置かないことや、ディレクトリ内には必要がなくても必ず"index.html"を配置するなどの対策が重要である。

    • ディレクトリ内に有効なインデックスファイルが存在せず、サーバーのディレクトリ・リスティング機能が有効な場合に公開を意図しないファイルがリストアップされ、アクセス可能な状態になる。
    • 重要性、または機密性の高いファイルを公開ディレクトリに設置しない。非公開領域のないサーバーに対してはそれに変わる対策を施す。
    • "index.html"の必要のないディレクトリでも空の"index.html"を設置し、ディレクトリ・リスティングの機能を無効化する。
    • ".htaccess"を利用可能なサーバーでは設定によってディレクトリリスティングの機能を停止させる。

強制ブラウジング

  • 公開ディレクトリに置いてあるデータファイルなどを類推されるURL、または、ディレクトリ・リスティングでリストアップされたURLを直接指定し観覧すること。画面上にはリンクが張られておらず、URLを知らなければアクセスできないように思われがちだか、公開ディレクトリに他人に知られてはいけない情報ファイルを置くことは大変危険である。サーバーの構成上、やむを得ず公開ディレクトリにおく場合は、推測が容易なファイル名を避けることや、ディレクトリ・リスティング対策を施すことが大変重要である。

    • 攻撃者は推測されるディレクトリ名、ファイル名をデータ化し、プログラムによって総当り的に攻撃を仕掛けてくる。この時公開領域の推測されるパスがヒットした場合、ファイルの内容が攻撃者の手にわたる事となる。
    • ディレクトリ・リスティング対策を適切に行い、強制ブラウジングに必要なファイル名の流出を防ぎ、攻撃者に有利な情報を与えない。
    • 重要性、または機密性の高いファイルに推測が容易なファイル名を避け、推測が困難なファイル名を用いる。
    • ".htaccess"を利用可能なサーバーでは特定の拡張子のファイルを表示しない設定をする。

クロスサイトリクエストフォージェリ

  • 攻撃対象のサイトをログイン観覧中に攻撃者の仕掛けたサイトにアクセスし、ユーザーの意図しない操作を実行させられてしまう攻撃。ユーザー権限で外部から処理を実行されてしまうため、コミュニティサイトでは意図しない発言が勝手に書き込まれたり、オンラインショップでは記憶にない買い物をさせられていたり、ユーザーとサーバーとの双方で注意が必要な攻撃である。

    • 対策を施していないサーバー(サーバーサイドプログラム)では、サイト内から送られてきたリクエストと外部サイトからのリクエストの区別がつかないため、攻撃サイト経由での不正リクエストを受け付けてしまう。
    • 重要な情報を扱うサイトへログイン中に気付かずに悪意ある外部サイトにアクセスしてしまうことが、原因のひとつである。また、アクセス終了後も長時間ログイン状態を保持するサイトでは、HTMLメールなどに仕掛けられた罠でも攻撃が有効になる場合があるので注意が必要である。
    • 第三者の知りえない、パスワードを発行し、外部サイトとの差分を発生させ、外部からのリクエストはエラーとするなどの対策を講じる。
    • 重要な処理を実行する直前には、再度パスワードなどの入力を求め再認証を行い、外部リクエストからの操作を遮断する。
    • ユーザー側でも、ログイン中は外部サイトのアクセスには注意を払い、アクセス終了後には、ログアウトを心がけるなどの対策が必要である。
    • 悪意あるメールのHTMLメール展開と同時に、プログラムが実行され、条件が整っている場合、クロスサイトリクエストフォージェリ攻撃が成立する。心当たりのないHTMLメールは展開することなく、削除する。

NULLバイト攻撃

  • NULLバイトといわれる特殊な終端記号をリクエストに混入させ、終端記号以降に書かれた悪意あるスクリプトにより、意図しないプログラムを実行させたり、データファイルの構造を破壊する攻撃である。またNULLバイトを利用した攻撃パターンは複数存在し、使用する関数、プログラムの構造を考慮し、対策を施す必要がある。

    • リクエストを処理する際、バイナリーセーフに対応する関数と非対応の関数で、NULLバイト以降の文字列が読み込まれたり、無視されたりする挙動の違いを利用し、不正データをチェックする機能をスルーさせ、攻撃を可能にする。
    • バイナリーセーフに対応していない関数は極力使用せず、使用の際はNULLバイト攻撃を念頭に置き、十分な検証を行う。
    • 入力データがテキストデータに限られる場合は、あらかじめNULLバイトを削除するエスケープ処理を行う。

HTTPレスポンス分割

  • HTTPレスポンスのヘッダ部分に不正に改行コードを混入し、正規のヘッダを強制終了させて、あたかも新しいレスポンスが送信されたかのように見せる攻撃方法である。このレスポンスに悪意あるヘッダと偽のページを記述しておけば、入力したIDやパスワードなど全ての情報が攻撃者に送信される事になり、フィッシング詐欺の常套手段でもある。

    • HTTPレスポンスヘッダへ動的に値を書き換えるようなWebアプリケーションで改行コードを削除するなどの適切なサニタイズ処理が行われていない場合、攻撃が成立してしまう場合がある。
    • HTTPレスポンスヘッダの動的書き換えは、安易に行わず、目的の機能を実現するための他の方法を十分検討する。
    • HTTPレスポンスヘッダへの入力値は"CRLF"の改行コードをエスケープするなどの適切なサニタイズ処理を施す。

OSコマンドインジェクション

  • 外部からサーバーに送られるOSコマンドに不正なコマンドまたはコマンドオプションなどをインジェクション(混入)させ、サーバーのダウン、情報の流出などサーバーが乗っ取られてしまう危険性のある深刻な脆弱性である。

    • WebアプリケーションでOSコマンドに外部からの入力値を適用して送信する際、特殊文字で区切る事により、一行で複数のコマンドを送信できることを利用した攻撃であり、適切な入力チェック、サニタイズが行われていないと攻撃が成立してしまう。
    • 極力OSコマンドを使用したプログラムを組むことは避け、ライブラリ等のOSのシェルに依存しないプログラムが利用できないか十分検討する。
    • OSコマンドを利用する場合は、複数のコマンドが実行されたり、不必要なコマンドオプションが実行されたりすることを防ぐために厳格な入力チェックを行う必要がある。

SQLインジェクション

  • データベースを操作するためのSQL文に不正なSQL文をインジェクション(混入)させ、データの削除、または改ざんなどの外部からのデータベース操作を可能にする攻撃方法である。

    • SQL文を動的に生成するWebアプリケーションにおいて、入力値を特殊文字で区切り、複数のSQL文をインジェクションさせ、データの削除、改ざん、表示などが実行可能になる。また、条件式を追加することによって、意図しないデータを表示したりするなどと言った攻撃方法も存在する。
    • SQL文への入力値の厳格なチェックを行い、想定できる範囲外の値はエラーとし、SQL文の実行を中断する。
    • SQL文特殊文字のエスケープなど、複数のSQL文や条件式の追加が出来ないように適切なサニタイズを行う。

セカンドオーダーSQLインジェクション

  • データベースを経由したSQLインジェクション。SQL文を動的に生成するWebアプリケーションにおいて外部からの入力値は勿論、データベースなどの内部からの入力値も信用してはならない。外部からの直接入力時には効力を発揮せず、入力された攻撃用のデータをデータベースから呼び出されたときに攻撃が発動することがセカンドオーダーの由縁である。

    • SQLインジェクション対策に不備があり、データベースに攻撃用のデータが格納されることにより、攻撃の成功率が高まる。加えてデータベースからの値を基にSQL文を動的に生成し、適切なサニタイズが行われていない場合、攻撃が成立する。
    • SQL文の生成に利用する入力値は、外部、内部関係なくサニタイズを施し、SQLインジェクションの対策をもれのないように徹底する。
    • 可能な限りバインドメカニズムを採用し、あらかじめ指定されたSQL文以外の文法を実行させないようにする。

インクルード攻撃

  • 外部ファイルの読込みに利用されるinclude文の変数部分を利用し、攻撃コードを含んだファイルを読み込ませることによって、個人情報の漏洩、またはデータの改ざんなどさまざまな攻撃が可能となる。

    • インクルード攻撃には、大きく分けて二種類の攻撃パターンがあり、ひとつはinclude文の変数部分にサイト外部からのPHPファイルなどを読み込ませて攻撃をするリモートファイル・インクルード攻撃とディレクトリトラバーサルなどの組み合わせにより、サイト内部の意図しないファイルを表示されたり、入出力ストリームを利用し、次なる攻撃の足がかりとされてしまう可能性のあるローカルファイル・インクルード攻撃がある。
    • サーバーサイドの設定に依存することなく、サイト外部からのファイルの読込みを許可しないプログラムを行う。
    • 入力値が期待するファイルパスであるかを厳格に入力チェックを行うなどの適正なバリデートを行う。
    • ディレクトリトラバーサルや入出力ストリームの悪用を防ぐための適切なサニタイズを行う。

eval利用攻撃

  • 与えられた文字列を式として評価する関数に悪意あるコードを送り込み、任意のプログラムを実行させるなどする攻撃方法である。

    • eval関数、または関連する関数の引数に外部からの入力値を含む場合、適切なサニタイズが施されていない場合、攻撃を受ける可能性がある。
    • eval関数、または関連する関数の利用は極力避け、他の方法で実現できないかを十分に検討する。
    • 外部からの入力値は、一切信用せず、eval利用攻撃の特性に合ったサニタイズを施す。

メールヘッダインジェクション

  • メールヘッダ部分に改行やカンマを混入させ、意図しない宛先にメールを送る攻撃である。スパムメールの踏み台として利用されることが多く、大量のメールを送信させられる為、サーバーのリソースを著しく消費し、場合によってはスパム送信メールサーバーとしてブラックリストに登録されることもある。

    • メール送信関数に外部リクエストを渡す場合、入力値の整合性確認がなく、改行やカンマなどの特殊文字をサニタイズしていない場合、攻撃が成立する。
    • メールヘッダ項目の宛先部分は極力固定化し、宛先が複数考えられる場合は、ホワイトリスト化し、許可のない宛先はエラーとする。
    • 宛先が不特定多数でホワイトリスト化できない場合は、同一IPアドレスからのフォームメールの利用回数を記録し、一日の送信回数に上限を設けるなどの対策をする。
    • メールヘッダ各項目に応じた入力値の整合性を確認するなどの適切なバリデートを行う。

セッションハイジャック

  • セッションを管理するセッションIDやセッション・クッキーを盗むことにより、第三者が本人であるかのようになりすまし、入力した情報を盗んだり、アクセスしたページから情報操作したりする攻撃方法である。

    • セッションIDやセッション・クッキーを盗まれるような脆弱性がサイト内に含まれる可能性がある。
    • セッションIDを固定化していたり、類推されるようなIDを利用し、総当り攻撃を受けた場合、攻撃が有効になることがある。
    • ページ移動毎にセッションIDを再発行する処理を施し、同一のセッションIDを使い続けることを避ける。
    • クッキーの使用は、有効期限を適切に設定し、必要以上の有効期限を設定することのないように注意する。
    • 重要な情報を扱うページにアクセスする際は、第三者の知りえないパスワードによるアクセス制限を設けるなどの対策を講じる。

セッション固定化攻撃(session fixation)

  • 攻撃者の用意した攻撃用のページを踏ませることにより、攻撃者任意のセッションIDでログインを強制させられる。攻撃者の管理下にあるセッションIDにより、ログイン後にのみ移管可能なページにも攻撃者がアクセス可能な状態となる。

    • ログイン後に新たなセッションIDを発行せずに単一のセッションID使い続けることにより、攻撃が成立する可能性が高まる。/li>
    • 重要なページへの遷移をセッションIDの認証のみで行っている場合、個人情報の流出、またはデータ改ざんの被害に合う恐れがある。
    • ページ移動毎にセッションIDを再発行する処理を施し、同一のセッションIDを使い続けることを避け、ログイン後に必ず新しいセッションIDを発行する。
    • 重要なページへの遷移には、再度、第三者の知りえない(アカウントとパスワードでの認証など)、または、総当り攻撃が不可能なユニークな値(セッションネームを独自の値に書き換えるなど)を使用して、遷移の認証を許可する処理を施す。

Tatsusからのお知らせ

リンク