ユーザー名の列挙を回避する方法Secure Code Warrior

2017年10月09日発行
ピーテル・デ・クレマー著
ケーススタディ

ユーザー名の列挙を回避する方法Secure Code Warrior

2017年10月09日発行
ピーテル・デ・クレマー著
リソースを見る
リソースを見る

サイドチャネル攻撃とは、アルゴリズムの理論的な弱点やソフトウェアのコードのバグではなく、ソフトウェアシステムの物理的な実装からハッカーが情報を収集できることを言います。

私がこのことをより明確にするために使いたい例は、ユーザー名の列挙を行う方法です。ユーザー名の列挙とは何か、なぜそれが悪いのかを知りたい方は、当社のウェブサイトでビデオによる説明をご覧になるか、コードで識別できるかどうかチャレンジしてみてください。

サイドチャネル攻撃によってユーザ名の列挙がどのように行われるかを理解するためには、最新のウェブアプリケーショ ンでパスワードがどのように扱われているか(あるいは少なくともそうあるべきか)をある程度理解しておく必要があります。優れたウェブアプリケーションは、あなたのパスワードを知りませんし、どこにもパスワードを保存しません。では、あなたが入力したものが正しく、実際にあなたのパスワードであることをどうやって知ることができるのでしょうか?パスワードはハッシュ化されています。

ハッシュ関数とは、一方通行で実行するのは簡単だが(多少計算コストはかかるが)、逆に実行するのは非常に困難な数学的演算であり、優れたハッシュアルゴリズムでは、入力に応じて出力が一意になる。Webサイトに登録すると、パスワードそのものではなく、そのハッシュが安全に保存されます。つまり、ログインするたびに、ウェブアプリケーションは入力をハッシュ化し、ハッシュ化された結果を保存されたハッシュと比較するのです。安全なパスワード保存について詳しく知りたい方は、私たちのプラットフォームで学ぶことができます。

入力のハッシュ化はコンピュータでは時間がかかるため、開発者はユーザーがスムーズに利用できるように、書いたものすべてを最適化しようと常に心がけています。プログラムを高速化する一つの方法は、必要のないハッシュ化を省略することです。たとえば、ユーザー名が存在しない場合(つまり、パスワードをチェックする必要がない場合)には、ユーザーに即座に応答することができます。このようにして、パスワードのハッシュ化という遅い計算を省略することができます。ユーザー名が正しければ、入力されたパスワードをハッシュ化して、保存されているハッシュと比較します。

この時点で、何が問題になるか想像がつくかもしれません。実際にはハッシュ化にかかる時間はわずか数ミリ秒ですが、ハッカーはこの追加された遅延を利用して、入力したユーザー名が正しいかどうかを調べることができます。間違ったユーザー名の場合はハッシュ化が行われていないため、わずかに速いレスポンスが得られます。このようなサイドチャネル攻撃はタイミング攻撃と呼ばれ、異なる非機能要件がお互いに打ち消しあう良い例となります。高速性と安全性を同時に実現できないコードもあります。

そのため、パスワードが完璧に処理され、表示されるメッセージが一般的なもので、パスワードやユーザー名が間違っているかどうかを知らせるものではないにもかかわらず、システムには脆弱性があります。解決策は簡単です。常にパスワードをハッシュ化するか、ハッシュ化にかかる時間分だけ返信を遅らせるのです。

得られた情報は、攻撃者がシステム上のユーザーのリストを得るために使用することができます。この情報は、ブルートフォース攻撃やデフォルトのユーザー名/パスワード攻撃など、ウェブアプリケーションへの攻撃に使用することができます。

https://www.owasp.org/index.php/Testing_for_User_Enumeration_and_Guessable_User_Account_(OWASP-AT-002)

リソースを見る
リソースを見る

著者

ピーテル・デ・クレマー

もっと知りたい?

セキュアコーディングに関する最新の知見をブログでご紹介しています。

当社の豊富なリソースライブラリは、安全なコーディングアップスキルに対する人間的なアプローチを強化することを目的としています。

ブログを見る
もっと知りたい?

開発者主導のセキュリティに関する最新の研究成果を入手する

ホワイトペーパーからウェビナーまで、開発者主導のセキュアコーディングを始めるために役立つリソースが満載のリソースライブラリです。今すぐご覧ください。

リソース・ハブ

ユーザー名の列挙を回避する方法Secure Code Warrior

2017年10月09日発行
Pieter De Cremer 著

サイドチャネル攻撃とは、アルゴリズムの理論的な弱点やソフトウェアのコードのバグではなく、ソフトウェアシステムの物理的な実装からハッカーが情報を収集できることを言います。

私がこのことをより明確にするために使いたい例は、ユーザー名の列挙を行う方法です。ユーザー名の列挙とは何か、なぜそれが悪いのかを知りたい方は、当社のウェブサイトでビデオによる説明をご覧になるか、コードで識別できるかどうかチャレンジしてみてください。

サイドチャネル攻撃によってユーザ名の列挙がどのように行われるかを理解するためには、最新のウェブアプリケーショ ンでパスワードがどのように扱われているか(あるいは少なくともそうあるべきか)をある程度理解しておく必要があります。優れたウェブアプリケーションは、あなたのパスワードを知りませんし、どこにもパスワードを保存しません。では、あなたが入力したものが正しく、実際にあなたのパスワードであることをどうやって知ることができるのでしょうか?パスワードはハッシュ化されています。

ハッシュ関数とは、一方通行で実行するのは簡単だが(多少計算コストはかかるが)、逆に実行するのは非常に困難な数学的演算であり、優れたハッシュアルゴリズムでは、入力に応じて出力が一意になる。Webサイトに登録すると、パスワードそのものではなく、そのハッシュが安全に保存されます。つまり、ログインするたびに、ウェブアプリケーションは入力をハッシュ化し、ハッシュ化された結果を保存されたハッシュと比較するのです。安全なパスワード保存について詳しく知りたい方は、私たちのプラットフォームで学ぶことができます。

入力のハッシュ化はコンピュータでは時間がかかるため、開発者はユーザーがスムーズに利用できるように、書いたものすべてを最適化しようと常に心がけています。プログラムを高速化する一つの方法は、必要のないハッシュ化を省略することです。たとえば、ユーザー名が存在しない場合(つまり、パスワードをチェックする必要がない場合)には、ユーザーに即座に応答することができます。このようにして、パスワードのハッシュ化という遅い計算を省略することができます。ユーザー名が正しければ、入力されたパスワードをハッシュ化して、保存されているハッシュと比較します。

この時点で、何が問題になるか想像がつくかもしれません。実際にはハッシュ化にかかる時間はわずか数ミリ秒ですが、ハッカーはこの追加された遅延を利用して、入力したユーザー名が正しいかどうかを調べることができます。間違ったユーザー名の場合はハッシュ化が行われていないため、わずかに速いレスポンスが得られます。このようなサイドチャネル攻撃はタイミング攻撃と呼ばれ、異なる非機能要件がお互いに打ち消しあう良い例となります。高速性と安全性を同時に実現できないコードもあります。

そのため、パスワードが完璧に処理され、表示されるメッセージが一般的なもので、パスワードやユーザー名が間違っているかどうかを知らせるものではないにもかかわらず、システムには脆弱性があります。解決策は簡単です。常にパスワードをハッシュ化するか、ハッシュ化にかかる時間分だけ返信を遅らせるのです。

得られた情報は、攻撃者がシステム上のユーザーのリストを得るために使用することができます。この情報は、ブルートフォース攻撃やデフォルトのユーザー名/パスワード攻撃など、ウェブアプリケーションへの攻撃に使用することができます。

https://www.owasp.org/index.php/Testing_for_User_Enumeration_and_Guessable_User_Account_(OWASP-AT-002)

弊社製品や関連するセキュアコーディングのトピックに関する情報をお送りする許可をお願いします。当社は、お客様の個人情報を細心の注意を払って取り扱い、マーケティング目的で他社に販売することは決してありません。

送信
フォームを送信するには、「Analytics」のCookieを有効にしてください。完了したら、再度無効にしてください。