秘密の質問について
前回パスワードの定期変更についてという記事を書いた
もう一つ気になっているのが秘密の質問である。
事前登録した質問にいくつか正解すると、パスワード初期化画面に遷移できるといったものだ。僕の構築した認証基盤にも実装されている。
パスワードについては何文字以上だの変更頻度だの強度について議論がされるのに秘密の質問の強度はあまり議論されない(気がする)。
しかしこれを突破するとパスワードが漏洩したのと当然同じことになる。
しかも秘密の質問はソーシャルハッキングが可能だ。
大体「母親の旧姓」や「ペットの名前」などがよくある質問項目だがSNSなどの公開情報から推測できるものもあるだろう。
ただ、秘密の質問も数年前はお勧めのオプションだったのだ。
僕は「セルフヘルプ」の目的でこの機能を実装した。
認証基盤の運用をしていると、驚くほどパスワードがわからなくなる人は多い。そういう時は管理者が本人確認した上で初期化したりするが、その負荷を軽減するために、自分自身でパスワード初期化できるのがこの秘密の質問方式なのだ。
なぜ秘密の質問もやめるべきか、整理したい。
- NIST Special Publication 800-63B
openid-foundation-japan.github.io
前回同様、まずNISTガイドラインの記述を見る。
ガイドラインの概略や記法(SHALLとか)は前回記事を参照いただきたい。
ここに以下記述がある。
記憶シークレットを選択する際、検証主体は加入者に対して特別なタイプの情報(例えば、あなたの最初のペットの名前はなんですか?といったもの)の入力を求めないものとする(SHALL)。
SHALLなので「厳密に従うことを要求しており、内容と異なってはならない。」だ。
もう絶対やめろと言っているのだ。(しないものとするだからSHALL NOTのような気もするが)
- いつから絶対やめろになった?
SHALL NOTになったのは今回の改訂からである。
NIST SP 800-63は初版は2006年4月に発行され、以降NIST SP 800-63-1、NIST SP 800-63-2 とバージョンアップされ今回NIST SP 800-63-3として3回目のバージョンアップがされた。
各バージョンの簡単な変更履歴は 2.2. 変更履歴 にある
openid-foundation-japan.github.io
この 2.2.3. SP 800-63-3 に以下記述がある。
- Pre-registered Knowledge Token (Authenticator) は (往々にして弱い) パスワードの特別な形態であるという認識のもと, Pre-registered Knowledge Token を関する記述の削除.
このガイドライン上では
pre-registered knowledge tokens = 事前登録された知識トークン = 秘密の質問 である。よって秘密の質問は今回から禁止となっている。
なおSP 800-63-1 の変更履歴には
従来の Token タイプに対する専門用語の変更や, Pre-registered Knowledge Token や Look-up Secret Token, Out-of-band Token 等のより多種多様な Token タイプへの言及.
とあるので、おそらくSP 800-63-1からTokenとしてpre-registered knowledge tokensが定義されたのだろう。
しかし NIST 800‐63‐1 Overview によれば
Knowledge Based Authentication is not
recognized, due to risk of targeted research
attacks
– Pre‐registered knowledge tokens (e.g., “Name of
first pet?”) permitted at Levels 1 and 2 only
とあるため、禁止ではないもののリスクがあるとこの時既に警告はされていたようだ。
ちなみに「Level1または2での利用にとどめよ」とあるが
このLevelはAuthenticator Assurance Level(AAL)のこと・・と思われる。
AALとはざっくりいうと認証の強度のレベルで、
Level1が単一要素認証OK
Level2が2要素認証だがソフトウェアトークンを含めてOK
Level3は2要素認証かつハードウェアトークン必須
という感じだ。(かなり簡素な説明なので注意。)
- 秘密の質問が危険である理由
SP 800-63Bのリファレンスの情報をちらちらとみてはみたものの秘密の質問廃止に関わるエビデンスは見つけられなかった。
かわりに以下の記事を見つけた。
2015年5月と古いが、Googleのセキュリティブログ記事である。
Googleで秘密の質問を解析し、利用すべきでないと結論づけた論文のサマリだ。
そのサマリのブログを要約すると以下。
調査者 | |
---|---|
調査対象 | Googleで数百万回のアカウント復旧の申し立てに使用されていた何百万もの秘密の質問と回答 |
発表 | www2015(http://www.www2015.it)にて発表 |
調査結果
英語を話すユーザの「あなたの好きな食べ物は何ですか?」の答えは1回の試行で19.7%当たった。(ちなみにピザ) |
アラビア語を話すユーザの「最初の先生の名前は何ですか?」の答えは10回の試行で24%当たった。 |
スペイン語を話すユーザの「あなたの父親のミドルネームは何ですか?」の答えは10回の試行で21%当たった。 |
韓国語を話すユーザの「あなたの出身都市は何ですか?」の答えは10回の試行で39%当たった。 |
韓国語を話すユーザの「好きな食べ物は?」の答えは10回の試行で43%当たった。 |
37%のユーザはあえて質問内容を無視し、共通の間違った回答を登録していた。 |
英語を話すユーザの40%は秘密の質問に回答できなかった。ただしそれらのユーザはSMSやe-mailによるリセットコードを75~80%返すことができた。 |
「あなたの図書館カード番号は何ですか?」は22%しか回答できなかった。 |
「あなたのマイレージ番号は何ですか?」は9%しか回答できなかった。 |
英語を話すユーザの「あなたの父親のミドルネームは何ですか?」は76%回答できるが、「あなたの最初の電話番号は何ですか?」は55%しか回答できない。 |
①「あなたはどの都市に生まれましたか」は79%回答できる。攻撃者が10回試行しても6.9%しか当たらない。 |
②「あなたの父親のミドルネームは何ですか?」は74%回答できる。攻撃者が10回試行しても14.6%しか当たらない。 |
③①②の両方に答えないといけないとき、攻撃者は10回試行して1%しか当たらないが、ユーザも59%しか回答できない。 |
と、いうことが上のカフェメニューのような資料にかかれている。
- まとめ
上記の結果から
✔ ユーザが答えやすい質問では少ない試行で攻撃者に当てられてしまう可能性がある。
✔ ユーザが秘密の質問に回答できる確率はそもそもあまり高くなく、全ての質問に同じ回答をいれておくなど脆弱な設定にしているユーザもいる。
✔ ユーザが答えやすい質問を複数文答えさせる場合、ユーザが回答できる確率も下がる。
ということが言えるだろう。
なので、難しい質問を複数文答えさせるなどの運用だとそもそもユーザは回答できず、ユーザが回答できるレベルまで落とした運用にすると容易に推測できるリスクが高まってしまう。
なのでもうやめましょうということだろう。
まぁそもそも、パスワードを忘れたから秘密の質問で代替するというのもいずれもSometing you know(あなたが知っていること)であり認証的には単一要素だ。
Googleが言うようにSMSやe-mailでリセットコードを受け取る方式や、ワンタイムパスワードなどパスワードとは違う要素で認証できるのが良いのは間違いない。
ただ、秘密の質問方式は非常に導入が簡単なのである。
秘密の質問に代わるパスワード初期化方式はこれからじっくり考えたい。
(そもそもパスワードもなくせると・・・)