ブログに戻る

フォロー&ご登録

英語のみで利用可能

このページは現在英語でのみ閲覧可能です。ご不便をおかけして申し訳ございませんが、しばらくしてからこのページに戻ってください。

HavelBeenPwned と Fastly KV Store の統合で侵害されたパスワードを検出

Arun Kumar

Senior Security Researcher, Fastly

Fastly Security Research Team

Fastly Security Research Team, Fastly

残念なことに近年、データ侵害や認証情報のダンプが頻繁に発生する現実に私たちは直面しています。認証情報の再利用に関して不適切なプラクティスが蔓延しているせいで、サイバー犯罪者は頻繁に侵害された認証情報を利用してアカウント乗っ取り (ATO) 攻撃を実行できます。ATO 攻撃を仕掛けるのによく利用される手口にクレデンシャルスタッフィングと呼ばれるものがあります。クレデンシャルスタッフィングでは、顧客アカウントに不正にアクセスするために、侵害された認証情報のリストにある認証情報が列挙されます。 

幸い、パスワードハッシュの形で私たちも侵害された認証情報にアクセスできるので、この種の攻撃を検出してブロックすることが可能です。パスワードハッシュは「HaveIBeenPwned」(HIBP) を通じて利用できます。HIBP は、侵害されたパスワードのデータベースを管理し、プライバシーが保護された方法でパスワードが侵害されているかどうかを検証できる API を提供するコミュニティサービスです。このブログ記事では、Fastly のエッジで Compute を使用しながら KV Store でパスワードハッシュを共有することによって、侵害されたパスワードを悪用する攻撃を低レイテンシで検出するアプローチについてご説明します。

数百億に上るクレデンシャルの侵害

HaveIBeenPwned によると、侵害されているアカウントの数は2024年2月現在で129.4億に上ります。これは、多数の侵害されたWebサイトで認証情報が漏えいされた既知のアカウントの合計数です。これらのアカウントには、複数のWebサイトで同じクレデンシャル (ユーザー名とパスワードの組み合わせなど) を使用しているものが含まれる可能性があります。これは上記で触れた認証情報の再利用にあたり、例えば Google と Yahoo のアカウントで同じユーザー名とパスワードの組み合わせを使用しているケースがこれに相当します。また、ユーザー名が異なるクレデンシャルで、同じパスワードが使用されている場合もあります。従って、一意のパスワードの数は、129.4億のアカウント数よりもずっと少なくなります。

HIBP のパスワードデータセットを分析したところ、一意のパスワードの数は9億3,100万でした。このデータセットには各パスワードの使用頻度に関する情報も含まれており、この情報によると漏えいしたクレデンシャルの数は69億3,000万に相当すると推測され、各クレデンシャルのペアが平均して2つのアカウント (すなわち2つのWebサイド) で使用されていることを意味します。 

パスワードの中には、他のものよりもはるかに多く使用されているものがあります。例えば、「123456」というパスワードは4,200万のクレデンシャルで使用されている一方、「hunter2」は2万4,200のクレデンシャルで使用されていました。undefinedundefined以下のチャートは各パスワードの使用頻度に基づいてソートされたパスワードの数に対するクレデンシャルの合計数を示しています。驚くべきことに、3,400万のパスワード (侵害されたパスワードの3.6%) が侵害されたクレデンシャルの60%で使用されており、大量のパスワードが再利用されていることを示しています。これには、複数のWebサイトで同じクレデンシャルが使用されているケースと、無関係のユーザーが同じパスワードを (異なるユーザー名と一緒に) 使用しているケースの両方が含まれます。

図1 : HaveIBeenPwned が提供するパスワードハッシュのデータセットに含まれるパスワードを使用しているクレデンシャルの数

同様に、5億3,200万のパスワード (侵害されたパスワードの57%) が侵害されたクレデンシャルの94%で使用されています。このポイントを超える1:1の直線的な増加は、残り4億のパスワードが一意のものであり、パスワードマネージャーによって生成された可能性が高く、従ってクレデンシャルスタッフィング攻撃を仕掛ける犯罪者にとって有用ではないことを示唆しています。パスワードマネージャーによって生成されたパスワードが6%を占めるということは、残りの94%がクレデンシャルスタッフィング攻撃に役立つということになります。つまり、653億ものクレデンシャルがクレデンシャルスタッフィング攻撃で利用可能なのです!

クレデンシャルスタッフィング攻撃の検出方法

パスワードマネージャーで生成された一意のパスワードを各Webサイトで使用して認証を行うことで、クレデンシャルスタッフィング攻撃の可能性を完全に排除できます。上のチャートは侵害されたクレデンシャルに関するものですが、データセットのサイズが十分に大きいことから、侵害されていないクレデンシャルについても同じことが言えます。従って、パスワードマネージャーの採用レベルは非常に低く、このツールを使用して生成されたクレデンシャルは全体のおよそ6%に過ぎないと推察されます。

多要素認証 (MFA) を実装し、適切な登録とリセットのプロセスを使用することも、クレデンシャルスタッフィングやその他のタイプのアカウント乗っ取り攻撃への対策として効果的です。また、最近導入されたパスキー標準は、パスワードの使用を完全に排除する、より便利でセキュアなサインインメカニズムを提供します。このサインイン方法の採用が現在進んでおり、サポートされているあらゆる場所でパスキーを使用することをお勧めします。

これらの緩和対策が不可能な場合、攻撃をプロアクティブに検出してブロックすることが大切です。「記憶シークレット」に関する NIST のガイダンスでは、ログインやサインアップ、パスワードリセットの際に、使用するパスワードを以前侵害された認証情報のコーパスから取得したパスワードと照らし合わせることが推奨されています。 

以前のブログ記事で、HIBP の Passwords API を Fastly の Compute サービスで使用してリクエストに含まれる侵害されたパスワードを検出するアプローチを取り上げたことがありました。今回は、各リクエストで Passwords API を呼び出すことなく完全にエッジでこのような検出を行う新しいアプローチをご紹介します。この方法では、高度に圧縮され、エッジに保存されたパスワードハッシュを使用します。これにより、さらに高速な処理が可能になり、サードパーティの可用性への依存を回避できます。

侵害されたパスワードをエッジに保存

Fastly の KV Store にパスワードハッシュを保存することにより、HIBP データセットに低レイテンシでアクセスできるようになります。KV Store は、キーと値のペアの形式でデータを保存できる一種のコンテナであり、エッジでパフォーマンスの高い読み込みと書き込みを実現するのに役立ちます。KV Store は無制限の数のキーをサポートし、キーの最大サイズは UTF-8 形式で1024バイトです。値はテキストまたはバイナリで最大サイズは 25 MB です。 

問題は、HIBP のパスワードデータセットは侵害されたパスワードの SHA1 ハッシュからなる膨大なリストで、非圧縮テキスト形式でのサイズは現在 40 GB に上り、今も拡大し続けている点です。 

フィルターとパーティションでさらなる最適化


私たちは、リソースの消費 (KV Store と Compute のメモリ) を抑え、Fastly Compute から低レイテンシでアクセスできるようにするため、非圧縮テキストではなく、フィルターデータ構造として HIBP データセットを保持しています。フィルターは、ハッシュ関数を使用してランダム化し、コンパクトに一連の項目を表現する確率的なデータ構造です。フィルターの重要な属性は、偽陰性がゼロの偽陽性の確率です。つまり、低いとはいえ、問題の無いパスワードが誤って侵害されたパスワードとして特定される可能性がありますが、侵害されたパスワードは常に「侵害されている」と正しく判断されます。フィルターデータ構造でハッシュを表現することによって、データセットのサイズを 40 GB から 1.08 GB へと97%削減できました。

図2 : Compute サービスでリクエストを傍受して侵害されたパスワードが使用されているかを確認

リソースの消費をさらに削減するため、パスワードハッシュは3文字のプリフィックスを使用してグループ化され、各プリフィックスに個別のフィルターが使用されます。これらのフィルターは値として KV Store に保存され、3文字からなるハッシュのプリフィックスがキーとして使用されます。検証されているパスワードに関連するプリフィックスのフィルターのみが Compute サービスに読み込まれ、通常各フィルターのサイズは 266 KB です。

パスワードを含むリクエストが実行されると、Compute サービスによってそのパスワードの SHA1 ハッシュが生成され、ハッシュの最初の3文字を使用して適切なフィルターオブジェクトが KV Store から取得されます。そして、フィルターのパスワードハッシュを確認してパスワードが侵害されたものかどうかを判断されます。「Fastly-Compromised-Password」のリクエストヘッダーと検証結果が追加され、リクエストがバックエンドオリジンに送信されます。これにより、バックエンドはパスワードの侵害ステータスに基づいて動作を変更できます。パスワードが侵害されている場合、バックエンドはそのパスワードを拒否したり (ユースケース : サインアップ)、ユーザーをパスワードリセットページにリダイレクトしたり (ユースケース : ログイン)、シグナルをクレデンシャルスタッフィングの検出ツールに送信したりするなど、適切なアクションを選択できます。

私たちは、Cuckoo フィルターXOR フィルターBinaryFuse8 フィルターを含む複数のフィルターアルゴリズムを、KV Store のデータパーティションに使用されるさまざまな長さのハッシュプリフィックスと一緒にテストしました。ルックアップパフォーマンス、生成されたフィルターのサイズ、データの増加に伴うフィルターサイズの拡大パターン、フィルターのマーシャリング解除速度を考慮した結果、3文字のプリフィックス、BinaryFuse8 フィルター、9ビットフィンガープリントの組み合わせが最も効果的であることが分かりました。このフィンガープリントサイズとこのデータセットの負荷因子を適用した場合、このフィルターの偽陽性率は0.3%でした。

デモおよびソースコード

Fastly Developer Hub のデモセクションにて、このアプローチのデモが公開されています。ぜひご自分で試して Compute サービスのリアルタイムログビューアーで実行シーケンスをご確認ください。以下の図3と図4は、弱いパスワード「hunter2」を使用してデモを実行した例を示しています。

図3 : デモ目的のために分かりやすくクレデンシャルを入力

図4 : バックエンドに送信されるリクエストが「Fastly-Compromised-Password」ヘッダーでエンリッチ化

デモのコードはオープンソース化されているので、侵害されたパスワードの検出機能をお客様のWebサイトに実装できます。レポジトリには、ハッシュのフィルターを構築し、KV Store にアップロードするためのコードも含まれています。Fastly では、3か月に1度フィルターを再生成して最新の状態に維持することを推奨しています。