ブログに戻る

フォロー&ご登録

Proof of Work でクレデンシャルスタッフィング攻撃を防御しログイン時のセキュリティを守る

Andrew Betts

Principal Developer Advocate, Fastly

主なインターネットユーザーの間では、適切なパスワードや多要素認証は幸いますます広く使われるようになってきています。しかし、依然として簡単に推測できるパスワードや、パスワードの再利用も未だ蔓延しています。これが対処されることなくデータ漏えいによって情報源が提供され続ける限り、攻撃者は人気サイトのアカウントに不正侵入しようとし続けます。たとえば、近年で非常に大きなデータ漏えいの1つとして、2012 年に LinkedIn で使用されていたユーザー名とパスワードは今や誰もが知ることのできるものです。もし、同じ組み合せを今でも他のサイトで使用している場合、そのパスワードは非常に脆弱です

サイト運営者はこういった種類の攻撃を阻止するために強力なツールを利用しています。ログイン時に CAPTCHA が求められることもよくありますが、CAPTCHA はユーザーが使いやすい方法ではありません。ユーザー操作が不要でログインシステムに対する自動攻撃を著しく難しくするようなセキュリティチェックを実装できるならどうでしょうか?

高額な解決策と安価な検証方法

攻撃者はログインシステムに対して短時間で数千ものユーザー名とパスワードの組み合せを試すことができます。この攻撃手法は「クレデンシャルスタッフィング」と呼ばれます。CAPTCHA 以外にも、この攻撃に対する解決策としてレート制限を行うこともできますが、レート制限にはサーバー側の状態 (カウンター) が必要で、猛攻撃にも対処できるようにグローバルかつ大規模に実装するには多額のコストがかかります。

では、代わりに数学の問題を作ってログイン時にブラウザに解かせるのはどうでしょうか?これは最新の CPU でも数百ミリ秒もかかるほどの非常に難しい問題である必要がある一方で、まったくコストをかけずに正解を検証できるものでなければなりません。以下は Fastly での実施方法です。

  1. ユーザーがログインページに移動

  2. Fastly のキャッシュからログインフォームを配信して、署名済みの CSRF ノンス (膨大でランダムな数字) を追加

  3. ユーザーがユーザー名とパスワードを入力して送信をクリック

  4. ブラウザは counter という新規の JavaScript 変数を作成し、これを 1 に設定

  5. ユーザー名、パスワード、ノンス、および counter の値を組み合せて 1 つの文字列にし、SHA-256 のようなハッシュ関数を経由して渡す

  6. 結果が「000」で始まる文字列であれば counter とノンスがフォームの非表示フィールドに追加されてフォームが送信される

  7. そうでない場合は、カウンターが 1 ずつ増分してステップ 5 に戻る

000 で始まる有効な SHA-256 を生成するには長い時間がかかります。これはこの結果となる確率が 1/3375 で、成功するには 3,375 面ある巨大なサイコロを特定の数字が出るまで振るようなものです。

以下はこのコンセプトを示すデモです。有効な結果が出るまでにどれだけの時間がかかるか、何回の試行が必要だったかがわかります。「GO」ボタンをクリックして計算を始めてみて下さい。

  CodePen で Andrew Betts (@triblondon) による Pen Proof of Work をご覧ください。

私もさまざまなデバイスで実行し、100 以上の有効なハッシュでのハッシュごとの平均計算時間を割り出しました。

10バイトノンス 100バイトノンス 1キロバイトノンス
Chrome / 2016 Macbook Pro 150ミリ秒 200ミリ秒 1400ミリ秒
Safari / iPhone 7 Plus 150ミリ秒 280ミリ秒 3300ミリ秒

エンドユーザーから見ると、まったく遅いようには見えません。停止するのは「サインイン」をクリックしたときで、ユーザーはその時点で画面の動きが停止することを想定している上、計算はメインスレッドの混雑を避けるためにワーカーで実行されるからです。

しかし、攻撃者にとっては非常に困難なものになっています。一定量のサーバーハードウェアに対して 1 秒あたりに実行できるリクエストの数が大幅に削減されているからです。

エッジでのリクエストの検証

もちろん、すべての鍵は Fastly でリクエストを確認できることにあります。Fastly では、正しいハッシュの設定に失敗した大量のクレデンシャル (認証情報) がオリジンサーバーに到達することを防止できます。これは非常に簡単な処理です。ブラウザが終了したカウンターを知っていれば、必要な処理はたった一度のハッシュ計算で、直接そのカウンター値を算出することができます。結果が 000 から始まるリクエストがオリジンサーバーに送信され、そうでない場合は、シンセティック 403 エラーがブラウザに返されます。

ここでは VCL の SHA-256 を実行するために Fastly 内に搭載された暗号化/ハッシュ関数を使っています。一致しない場合はエラーがトリガーされます。

便利なツール

1 つの技術で、ログインページへの攻撃をすべて阻止するようなセキュリティ対策を講じられる訳ではありません。私たちができることは、通常のログインを複雑にすることなく、攻撃者の攻撃を難しくする方法を模索することです。対策Proof of Work は、武器として使える便利なツールであり、CAPTCHA よりも優れたユーザー体験を提供することが多いものです。ぜひ試してみてください。