Cloud Security Scanner の使用

Cloud Security Scanner は、App Engine ウェブ アプリケーションでのセキュリティ上の脆弱性を判定するのに使用します。アプリケーションをクロールして、開始 URL の範囲内にあるすべてのリンクをたどり、できる限り多くのユーザー入力とイベント ハンドラを処理しようとします。現時点では、次のものが検出されます。

  • XSS
  • Flash インジェクション
  • 混合コンテンツ
  • 安全でない JavaScript ライブラリの使用

Cloud Security Scanner は、現時点では App Engine スタンダード環境インスタンスのみをサポートしています。App Engine フレキシブル環境や Compute Engine、その他の Google Cloud リソースではまだ使用できません。

Cloud Security Scanner は、既存の安全な設計プロセスと開発プロセスを補完することを目的としています。誤検出があるとデベロッパーの注意がそがれるため、あまり多くの情報が報告されないようになっています。そのため判断が誤ったものになることがあり、また信頼度が低いアラートは表示されません。Cloud Security Scanner は、人によるセキュリティ レビューに置き換わるものではなく、アプリケーションにセキュリティの欠陥がないことを保証するものでもありません。ウェブ セキュリティについて詳しくは、OWASP 上位 10 件のプロジェクトをご覧ください。

Google Cloud Platform のセキュリティの詳細

使用上の注意

このツールを使用するときは、次の点に留意してください。

  • 現在も継続的に改善が進められているため、現在のスキャンでは報告されない問題が今後報告される可能性があります。
  • アプリケーションの機能やセクションをすべてテストしているとは限りません。
  • 制御や入力を検出すると、その有効化を試みます。
  • テスト アカウントが権限を持つ状態変更アクションを公開した場合、そのアクションが有効になって望ましくない結果がもたらされる可能性があります。

セキュリティ スキャンを実行できるユーザー

Cloud Security Scanner の IAM の役割について詳しくは、アクセス制御をご覧ください。

セキュリティ スキャンにかかる時間

セキュリティ スキャンは、直ちに実行されるのではなく、まずキューに追加され、後で実行されます。そのため、システム負荷によっては数時間後になる場合もあります。スキャンの実行が始まったら、その所要時間はアプリケーションのサイズによって異なります。多くの URL が含まれた大規模なアプリケーションの場合、完了するまでに数時間かかる場合があります。

スキャンする前に

スキャンする前に、スキャンしようとしている範囲を超えてデータやユーザーやシステムに影響を及ぼす可能性がある機能がないか慎重にアプリケーションを調べてください。

スキャンを実行すると、フィールドに値が入力されたり、ボタンが押されたり、リンクがクリックされたりするため、十分に注意して使用してください。また、データやシステムの状態を変更する機能が有効になる可能性があり、望ましくない結果がもたらされる場合があります。次に例を示します。

  • ブログ アプリケーションで一般からのコメントを受け付けるようにしていると、すべてのブログ記事にコメントとしてテスト文字列が投稿される場合があります。
  • メール登録ページで多数のテストメールが生成される場合があります。

リスクを最小限に抑える方法のヒントについては、予期しない結果の回避をご覧ください。

スキャンの作成

  1. テスト アカウントをまだ作成していない場合はここで作成し、テスト アカウントにログインします(テスト アカウントを使用する理由については、予期しない結果の回避をご覧ください)。テスト アカウントは、スキャンする App Engine インスタンスのオーナーかデベロッパーのものである必要があります。

  2. Google Cloud Platform Console に移動します。

  3. App Engine アプリケーションがすでにデプロイされているプロジェクトを選択します。

  4. [コンピューティング] > [App Engine] > [セキュリティ スキャン] を選択します。

  5. 初めてアプリケーションをスキャンするときには、新規にスキャンを作成するように求められます。

  6. [スキャンを作成] をクリックして、新規スキャン フォームを表示します。ここでは、フォームを最大化して必要なすべてのフィールドが表示されるようにしています。

    一方、スキャンがすでに存在する場合、新規スキャンの作成は求められません。ただし、ページの上部にある [新しいスキャン] ボタンをクリックすると、新規スキャン フォームを表示できます。

  7. 次の表を参考に必要に応じてスキャン項目に入力します。

  8. [作成] をクリックします。

次の表では、スキャン項目について説明します。

項目名 / 選択肢 説明
開始 URL シンプルなサイトでは通常、開始 URL は 1 つだけです。サイトのホームページかメインページかランディング ページから他のすべてのサイトページが検出されるものです。ただし、サイトのページ数が非常に多い場合や未接続のページが孤立している場合、あるいは移動するのに複雑な JavaScript を必要とする場合(マウスオーバー駆動型のマルチレベル メニューなど)、一部のページが検出されないこともあります。このような場合は、開始 URL を追加してスキャン対象範囲を広げます。
除外 URL 有効な正規表現を使用しなくても、* ワイルドカードによる簡素化されたプロト言語を使用して除外対象を定義すると、複雑さを軽減できます。詳細と有効なパターン例については、スキャン内の URL の除外をご覧ください。
Google アカウント Gmail でテスト アカウントを作成し、そのアカウントを使用してプロダクトをスキャンできます。あるいは、Google Apps を利用している場合には、ドメイン内にテスト アカウントを作成できます(例: test-account@yourdomain.com)。Cloud Security Scanner では、こうしたアカウントが Gmail アカウントと同じように機能します(2 要素認証はサポートされていません)。

Google+ アカウントには実名ポリシーが適用されることに注意してください。名前が実名に見えない場合には、Google+ でテスト アカウントがブロックされることもあります。
Google 以外のアカウント Google アカウント サービスを使用する予定がなく、代わりに独自の認証システムを作成した場合は、このオプションを選択します。ログイン フォームの URL、ユーザー名、パスワードを指定してください。この認証情報は、アプリケーションにログインしてスキャンする場合に使用します。

ログイン フォームのサポートは引き続き開発が進められており、すぐにはシステムで使用できない場合があります。テスト アカウントで手動ログインはできるのに Cloud Security Scanner にはログインできないことを確認した場合は、ツール内のフィードバック オプションを使用してサポートをご依頼ください。
スケジュール スキャンの実行を毎日、毎週、2 週間ごと、4 週間ごとのいずれかに設定できます。スキャンのスケジュールを作成するときは、スキャン対象アプリケーションの今後のバージョンがテストされるようにすることをおすすめします。また、新規リリースの Cloud Security Scanner で新たなバグタイプが見つかることもあるため、スキャンの実行をスケジュールしておくと、自分で作業しなくてもスキャン対象範囲が広がるという利点も得られます。

スキャンの実行

スキャンを実行するには:

  1. スキャンの作成に使用するテスト アカウントにログインしていることを確認します。

  2. Google Cloud Platform Console で、スキャンを作成したプロジェクトを選択します。

  3. [コンピューティング] > [App Engine] > [セキュリティ スキャン] を選択します。

  4. アプリのスキャンを複数作成した場合は、表示されるリストから目的のスキャンを選択します。このアプリのスキャンを 1 つだけ作成した場合は、そのスキャンが表示され、いつでも実行を開始できます。

  5. [スキャンを実行] をクリックして、アプリのスキャンを開始します。

スキャンがキューに配置され、実行されるまでに時間がかかる場合があります。実行されるまでに数分かかることもあれば、何時間もかかる場合もあり、これはサイトの複雑さ、各ページの処理可能な要素の数、リンクの数、JavaScript の量(ナビゲーションを含む)などシステム負荷と特性によって異なります。

スキャンの編集と削除

  1. スキャンの作成に使用するテスト アカウントにログインしていることを確認します。

  2. Google Cloud Platform Console で、スキャンを作成したプロジェクトを選択します。

  3. [コンピューティング] > [App Engine] > [セキュリティ スキャン] を選択します。

  4. アプリのスキャンを複数作成した場合は、表示されるリストから目的のスキャンを選択します。このアプリのスキャンを 1 つだけ作成した場合は、そのスキャンが表示され、いつでも編集や削除ができます。

  5. スキャンを編集するには [編集] をクリックし、プロジェクトからスキャンを削除するには [削除] をクリックします。

スキャンのステータスと結果は、スキャンページで確認します。また、プロジェクト ログページのログページにも有用な情報があります。

結果の詳細

Cloud Security Scanner では、XSS、Flash インジェクション、混在コンテンツ、安全でない JavaScript ライブラリの使用という 4 つのクラスの脆弱性が検出されます。こうした脆弱性が検出された場合は、結果がハイライト表示され、詳しい情報を確認できます。

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

スキャナのクロスサイト スクリプト(XSS)インジェクション テストでは、悪意のないテスト文字列をユーザーによる編集が可能な項目に挿入し、さまざまなユーザー アクションを実行することで、インジェクション攻撃をシミュレートします。このテストを実行すると、カスタムの検知機能がブラウザと DOM を監視して、インジェクションの成否を判断し、悪用の危険性を評価します。

テスト文字列内に含まれている JavaScript が正常に実行された場合は、Chrome デバッガが起動します。

脆弱性があるパラメータ q= 内の XSS アラートの例

テスト文字列を実行できたため、このページには JavaScript を混入させて実行できることがわかりました。この問題を攻撃者に知られた場合、攻撃者は悪意のあるリンクをクリックしたユーザー(被害者)を実行者として、任意の JavaScript を実行できるようになります。

状況によっては、ブラウザでテスト文字列が解析される前に、テスト対象アプリケーションがテスト文字列を変更してしまうこともあります。たとえば、入力内容を検証したり、項目のサイズを制限したりする可能性があります。この変更されたテスト文字列をブラウザが実行しようとすると、ブラウザの動作が中断し、JavaScript 実行エラーがスローされて、インジェクションの問題が発生します。ただし、これは必ずしも悪用可能とは限りません。テスト文字列の変更を回避できるかどうかを確認し、この問題が実際に XSS の脆弱性となっていることを確認するには、手動で確認する必要があります。

パラメータ q= にインジェクションの問題が含まれている可能性があることを示す JavaScript 破損アラートの例。

この問題の修正にはさまざまな方法がありますが、すべての出力をエスケープし、状況に応じた自動エスケープをサポートするテンプレート生成システムを使用することをおすすめします。

Flash インジェクション

レスポンスの先頭に影響を与えるパラメータが検出される場合があります。これを Rosetta Flash とも呼びます。攻撃者は、ブラウザでレスポンスを実行するときに、そのレスポンスを脆弱性があるウェブ アプリケーションから提供された Flash ファイルであるかのように見せかける場合があります。

callback= パラメータ内の Flash インジェクション アラートの例

これを修正するには、HTTP レスポンスの先頭にユーザーが制御できるデータを含めないようにします。

混合コンテンツ

Cloud Security Scanner は、HTTP トラフィックをパッシブに監視し、JavaScript や CSS ファイルに対するリクエストが HTTPS ページのコンテキストでありながら HTTP 経由で実行された場合には報告します。

http://irrelevant.google.com からの HTTP リソースが含まれている attribute_script という HTTPS ページ内の混合コンテンツ アラートの例

これを修正するには、HTTP の相対リンクを使用します。たとえば、http://// に置き換えます。

古いライブラリ

アプリケーションに組み込まれているライブラリのバージョンの中にはセキュリティの問題が含まれていることが知られているものがあり、Cloud Security Scanner でそのことを検出できる場合があります。これはシグネチャベースのスキャナと呼ばれるもので、使用中のライブラリのバージョンを特定し、そのライブラリを脆弱性があるライブラリの既知のリストと照合します。バージョンの検出に失敗した場合やライブラリに手動でパッチを適用したことがある場合は、誤検出の可能性もあります。

jquery-1.8.1.js の使用による古いライブラリ アラートの例

これを修正するには、組み込みのライブラリを既知の安全なバージョンに更新します。

クリアテキストのパスワード

Cloud Security Scanner により、アプリケーションがパスワード フィールドをクリアテキスト形式で送信している可能性があると検出される場合があります。

クリアテキストのパスワード アラートの例

クライアントとサーバー間で渡される機密情報を保護するには:

  • TLS 証明書または SSL 証明書を使用します。
  • パスワードのフィールドは、HTTPS を使用するページにのみ配置する必要があります。
  • フォーム アクションの属性では常に HTTPS URL を指定する必要があります。

問題の確認

スキャナから問題が報告された場合は、問題の箇所を特定する必要があります。この確認には、XSS 保護機能を無効にしたブラウザを使用します。Chrome の独立したテスト インスタンスを使用することをおすすめしますが、XSS 保護機能を無効にできる最近のブラウザであれば正常に機能するはずです。

Chrome で XSS 保護機能を無効にするには:

  1. Linux を使用している場合は、次のように Linux の Chrome コマンドを入力します。

    chrome --user-data-dir=~/.chrometest --allow-running-insecure-content \ --disable-xss-auditor --disable-sync --bwsi

  2. Mac OS X を使用している場合は、次のように Chrome コマンドを入力します。

    open -n /Applications/Google\ Chrome.app/ --args --disable-xss-auditor \ --user-data-dir=/tmp/xssrepro

Content Security Policy(CSP)を適用していると、JavaScript コードの実行が阻止されるため、XSS の再現が難しくなることに注意してください。この問題が発生した場合は、ブラウザのログコンソールを開いて、発生した CSP 違反の詳細を確認してください。

ターゲットの制限

Cloud Security Scanner には、スキャンのターゲットをスキャンが作成される特定の App Engine インスタンスに制限するフィルタが導入されています。別の App Engine プロジェクトや外部ドメインの URL を入力すると、エラー メッセージが表示されます。

プロジェクト内では、Cloud Security Scanner はログアウト URL と、スキャンに悪影響を与える可能性があるその他の汎用的な場所を自動的に回避しようとします。ただし、これを確実に行うためには、スキャン設定を使用して手動で URL を除外します。

予期しない結果の回避

スキャンを実行すると、フィールドに値が入力されたり、ボタンが押されたり、リンクがクリックされたりするため、十分に注意して使用してください。また、データやシステムの状態を変更する機能が有効になる可能性があり、望ましくない結果がもたらされる場合があります。

例:

  • ブログ アプリケーションで一般からのコメントを受け付けるようにしていると、すべてのブログ記事にコメントとしてテスト文字列が投稿される場合があります。
  • メール登録ページで多数のテストメールが生成される場合があります。

以下に、こうした結果やその他の予期しない結果をもたらすことなく、個別または一括してスキャンする場合に使用できる手法を紹介します。

  1. テスト環境でスキャンを実行します。テスト環境を設定するには、別途 App Engine プロジェクトを作成し、このプロジェクトにアプリケーションとデータを読み込みます。gcloud コマンドライン ツールを使用する場合、アプリをアップロードするときのターゲット プロジェクトをコマンドライン オプションとして指定できます。
  2. テスト アカウントを使用します。機密データや有害なオペレーションにアクセスできないユーザー アカウントを作成し、アプリをスキャンするときにはそのアカウントを使用します。多くのアプリケーションでは、ユーザーが初めてログインしたときに、利用規約の同意やプロフィールの作成など特別なワークフローが提示されます。ワークフローが異なるために、初期ユーザーのテスト アカウントで生成されるスキャン結果が、確立したユーザー アカウントのものとは異なる場合があります。アカウントが通常のユーザー状態のとき、つまり最初のフローが完了した後で、スキャンを実行することをおすすめします。
  3. CSS クラス inq-no-click を適用して、有効にするつもりのない個々の UI 要素をブロックします。この要素に添付されたイベント ハンドラは、インライン JavaScript であるか、addEventListener を使用して添付されているか、適切なイベント ハンドラ プロパティの設定によって添付されているかに関係なく、クロールやテストのときには無効になっています。
  4. バックアップ データを使用します。スキャンする前にデータのバックアップを検討してください。
  5. URL を除外します。クロールやテストの対象外にする URL パターンを指定できます。構文については、「URL の除外」セクションをご覧ください。

スキャンする前に、スキャンしようとしている範囲を超えてデータやユーザーやシステムに影響を及ぼす可能性がある機能がないか慎重にアプリケーションを調べてください。

テスト アカウントを使用した場合

多くのアプリケーションでは、ユーザーが初めてログインしたときに、利用規約の同意やプロフィールの作成など特別なワークフローが提示されます。初めてのユーザー向けに別のフローをアプリケーションに用意している場合は、スキャンのユーザー アカウントを選択するときに、このことに留意してください。ワークフローが異なるため、新規(初期)のユーザー アカウントで生成されるスキャン結果は確立したユーザー アカウントのものとは異なる場合があります。 アカウントが通常のユーザー状態のとき、つまり最初のフローが完了した後で、スキャンを実行することをおすすめします。

Cloud Security Scanner がログに与える影響

スキャンのトレースの一部は、ログファイルに記録されます。たとえば、アプリケーションのエラーページを調べるために、「~sfi9876」や「/sfi9876」などの意味のない文字列のリクエストが生成されることがあります。こういった無効なページの意図的なリクエストはログに記録されます。

スキャン結果の解釈

Cloud Security Scanner がテストし報告する問題は次のとおりです。

検出項目 検出条件
XSS CALLBACK Chrome ウェブツールのデバッガが、テスト対象アプリケーションの XSS によって正常に呼び出されました。
XSS ERROR Chrome JavaScript パーサーが、テスト リクエストに起因する構文エラーを検出しました。
XSS FLASH INJECTION アプリケーションが JSONP レスポンスを生成しましたが、それを利用したユーザーがレスポンスの先頭に影響を与える可能性があります。
MIXED CONTENT Chrome が HTTPS ページで HTTP スクリプトや CSS に対するリクエストを実行しました。
OUTDATED LIBRARY 使用中の JS ライブラリのバージョンには、既知のセキュリティの問題があります。注: この問題が悪用された形跡はありません。
CLEAR_TEXT_PASSWORD

詳しくは、結果の詳細をご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Security Scanner のドキュメント