Overview

注: このドキュメントは現在開発中です。近い将来、改善される予定です。

Google セーフ ブラウジング v5 は、Google セーフ ブラウジング v4 の進化版です。v5 で行われた 2 つの主な変更は、データの更新頻度と IP プライバシーです。また、API サーフェスが改善され、柔軟性と効率性が向上し、肥大化が軽減されました。さらに、Google セーフ ブラウジング v5 は、v4 からの移行を容易にするように設計されています。

現在、Google は v4 と v5 の両方を提供しており、どちらも本番環境に対応していると見なされています。v4 または v5 を使用できます。v4 のサポート終了日はまだ発表されていません。発表された場合は、少なくとも 1 年前にお知らせします。このページでは、v5 と v4 から v5 への移行ガイドについて説明します。v4 のドキュメントはすべて利用可能です。

データの更新頻度

v5 では、リアルタイム保護と呼ばれる動作モードが導入されています。これにより、上記のデータの古さの問題を回避できます。v4 では、クライアントはローカル データベースをダウンロードして維持し、ローカルにダウンロードした脅威リストに対してチェックを実行し、プレフィックスの部分一致がある場合は、完全なハッシュをダウンロードするリクエストを実行する必要があります。v5 では、クライアントは引き続き脅威リストのローカル データベースをダウンロードして維持する必要がありますが、安全と思われるサイトのリスト(グローバル キャッシュ)をダウンロードし、このグローバル キャッシュのローカル チェックとローカル脅威リスト チェックの両方を実行することが求められます。最後に、脅威リストの接頭辞が部分的に一致するか、グローバル キャッシュに一致しない場合は、完全なハッシュをダウンロードするリクエストを実行します。(クライアントに必要な現地での処理の詳細については、以下の手順をご覧ください)。これは、デフォルトで許可からデフォルトで確認に移行することを意味します。これにより、ウェブ上の脅威の拡散が速まっていることを踏まえ、保護を強化できます。つまり、これはほぼリアルタイムで保護を提供するように設計されたプロトコルです。Google は、クライアントがより新しい Google セーフ ブラウジング データのメリットを享受できるようにすることを目標としています。

IP プライバシー

Google セーフ ブラウジング(v4 または v5)は、リクエストの処理中にユーザーの ID に関連する情報を処理しません。Cookie が送信された場合、無視されます。リクエストの送信元 IP アドレスは Google に知られていますが、Google は IP アドレスを、ネットワークの基本的なニーズ(レスポンスの送信など)と DoS 対策の目的でのみ使用します。

v5 と同時に、Safe Browsing Oblivious HTTP Gateway API というコンパニオン API も導入されます。これは、Oblivious HTTP を使用して、エンドユーザーの IP アドレスを Google から隠します。不正行為に関与していないサードパーティが、ユーザー リクエストの暗号化されたバージョンを処理し、Google に転送します。そのため、サードパーティは IP アドレスにのみアクセスでき、Google はリクエストの内容にのみアクセスできます。サードパーティが Oblivious HTTP Relay(Fastly のこのサービスなど)を運用し、Google が Oblivious HTTP Gateway を運用します。これはオプションのコンパニオン API です。Google セーフ ブラウジングと併用する場合、エンドユーザーの IP アドレスは Google に送信されなくなります。

運用モード

Google セーフ ブラウジング v5 では、クライアントは 3 つの動作モードから選択できます。

リアルタイム モード

クライアントが Google Safe Browsing v5 をリアルタイム モードで使用する場合、クライアントはローカル データベースに次の情報を保持します。(i)ホスト接尾辞/パス接頭辞 URL 式の SHA256 ハッシュ形式の、安全と思われるサイトのグローバル キャッシュ、(ii)ホスト接尾辞/パス接頭辞 URL 式の SHA256 ハッシュ プレフィックス形式の脅威リストのセット。概要は、クライアントが特定の URL を確認するたびに、グローバル キャッシュを使用してローカル チェックが実行されることです。このチェックに合格すると、ローカル脅威リストのチェックが実行されます。それ以外の場合は、クライアントは以下の説明に沿ってリアルタイムのハッシュチェックを続行します。

クライアントは、ローカル データベースに加えてローカル キャッシュを維持します。このようなローカル キャッシュは永続ストレージに保存する必要はなく、メモリ不足の場合に削除される可能性があります。

手続きの詳細な仕様は次のとおりです。

ローカルリスト モード

クライアントがこのモードで Google Safe Browsing v5 を使用する場合、クライアントの動作は v4 Update API と同様ですが、v5 の改善された API サーフェスを使用します。クライアントは、ホスト サフィックス/パス プレフィックス URL 式の SHA256 ハッシュ プレフィックス形式の脅威リストのセットをローカル データベースに保持します。クライアントが特定の URL を確認するたびに、ローカル脅威リストを使用してチェックが実行されます。一致する場合にのみ、クライアントはサーバーに接続してチェックを続行します。

上記と同様に、クライアントはローカル キャッシュも維持しますが、これは永続ストレージに保存する必要はありません。

ストレージなしのリアルタイム モード

クライアントがストレージなしのリアルタイム モードで Google セーフ ブラウジング v5 を使用する場合、クライアントは永続的なローカル データベースを維持する必要はありません。ただし、クライアントは引き続きローカル キャッシュを維持する必要があります。このようなローカル キャッシュは永続ストレージに保存する必要はなく、メモリ不足の場合に削除される可能性があります。

クライアントが特定の URL を確認するたびに、クライアントは常にサーバーに接続してチェックを行います。このモードは、v4 Lookup API のクライアントが実装するモードに似ています。

リアルタイム モードと比較して、このモードではネットワーク帯域幅の使用量が増える可能性がありますが、クライアントが永続的なローカル状態を維持するのが不便な場合に適しています。

リアルタイム URL チェックの手順

この手順は、クライアントがリアルタイム モードの操作を選択した場合に使用されます。

このプロシージャは、単一の URL u を受け取り、SAFEUNSAFE、または UNSURE を返します。SAFE が返された場合、その URL は Google セーフ ブラウジングで安全と見なされます。UNSAFE が返された場合、その URL は Google セーフ ブラウジングによって安全でない可能性があると判断され、エンドユーザーへの警告の表示、受信したメールの迷惑メールフォルダへの移動、続行前にユーザーによる追加の確認を求めるなど、適切な措置を講じる必要があります。UNSURE が返された場合は、その後、次のローカルチェック手順を使用する必要があります。

  1. expressions は、URL u によって生成されたサフィックス/プレフィックス式のリストです。
  2. expressionHashes をリストとします。要素は expressions の各式の SHA256 ハッシュです。
  3. expressionHasheshash ごとに:
    1. hash がグローバル キャッシュに見つかった場合は、UNSURE を返します。
  4. expressionHashPrefixes をリストとします。要素は expressionHashes の各ハッシュの最初の 4 バイトです。
  5. expressionHashPrefixesexpressionHashPrefix ごとに:
    1. ローカル キャッシュで expressionHashPrefix を検索します。
    2. キャッシュに保存されたエントリが見つかった場合:
      1. 現在の時刻が有効期限より大きいかどうかを判断します。
      2. 大きい場合:
        1. 見つかったキャッシュに保存されたエントリをローカル キャッシュから削除します。
        2. ループを続けます。
      3. 大きい場合以外:
        1. expressionHashPrefixes からこの特定の expressionHashPrefix を削除します。
        2. expressionHashes 内の対応する完全なハッシュがキャッシュに保存されたエントリに存在するかどうかを確認します。
        3. 見つかった場合は UNSAFE を返します。
        4. 見つからない場合は、ループを続行します。
    3. キャッシュに保存されたエントリが見つからない場合は、ループを続行します。
  6. RPC SearchHashes または REST メソッド hashes.search を使用して、expressionHashPrefixes を Google Safe Browsing v5 サーバーに送信します。エラーが発生した場合(ネットワーク エラー、HTTP エラーなど)は、UNSURE を返します。それ以外の場合は、SB サーバーから受信した response をレスポンスとして使用します。これは、脅威の性質(ソーシャル エンジニアリング、マルウェアなど)を特定する補助情報と、キャッシュの有効期限 expiration とともに完全なハッシュのリストです。
  7. responsefullHash ごとに:
    1. expiration とともに fullHash をローカル キャッシュに挿入します。
  8. responsefullHash ごとに:
    1. isFound は、expressionHashesfullHash を見つけた結果です。
    2. isFound が False の場合は、ループを続行します。
    3. isFound が true の場合は UNSAFE を返します。
  9. SAFE を返します。

このプロトコルでは、クライアントがサーバーに expressionHashPrefixes を送信するタイミングは指定されていますが、送信方法は意図的に指定されていません。たとえば、クライアントがすべての expressionHashPrefixes を 1 つのリクエストで送信することは許容されます。また、クライアントが expressionHashPrefixes 内の各プレフィックスを個別のリクエストでサーバーに送信することも許容されます(並行して処理することもできます)。1 つのリクエストで送信されるハッシュ プレフィックスの数を 30 個以下に抑える限り、クライアントは expressionHashPrefixes のハッシュ プレフィックスとともに、無関係なハッシュ プレフィックスやランダムに生成されたハッシュ プレフィックスを送信することもできます。

LocalThreat List の URL チェック手順

この手順は、クライアントがローカルリスト モードのオペレーションを選択した場合に使用されます。また、上記の RealTimeCheck プロシージャがクライアントに UNSURE の値を返す場合にも使用されます。

このプロシージャは、単一の URL u を受け取り、SAFE または UNSAFE を返します。

  1. expressions は、URL u によって生成されたサフィックス/プレフィックス式のリストです。
  2. expressionHashes をリストとします。要素は expressions の各式の SHA256 ハッシュです。
  3. expressionHashPrefixes をリストとします。要素は expressionHashes の各ハッシュの最初の 4 バイトです。
  4. expressionHashPrefixesexpressionHashPrefix ごとに:
    1. ローカル キャッシュで expressionHashPrefix を検索します。
    2. キャッシュに保存されたエントリが見つかった場合:
      1. 現在の時刻が有効期限より大きいかどうかを判断します。
      2. 大きい場合:
        1. 見つかったキャッシュに保存されたエントリをローカル キャッシュから削除します。
        2. ループを続けます。
      3. 大きい場合以外:
        1. expressionHashPrefixes からこの特定の expressionHashPrefix を削除します。
        2. expressionHashes 内の対応する完全なハッシュがキャッシュに保存されたエントリに存在するかどうかを確認します。
        3. 見つかった場合は UNSAFE を返します。
        4. 見つからない場合は、ループを続行します。
    3. キャッシュに保存されたエントリが見つからない場合は、ループを続行します。
  5. expressionHashPrefixesexpressionHashPrefix ごとに:
    1. ローカル脅威リスト データベースで expressionHashPrefix を検索します。
    2. ローカル脅威リスト データベースに expressionHashPrefix が見つからない場合は、expressionHashPrefixes から削除します。
  6. RPC SearchHashes または REST メソッド hashes.search を使用して、expressionHashPrefixes を Google Safe Browsing v5 サーバーに送信します。エラーが発生した場合(ネットワーク エラー、HTTP エラーなど)は、SAFE を返します。それ以外の場合は、SB サーバーから受信した response をレスポンスとして使用します。これは、脅威の性質(ソーシャル エンジニアリング、マルウェアなど)を特定する補助情報と、キャッシュの有効期限 expiration とともに完全なハッシュのリストです。
  7. responsefullHash ごとに:
    1. expiration とともに fullHash をローカル キャッシュに挿入します。
  8. responsefullHash ごとに:
    1. isFound は、expressionHashesfullHash を見つけた結果です。
    2. isFound が False の場合は、ループを続行します。
    3. isFound が true の場合は UNSAFE を返します。
  9. SAFE を返します。

ローカル データベースを使用しないリアルタイム URL チェック手順

この手順は、クライアントがストレージなしのリアルタイム モードの動作を選択した場合に使用されます。

このプロシージャは、単一の URL u を受け取り、SAFE または UNSAFE を返します。

  1. expressions は、URL u によって生成されたサフィックス/プレフィックス式のリストです。
  2. expressionHashes をリストとします。要素は expressions の各式の SHA256 ハッシュです。
  3. expressionHashPrefixes をリストとします。要素は expressionHashes の各ハッシュの最初の 4 バイトです。
  4. expressionHashPrefixesexpressionHashPrefix ごとに:
    1. ローカル キャッシュで expressionHashPrefix を検索します。
    2. キャッシュに保存されたエントリが見つかった場合:
      1. 現在の時刻が有効期限より大きいかどうかを判断します。
      2. 大きい場合:
        1. 見つかったキャッシュに保存されたエントリをローカル キャッシュから削除します。
        2. ループを続けます。
      3. 大きい場合以外:
        1. expressionHashPrefixes からこの特定の expressionHashPrefix を削除します。
        2. expressionHashes 内の対応する完全なハッシュがキャッシュに保存されたエントリに存在するかどうかを確認します。
        3. 見つかった場合は UNSAFE を返します。
        4. 見つからない場合は、ループを続行します。
    3. キャッシュに保存されたエントリが見つからない場合は、ループを続行します。
  5. RPC SearchHashes または REST メソッド hashes.search を使用して、Google Safe Browsing v5 サーバーに expressionHashPrefixes を送信します。エラーが発生した場合(ネットワーク エラー、HTTP エラーなど)は、SAFE を返します。それ以外の場合は、SB サーバーから受信した response をレスポンスとして使用します。これは、脅威の性質(ソーシャル エンジニアリング、マルウェアなど)を特定する補助情報と、キャッシュの有効期限 expiration とともに完全なハッシュのリストです。
  6. responsefullHash ごとに:
    1. expiration とともに fullHash をローカル キャッシュに挿入します。
  7. responsefullHash ごとに:
    1. isFound は、expressionHashesfullHash を見つけた結果です。
    2. isFound が False の場合は、ループを続行します。
    3. isFound が true の場合は UNSAFE を返します。
  8. SAFE を返します。

リアルタイム URL チェック手順と同様に、この手順では、ハッシュ接頭辞をサーバーに送信する方法は明記されていません。たとえば、クライアントがすべての expressionHashPrefixes を 1 つのリクエストで送信することは許容されます。また、クライアントが expressionHashPrefixes の各プレフィックスを個別のリクエストでサーバーに送信することも許容されます(並行して処理することもできます)。1 つのリクエストで送信されるハッシュ プレフィックスの数を 30 個以下に抑える限り、クライアントは expressionHashPrefixes のハッシュ プレフィックスとともに、無関係なハッシュ プレフィックスやランダムに生成されたハッシュ プレフィックスを送信することもできます。

リクエストの例

このセクションでは、HTTP API を直接使用して Google セーフ ブラウジングにアクセスする例をいくつか示します。通常は、生成された言語バインディングを使用することをおすすめします。これは、エンコードとデコードが便利な方法で自動的に処理されるためです。該当するバインディングのドキュメントをご覧ください。

hashes.search メソッドを使用する HTTP リクエストの例を次に示します。

GET https://safebrowsing.googleapis.com/v5/hashes:search?key=INSERT_YOUR_API_KEY_HERE&hashPrefixes=WwuJdQ

レスポンス本文はプロトコル バッファ形式のペイロードで、デコードできます。

hashLists.batchGet メソッドを使用した HTTP リクエストの例を次に示します。

GET https://safebrowsing.googleapis.com/v5alpha1/hashLists:batchGet?key=INSERT_YOUR_API_KEY_HERE&names=se&names=mw-4b

レスポンスの本文は、プロトコル バッファ形式のペイロードであり、デコードできます。