[go: nahoru, domu]

この記事は Yoshi Yamaguchi、Santiago Díaz、Maud Nalpas、Eiji Kitamura による Google Security Blog の記事 "Uncovering potential threats to your web application by leveraging security reports" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

新たなウェブ標準である Reporting API は、本番ウェブサイトにアクセスするブラウザで発生する問題をレポートする汎用的な仕組みを提供します。受け取るレポートでは、世界中のユーザーのブラウザで発生するセキュリティ違反やまもなく非推奨になる API などの問題が詳しく説明されています。

多くの場合は、HTTP ヘッダーでエンドポイント URL を指定するだけでレポートを収集できます。するとブラウザは、皆さんにとって関心のある問題が含まれたレポートをエンドポイントに自動転送し始めます。ただし、レポートの処理や分析はそれほど簡単ではありません。たとえば、エンドポイントには大量のレポートが送られてくる可能性がありますが、そのすべてが根本的な問題の特定に役立つわけではない場合があります。そのような状況では、問題を抽出して修正するのは非常に困難かもしれません。

このブログ投稿では、Google セキュリティ チームがどのように Reporting API を使って潜在的な問題を検出し、実際の問題を特定しているかを紹介します。また、Google と同じようなアプローチで簡単にレポートの処理や対策ができるように、オープンソースのソリューションも紹介します。


Reporting API の仕組み

本番環境のユーザーのブラウザでしか発生しないエラーもあります。もちろん、皆さんはユーザーのブラウザにアクセスすることはできません。こういったエラーは、ローカルで、あるいは開発中に見かけることはありません。実際のユーザーやネットワーク、デバイスがどのような状態になっているかわからないからです。Reporting API を使えば、ブラウザを直接利用してこういったエラーをモニタリングできます。つまり、ブラウザがエラーをキャッチし、エラーレポートを生成して、指定したエンドポイントに送信してくれます。

レポートの生成と送信の仕組み。

Reporting API でモニタリングできるエラーには、次のようなものがあります。

モニタリングできるすべてのエラータイプについては、ユースケースとレポートタイプをご覧ください。

Reporting API は、HTTP レスポンス ヘッダーで有効化と設定を行います。つまり、ブラウザがレポートを送信するエンドポイントと、モニタリングするエラータイプを HTTP レスポンス ヘッダーで宣言します。ブラウザは、レポートのリストをペイロードとする POST リクエストによって、レポートをエンドポイントに送信します。

設定の例 :

# CSP 違反レポート、Document-Policy 違反レポート、非推奨レポートを受け取る設定の例
Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default"
# CSP 違反と Document-Policy 違反を `main-endpoint` に送信する
Content-Security-Policy: script-src 'self'; object-src 'none'; report-to main-endpoint; Document-Policy: document-write=?0; report-to=main-endpoint; # 非推奨レポートは自動生成され、明示的なエンドポイントは必要ない。常に `default` エンドポイントに送信される

注 : "report-only" モードをサポートするポリシーもあります。このポリシーでは、レポートは送信されますが、実際の制限は適用されません。これは、ポリシーが効果的に機能しているかどうかを判断する際に役立ちます。

Chrome ユーザーは、DevTools の [Application] パネルから、ブラウザが生成するレポートを確認できます。

DevTools の [Application] パネルに表示されるレポートの例。

レポートのエンドポイントのデモでは、生成されたさまざまな違反がサーバーでどのように受信されるかを確認できます。

違反レポートの例

2024 年 3 月時点で、Chrome は Reporting API をサポートしており、Safari は一部をサポートしています。詳細については、ブラウザ サポートの表をご覧ください。


Google のアプローチ

Google は、セキュリティを大規模に向上できるという恩恵を受けています。Content Security PolicyTrusted TypesFetch MetadataCross-Origin Opener Policy といったウェブ プラットフォームによる対策は、さまざまな Google プロダクトや無数の個々のサービスからあらゆる脆弱性を排除するために役立ちます。この点は、こちらのブログ投稿で詳しく説明しています。


セキュリティ ポリシーを大規模に導入する場合、エンジニアリング上の課題の 1 つとなるのが、新しい制限に準拠しておらず、制限が適用された場合に動作しなくなるコードを特定することです。この問題を解決するためによく使われる 4 つのステップがあります。
  1. ポリシーを report-only モード でロールアウトします(CSP report-only モードの例)。こうすると、ブラウザはクライアント側のコードを通常どおり実行するよう指示しつつ、ポリシーが適用された場合に違反となるイベントの情報を収集します。この情報は、レポートのエンドポイントに送信される違反レポートに集約されます。
  2. 違反レポートをトリアージし、ポリシーに準拠していないコードの場所にリンクします。たとえば、危険な API を使っていたり、ユーザーデータとコードが混在するパターンを使っていたりするため、セキュリティ ポリシーに準拠していないコードベースがあるかもしれません。
  3. 特定したコードをリファクタリングして準拠させます。たとえば、危険な API を安全なバージョンに置き換えたり、ユーザー入力をコードと混在させないようにしたりします。こうしたリファクタリングにより、危険なコーディング パターンが減り、コードベースのセキュリティ態勢が向上します。
  4. すべてのコードを特定し、リファクタリングが終わった段階で、report-only モード からポリシーを削除し、完全に適用します。通常のロールアウトでは、手順 1~3 を繰り返し、すべての違反レポートを確実にトリアージします。



Reporting API では、1 つのレポート エンドポイントと、複数のセキュリティ機能を表現する 1 つのスキーマを使ってこのサイクルを実行できます。そのため、ブラウザ、コードパス、ユーザータイプを問わずに、さまざまな機能のレポートを一元的に収集できます。

注 : ポリシーで禁止されているアクションを行おうとすると、違反レポートが生成されます。たとえば、あるページに CSP を設定しているにもかかわらず、CSP で許可されていないスクリプトを読み込もうとする場合です。Reporting API で生成されるレポートのほとんどは違反レポートですが、それがすべてではありません。その他のタイプには、非推奨レポートやクラッシュ レポートなどがあります。詳細については、ユースケースとレポートタイプをご覧ください。

残念ながら、違反レポートのストリームにはノイズが紛れ込むことがよくあります。その場合、準拠していないコードを見つけることが難しくなる可能性があります。たとえば、多くのブラウザ拡張機能、マルウェア、ウィルス対策ソフトウェア、開発ツールのユーザーは、DOM にサードパーティのコードを挿入したり、禁止された API を使ったりしています。挿入されるコードがポリシーに準拠していない場合、コードベースにリンクされていない対策不可能な違反レポートになる可能性があります。そのため、レポートのトリアージが困難になり、すべてのコードを確実に準拠させてから新しいポリシーを適用するのが難しくなります。

Google は長年にわたり、違反レポートを収集して活用し、それをまとめて 根本原因に集約するための多くの技術を開発してきました ここでは、デベロッパーが違反レポートのノイズを除外できる技術の中から、特に役立つ技術の概要を紹介します。


根本原因に注目する

ブラウザのタブが使われている間に、ポリシーに準拠していないコードが何度も実行されることはよくあります。それが発生するたびに、新しい違反レポートが作成され、キューイングされて、レポートのエンドポイントに送信されます。これが起きると、冗長な情報を含む大量のレポートができてしまいます。そこで、違反レポートをクラスタにグループ化することで、個々の違反を意識することなく、根本原因について考えることができます。根本原因の方が理解しやすいので、有効なリファクタリング方法を探す時間を短縮できます。

例を通して、違反がどのようにグループ化されるのかを確認してみましょう。たとえば、インライン JavaScript イベント ハンドラの使用を禁止する report-only の CSP が導入されているとします。違反レポートは、該当するハンドラのすべてのインスタンスについて作成され、次のフィールドが設定されます。

  • blockedURL フィールドには、inline が設定されます。これは違反の種類を表します。
  • scriptSample フィールドには、フィールド内のイベント ハンドラの内容の最初の数バイトが設定されます。
  • documentURL フィールドには、現在のブラウザタブの URL が設定されます。

ほとんどの場合、この 3 つのフィールドで、特定の URL のインライン ハンドラを一意に識別できます。他のフィールドの値が異なる場合でも同様です。こういったことがよく起こるのは、トークンやタイムスタンプなどのランダムな値をページをまたいで使う場合です。前述のようなフィールドの値は、アプリケーションやフレームワークによって微妙に異なる場合があるため、レポート値をあいまい一致させることができれば、手間を省きつつ、違反をクラスタにグループ化して対策につなげることができます。必要に応じて、URL フィールドに既知のプレフィックスがある違反をグループ化することができます。たとえば、URL が chrome-extensionmoz-extensionsafari-extension で始まるすべての違反をグループ化すると、根本原因がコードベース以外のブラウザ拡張機能である違反を、高い信頼性で特定できます。

独自のグループ化戦略を策定すれば、トリアージが必要な違反報告の数を大幅に減らし、根本原因に注目することができます。通常は、関心のある種類の違反を一意に識別するフィールドを選び、そのフィールドを使って、特に重要な根本原因に優先順位をつけられるようにする必要があります。

 

環境情報を活用する

対策不可能な違反レポートと対策可能な違反レポートを区別するもう 1 つの方法が、環境情報です。このデータは、レポートのエンドポイントへのリクエストには含まれますが、違反レポート自体には含まれません。環境情報からクライアント設定におけるノイズ源を判別できる可能性があるので、トリアージに役立つかもしれません。

  • ユーザー エージェントまたはユーザー エージェント クライアント ヒント : ユーザー エージェントは、対策不可能な違反の大きな兆候です。たとえば、クローラ、ボット、一部のモバイルアプリなどは、サポート対象のブラウザ エンジンとは動作が異なり、カスタムのユーザー エージェントを使っているので、他では起きない違反が発生する可能性があります。それ以外にも、特定のブラウザでのみ発生する違反や、ナイトリー ビルドによる変更や新バージョンのブラウザによって発生する違反もあります。ユーザー エージェント情報がなければ、こういった違反を調査することは非常に困難になります。
  • 信頼できるユーザー : エンドポイントが違反の発生したドキュメントと same-site である場合、Reporting API がレポート エンドポイントに対して行うリクエストに利用可能な Cookie が添付されます。Cookie を取得すると、違反が起きたユーザーの種類を特定する際に役立ちます。対策すべき違反の多くは、会社の従業員やウェブサイト管理者など、信頼できるユーザーによるものであり、これらのユーザーが侵略的な拡張機能をインストールしたり、マルウェアに感染していたりすることはないでしょう。レポート エンドポイントから認証情報を取得できない場合は、まず信頼できるユーザーを対象に report-only ポリシーを設定してみましょう。そうすることで、対策すべき違反の基準を明確にしてから、ポリシーを一般公開することができます。
  • ユニーク ユーザー数 : 一般原則として、典型的な機能やコードパスのユーザーからは、ほぼ同じ違反が生成されるといえます。そのため、少数のユーザーでしか発生していない違反は除外候補とすることができます。つまり、アプリケーションのコードではなく、ユーザーの特定の設定が問題である可能性があるということです。「ユーザー数をカウントする」方法の 1 つは、違反を報告したユニーク IP アドレス数を記録することです。近似カウント アルゴリズムは使いやすく、特定の IP アドレスを追跡せずにこの情報を収集できます。たとえば、HyperLogLog アルゴリズムは、わずか数バイトで、信頼度高く、集合内のおおまかな一意の要素数を数えることができます。

違反をソースコードにマッピングする(高度な内容)

違反のタイプによっては、source_file フィールドまたはそれと同等のフィールドが含まれます。このフィールドは、違反の原因となった JavaScript ファイルを表し、通常は行番号と列番号が付いています。これらの 3 ビットデータは高品質の信号であり、リファクタリングが必要なコードの行を直接指すことができます。

ただし、コンパイルや最小化のために、ブラウザがフェッチしたソースファイルがコードベースに直接マッピングできなくなることもよくあります。その場合は、JavaScript ソースマップを使って、デプロイされたファイルとオーサリングされたファイルの間で行番号と列番号をマッピングするとよいでしょう。すると、違反レポートがソースコードの行に直接変換されるので、非常に対策しやすいレポート グループと根本原因が生成されます。

 

独自のソリューションを確立する

Reporting API は、セキュリティ違反、非推奨の API 呼び出し、ブラウザの介入などのブラウザ側イベントを、イベントごとに指定されたエンドポイントに送信します。ただし、前のセクションで説明したように、そのレポートから実際の問題を抽出するには、データ処理システムが必要です。


幸いなことに、さまざまな方法で必要なアーキテクチャを設定できるようになっており、オープンソースのプロダクトもあります。必要なシステムの基本的な要素は次のとおりです。
  • API エンドポイント : HTTP リクエストを受け取り、JSON 形式でレポートを処理するウェブサーバー
  • ストレージ : 受け取ったレポートやパイプラインで処理したレポートを格納するストレージ サーバー
  • データ パイプライン : ノイズを除去し、必要なメタデータを抽出して集約するパイプライン
  • データ視覚化ツール : 処理したレポートから知見を得るためのツール

以上の各コンポーネントのソリューションは、パブリック クラウド プラットフォーム、SaaS サービス、オープンソース ソフトウェアとして利用できます。詳細については、代替ソリューションのセクションをご覧ください。また、次のセクションでは、サンプル アプリケーションの概要を説明します。

 

サンプル アプリケーション : Reporting API プロセッサ

ブラウザからレポートを受け取る方法と、受け取ったレポートを処理する方法を理解できるように、小さなサンプル アプリケーションを作成しました。このアプリケーションで、ブラウザが送信したレポートからウェブ アプリケーションのセキュリティ問題を抽出するために必要なプロセスを示します。具体的には、以下のプロセスになります。

  • レポートのストレージへの保存
  • ノイズ リダクションとデータ集約
  • 処理済みのレポートデータの可視化
このサンプルでは、Google Cloud を使っていますが、各コンポーネントはお好みのテクノロジーに置き換えることができます。サンプル アプリケーションの概要を次の図に示します。



緑色のボックスは、独自に実装する必要があるコンポーネントです。 フォワーダ(forwarder) はシンプルなウェブサーバーであり、JSON 形式のレポートを受け取り、それを Bigtable 用のスキーマに変換します。 ビームコレクタ(beam-collector) はシンプルな Apache Beam パイプラインであり、ノイズの多いレポートをフィルタリングし、関連するレポートを集約して、CSV ファイルとして保存します。この 2 つのコンポーネントは、Reporting API からのレポートを有効利用するうえで重要な役割を果たしています。


実際に試す

これは実際に実行できるサンプル アプリケーションなので、すべてのコンポーネントを Google Cloud プロジェクトにデプロイし、自分で仕組みを確認することができます。サンプル システムを設定するための詳細な前提条件と手順は、README.md ファイルに記載されています。

 

代替ソリューション

ここで共有したオープンソース ソリューション以外にも、Reporting API を簡単に使えるようにするツールがいくつも用意されています。次のようなものがあります。

  • Sentry や Datadog などのアプリケーション エラー モニタリング プラットフォーム

代替案を選択する際は、価格だけでなく、次の点を考慮するようにしましょう。
  • アプリケーションの URL をサードパーティのレポート収集ツールに渡しても構わないでしょうか?ブラウザが URL から機密情報を取り除いたとしても、機密情報はこのように漏洩する可能性があります。アプリケーションにとってリスクが高すぎると思われる場合は、独自のレポート エンドポイントを運用してください。
  • 収集ツールは、必要なすべてのレポートタイプをサポートしていますか?たとえば、すべてのレポート エンドポイント ソリューションが COOP/COEP 違反レポートをサポートしているわけではありません。

まとめ

この記事では、ウェブ デベロッパーが Reporting API を使ってクライアント側の問題を収集する方法と、収集したレポートから実際の問題を抽出する際の課題について説明しました。また、その課題を解決するために Google がどのようにレポートをフィルタリングして処理しているかを説明し、同様のソリューションを実現する際に利用できるオープンソース プロジェクトを紹介しました。この情報が役立ち、Reporting API を活用するデベロッパーが増え、結果としてウェブサイトの安全性と持続可能性が向上することを願っています。


学習リソース



Reviewed by Eiji Kitamura - Developer Relations Team

この記事は Dave Lester, Bob Callaway による Google Open Source Blog の記事 "Sigstore project announces general availability and v1.0 releases" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。


本日(元記事公開当時)、Sigstore コミュニティは、コミュニティが運営する無償の認証局と透過ログサービスの一般向け提供版についてお知らせします。さらに、Sigstore の 2 つの基本プロジェクトである Fulcio と Rekor で、API が安定版となった v1.0 リリースを公開します。Google も、こういったオープンソース コミュニティの節目を祝福しています。🎉

Sigstore は、オープンソース ソフトウェアの署名、検証、保護のための標準です。最近のサイバーセキュリティに関する米国大統領令など、ソフトウェア サプライチェーンのセキュリティに対する業界の注目度が高まる中、ソフトウェアの出所を把握して信頼する機能はこれまでになく重要になっています。Sigstore は、ソフトウェアのデジタル署名の複雑な部分を簡素化、自動化することで、この機能をこれまで以上に使いやすくて信頼性が高いものにします。

Sigstore プロジェクトは、2020 年に Red Hat と Google のオープンソース コラボレーションとして始まりました。そして、ベンダーに依存せずにコミュニティが運営と設計を行うプロジェクトに成長し、Open Source Security Foundation(OpenSSF)の一員にもなりました。この取り組みは、さまざまなパッケージ マネージャーやエコシステムにも広がり続けています。Python や Kubernetes などのオープンソース プロジェクトの新リリースをダウンロードすれば、それが Sigstore で署名されていることがわかります。

Google は Sigstore コミュニティのメンバーとして、積極的な貢献を行っています。アップストリーム コード以外にも、次のようないくつかの形で貢献しています。

  • Sigstore のコアサービスは、Google がサポートするオープンソース テクノロジーで構築されています。この貢献には、GogRPCTrillianCertificate Transparency などが含まれます。
  • Google は、今年の SigstoreCon のダイヤモンド スポンサーです。

私たちは、Sigstore の開発や運営を支える大きなオープンソース コミュニティの一部です。新しい採用者や貢献者は大歓迎です。Sigstore を使ってみたい方は、プロジェクトのドキュメントでソフトウェアの署名と検証のプロセスについてご確認ください。貢献したい方は、Sigstore GitHub 組織に複数の個人リポジトリがあるので、簡単なタスクを示す目印として、「good first issue」ラベルをご利用ください。プロジェクトには Slack コミュニティこちらの招待を利用できます)があり、コミュニティ ミーティングも定期的に開催しています。


Posted by Eiji Kitamura - Developer Relations Team

この記事は Ali Sarrafによる Chromium Blog の記事 "Introducing passkeys in Chrome" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

Chrome Canary でパスキーがサポートされるようになったことは 10 月にお知らせしました。本日(元記事公開当時)は、Chrome Stable 108 以降でパスキーがサポートされるようになったことをお知らせします。

パスキーとは

通常、私たちのデジタルライフを最前線で守るのはパスワードです。しかし、パスワードはフィッシングされたり、データ漏洩や不十分な管理による被害を受けたりするリスクがあります。Google はこういった問題を以前から認識していました。そのため、2 段階認証Google パスワード マネージャーといった防御策を設けてきました。

前述のようなセキュリティの脅威に簡単かつ便利に対処するには、パスワードを使わない認証に転換しなければなりません。そこで登場するのがパスキーです。パスキーはフィッシングによって侵害される可能性があるパスワードなどの認証要素に代わるもので、安全性を大幅に向上させることができます。パスキーは再利用できず、サーバーの侵害によって漏洩することもないため、ユーザーはフィッシング攻撃から保護されます。また、業界標準に基づいて作られており、オペレーティング システムやブラウザのエコシステムに依存せずに動作し、ウェブサイトでもアプリでも利用できます。

パスキーを使う

パスキーを使うと、対応しているサイトやアプリにログインできます。パスキーを使ってログインするには、デバイスのロック解除と同じ方法で認証する必要があります。

パスキーは、Windows 11、macOS、Android の Chrome の最新版に対応しています。Android では、Google パスワード マネージャーと、将来的にはパスキーをサポートするサードパーティーのパスワード マネージャーでもパスキーが安全に同期されます。




パスキーがデバイスに保存されると、ログイン時の自動入力に表示されるので、安全にログインできるようになります。




デスクトップ デバイスでも、近くのモバイル デバイスのパスキーを利用できます。パスキーは業界標準に基づいて作られているので、Android デバイスでも iOS デバイスでも利用可能です。




この方法でログインしても、パスキーがモバイル デバイスの外に出ることはありません。サイトと交換されるのは安全に生成されたコードのみなので、パスワードとは違い、何も漏洩することはありません。

ユーザーがパスキーを細かく管理できるように、Windows と macOS の Chrome M108 以降では、Chrome 上でパスキーを管理できるようになっています。




パスキーに対応する

サイトでパスキーを動作させるには、デベロッパーが WebAuthn API を使ってサイトにパスキーのサポートを組み込む必要があります。私たちは、Apple や Microsoft をはじめとする同じ業界の企業、FIDO Alliance のメンバー、W3C と協力し、何年もかけて安全な認証標準の検討を進めています。

私たちの目的は、ウェブで可能な限りユーザーの安全を守ることです。そのため、パスキーがもたらす未来に期待を寄せています。Chrome がパスキーに対応したのは大きな節目ではありますが、これで作業が終わるわけではありません。このテクノロジーがさまざまなサイトで広く採用されるには、まだ時間が必要です。iOS と Chrome OS でパスキーを利用できるようにするための作業も進行中です。移行が進む今後も、パスワードは私たちの生活の一部であり続けるので、Google パスワード マネージャーを通じて通常のログインの安全性と利便性を強化する作業も続けてまいります。



Posted by Eiji Kitamura - Developer Relations Team

この記事は Arnar Birgisson による Google Security Blog の記事 "Security of Passkeys in the Google Password Manager" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

この度、デベロッパーの皆さんが Android と Chrome でパスキーのサポートをテストできるようになったことをお知らせします。この機能は今年中に一般提供版になる見込みです。この投稿では、Google Password Manager に保存されたパスキーの安全がどのように保たれているかについて詳しく説明します。簡単な概要については、Android デベロッパー ブログの投稿をご覧ください。

パスキーはパスワードに代わるもので、安全性とセキュリティが向上しています。また、テキスト メッセージ、アプリベースのワンタイム コード、プッシュベースの承認など、従来の 2 要素認証方式も不要になります。パスキーは公開鍵暗号を使うので、サービス プロバイダからデータが漏洩しても、パスキーで保護されたアカウントが侵害されることはありません。また、業界標準の API とプロトコルを使うので、フィッシング攻撃の対象にもなりません。

パスキーは、業界全体の努力の成果で、FIDO Alliance と W3C Web Authentication ワーキング グループが作成した安全な認証標準、さまざまなプラットフォームの一般的な用語やユーザー エクスペリエンス、デバイスの紛失時の復元性、デベロッパー向けの一般的な統合パスといった要素を組み合わせたものです。パスキーは Android をはじめとする業界の主要なクライアント OS プラットフォームでサポートされます。

1 つのパスキーで、オンライン サービスの 1 つの特定のユーザー アカウントを識別できます。1 人のユーザーは、サービスごとに異なるパスキーを持ちます。ユーザーのオペレーティング システムや現在のパスワード マネージャーのようなソフトウェアが、ユーザー フレンドリーな方法でパスキーを管理します。ユーザーから見れば、パスキーを使うのはパスワードを保存するのとまったく同じです。ただし、セキュリティは大幅に向上します。

パスキーは、主に暗号秘密鍵で構成されます。ほとんどの場合、この秘密鍵は、ノートパソコンやスマートフォンといったユーザーのデバイスのみに保存されます。パスキーを作成すると、対応する公開鍵のみがオンライン サービス側に保存されます。サービスはログイン時に、公開鍵を使って秘密鍵の署名を検証します。秘密鍵の署名は、ユーザーのデバイスからしか送信できません。さらに、ユーザーが秘密鍵の署名を送信するには、デバイスや認証情報ストアのロックを解除しなければなりません。そのため、盗まれたスマートフォンなどからログインすることはできません。

デバイスの紛失やアップグレードといった一般的な事象に対処するため、パスキーの重要な特徴として、同じ秘密鍵を複数のデバイスに保存できるようになっています。これは、プラットフォームが提供する同期やバックアップを通じて実現します。

Google Password Manager のパスキー

Android の Google Password Manager は、パスキーのバックアップと同期に対応しています。つまり、ユーザーが同じ Google アカウントを使って 2 台の Android デバイスをセットアップすると、一方で作られたパスキーが他方でも利用できるようになります。これは、スマートフォンとタブレットのようにユーザーが同時に複数のデバイスを持つ場合と、より一般的なケースとしてユーザーが古い Android スマートフォンを新しいものにアップグレードする場合の両方に適用されます。

Google Password Manager のパスキーは、常にエンドツーエンドで暗号化されます。パスキーをバックアップする場合、暗号化した秘密鍵のみアップロードされます。この暗号化は、ユーザーのデバイス上でしかアクセスできない暗号鍵を使って行います。この仕組みにより、Google 内部の悪意のある攻撃者など、Google 自体からもパスキーを保護できます。そういった攻撃者は秘密鍵にアクセスできないので、対応するオンライン アカウントにパスキーを使ってログインすることはできません。

さらに、パスキーの秘密鍵は、ハードウェアで保護された暗号鍵で暗号化した状態で、ユーザーのデバイスに保存されます。

パスキーを作成したり、Google Password Manager に保存されたパスキーを使用したりするには、画面ロックを設定する必要があります。そのため、ユーザーのデバイスに触れることができる人でも、パスキーを使うことはできません。また、この仕組みは、エンドツーエンドの暗号化やデバイスの紛失時の安全な復元を促すために必要なことでもあります。

アクセスの復元と新しいデバイスの追加

ユーザーが新しい Android デバイスを設定して古いデバイスからデータを転送すると、既存のエンドツーエンドの暗号化鍵も新しいデバイスに安全に転送されます。古いデバイスが紛失したり故障したりしている場合、安全なオンライン バックアップからエンドツーエンドの暗号化鍵を復元する必要があることがあります。

エンドツーエンドの暗号化鍵を復元するには、その鍵にアクセスできた別の既存デバイスのロック画面の PIN、パスワード、パターンのいずれかを入力する必要があります。なお、新しいデバイスでパスキーを復元するには、Google アカウントへのログインと既存デバイスの画面ロックの両方が必要です。

画面ロックの PIN やパターンは特に短いので、復元メカニズムには総当たり推測に対する保護が組み込まれています。既存デバイスの画面ロック情報の入力に数回連続して失敗すると、そのデバイスの画面ロックは利用できなくなります。この回数は常に 10 回以下ですが、安全を保証するため、その回数に達する前にブロックされることもあります。他の既存デバイスの画面ロックは、その後も利用できます。

登録されているすべての既存デバイスで最大試行回数に達した場合(悪意のある者が総当たり推測を行った場合など)でも、画面ロックを知っている既存デバイスを利用できれば、復元が可能です。既存デバイスにログインし、画面ロック PIN、パスワード、パターンを変更すると、復元の失敗回数はリセットされます。その後、既存デバイスの新しい画面ロックを入力すると、新しいデバイスでエンドツーエンドの暗号化鍵を復元できます。

画面ロックの PIN、パスワード、パターン自体は、Google も知ることはできません。Google がデバイスの画面ロックの入力が正しいことを検証するためのデータは、Google のサーバーの安全なハードウェア エンクレーブに保存され、Google などが読み取ることはできません。安全なハードウェアでは最大試行回数が 10 回以下に制限されます。これは内部からの攻撃にも適用されるため、画面ロック情報は Google からも保護されます。

デバイスから画面ロックを削除しても、最大 64 日間は、それまで設定されていた画面ロックを別のデバイスのエンドツーエンドの暗号化鍵の復元に利用できます。画面ロックが侵害されたことに気づいた場合、安全な選択肢は別の画面ロック(別の PIN など)を設定することです。これにより、それまでの画面ロックを復元に使うことはできなくなります。ユーザーがオンラインでデバイスにログインしている場合、この変更は即座に反映されます。

復元のユーザー エクスペリエンス

デバイスをセットアップする際にエンドツーエンドの暗号化鍵が転送されなかった場合、新しいデバイスでパスキーを初めて作成または使用するときに、復元処理が自動的に行われます。ほとんどの場合、新しいデバイスでこれが行われるのは一度だけです。

ユーザーから見ると、新しいデバイスで初めてパスキーを使うときは、まずエンドツーエンドの暗号化鍵の復元に必要な既存デバイスの画面ロックを尋ねられ、その後にパスキーの利用時に毎回必要になる現在のデバイスの画面ロックまたは生体認証を求められることになります。

パスキーとデバイス固有の秘密鍵

パスキーは、FIDO マルチデバイス認証情報の一例です。リライング パーティは、パスキーの復元性やユーザビリティというメリットを活用できますが、特定のデプロイ シナリオでは、従来の FIDO 認証情報が提供していたデバイスの固有性についての強いシグナルが必要になることがあります。Google はこの点を認識しています。

それに対処するため、Android のパスキーは、Device-bound Public Key WebAuthn 拡張機能(devicePubKey)提案をサポートしています。リライング パーティが、Android でパスキーを作成または使用するときにこの拡張機能を要求すると、その結果として 2 つの署名を受け取ります。1 つはパスキーの秘密鍵の署名で、この鍵は複数のデバイスに存在する可能性があります。もう 1 つは第 2 の秘密鍵の署名で、この鍵は現在のデバイスにしか存在しません。このデバイス固有の秘密鍵は、対象のパスキーに対して一意で、それに対応するデバイス固定の公開鍵のコピーがすべてのレスポンスに含まれます。

2 つのパスキーの署名に同じデバイス固有の公開鍵が含まれていれば、それは署名が同じデバイスで生成されたことを示す強いシグナルになります。一方で、初めて目にするデバイス固有の公開鍵が含まれていれば、それはパスキーが新しいデバイスに同期されたことを示している可能性があります。

Android のデバイス固有の秘密鍵は、Android Keystore API を通じてデバイスの高信頼実行環境(TEE)で生成されます。これにより、デバイス固有の秘密鍵が別のデバイスに漏洩しないように、ハードウェアレベルで保護されます。デバイス固有の秘密鍵はバックアップされないので、デバイスを出荷時の設定にリセットしたり、以前のバックアップから復元したりすると、デバイス固有の鍵ペアは違うものになります。

デバイス固有の鍵ペアは、オンデマンドで作成され、保存されます。つまり、パスキーが作成されたときに devicePubKey がリクエストされていなくても、リライング パーティは既存のパスキーから署名を取得する際に devicePubKey 拡張機能をリクエストできます。


この記事は Google オープンソース セキュリティ チーム、Brandon Lum、Oliver Chang による Google Security Blog の記事 "SBOM in Action: finding vulnerabilities with a Software Bill of Materials" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

昨年は、ソフトウェア部品表(Software Bills of Materials、SBOM)を採用しようという機運が業界全体で高まりました。SBOM とは、ソフトウェアをビルドするために必要なコンポーネント、ライブラリ、モジュールをすべて列挙したものです。2021 年のサイバーセキュリティに関する米国大統領令を受けて、私たちが使うソフトウェアが何でできているのかを理解する手段として、このソフトウェア部品表が注目されています。基本的な考え方は、他者が作ったものも含め、すべての部品について把握していなければ、特定のソフトウェアに含まれるリスクは判断できないというものです。SBOM への関心の高まりは、米国国立標準技術研究所(NIST)がソフトウェアの SBOM 情報の提供を必須としたセキュア ソフトウェア開発フレームワークを公開したことで、さらに押し上げられることになりました。しかし、業界で SBOM を生成して共有する手法が進展しつつある今、SBOM をどのように活用すればよいのでしょうか。

SBOM を生成するだけでは、まだ道半ばです。あるソフトウェアの SBOM が準備できたら、それを既知の脆弱性リストにマッピングして、脅威を及ぼしかねないのはどのコンポーネントかを確認する必要があります。この 2 つの情報源を結びつけることで、利用者はソフトウェアに含まれているものだけでなく、そのリスクや修正すべき問題があるかどうかも把握できます。

このブログ投稿では、大規模で重要なプロジェクトである Kubernetes から SBOM を取得し、オープンソースのツールを使ってそこに含まれる脆弱性を特定するプロセスを示します。私たちの例の成功は、完全な SBOM が作られるのを待たなくても、SBOM と一般的な脆弱性データベースとのマッピングを始められることを示しています。2 つのデータソースを結びつける際の現在の制限に対処するために SBOM 作成者が少しの更新を行うだけで、このプロセスは、平均的なソフトウェア利用者が簡単に使えるものになります。

OSV: SBOM と脆弱性を結びつける

以下の例では、Kubernetes を取り上げます。大規模プロジェクトである Kubernetes では、SBOM 情報を伝達するためのオープンな国際基準(ISO)である Software Package Data Exchange(SPDX)形式で SBOM が提供されています。SBOM を提供しているすべてのプロジェクトにも、同じ考え方が当てはまるはずです。SBOM を提供していないプロジェクトでは、Kubernetes が作成した同じ bom ツールを使って独自の SBOM を生成できます。

今回は、この SBOM を Open Source Vulnerabilities(OSV)データベースにマッピングすることにしました。このデータベースでは、オープンソース パッケージのバージョンやコミット ハッシュとマッピングできる形式で脆弱性が記述されています。OSV データベースはこの点でも優秀で、標準形式が提供され、複数のエコシステム(Python、Golang、Rust など)やデータベース(Github Advisory Database(GHSA)Global Security Database(GSD)など)からの情報が集約されています。

SBOM とデータベースを結びつけるために、SPDX の spdx-to-osv ツールを使います。このオープンソース ツールは SPDX の SBOM ドキュメントを受け取り、OSV 脆弱性データベースに照会をし、ソフトウェアで宣言されているコンポーネントに含まれる脆弱性の一覧を返します。
例 : Kubernetes の SBOM

最初の手順は、Kubernetes の SBOM をダウンロードすることです。Kubernetes の SBOM は公開されており、プロジェクト、依存関係、バージョン、ライセンスについての情報が含まれています。次に示す簡単な curl コマンドで、誰でもダウンロードできます。

# Kubernetes SPDX ソース ドキュメントをダウンロードする

$ curl -L https://sbom.k8s.io/v1.21.3/source > k8s-1.21.3-source.spdx


次の手順では、SPDX の spdx-to-osv ツールを使って Kubernetes の SBOM と OSV データベースを結びつけます。

# SPDX SBOM 情報を受け取り、それを OSV 脆弱性にマッピングする spdx-to-osv ツールを実行する

$ java -jar ./target/spdx-to-osv-0.0.4-SNAPSHOT-jar-with-dependencies.jar -I k8s-1.21.3-source.spdx -O out-k8s.1.21.3.json


# 出力された spdx-to-osv ツールの OSV 脆弱性を表示する

$ cat out-k8s.1.21.3.json

{

  "id": "GHSA-w73w-5m7g-f7qc",

  "published": "2021-05-18T21:08:21Z",

  "modified": "2021-06-28T21:32:34Z",

  "aliases": [

    "CVE-2020-26160"

  ],

  "summary": "Authorization bypass in github.com/dgrijalva/jwt-go",

  "details": "jwt-go allows attackers to bypass intended access restrictions in situations with []string{} for m[\"aud\"] (which is allowed by the specification). Because the type assertion fails, \"\" is the value of aud. This is a security problem if the JWT token is presented to a service that lacks its own audience check. There is no patch available and users of jwt-go are advised to migrate to [golang-jwt](https://github.com/golang-jwt/jwt) at version 3.2.1",

  "affected": [

    {

      "package": {

        "name": "github.com/dgrijalva/jwt-go",

        "ecosystem": "Go",

        "purl": "pkg:golang/github.com/dgrijalva/jwt-go"

      },




ツールの出力から、Kubernetes の v1.21.3 には、脆弱性 CVE-2020-26160 があることがわかります。この情報は、このソフトウェアを運用するリスクを管理するために追加のアクションが必要かどうかを判断する際に役立つ可能性があります。たとえば、ある組織が Kubernetes の v1.21.3 を使っている場合、会社のポリシーに基づいてデプロイされたソフトウェアを更新するという対策をとることが考えられます。そうすれば、この脆弱性を悪用した攻撃から組織を守ることができます。

SBOM ツールの改善提案

spdx-to-osv ツールを動作させるには、いくつかの小さな変更を行い、SBOM が提供する情報のあいまいさを排除する必要がありました。
  • 現在の bom ツールの実装では、バージョンがパッケージ名の中に含まれています(gopkg.in/square/go-jose.v2@v2.2.2)。SPDX 形式ではバージョン番号が別のフィールドに格納されているため、この接尾辞を取り除かないと、照合させることができませんでした。
  • この bom ツールで作成した SBOM では、エコシステムが特定できません。エコシステムがないと、どのライブラリやパッケージが影響を受けるかを確実に自動判定することはできません。エコシステムによって影響の有無が異なる場合、脆弱性スキャナが誤判定を引き起こす可能性があります。SBOM でライブラリやパッケージのバージョンが区別されていれば、利便性がさらに高まります。
ただし、これらは比較的小さなハードルで、手動で多少の調整をするだけで、うまくツールを実行できました。今後、このプロセスを簡単に実行できるように、次の提案により SBOM 生成ツールを改善したいと考えています。

  • SBOM ツールの作成者は、ソフトウェアに含まれるすべてのパッケージについて、Purl などの識別スキームによる参照を追加すべきです。この種の識別スキームがあれば、エコシステムを特定できるとともに、前述の接尾辞のようなパッケージ記述子の小さな揺れに対するスキームの柔軟性が向上するので、パッケージの識別も容易になります。SPDX ではこれをサポートするために、Purl の外部参照やその他のパッケージ識別スキーマの外部参照を使用しています。
SBOM の未来

SBOM の当初の目的である「ソフトウェアの脆弱性リスク管理を支援する」が実現されつつあることは明らかです。今回の例では OSV データベースを照会しましたが、近いうちに、他の脆弱性データベースに SBOM データをマッピングしたり、VEX などの新しい標準を使ったりすることもできるようになるでしょう。VEX では、ソフトウェアの脆弱性が軽減されているかどうかについての追加情報が提供されます。

SBOM の採用が広がり、ツールの改善が続けば、そう遠くないうちに、すべてのソフトウェアで SBOM のリクエストやダウンロードができるようになるでしょう。さらに、利用するソフトウェアの脆弱性も把握できるようになるかもしれません。今回の例を通して、SBOM と脆弱性データベースを結びつけるうえでの問題が解消されたときに、SBOM で何が実現できるかを垣間見ることができました。それこそ、使うソフトウェアのリスクに関する不安が軽減された新たな日常です。
 
spdx-to-osv ツールの作成者で、このブログ投稿に貢献いただいた Source Auditor 社の Gary O'Neall 氏に深く感謝いたします。


Posted by Eiji Kitamura - Developer Relations Team

この記事は Android セキュリティおよびプライバシー チーム、Eugene Liderman、Sara N-Marandi による Google Online Security Blog の記事 "I/O 2022: Android 13 security and privacy (and more!)" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

I/O では毎年、Android のプライバシーとセキュリティの最新機能についてお話ししています。しかし、ユーザーの皆さんの中には、Google が最新リリースでシームレスなエクスペリエンスを提供しつつ、安全性やプライバシーを強化している方法について、もっと詳しく知りたいと考えている方もいます。そこで、データ保護を強化し、プライバシーを高めてアプリの信頼性やデバイスのエクスペリエンスを向上するために開発しているツールについて、詳しく説明したいと思います。

高速で邪魔にならないセキュリティ

スマートフォンを使うのが消費者であっても企業であっても、デバイスとそこで実行されるアプリの妥当性を保証するうえで、重要な要素となるのが構成証明(attestation)です。基本的に、鍵の構成証明とは、デベロッパーがシークレットまたは指定されたデータをデバイスにバインドすることです。これは、この鍵が利用できる限り「同じユーザー、同じデバイス」であるという主張であり、暗号学的に妥当性を主張できます。

Android 13 では、Android デバイスへの構成証明鍵のプロビジョニング方式を新しいモデルに移行しました。この方式はリモート鍵プロビジョニング(RKP)と呼ばれています。新しいアプローチでは、工場でのプロビジョニング エラーを無くし、鍵の脆弱性のリカバリ方法を提供することで、デバイスのセキュリティを強化します。具体的には、構成証明鍵の証明書管理ライフサイクルにおいて、Google の責任範囲を広げたアーキテクチャに移行することによって実現します。RKP の詳細は、こちらから確認できます。

また、Google Play システム アップデートを使って直接アップデートできるモジュールをさらに増やします。これにより、シームレスかつ自動的により多くのシステム コンポーネントをアップグレードしたりバグを修正したりできるようになるため、デベロッパーはアップデートについて気にする必要がなくなります。現在、Android の 30 以上のコンポーネントが Google Play 経由で自動アップデートできる状態になっています。これには、Android 13 の新モジュールである Bluetooth や超広帯域無線(UWB)も含まれています。

昨年は、主要なオペレーティング システムの脆弱性のほとんどが、C や C++ などのプログラミング言語の未定義の動作によって引き起こされていることについてお話ししました。Rust は高度なシステム プログラミング(OS、ネットワーク)に必要な効率と柔軟性を兼ね備えたもう 1 つの言語ですが、Rust にはメモリ安全性という追加の利点があります。うれしいお知らせですが、鍵管理コンポーネントやネットワーク スタックなどの Android のセキュリティ上重要な部分に、Rust が採用されています。

強固なプラットフォームの実現は、メモリ安全性や不正利用防止技術などを継続的に改善することにとどまりません。強固な API サーフェスを実現して、エンドユーザーにより安全なエクスペリエンスを提供することもその一部です。

Android 13 では、アプリ デベロッパーが意図せずに導入してしまいがちな潜在的脆弱性への対策として、たくさんの機能拡張を実装しました。その 1 つとして、アプリの特定のブロードキャスト レシーバをエクスポートしてデバイスの他のアプリに公開するかどうかをデベロッパーが指定できるようにすることで、ランタイム レシーバの安全性を向上しています。また、インテント フィルタで一致しないインテントをブロックすることで、アプリとそのコンポーネントの保護をさらに強化します。

特定のセキュリティ認証要件に準拠しなければならない企業ユーザーのために、セキュリティ ログ レポートをアップデートして、セキュリティ ログのカバレッジを増やすとともに、ログを 1 か所にまとめるようにしました。この機能は、Common Criteria などの標準に準拠しなければならない企業に便利です。また、すべてのセキュリティ関連ログを 1 か所で審査できるので、管理ソリューション プロバイダなどのパートナーにとっても有益です。

条件に合わせたプライバシー

Android 13 では、プライバシーを重視したアプリを開発する方法が増えます。新しい写真ピッカーを使うと、別のアプリにメディア ライブラリへのアクセス権を与えることなく、共有したい写真や動画のみを選択できます。現在、アプリでこの機能を実装できるようになっています。

Android 13 では、昨年導入した周辺デバイス パーミッションを利用して、動作するために位置情報を要求しなければならないアプリの数も減らします。たとえば、一部のアプリや状況で、Wi-fi を有効にするために位置情報をオンにする必要はなくなります。また、ストレージの動作を変更し、オーディオ、画像、動画のファイルにアクセスするパーミッションを別々に要求しなければならないようにしました。

これまでは、アプリがバックグラウンドからクリップボードにアクセスすることは制限されており、それが行われた際には警告を表示していました。Android 13 では、短い周期でクリップボードの履歴を自動削除するので、アプリが以前にコピーされた情報を見ることはできなくなります。

Android 11 より、長期間利用しなかったアプリに付与されたパーミッションの自動リセットが導入され、その後、この機能は Android 6 以降を実行しているデバイスにまで拡大されています。それ以来、50 億以上のパーミッションが自動リセットされました。

Android 13 では、アプリ制作者がさらに積極的にパーミッションの削除ができるようになります。デベロッパーは、アプリが不要なパーミッションを保持する時間を短縮することで、プライバシーを強化できます。

通知が多くのアプリにとって重要であることは認識していますが、ユーザーにとっては、すべての重要度で同じであるわけではありません。Android 13 デバイスの新規アプリは、デフォルトで通知を送信する前にパーミッションを求めることが義務づけられるので、アラートを受け取りたいアプリを細かく制御できるようになります。

信頼できるアプリ

ほとんどのアプリ デベロッパーは、パッケージ化された機能がバンドルされたさまざまなソフトウェア開発キット(SDK)を使ってアプリを開発しています。SDK はすばらしい機能を提供してくれますが、一般的に、アプリ デベロッパーが SDK コードの確認や調整を行うことはほぼ不可能です。パフォーマンスの分析も同様です。

そこで、アプリの安全性を高めることを目的として、デベロッパーと連携して、新しい Google Play SDK Index を導入します。これにより、SDK のコードをアプリに組み込む前に、SDK の安全性や信頼性に関するシグナルを確認できるようになります。すべての方が、この仕組みを活用して、アプリのエコシステムのセキュリティとプライバシーを強化することができます。

先月、Google Play で新しいデータ セーフティ セクションのロールアウトを開始しました。これにより、アプリがユーザーのデータをどのように収集、共有、保護する予定であるかを、アプリをインストールする前に知ることができます。また、さらに Play アプリの信頼性向上を促すため、デベロッパーが世界で認知されているモバイルアプリのセキュリティ標準である OWASP の MASVS に照らして、独立してアプリを検証できるようにしました。

私たちは、少数のデベロッパー グループや認定ラボパートナーと共同で、このプログラムを進化させようとしています。この独立した検証を終えたデベロッパーは、その旨をデータ セーフティ セクションに表示することができます。

その他のモバイル セキュリティと安全性

現在、Google Play のマルウェア対策によって、1 日あたり 1,250 億個のアプリがスキャンされています。私たちは、それと同じように、スパムやフィッシングの検知には組み込みの機能が使われるべきだと考えています。うれしいことに、ある最新の分析レポートで、フィッシングと詐欺対策の組み込みメッセージング アプリとして、Messages が最も高い評価を受けました。

現在、Messages は、毎月 15 億のスパム メッセージからの保護に役立てられています。そのため、迷惑メールも不正アクセスの試みも避けることができます。悪意のあるユーザーが情報を盗み取ろうとして、リンクをクリックさせようとしたり、アプリをダウンロードさせようとしたりするケースが増えています。そのため Google は、常に新たな防御策を探し続けています。

昨年には Messages にエンドツーエンドの暗号化を導入し、モバイルでの会話のセキュリティを向上しました。今年は、グループ会話のエンドツーエンド暗号化をベータ版としてリリースし、個人のメッセージの保護をさらに強化する予定です。

Google はたくさんの機能を開発していますが、それをオープンで透過性のある形で行っています。Android 11 では、スマートフォンでプライバシーを保ちながらデジタル ID を使えるようにするプラットフォーム機能についてお知らせしました。これは、ISO 規格に準拠した新機能でした。カード型の免許証(またはその他の身分証明書)を誰かに渡して確認してもらう場合、選択の余地はありません。つまり、相手はフルネーム、生年月日、住所などの個人を特定できる情報(PII)にアクセスできます。モバイル版ならもっと細かい制御が可能で、相手に何を公開するのかをエンドユーザーやアプリが厳密に選択できます。さらに相手も、返されたデータを保持するつもりかどうかを宣言しなければなりません。また、身元を明かすことなく、年齢などの一部の詳細情報を提示することもできます。

直近 2 回の Android リリースでは、この API を改善し、サードパーティ組織がさまざまなデジタル身分証明のユースケースを簡単に利用できるようにしています。運転免許証、学生証、企業のバッジなどがその一例です。ここで、Google Wallet が Android Identity Credential を使ってデジタル ID と運転免許証をサポートすることを発表します。Google は、米国の各州や世界中の政府と連携し、今年中に Wallet でデジタル ID を実現する予定です。Google Wallet の新しい機能強化の詳細については、こちらからご覧ください。

Android による保護

Google は、皆さんのセキュリティとプライバシーはわかりやすく、制御しやすいものであるべきだと考えています。今年は、Android 13 デバイスの設定画面に、デバイスのセキュリティとデータのプライバシーのすべてを管理できる機能をロールアウトする予定です。

新しいセキュリティとプライバシーの設定ページでは、安全性の状態を色分けされたシンプルな表現で示すほか、セキュリティとプライバシーを改善するための明確で実用的なガイダンスも提供する予定です。このページの中心は、新しいアクション カードです。安全性のリスクに対処するために実行すべき重要な手順が、そこに通知されます。問題について警告する通知のほかに、プライバシーを強化する方法についてのタイムリーなおすすめも提供したいと考えています。

データを管理できているという安心感を得るには、信頼できる安全な土台が必要です。デバイスが安全でなければ、プライバシーの保護は望めないからです。Android が常に皆さんを守ることができるように、私たちは懸命に努力を続けています。その保護について詳しく知りたい方は、ウェブサイトをご覧ください。


Reviewed by Eiji Kitamura - Developer Relations Team

この記事は Google アカウント セキュリティ チーム、ソフトウェア エンジニア、Daniel Margolis による Google Online Security Blog の記事 "Taking on the Next Generation of Phishing Scams" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

セキュリティ技術は毎年向上しており、ブラウザが進化してウェブの暗号化が普及し、認証が強固になっています。しかし、フィッシングは依然として脅威であり続けています(米国労働省への先日のフィッシング攻撃からもわかります)。その原因は、単純なパスワードだけで世界中どこからでもオンライン アカウントにログインできる状態が続いているところにあります。そこで今回の I/O では、フィッシングのリスクを減らす新たな方法として、Google ドキュメント、スプレッドシート、スライドのフィッシング保護の拡大、2 段階認証の自動登録の継続などについてお知らせしました。このブログでは、フィッシングの手法と、それがどのように進化しているかについて詳しく説明します。

フィッシングの広がりとともに、攻撃者が多要素認証を狙うことが多くなっています。たとえば、正規の「ワンタイム パスコード」(攻撃者が被害者のアカウントにログインしようとして送られたもの)の後に「先ほど受信したコードを返信してください」というなりすましメッセージを送ることで、SMS コードを直接盗み取ろうとする場合があります。


左 : 正規の Google SMS 認証。 右 : 認証コードを共有することを求めるなりすましメッセージ。


また、それよりも高度な動的フィッシング ページを使ってリレー攻撃が行われることもあります。この攻撃では、通常のフィッシング攻撃と同じように、ユーザーは目的のサイトにログインしていると思いこんでいます。しかし、単なる静的なフィッシング ページで被害者がログインしようとしたときにメールとパスワードを取得しようとするのではなく、情報を盗むと同時に実際のウェブサイトにログインするウェブサービスが使われています。

最も簡単な方法は、既製の「リバース プロキシ」をほぼそのまま利用することです。これが「中間者」として動作し、入力を正規のページに転送し、正規のページからの応答をブラウザに送り返します。



こういった攻撃を防ぐのは困難です。攻撃者に提示される追加の認証画面(SMS コードのプロンプトなど)も被害者にリレーされ、被害者の応答も本物のウェブサイトにリレーされるからです。この方法では、どんな認証が行われても、被害者がそれを解決してくれることになります。

従来の PIN コードによる多要素認証では、このような攻撃には対抗しきれません。スマートフォンに同意画面を提示するという認証は、SIM スワップ攻撃には効果的ですが、こういったリアルタイム盗聴を防ぐことはできません。

ソリューション領域

ここ数年間で、デバイスベースの 2 要素認証の自動有効化を始めています。この認証方法は、従来のパスワード漏洩に効果があるだけでなく、技術の向上に伴い、前述のような高度な形態のフィッシングからの保護にも役立つようになっています。

大まかに分けると、ほとんどのフィッシング対策は次のように分類されます。
  • ブラウザの UI を改善し、ユーザーが正規のウェブサイトを見分けられるようにする。
  • パスワード マネージャでログイン前にウェブページが本物かどうかを検証する。
  • メール(最もよく使われる配信チャンネル)とブラウザの両方でフィッシングを検知し、疑わしいウェブページについて警告する。
  • 自動ログインを防ぐことで、前述の中間者攻撃を防止する。
  • セキュリティ鍵やスマートフォンの Bluetooth 接続を利用して、フィッシングに強い FIDO 認証をする。
  • Google Prompt 認証を強化し、ユーザーが疑わしいログイン試行を特定できるようにしたり、フィッシングに対抗するための追加手順を導入したりする(別のウェブアドレスに移動する、ログインしているコンピュータと同じワイヤレス ネットワークに接続するなど)。

フィッシングに強い認証を多くのユーザーに展開する


この 10 年間、私たちは FIDO Alliance の一員として、たくさんの業界パートナーの協力のもと、フィッシングに強い認証メカニズムの展開を懸命に進めてきました。こういった取り組みを通じて、Titan セキュリティ キーなどの物理 FIDO セキュリティ鍵を導入しました。これを使うと、ログインするウェブサイトが本物かどうかを検証することで、フィッシングを防ぐことができます(この検証により、前述の「中間者」フィッシングを防ぎます)。先日には、FIDO Alliance、Apple、Microsoft とともに、フィッシングに強い真にパスワードレスな未来に向けて、大きな節目となる発表をしました。すなわち、FIDO ログイン標準のサポートを拡大します。

セキュリティ鍵はたいへん効果的ですが、あらゆる人がキーホルダーにつけて持ち歩くようになるとは思えません。



そこで、このレベルのセキュリティをより身近なものにするため、セキュリティ鍵をスマートフォンに組み込みます。USB でデバイスに接続しなければならない物理 FIDO セキュリティ鍵とは違い、Bluetooth を使ってスマートフォンがログインするデバイスのそばにあることを確認します。これにより、物理セキュリティ鍵と同じく、遠くにいる攻撃者がユーザーを欺いてブラウザのログインに同意させることはできなくなります。「中間者」攻撃は SMS や Google Prompt にも有効ですが、このセキュリティ層が追加されることで、このような攻撃を防ぐことができます。

(なお、Bluetooth の範囲内にあるコンピュータがユーザーとしてログインできるようになるわけではありません。ユーザーがそのコンピュータからログインすることに同意できるようになるだけです。また、この仕組みは、スマートフォンがログインしようとしているデバイスの近くにあることを確認するためだけに使います。そのため、Bluetooth をオンにする必要があるのはログインの間だけです)

今後の数か月間で、この技術を多くの場所に展開する予定です。そのため、この追加セキュリティ チェックが行えるように、ログイン時に Bluetooth を有効にするリクエストが表示されることがあるかもしれません。Android スマートフォンで Google アカウントにログインしている場合は、Google Prompt と同じように、スマートフォンを自動登録できます。そのため、一切追加設定をすることなく、この追加のセキュリティ層を多くのユーザーに提供できます。

ただし、この安全なログイン方式は、どこでも利用できるわけではありません。Bluetooth をサポートしていないコンピュータや、セキュリティ鍵をサポートしていないブラウザにログインする場合は利用できません。そのため、すべての人がフィッシングに強いセキュリティを利用できるようにするのであれば、セキュリティ鍵が利用できない場合のバックアップを提供する必要があります。そして、そのバックアップも、攻撃者に利用されることがないように、十分に安全なものでなければなりません。


フィッシング対策として既存の認証を強化する


ここ数か月の間に、従来の Google Prompt 認証をフィッシングに強くする実験を始めています。

現時点で、すでに状況に応じて認証操作が変わるようになっています。たとえば、「許可」と「拒否」のクリックに加えて、PIN コードと画面に表示されている内容を照合することが求められる場合があります。これは、認証に同意させようとする静的フィッシング ページへの対策として有効です。

また、リスクが高い状況でさらに多くの操作を求める実験も開始しています。たとえば、フィッシング攻撃者のものと思われるコンピュータからログインしている場合に、目立つように警告を表示します。あるいは、スマートフォンとログイン操作を行っているコンピュータが確実に近くにあることを確認するため、両方が同じ Wi-Fi ネットワークに接続することを求めます。この対策により、セキュリティ鍵に Bluetooth を使う仕組みと同じように、意図せずに「中間者」フィッシング ページにログインしてしまうことを防止できます。


すべてを統合する

ここで紹介した方法は、いずれもアカウントのセキュリティを劇的に高めるものです。しかし、当然ながら、これが難しいユーザーもいます。そのため、ユーザビリティにも注目したリスクベースのアプローチの一環として、これらの方法を徐々にロールアウトしています。リスクが高いと判断されたアカウントや、異常な動作が見られたアカウントには、先ほどのような追加セキュリティ対策が導入される可能性が高くなります。

今後、FIDO2 認証がさらに普及すれば、多くのユーザーに対してそれをデフォルトにできると考えています。すると、今回説明したような既存の認証をさらに強固にしたものを使って、安全なフォールバックを提供できるようになります。

ブラウザの自動処理を検知して「中間者」攻撃を防ぐ、Chrome や Gmail でユーザーに警告する、Google Prompt の安全性を強化する、Android スマートフォンを使いやすいセキュリティ鍵として自動的に有効化するなど、ここで紹介した新手法を連携すれば、ユーザーをフィッシングから守る仕組みをさらに強化できます。

フィッシング攻撃は古くからの根強い脅威ですが、最新技術によって、オンラインでの安全を享受できるユーザーを増やすための画期的な対策を実現できるようになっています。
Reviewed by Eiji Kitamura - Developer Relations Team

この記事は Android、Pixel、および Tensor セキュリティ チーム、 Dave Kleidermacher、Jesse Seed、Brandon Barbello、Stephan Somogyi による Google Online Security Blog の記事 "Pixel 6: Setting a new standard for mobile security" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

リリースされたばかりの Pixel 6 と Pixel 6 Pro は最も安全な Pixel スマートフォンであり、5 年間にわたるセキュリティ アップデートが適用されるほか、最もレイヤー数の多いハードウェア セキュリティを備えています。これらの新しい Pixel スマートフォンでは、レイヤー化されたセキュリティ アプローチを採用しており、Google Tensor SoC(System on a Chip)ハードウェアから Pixel で先行利用できる Android オペレーティング システムの新機能に至るまでのイノベーションを活用して、チップからデータセンターまでを網羅する Google セキュリティが適用された最初の Pixel スマートフォンを実現しました。また、複数の専属のセキュリティ チームが開発を担当して、透明性と外部検証を通じて Pixel のセキュリティを証明しています。

コアにセキュリティを提供

Google は、Google Tensor を使用して、ハードウェア セキュリティの最重要部にユーザーデータの保護と透明性を提供しています。Google Tensor のメイン プロセッサは Arm ベースであり、TrustZone™ テクノロジーを活用しています。TrustZone は、一般的な処理を安全に行うセキュリティ アーキテクチャの重要な要素ですが、Google Tensor に含まれているセキュリティ強化は、TrustZone の一歩先を進んでいます。

図 1. Pixel の安全な環境

Google Tensor セキュリティ コアは、ユーザー プライバシーの保護に特化したカスタム設計のセキュリティ サブシステムです。このサブシステムは、アプリケーション プロセッサとは論理的かつ物理的に異なり、専用 CPU、ROM、OTP(1 回しか書き込めない)メモリ、暗号化エンジン、内部 SRAM、保護された DRAM で構成されます。Pixel 6 と Pixel 6 Pro の場合、セキュリティ コアの主要なユースケースには、実行時にユーザーデータ キーを保護したり、セキュアブートを強化したり、Titan M2TM と連携したりすることが含まれます。

ハードウェアの安全性は、OS が安全であるときにのみ確保されます。Google では、オープンソースの信頼できる実行環境である Trusty を使用しています。Trusty OS は、TrustZone と Google Tensor セキュリティ コアの両方で使用される安全な OS です。

Pixel 6 と Pixel 6 Pro では、Google がすべてを設計して開発した別個のセキュリティ チップである新しい Titan M2TM によってセキュリティが強化されています。この次世代チップを採用したことにより、Google は社内設計した RISC-V プロセッサに移行し、速度とメモリ容量を向上し、高度な攻撃に対する耐性をさらに強化しています。Titan M2TM は、独立した認定済みの評価ラボによって、脆弱性評価の最も厳格な標準である AVA_VAN.5 に照らしてテストされています。Titan M2™ は Android StrongBox をサポートします。Android StrongBox は、PIN とパスワードの保護に使用されるキーを安全に生成して格納し、Google Tensor セキュリティ コアと連携して、SoC で使用中のユーザーデータ キーを保護します。

システムが改善された Pixel 6 と Pixel 6 Pro は、Android 12 と、Pixel で先行利用や限定利用ができるたくさんの機能が搭載された状態で出荷されます。

強化されたコントロール

Google は、Android のリリースのたびに、データをコントロールしてデバイスを管理するより適切な方法をユーザーに提供することを目指しています。Pixel で使用される Android 12 以降では、新しいセキュリティ ハブを使用して、すべてのセキュリティ設定を 1 か所で管理することができます。つまり、デバイスの現在の構成を一元的に表示することにより、スマートフォン、アプリ、Google アカウント、パスワードを保護できるようにしています。また、セキュリティ ハブは、セキュリティを改善するための推奨事項を提供するため、ニーズに最適な設定を判定できるようになります。

Google はプライバシーのためにプライバシー ダッシュボードをリリースし、過去 24 時間以内に位置情報、マイク、カメラにアクセスしたアプリをシンプルで明確なタイムライン形式で表示できるようにしています。予想よりも多くのデータにアクセスしているアプリに気付いた場合、ダッシュボードには、それらのアプリのパーミッションをすぐに変更できるコントロールへのパスが表示されます。

さらに透明性を向上するため、アプリがカメラやマイクにアクセスしていることが、Pixel のステータスバーにある新しいインジケーターでわかるようになっています。アクセスを無効にしたい場合、プライバシーの新しい切り替え機能により、1 回タップするだけで、スマートフォンのアプリによるカメラやマイクへのアクセスをいつでもオフにすることができます。

Pixel 6 と Pixel 6 Pro には、セキュリティが低い 2G ネットワークにアクセスするデバイスの機能を削除する切り替え機能も含まれています。一部の状況では 2G ネットワークへのアクセスが必要になりますが、さらなる攻撃ベクトルが発生する可能性があります。この切り替え機能は、2G 接続が不要なときに、そのリスクを軽減することに役立ちます。

組み込みのセキュリティ

Google はすべてのプロダクトをデフォルトで安全にするために、オンラインの安全を維持することに他の誰よりも取り組んでいます。また、Pixel 6 と Pixel 6 Pro では、デフォルトで組み込まれている保護機能を強化しています。

画面に埋め込まれた光学指紋認証センサーは、バイオメトリック情報の安全を確保し、デバイスの外に流出することを防ぎます。Google の継続的なセキュリティ開発ライフサイクルの一環として、Pixel 6 と Pixel 6 Pro の指紋認証によるロック解除は、外部のセキュリティ エキスパートによって、Android 12 互換性定義ドキュメント(Compatibility Definition Document、CDD)で定義されているクラス 3 強度要件を満たす安全な生体認証ロック解除メカニズムとして検証されています。

フィッシングは強大な攻撃ベクトルであり続け、さまざまなデバイスを使用しているすべての人に影響を及ぼしています。

Pixel 6 と Pixel 6 Pro では、新しいフィッシング対策保護機能が導入されています。組み込みの保護機能は、通話、テキスト メッセージ、メール、アプリを通じて送信されるリンクからの潜在的な脅威を自動的にスキャンし、潜在的な問題がある場合は、ユーザーに通知します。

また、ユーザーは、Google Play プロテクト内のオンデバイス検出機能に加えられた機能強化により、悪意のあるアプリからより強固に保護されています。Google Play プロテクトは 2017 年にリリースされて以来、デバイスがオフラインのときでも、悪意のあるアプリを検出できるようにしてきました。Pixel 6 と Pixel 6 では、Google Play プロテクトでのマルウェア検出を強化する新しい機械学習モデルを使用しています。この検出機能は Pixel で実行され、フェデレーション アナリティクスと呼ばれるプライバシー保護テクノロジーを使用して、一般的に実行される悪意のあるアプリを検出します。これにより、すでに 1,000 億個のアプリを毎日分析して脅威を検出している Google Play プロテクトが改善され、30 億人を超えるユーザーにさらに強固な保護を提供します。

Pixel の多くのプライバシー保護機能は、残りのオペレーティング システムやアプリから分離されたオープンソースのサンドボックスである Private Compute Core 内で実行されます。Google のオープンソースの Private Compute Services は、これらの機能のネットワーク通信を管理し、プライバシーを保護すると同時に、フェデレーション ラーニング、フェデレーション アナリティクス、個人情報の取得を通じて機能を改善します。Private Compute Core ですでに実行されているいくつかの機能には、自動字幕起こし、この曲なに?、スマート リプライの提案などが含まれます。

Google Binary Transparency(GBT)は、Google のオープンで検証可能なセキュリティ インフラストラクチャに追加された最新機能であり、デバイスのソフトウェア整合性に新しいレイヤーを追加します。証明書の透過性によって導かれる原則を基に構築された GBT は、Pixel で実行できるソフトウェアを、認定された OS ソフトウェアのみに限定します。GBT は、システム イメージのハッシュを署名し、追加専用のログに格納することで機能します。このログは公開され、公開されたハッシュとデバイスにあるハッシュが同じであることを検証するために使用できます。これにより、ユーザーと研究者は初めて、OS の整合性を独立して検証できるようになりました。

スマートフォン以外への拡張

多層防御は、ハードウェアとソフトウェアのレイヤーだけの問題ではありません。セキュリティは厳密なプロセスです。Pixel 6 と Pixel 6 Pro では、設計やアーキテクチャの詳細なレビュー、セキュリティ上重要なコードのメモリ安全な書き換え、静的分析、ソースコードの公式検証、重要なコンポーネントのファジング、デバイスに侵入テストする外部のセキュリティ ラボなどが含まれたレッドチームを活用しています。また、Pixel は Android 脆弱性報奨金プログラムに含まれています。昨年、このプログラムでは 175 万ドルが支払われ、Google とセキュリティ リサーチ コミュニティの間に有益なフィードバック ループを構築したほか、最も重要であるユーザーの安全を引き続き確保できるようにしています。

ハードウェアとソフトウェアが組み合わされた、このセキュリティ システムを締めくくるのは Titan Backup Architecture です。このアーキテクチャにより、クラウドでの Pixel の安全な土台が確保されます。Android のバックアップ サービスと Google Cloud の Titan テクノロジーの組み合わせは 2018 年に発表され、クライアント以外は Google を含め誰もが知らないランダムに生成されたキーのみによって、バックアップされたアプリケーション データを復号化できるようにします。このエンドツーエンドのサービスはサードパーティのセキュリティ ラボによって別個に監査され、パスコードを明確に知らない限り、ユーザーのバックアップされたアプリケーション データに誰もアクセスできないことが検証されました。

ハードウェアやソフトウェアからデータセンターに至るまでのこのエンドツーエンドのセキュリティに加え、Pixel 6 と Pixel 6 Pro デバイスでは、米国で発表されてから 5 年以上の Android セキュリティ アップデートが保証されています。これは、業界にとって重要な取り組みであり、他のスマートフォン メーカーもこの取り組みを推進することを望んでいます。

Google は安全なチップセット、ソフトウェア、プロセスを連携させることにより、Pixel 6 と Pixel 6 Pro を最も安全な Pixel スマートフォンにすることができました。


Reviewed by Eiji Kitamura - Developer Relations Team

この記事は Google オープンソース プログラム オフィス、Anne Bertucio による Google Open Source Blog の記事 "Protect your open source project from supply chain attacks" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

米国の大統領令から鍵署名パーティまで、2021 年はサプライ チェーンのセキュリティが取りざたされる一年になっています。オープンソースのメンテナンス担当者がプロジェクトのサプライ チェーン全体の攻撃面や脅威ベクトルについて知れば、克服できないと感じて打ちひしがれるかもしれません。朗報なのは、2021 年がサプライ チェーン セキュリティ ソリューションの一年でもあったということです。行うべき作業はまだ多く残されており、既存のソリューションも多くの改善の余地を抱えています。しかし、サプライ チェーンを強化してセキュリティ侵害を防ぐために、今すぐプロジェクトに適用できる予防措置があります。

All Things Open 2021 の参加者は、クイズゲームを通してサプライ チェーンのセキュリティに関するベスト プラクティスを学びました。このブログ投稿では、クイズの問題と解答、そして予防措置の選択肢を紹介します。また、この投稿はサプライ チェーン攻撃からオープンソース プロジェクトを守りたい方向けの初心者向けガイドにもなります。以降で紹介する推奨事項は、SLSA フレームワークOpenSSF Scorecards の重要事項に従っており、その多くは Allstar プロジェクトを使って自動的に実装できます。
典型的なソフトウェア サプライ チェーンと、その接続点で発生する可能性がある攻撃の例
典型的なソフトウェア サプライ チェーンと、その接続点で発生する可能性がある攻撃の例

Q1 : デベロッパー アカウントの乗っ取りを防ぐためにするべきことは何ですか?
  1. 正解 : 多要素認証を利用する(可能ならセキュリティ キー)
  2. コア メンテナンス担当者向けの共有アカウントを利用する
  3. パスワードはすべて rot13 で記述する
  4. IP 許可リストを利用する
理由と解説 : 悪意のある人物がデベロッパー アカウントにアクセスできる場合、既知の貢献者になりすまして悪意のあるコードを送信する可能性があります。貢献者には、commit を送るプラットフォームだけでなく、メールなどの貢献に関連するアカウントに対して、多要素認証(MFA)を使うことを推奨しましょう。可能であれば、MFA の方式でお勧めなのはセキュリティ キーです。

Q2 : 悪意のある commit をマージしないために、するべきことは何ですか?
  1. 正解 : すべての commit で、commit の作成者以外の誰かによるレビューを必須とする
  2. すべての commit に対して自動実行テストをする
  3. すべての commit に対して 'bitcoin' という単語をスキャンする
  4. 1 年以上前からアカウントを使っている貢献者からの commit のみを受け付ける
理由と解説 : セルフマージ(一方的な変更とも呼ばれます)には、1)貢献者のアカウントを乗っ取った攻撃者がプロジェクトに悪意のあるコードを注入する可能性がある、2)善意の貢献者が意図しないセキュリティ リスクを含む commit をマージする可能性がある、という 2 つのリスクがあります。悪意のあるコードの送信や意図しない脆弱性を回避するために役立つのが、身元が明らかで信頼できる別の人の目です。可能であれば、GitHub のブランチ保護設定などを使い、自動要件として設定しましょう。Allstar などのツールも、この要件の適用に役立ちます。これは、SLSA レベル 4 に対応します

Q3 : CI/CD パイプラインで使うシークレットはどのように保護しますか?
  1. 正解 : シークレット マネージャー ツールを利用する
  2. シークレットへのアクセスを管理するメンテナンス担当者を任命する
  3. シークレットを環境変数に保存する
  4. シークレットを別のリポジトリに保存する
理由と解説 : 「多層防御」というセキュリティの考え方は、複数の異なる防御レイヤーを設けてシステムやシークレット * などの機密データを守ることを指します。シークレット マネージャー ツール(GCP ユーザーの Secret Manager や、HashiCorp Vault、CyberArk Conjur、Keywhiz など)を使うと、ソースコードにシークレットをハードコードする必要はなくなり、集中管理や機能の監査を実現できます。また、シークレットの漏洩を防ぐ認可レイヤーを導入することにもなります。

* 機密データを CI システムに保存する場合は、それが CI/CD のためだけに使われることや、パスワードや ID マネージャーに格納するほうが適したデータではないことを確認してください。

Q4 : CI/CD システムを不正利用から守るためにするべきことは何ですか?
  1. 正解 : 最小権限の原則に従ったアクセス制御を行う
  2. すべての pull リクエストと commit に対して結合テストを行う
  3. すべての貢献者に GitHub のロール "Collaborators" を設定する
  4. ローカルで CI/CD システムを実行する
理由と解説 : デフォルトでプロジェクト リポジトリに対して「必要最低限のアクセス」を付与することで、意図しないアクセスと不正利用の両方から CI/CD システムを守ることができます。テストを行うことは重要ですが、デフォルトですべての commit と pull リクエストに対してレビュー前にテストを実行すると、CI/CD システムのコンピューティング リソースの意図しない不正利用につながる可能性があります。

Q5 : ビルド中のセキュリティ侵害を避けるためにするべきことは何ですか?
  1. 正解 : ビルドの定義や構成を build.yaml などのコードで定義する
  2. コードを侵害する時間を攻撃者に与えないように、可能な限りビルド時間を短縮する
  3. ビルドシステムには LEGO ブランドの部品だけを使い、代替品は認めない
  4. 攻撃者の手がかりとなるものを残さないように、ビルドログを削除する
理由と解説 : 手動でビルド手順を実行すると、意図しない構成ミスが紛れ込む可能性があります。しかし、ビルド スクリプト(ビルドやビルドの手順を定義した build.yaml などのファイル)を使えば、手動でビルドする必要はなくなります。加えて、悪意のある人物がビルドを改ざんしたり、レビューされていない変更を紛れ込ませたりする機会を減らすことにもなります。これは、SLSA レベル 1~4 に対応します

Q6 : 依存関係の利用前評価はどのように行うべきですか?
  1. 正解 : Scorecardsdeps.dev などのツールを使ってリスクと推移的な変更を評価する
  2. パッケージ URL の隣に表示される小さな「鍵」アイコンをチェックする
  3. GitHub で最低 1,000 個のスターが付いている依存関係のみを利用する
  4. メンテナンス担当者が一度も変更されていない依存関係のみを利用する
理由と解説 : 1 つの決定的な手法でパッケージが「良い」か「悪い」かを判断することはできません。セキュリティ プロファイルや許容できるリスクは、プロジェクトごとに異なります。プロジェクトにとって依存関係が「安全」であるかどうかを判断するうえで役立つのは、依存関係やどのような変更が推移的に取り込まれるかの情報を集めることです。Open Source Insights(deps.dev)などのツールは、最初のレイヤーと推移的依存関係をマッピングしてくれます。一方の Scorecards は、セキュリティ ポリシー、MFA、ブランチ保護の使用有無など、複数のリスク評価指標に基づいてパッケージのスコアを算出します。

使っている依存関係を把握できたら、定期的に Open Source Vulnerabilities などの脆弱性スキャンツールを実行します。そうすることで、常に最新のリリースやパッチについての情報を得ることができます。多くの脆弱性スキャンツールは、アップグレードの自動適用にも対応しています。

Q7 : ビルドが自分の意図したビルドであることを保証する(すなわち、検証する)ために、何をするべきですか?
  1. 正解 : 来歴の認証を生成できるビルドサービスを利用する
  2. 最新の commit をチェックし、信頼できるコミッターのものであることを確認する
  3. ステガノグラフィーを使ってプロジェクトのロゴをビルドに埋め込む
  4. リリースのたびに適合テストを行う
理由と解説 : ビルドの出所(ビルドの来歴)とアーティファクトを表示すると、ビルドが改ざんされていないことや、正しいものであることをユーザーに示すことができます。来歴にはさまざまな要素があります。こういった要素を実現する 1 つの方法は、来歴を表示するために必要なデータを生成と認証するビルドサービスを利用することです。これは、SLSA レベル 2~4 に対応します

Q8 : レジストリからアーティファクトを選ぶ際に、求めるべきことは何ですか?
  1. 正解 : アーティファクトが暗号学的に検証可能な形で署名されていること
  2. アーティファクトが(墓から盗み出されて)呪われたものでないこと
  3. タイムスタンプ : 最新のアーティファクトのみを使う
  4. 公式認定 : 信頼できるブランドや標準化団体のロゴを探す
理由と解説 : 来歴の生成やビルドの署名は、自分のプロジェクトで行うべきことであるだけでなく(SLSA レベル 2~4)、他者のアーティファクトを使うときも、同じ証明を求めるべきです。ロゴなどのブランドに基づく認定形態は偽造可能で、タイポスクワッティングによって正当性を偽装できます。署名などの偽造できない証明を求めるようにしてください。たとえば Sigstore は、OSS プロジェクトでビルドに署名したり、他者のビルドを検証したりする際に役立ちます。

プロジェクトのセキュリティ改善は継続的な取り組みです。ここで紹介した推奨事項の中には、プロジェクトですぐに採用するのが現実的ではないものもあるかもしれません。しかし、プロジェクトのセキュリティ向上のために行える手順はすべて、正しい方向に向かう一歩です。
オープンソース プロジェクトのセキュリティに関連するリソース :
  • SLSA : サプライ チェーンのセキュリティ レベルに関するフレームワーク
  • Scorecards : セキュリティのベスト プラクティスの使用状況を測定
  • Allstar : セキュリティのベスト プラクティスを強制する GitHub アプリ
  • Open Source Insights : オープンソース プロジェクトの依存関係の視覚化と検索
  • OSV : オープンソース用の脆弱性データベースと自動化インフラストラクチャ

Reviewed by Eiji Kitamura - Developer Relations Team

この記事は Chrome セキュリティ チーム、Adrian Taylor、Andrew Whalley、Dana Jansens、Nasko Oskov による Google Online Security Blog の記事 "An update on Memory Safety in Chrome" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

セキュリティは、いたちごっこのようなものです。攻撃者が新しい手法を生み出せば、ブラウザは一歩先を行くために新たな防御策を講じ続けなければなりません。そのため、Chrome は、サンドボックスサイト分離をベースとした今までにない強固なマルチプロセス アーキテクチャを構築してきました。これらは、ファジングとともに、現在も私たちの主要な防衛線であり続けています。しかし、それも限界に近づきつつあり、この戦略だけに頼って実際に出回っている攻撃に対処することはできなくなっています。

昨年、Google は、重大なセキュリティ バグの 70% 超がメモリの安全性の問題であることを明らかにしました。つまり、C 言語や C++ 言語のポインタのミスによって、メモリが誤解釈されてしまうのです。

メモリの安全性は、世界のソフトウェア エンジニアリング コミュニティが真剣に受け止める必要がある問題です。しかし、これは同時にチャンスでもあります。なぜなら、多くのバグに同じような根本原因があるということは、1 つの対策で相当のバグを撲滅できる可能性があるからです。

Chrome では、このチャンスを活かすため、大まかに次の 3 つの方法を検討しています。

  1. ポインタが正しいことをコンパイル時にチェックすることで、C++ の安全性を向上
  2. ポインタが正しいことを実行時にチェックすることで、C++ の安全性を向上
  3. メモリ安全な言語をコードベースの一部に使うことについて調査

「コンパイル時にチェック」とは、Chrome が皆さんのデバイスにインストールされる前の、ビルドプロセスの段階で安全性を保証することを指します。「実行時」とは、Chrome が皆さんのデバイスで実行されている間にチェックを行うことを指します。

実行時チェックには、パフォーマンスのコストが伴います。ポインタが正しいかどうかをチェックする操作は、メモリや CPU 時間にとっては微少なコストです。しかし、ポインタの数は膨大なので、そのコストは積み重なります。莫大な数のユーザーを持つ Chrome にとって、パフォーマンスは重要です。ユーザーの多くはメモリの少ない低電力モバイル デバイスを使っているため、こういったチェックが増加すれば、ウェブが遅くなってしまいます。

つまり、選択肢 1、コンパイル時に C++ を安全にする方法を選ぶのが理想です。しかし、この言語はそのような設計にはなっていません。この領域で Google が取り組んできたことを詳しく知りたい方は、借用の問題 : C++ の Borrow-Checker の難しさをご覧ください。

そのため、ほとんどは選択肢 2 と 3、つまり C++ の安全性を向上させる(ただし遅くなる)か、別の言語を利用する方法をとらざるをえません。Chrome のセキュリティでは、この両方のアプローチを試しています。

C++ の安全性ソリューションに向けた主な取り組みには、MiraclePtrABSL/STL 強化モードなどがあります。どちらも、悪用できるセキュリティ バグの大半を解消することを目指していますが、ある程度のパフォーマンス低下も想定されます。たとえば MiraclePtr は、参照されているメモリを隔離することで解放後の使用に関するバグを防ぎますが、多くのモバイル デバイスではメモリはとても貴重なため、隔離用の領域を割り当てるのは難しくなっています。それでも、MiraclePtr は、ブラウザのプロセスで解放後の使用に関するバグを 50% 以上解消できる可能性を秘めています。今のところ、これは Chrome のセキュリティにとって大きなメリットです。

それと並行して、将来的に Chrome の一部でメモリ安全な言語を使えないかを検討しています。その第一候補は、Mozilla にいる私たちの友人が開発した Rust です。Rust は(ほとんどが)コンパイル時に安全です。つまり、Rust コンパイラは、コードが皆さんのデバイスにインストールされる前にポインタのミスを見つけます。そのため、パフォーマンスが低下することはありません。しかし、C++ と Rust を十分に連携して使えるかどうかという未解決の問題が残されています。また、たとえ明日から Rust で新しい大型コンポーネントを書き始めたとしても、セキュリティ脆弱性の大部分を解消できるのは、おそらく何年も後になるはずです。さらに、既存のコンポーネントの一部を Rust で書けるほど言語の境界を十分にクリーンにできるかという問題もあります。この点は、まだ明らかではありません。Google は、Chromium ソースコード ツリーのユーザーが触れることのない限られた部分で、Rust の実験を始めています。しかし、製品版の Chrome にはまだ含まれておらず、試験運用版のフェーズにとどまっています。

以上の理由から、Google は両方の戦略を並行して追求しています。C++ の安全性向上、Chrome での新しい言語の試行というこの領域の最新情報にぜひご注目ください。


Reviewed by Eiji Kitamura - Developer Relations Team

この記事は Google Cloud プロダクト マネージャー、Christiaan Brand による Google Online Security Blog の記事 "Simplifying Titan Security Key options for our users" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

この度、Google ストアの Titan セキュリティ キーのラインナップの変更についてお知らせします。この変更によって、これまでよりもシンプルになり、適切なセキュリティ キーを簡単に選べるようになります。今後は、USB-A バージョンと USB-C バージョンの 2 種類の Titan セキュリティ キーのみを提供します。どちらのキーにも近距離無線通信(NFC)機能が搭載されているので、ほとんどのモバイル デバイスで利用でき、モバイル デバイスに接続したキーをタップするだけで安全にログインできます。

Google は 2018 年に、認証情報のフィッシングに対する直接的な防御として Titan セキュリティ キーを導入しました。フィッシングとは、攻撃者がユーザーを欺いてユーザー名とパスワードを入力させることを指します。これは、オンライン アカウントを侵害する方法の中でも、特に簡単で成功率の高い方法であり続けています。Titan セキュリティ キーと高度な保護機能プログラムによる業界トップクラスの自動保護の組み合わせは、Google アカウントを安全に保つために特に効果的な方法の 1 つです。


新しい Titan セキュリティ キー オプションの紹介 現在、NFC 機能はさまざまな Android スマートフォンや iPhone でサポートされているので、Bluetooth Titan セキュリティ キーは終了し、今後は、より簡単で広く使われている NFC 機能に注力します。ただし、Bluetooth Titan セキュリティ キーを使っている既存ユーザーのために、これらのキーは引き続き Bluetooth でも動作し、ほとんどの最新モバイル デバイスでは NFC キーとして利用することもできます。既存の Bluetooth Titan セキュリティ キーに適用されている保証は、利用規約に応じて今後も継続されます。すべての Titan セキュリティ キーには、Google が制作したファームウェアを搭載したハードウェア セキュア エレメント チップが組み込まれているので、キーの整合性を検証できます。

USB-A ポートを搭載したコンピュータをお持ちの方には、USB-A + NFC セキュリティ キーをお勧めします。

USB-C ポートを搭載したコンピュータをお持ちの方には、USB-C + NFC セキュリティ キーをお勧めします。


USB-C コネクタを搭載した iPad をお持ちの方は、USB-C Titan セキュリティ キーを利用できます。Lightning コネクタを搭載した iPad をお持ちの方には、USB-A Titan セキュリティ キーと Apple Lightning アダプタをお勧めします。


Titan セキュリティ キーは、Google ストアで購入できます。USB-A + NFC キー(USB-A to USB-C アダプタ付き)は 30 ドル、USB-C + NFC キーは 35 ドルで販売しています。
セキュリティ キーがフィッシング対策にどう役立つかを詳しく知りたい方は、Titan セキュリティ キー プロダクト ページをご覧ください。

Reviewed by Eiji Kitamura - Developer Relations Team

この記事は Chrome セキュリティ チーム、Charlie Reis、Alex Moshchuk による Google Online Security Blog の記事 "Protecting more with Site Isolation" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

Chrome のサイト分離により、悪意のあるウェブサイトが他のウェブサイトからデータを盗みにくくなる、重要なセキュリティ保護機能です。サイト分離は、Windows、Mac、Linux、Chrome OS ですべてのウェブサイトを他のサイトから保護し、ウェブサイトよりも権限が高い拡張機能とプロセスが共有されないことも保証します。Chrome 92 では、この機能をさらに拡張し、拡張機能が相互にプロセスを共有できないようにする予定です。これにより、既存の拡張機能の動作を一切妨げることなく、悪意のある拡張機能に対する保護が強化されます。

一方で、現在の Android のサイト分離は、パフォーマンスのオーバーヘッドを低く保つため、高価値サイトのみを保護しています。今回は、サイト分離の 2 つの改善についてお知らせします。これにより、Android ユーザーのサイト保護の対象となるサイトが増加します。Chrome 92 以降、ユーザーがサードパーティ プロバイダ経由でログインするサイトや、Cross-Origin-Opener-Policy ヘッダーが設定されているサイトに、サイト分離が適用されます。

Android のサイト分離の継続的な目標は、リソースの制約があるデバイスで、ユーザー エクスペリエンスを低下することなくセキュリティ層を追加することです。ほとんどの Android デバイスにとって、 すべての サイトでサイト分離をすると、コストがかかりすぎる点は変わりません。そのため、保護を追加することで最もメリットを得られるサイトを優先するように経験則を改善することを戦略としています。現在のところ、Chrome はユーザーがパスワードを入力してログインするサイトを分離しています。しかし、多くのサイトが、サードパーティのサイト(たとえば、「Google でログイン」を提供するサイト)を使って、パスワードを入力しなくても認証できるようになっています。ほとんどの場合、これは業界標準の OAuth プロトコルで実現されています。Chrome 92 以降のサイト分離は、一般的な OAuth のインタラクションを認識し、OAuth ベースのログインを利用するサイトを保護します。そのため、ユーザーがどのように認証をしても、データは安全です。

さらに Chrome は、新しい Cross-Origin-Opener-Policy(COOP)レスポンス ヘッダーに基づいてサイト分離をトリガーするようになります。このヘッダーは Chrome 83 以降でサポートされ、セキュリティを考慮したウェブサイトの運営者が、特定の HTML ドキュメントで新しいブラウジング コンテキスト グループをリクエストできるようにします。これにより、信頼できないオリジンからドキュメントが切り離されるので、攻撃者はサイトのトップレベル ウィンドウを参照したり操作したりできなくなります。このヘッダーは、SharedArrayBuffer などの充実した API を使う際に必要なヘッダーの 1 つでもあります。Chrome 92 以降のサイト分離では、ドキュメントの COOP ヘッダーがデフォルト以外の値だった場合、ドキュメントのサイトに機密データが含まれる可能性があるものとして扱い、サイト分離を開始します。そのため、Android でサイト分離によって確実にサイトを保護したいサイト運営者は、サイトで COOP ヘッダーを指定することでそれを実現できます。

これまでと同様、Chrome は新しく分離されたサイトをデバイスのローカルに保存します。ユーザーが閲覧履歴などのサイトデータを削除すると、そのリストもクリアされます。また、Chrome は、COOP によって分離されるサイトに一定の制限を課し、リストを最近使われたサイトのみに集中させ、リストが大きくなりすぎるのを防ぎ、悪用されないように保護しています(COOP サイトがリストに追加される前にそのサイトでのユーザー インタラクションを必須とするなど)。今後も、この新しいサイト分離モードには、最低 RAM しきい値(現在は 2 GB)を設けます。以上の点を踏まえたサイト分離の新たな改善では、Chrome の全般的なメモリ使用量やパフォーマンスに大きな影響を与えることなく、ユーザーの機密データを扱うたくさんのサイトに保護を追加できることがデータによりわかっています。

Android のサイト分離におけるこれらの改善に伴い、Android で Spectre に対応するための V8 ランタイム対策の無効化も行うことにしました。この対策は、サイト分離よりも効果が低く、パフォーマンスのコストがかかります。デスクトップ プラットフォームでは Chrome 70 以降でこの対策は無効化されており、今回の対応によって Android もそれと同等になります。Spectre からデータを保護したいサイトでは、COOP ヘッダーを設定することを検討してください。それによってサイト分離が行われます。

Android デバイスで完全な保護を実現したいユーザーは、chrome://flags/#enable-site-per-process から手動でサイト分離をオプトインすることもできます。これにより、すべてのウェブサイトが分離されるようになりますが、メモリの消費量は増加します。


Reviewed by Eiji Kitamura - Developer Relations Team