profile-image

masatora.net

『体系的に学ぶ 安全なWebアプリケーションの作り方』の簡単なまとめ

セキュリティ

はじめに

『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践』を読んだので、内容をまとめてみます。

前提知識

受動的攻撃とは

  • 受動的攻撃とは、Webサイトの利用者に罠をしかけることにより、そのユーザを通してアプリケーションを攻撃する手法
  • サイトをまたがった受動的攻撃では以下のように攻撃する
  1. 利用者が罠サイトを閲覧
  2. 罠サイトから、仕掛けを含むHTMLをダウンロードする
  3. HTMLの仕掛けが発動して正規のサイトに攻撃のリクエストを送信する
  4. 正規サイトからJSなどの仕掛けを含むレスポンスが返る

同一オリジンポリシーとは

  • JavaScriptなどのクライアントからサイトをまたがったアクセスを禁止するセキュリティ上の制限。
  • 受動的攻撃を防止するために用意された。
  • 「同一オリジン」であるとは、以下のすべてを満たす場合
  1. URLのホストが一致
  2. スキームが一致
  3. ポート番号が一致

CORSとは

  • WebアプリケーションにおいてJSの活用が進むようになり、同一オリジンポリシーの制限を超えてサイト間でデータをやり取りしたいというニーズが強くなった。
  • それを実現するため、CORSが策定された。
  • CORSは、同一オリジンポリシーに依存するアプリケーションとの互換性を保ちながら、異なるオリジンとのデータ交換を可能にするもの。
  • 情報の提供元がAccess-Control-Allow-Originヘッダを出力することで、XMLHttpRequestでのアクセスを許可できる
  • 仕組み
  • シンプルなリクエスト
  • 以下の条件を満たす場合、相手側の許可なしにXMLHttpRequestを用いてリクエストを送信可能(HTMLフォームで送れる場合と同程度のリスクのリクエスト)
  1. メソッドはGET/HEAD/POSTのいずれか
  2. リクエストヘッダは以下に限る
  3. Accept
  4. Accept-Language
  5. Content-Language
  6. Content-Type
  7. Content-Typeヘッダは以下のいずれか
  8. application/x-www-form-urlencoded
  9. multipart/form-data
  10. text/plain
  • プリフライトリクエスト
  • 上記を満たさない場合は、プリフライトリクエストを送信する必要がある

CORSはなぜ受動的攻撃を防げるのか

drawing

Webアプリケーションの主な脆弱性/攻撃手法と対策

攻撃 概要 典型的な原因 発生箇所 影響を受けるページ 影響の種類 影響の度合い 利用者関与 対策の概要
[ ] XSS 開発者の意図しない形でHTMLやJSを注入・変形される HTML生成の際に特殊記号を正しく扱っていないこと Webアプリケーション上でHTML,JavaScriptを生成している箇所 すべてのページ Webサイト利用者のブラウザ上でのJSの実行・偽情報の表示 中~大 必要 1. 属性値はダブルクォートで囲む 2. HTMLで特別な意味を持つ記号文字をエスケープする
[ ] SQLインジェクション シングルクォートなどを用いてリテラルからはみ出した文字をSQL文として認識させ、アプリケーションが呼び出すSQL文を変更する リテラルの扱いの不備 SQL呼び出しをしている箇所 すべてのページ 情報漏えい・データ改ざん・認証の回避・プログラムの実行・ファイルの参照/更新 不要 静的プレースホルダ(値のバインドをデータベースエンジンで行う)を利用してSQLを呼び出す
[ ] CSRF アプリケーションの「重要な処理」を勝手に実行させる Webの以下の性質のため、正規のリクエストと不正なリクエストの見分けがつかない 1. formのaction属性にはどのドメインのURLも指定できる 2. Cookieに保存されたセッションIDは自動的に送信される 以下のいずれかのサイト上の「重要な処理」が行われるページ 1. Cookieのみでセッション管理が行われているサイト 2. HTTP認証・TLSクライアント証明書のみで利用者の識別をしているサイト CSRF脆弱性のあるページ 被害者の権限で「重要な処理」を実行させられる 中~大 必要 「重要な処理」の前に正規利用者からのリクエストであることを確認する(CSRF対策トークン・パスワード再入力・Referer確認)
[ ] クリックジャッキング iframeとCSSを巧妙に利用して、透明にした攻撃対象ページと罠のサイトを重ね合わせ、利用者が気づかないうちに攻撃対象サイトでのクリックを誘導する HTMLの仕様を巧妙に悪用 マウスなどの操作のみで「重要な処理」を実行でき、かつ認証を要するページ クリックジャッキング脆弱性のあるページ 被害者の権限で「重要な処理」を実行させられる 中~大 必要 「重要な処理」の実行ボタンなどがあるページでX-Frame-Optionヘッダを出力する
[ ] セッションハイジャック 第三者がセッションIDを悪用してなりすます 1. セッションIDが推測可能 2. セッションIDを外部から強制できる 3. セッションIDをURLに埋め込んでいる セッションIDを生成している場所 セッション管理をしているページすべて なりすまし 不要 1. 実績のあるセッション管理機構を利用する(自作しない) 2. ログイン時にセッションIDを変更する 3. URL埋め込みのセッションIDの禁止
[ ] オープンリダイレクト 任意のドメインにリダイレクトできる脆弱性(フィッシングに悪用可能) 以下の両方 1. リダイレクト先のURLを外部から指定できる 2. リダイレクト先のドメイン名のチェックがない 外部から指定したURLにリダイレクト可能な箇所 Webアプリケーションの利用者が被害を受ける フィッシングサイトへの誘導・マルウェアを配布される 中~大 必要 以下のいずれか 1. リダイレクト先の固定 2. あらかじめ許可されたドメインのみリダイレクトする
[ ] HTTPヘッダインジェクション 任意のレスポンスヘッダの追加、レスポンスボディの偽造 外部から指定したパラメータに含まれる改行をそのままレスポンスとして出力する 外部から指定したパラメータに基づいてHTTPレスポンスヘッダを出力している箇所 すべてのページ なりすまし、偽ページの表示、キャッシュ汚染 中~大 必要 以下のいずれか 1. 外部からのパラメータをHTTPレスポンスヘッダとして出力しない 2. パラメータ中の改行コードをチェックする
[ ] ディレクトリトラバーサル アプリケーションの意図しないファイルに対して閲覧・改ざん・削除をする 以下の3つ 1. ファイル名を外部から指定できる 2. ファイル名として、異なるディレクトリを指定できる 3. ファイルに対するアクセス可否をチェックしていない ファイル名を外部から指定できるページ すべてのページ 秘密情報の漏洩、データの改竄・削除、任意のスクリプトの実行、アプリケーションの機能停止 不要 以下のいずれか 1. 外部からファイル名を指定できる仕様を避ける 2. ファイル名にディレクトリ名が含まれないようにする 3. ファイル名を英数字に限定する
[ ] OSコマンドインジェクション 意図しないOSコマンドを実行する シェルのメタ文字がエスケープされていない シェルを呼び出す機能のある関数を実行している場所 すべてのページ 秘密情報の漏洩、データの改竄・削除、外部への攻撃、アプリケーションの機能停止 不要 以下のいずれか 1. シェル呼び出し機能のある関数の利用を避ける 2. シェル呼び出し機能のある関数には外部からのパラメータを渡さない 3. OSコマンドにわたすパラメータを安全な関数によりエスケープする

参考