(続) Facebookのパスワードリセット機能のまとめ

前回の記事では、複雑な Facebookのパスワードリセット機能についてまとめてみたのですが、引き続き調べてみるとおもしろいことがわかってきました。ということで続編です。(割とどうでもいいような細かいことが気になるんですよね。)

まずは前回の復習。私が知っている限り、Facebookは次のような方法でパスワードをリセットをすることができます。

1. 通常の方法
 1-1. Googleアカウントでログインする
 1-2. 登録しているメールアドレスにメールで確認コードを送る
 1-3. 登録している携帯電話に SMSで確認コードを送る
 1-4. コードジェネレータを利用する
2. 「セキュリティのための質問」に回答する
3. 友達の助けを借りる
 3-1. 「信頼できる連絡先」を事前に登録している場合
 3-2. 「信頼できる連絡先」を登録していない場合


前回の記事を書いていたときには、(2) と (3-1)、そして (3-1) と (3-2) はそれぞれ排他的であり、両方同時に有効になることはないと思いこんでいました。まあ普通に考えたらそうですよね。ところが実際には両方とも有効なアカウントが存在することがわかりました。驚愕の事実です。(こちらの記事にも間違いがあったので訂正してあります。)

そうなると一体どういうパターンが存在するんだと気になってきました。しかし個別のアカウントの設定項目を調べるだけでは限界がありますし、パスワードリセットのオプションがどういう条件で使えるようになるのかもはっきりしません。そこでいくつかのアカウントについて、パスワードリセットのどの方法が有効になっているのか具体的に調べてみることにしました。


(1)の通常の方法はどのアカウントでも利用できます。そうするとパターンとしては (2)、(3-1)、(3-2)の 3つのオプションがそれぞれ使えるか使えないか、全部で 8通りになるはずです。

パターン (1) 通常 (2) SQ (3-1) TC (3-2) GH 補足
パターン1 × × × SQもTCも未設定の状態。最近登録したアカウントのデフォルト。
パターン2 × × SQを設定した状態。
パターン3 × × TCを設定した状態。
パターン4 × SQとTCを両方とも設定した状態。
パターン5 × × パターン1との違いが生じる条件が不明。登録時期や設定内容によると推測。
パターン6 × パターン2との違いが生じる条件が不明。登録時期や設定内容によると推測。
パターン7 × パターン3との違いが生じる条件が不明。登録時期や設定内容によると推測。
パターン8 パターン4との違いが生じる条件が不明。登録時期や設定内容によると推測。

(SQ: Security Question, TC: Trusted Contacts, GH: Get Help From Friends)

Facebookの中の人でもない限り、これらのパターンがどの程度存在するのかなんてわかりません。しかしそもそも存在するのかしないのかくらいは、身近なところで調べればわかりそうです。というわけで、Facebookのお友達の中から適当に 100人選択して、上記のどのパターンに該当するのか調べてみました。結果は次のとおりです。

パターン 該当人数
パターン1 17
パターン2 43
パターン3 1
パターン4 5
パターン5 10
パターン6 21
パターン7 1
パターン8 2

調べたアカウントには当然偏りがありますし、数字そのものに特に意味はありません*1。しかしパターン8 (すべてのオプションが有効) という人がいたり、思っていたよりも (3-2) のオプションが有効な人 (パターン5, 6, 7, 8の 34人が該当) が多いことや、全部のパターンが存在するということがわかり、個人的には非常に興味深い結果が得られました。またこれは私の友達に限ってのことかもしれませんが、「セキュリティのための質問」を多くの人 (71人) が設定している一方、まだ比較的新しい機能である「信頼できる連絡先」を設定している人 (9人) は少ないですね。

みなさんも自分の Facebookアカウントが上記のどのパターンに該当するのか、ぜひご自身で確認されることをオススメしたいと思います。


(参考)
自分のアカウントの確認がしたい人向けに、具体的な確認手順を書いておきます。

0. 「パスワードを忘れた場合はこちら」をクリックし、メールアドレスや名前などを入力して自分のアカウントを特定する。

1. 「パスワードを再設定」の画面で、「上記アドレスが利用できない場合」をクリックする。
1-1. 「メールにアクセスしてください」の画面が表示される。 → パターン1
1-2. 「ご連絡」の画面が表示される。 → 2へ

2. 「ご連絡」の画面でメールアドレスを入力し、「続行」をクリックする。
2-1. 「友達を通じてアカウントを再開」の画面が表示される。 → パターン5
2-2. 「セキュリティのための質問に回答」の画面が表示される。 → 3へ
2-3. 「信頼できる連絡先に助けを求めましょう」の画面が表示される。 → 4へ

3. 「セキュリティのための質問に回答」の画面の表示を確認する。
3-1. 「回答が思い出せませんか? アカウントの再開を友達に手伝ってもらう」というメッセージが表示されている。 → パターン6
3-2. 上記のメッセージが表示されていない。 → パターン2

4. 直接次の URLにアクセスする。(現在の URLの trustedの部分を sqに書き換える)
ttps://www.facebook.com/recover/sq?cp=xxx@xxx.xxx (cpの値は 2で入力したメールアドレス)
4-1. 「アカウントにセキュリティのための質問が設定されていません。」というメッセージが表示されている。 →  5へ
4-2. 上記メッセージは表示されないが、「回答が思い出せませんか? アカウントの再開を友達に手伝ってもらう」というメッセージが表示されている。→ パターン8
4-3. いずれのメッセージも表示されていない。 → パターン4

5. 「セキュリティのための質問に回答」の画面の表示を確認する。
5-1. 「回答が思い出せませんか? アカウントの再開を友達に手伝ってもらう」というメッセージが表示されている。 → パターン7
5-2. 上記のメッセージが表示されていない。 → パターン3

*1:たとえば最近登録したようなアカウントばかりを調べれば、パターン1と3がほとんどになるはずです。

Facebookの「セキュリティのための質問」を再設定する方法

前回の記事に書いたように、Facebookではパスワードをリセットするための一つの方法として「セキュリティのための質問」を利用することができる。ただし問題がひとつある。Facebookでは一度設定した「セキュリティのための質問」をあとから変更することができない。他人が容易に推測できるような回答をうっかり設定しまう場合を考えると、これは非常に危険である。3人の架空のアカウントで友達になって…などとわざわざ面倒な方法を使わなくても、簡単にアカウントが乗っ取れてしまう。

そこでどうしても過去に設定した「セキュリティのための質問」を変更したい人のために、ややトリッキーではあるが変更することが可能な方法を紹介する。(ただし正規の手順というわけではないので、実行する場合は自己責任で*1。)

なお現在は「セキュリティのための質問」に代わる機能として「信頼できる連絡先」の機能が提供されている。「信頼できる連絡先」を設定すると「セキュリティのための質問」は無効になるので、こちらを使うことをオススメしておく。(「セキュリティのための質問」はアカウント設定に項目が表示されない。現在の設定状況を確認したい時はこのURLで確認できる。)

(2013-08-13 追記)
追加で検証したところ、上記の『「信頼できる連絡先」を設定すると「セキュリティのための質問」は無効になる』は間違いだということがわかった。「信頼できる連絡先」と「セキュリティのための質問」とを両方設定したアカウントでパスワードリセットを試みると、画面遷移上は「信頼できる連絡先」しか利用できないように見える。しかし直接「セキュリティのための質問」を利用するための URLにアクセスすると、「セキュリティのための質問」を利用してリセットすることが可能。
(別記事も参照のこと。)

概要

この方法の鍵となるのは、設定済みの「セキュリティのための質問」が悪用されてしまいもはや安全ではない、と Facebookに認識させることにある。手順の(1)で「セキュリティのための質問」に正しく回答する必要があるため、自分で設定した回答を忘れてしまった場合にはこの方法は使えない。また手順(2)では現在のパスワードでログインし直す必要がある。

前提条件
・対象となるFacebookアカウントにログインできること (現在のパスワードを知っていること)
・設定済みの「セキュリティのための質問」の回答を知っていること

手順
(1) パスワードリセット機能を利用してパスワードを再設定する。
(2) 古いパスワードでログインする。
(3) アカウント再開の手続きを行う。

以下、順に詳しくみていく。

1. パスワードをリセットする

まずはパスワードリセット機能を使ってパスワードを再設定する。このとき「セキュリティのための質問」に回答する。*2

1-1. 「パスワードを忘れた場合はこちら」をクリックする。
1-2. メールアドレスや名前などを入力して対象のアカウントを特定する。
1-3. 「上記メールアドレスが利用できない場合」をクリックする。
1-4. 新しいメールアドレスを入力する。
1-5. 「セキュリティのための質問」に対する回答を入力する
1-6. 新しいパスワードを入力する。

このあと (1-4) で入力したメールアドレスにリンクが送られてくるが、何もしなくてよい。また (1-6) で設定したパスワードは以降の手順では使用しない。

ちなみに (1-4) のメールアドレス入力画面が表示されず (1-5) の画面に遷移しない場合や、直接 (1-5) の URLを指定してもエラーが表示される場合、そのアカウントでは「セキュリティのための質問」が設定されていないか、無効になっている*3

2. 古いパスワードでログインする

パスワードリセットを実行したあと、古いパスワードでログインする。アプリやブラウザなどログイン済みのセッションが存在する場合には強制的にログアウトされるので、再度ログインを行う*4
ここは重要なポイントなので間違えないように。さきほど新しく設定したパスワードではなく、そんなものは知らないよーと何食わぬ顔をして古いパスワードを使うこと。

2-1. 古いパスワードでログインする。
2-2. 「誰かがあなたのアカウントにアクセスしようとしました」というメッセージが表示される。
→ 「私ではありません」をクリックする。
2-3. 「誰かがアカウントにアクセスしようとしましたか?」 というメッセージが表示される。
→ 「アカウントの安全を確保」をクリックする。

(2-1)の時点ではパスワードリセットが実行されたあとで、アカウントはロック状態になっている。しかし古いパスワードでログインし、パスードリセットは自分が実施したものではないと申告することにより、正規のユーザではない第三者が不正にパスワードリセットをかけたことにできる。この場合、古いパスワードでログインしてきたのが正規ユーザと判断され、アカウントを再開するための手続きが開始される。

3. アカウント再開の手続きを行う

ここでは新しいパスワードの設定、登録されているメールアドレスの確認、このアカウントで最近行われた設定変更の確認などが行われる。その中で今回の目的である「セキュリティのための質問」も再設定することができる*5。(ただし設定を無効にすることはできない。)

3-1. 「セキュリティのための質問」に回答し、本人確認を行う。
3-2. 新しいパスワードを設定する。
3-3. メールアドレスを確認する。
3-4. 最近行われた変更内容を確認する。
3-5. 「セキュリティのための質問」を再設定する。
3-6. 「ログイン」をクリックすると、アカウントのロックが解除される。

以上で再設定は完了。おそらくこの方法で再設定したい人はほとんどいないし、誰得な情報ではあるが、せっかく調べたので一応記事にしておく。

*1:再設定によって、「セキュリティのための質問」を使ったパスワードリセット機能が無効になる可能性がある。まあ悪用はされなくなるので目的は達成していると言える。

*2:パスワードリセットは普段ログインしている環境とは異なる環境から実施したほうがよい。例えば Tor Browserを使用するなど。

*3:「セキュリティのための質問」を設定した直後も無効になっており、数日経過しないと有効にならない。

*4:強制的にログアウトされるかどうかはパスワードリセット時の設定による。

*5:画面キャプチャするのを忘れたので細かい手順は省略。またアカウント再開がこのとおりにスムーズにいかない可能性もある。→ 手順を再度確認できたので追記した。

Facebookのパスワードリセット機能のまとめ

Facebookのパスワードを忘れてしまった場合、「パスワードを忘れた場合はこちら」のリンクから、パスワードを再設定することができる。いわゆるパスワードリセット機能で、大抵の Webサービスには似たような機能があると思うが、Facebookでは実に多様な方法でパスワードをリセットすることができる。そしてこれがセキュリティ上問題になったり、混乱を生む原因にもなっているのではないかと思う。ということで Facebookのパスワードリセット機能についてまとめておく。(続編も一緒にどうぞ!)

通常の方法

まず、もっともポピュラーな方法として以下がある*1

1-1. Googleアカウントでログインする
1-2. 登録しているメールアドレスにメールで確認コードを送る
1-3. 登録している携帯電話に SMSで確認コードを送る
1-4. コードジェネレータを利用する

FacebookGmailのメールアドレスを登録している場合、Googleアカウントでログインするのが最も簡単な方法だ (1-1)。Facebookに登録された Googleのアカウントでログインし、Facebookにメールアドレスの表示を許可するだけで OK。すぐに新しいパスワードを再設定することができる。(Google以外にもアカウント連携できるものがあるかも。未確認。)

Gmail以外のメールアドレスを登録している場合や携帯電話番号を登録している場合には、(1-2) か (1-3) の方法で 6桁の確認コードを受信できる。またログイン承認 (いわゆる 2段階認証) の機能に用いられるコードジェネレータを有効に設定している場合には、それを使ってもよい (1-4)。いずれの場合でも確認コードを正しく入力できればパスワードの再設定が可能だ。

ややイレギュラーな方法

次に上記のいずれの手段も利用できない場合に使う方法を紹介する。スマホを紛失したり、メールアドレスにもアクセスできないというかなり特殊な状況だとは思うが、こういう緊急時(?)でもパスワードをリセットすることができる。

2. セキュリティのための質問に回答する

「セキュリティのための質問」は他のサービスでは「秘密の質問」などと呼ばれることもある。本人以外には知りえない情報をあらかじめ登録しておき、その内容を答えさせることで本人かどうかを確認するものだ。しかし実際には、質問の選択肢が限定されていて、質問の内容も本人以外が容易に知りうるものが多く、アカウント乗っ取りに利用されるケースもある。なかなか問題の多い機能である。

Facebookでは以下の 6つの中から質問を選択して、あらかじめ回答を登録しておく。

  • 小学校1年生の時の担任の先生の苗字は?
  • お母さんが生まれた町の名前は?
  • 8才の時に住んでいた町の名前は?
  • 小学校3年のときの担任の先生の名前は?
  • おじいさんの職業は?
  • おばあさんの職業は?

選択肢が少ないうえに、本人以外には知りえない秘密かと言われれば疑問を感じるものもある。

ところで秘密の質問を使ってパスワードリセットを行うのは他のサービスでは一般的に行われているが Facebookではやや日陰の存在だ。なぜかというと、実は Facebookでは設定することをもはや推奨していないからだ(後述する「信頼できる連絡先」の利用をすすめている)。機能としては存在しているのに、設定項目としてどこにも表示されないのである。以前は「アカウント設定 > セキュリティ」の中に項目として表示され、一度設定を行うと以後表示されなくなっていた。しかし現在は設定の有無に関係なく表示されないようになっている*2

また「セキュリティのための質問」は一度設定すると以後その内容を変更することができなくなる。その理由はヘルプによると、次のとおりである。

セキュリティのための質問を変更することはできますか。

ユーザーのアカウントと情報を安全な状態に維持するため、アカウントのセキュリティのための質問を一度設定すると、変更することはできません。ご不便をおかけして申し訳ありません。

うっかり間違って他人が容易に推測可能な回答を設定してしまった場合はどうすればいいのだろうか。設定してもあとから変更できるようにするべきだと思うがこういう仕様なので仕方がない。(実はちょっとした技を使うと再設定することはできるのだが、それについては別記事で。)
ちなみに Yahoo! Japanでも Facebookと同じように、一度設定すると変更できない仕様になっている

というわけなので、Facebookの「セキュリティのための質問」は強制ではないし、設定項目にも表示されないし、一度設定したら変更できないし、うっかり簡単な答えを設定したら悪用される危険性が高いので、設定しないほうがいいと思う。万が一の場合に備えて設定しおきたいという奇特な人は、ランダムな回答を登録してパスワード管理ソフトにでも覚えさせておけばいい。

なお設定項目に表示されないため、自分が過去に設定したかどうか忘れてしまうこともあるだろう。そういう場合には以下の URLにアクセスすると、セキュリティのための質問を設定したか確認することができる。

https://www.facebook.com/update_security_info.php (要ログイン)

3. 友達の助けを借りる

さて次に SNSらしいユニークな方法が「友達の助けを借りる」というものだ。これは実際には次の 2つのパターンにわかれる。

3-1. 信頼できる連絡先を事前に登録している場合

信頼できる連絡先」とは何かというと、パスワードリセットを行う際に助けてもらう友人をあらかじめ登録しておく機能のことだ。3〜5人の友達をあらかじめ登録しておくことができる。この場合のパスワードリセットの手順は以下のようになる。

  1. あらかじめ登録した友達 3-5人の中から 3人の友達に連絡する。
  2. 友達にこの URL にアクセスしてコードを取得してもらい、そのコードを聞く。
  3. 3人から聞いた 3つのコードを入力する。

3つのコードがすべて正しく入力できれば、パスワードを再設定することができるようになる。
これは「セキュリティのための質問」に代わるものとして今年 5月に導入された比較的新しい機能なので、まだ利用できないユーザがいるかもしれない*3

3-2. 信頼できる連絡先を登録していない場合

信頼できる連絡先を登録していない場合はどうなるかというと、実はパスワードリセットを行う際にあとから助けてもらう友人を選択することもできる。この場合の手順は以下のとおり。

  1. 友達一覧の中から 3人の友達を選択する。
  2. 3人の友達に手順を説明するメッセージが送信される。
  3. 3人の友達から確認コードを取得し、3つのコードを入力する。

基本的な手順はさきほどとほとんど変わらないが、助けを借りる友達をあらかじめ登録しておくか、あとから選択するかという点が異なる。そしてこの違いが実は問題で、いわゆる「3人の架空アカウントと友達になると乗っ取られる」問題はこの機能を悪用するものだ。フェイスブックナビが注意喚起をしたことで最近ちょっと話題にもなったが、実はこの問題自体は約 2年前から存在している。そしてこれを解決するために改良されたのが前述の「信頼できる連絡先」の機能である。

攻撃者はあらかじめ架空のダミーアカウントを複数登録し、ターゲットとなるアカウントに友達申請をする。運良く 3人の友達(いずれもダミー)が承認されれば、(3-2)の手順を利用して攻撃者はターゲットのアカウントのパスワードをリセットできるという仕組みだ。しかしこの乗っ取り方法は攻撃者からすれば面倒で効率が悪いし、2年も前から存在するのにこの方法で乗っ取られたという話は聞いたことがない。
また最近新しく登録したアカウントではそもそもこの方法は有効になっていないほか、古いユーザのアカウントでも無効になっている場合がある。おそらくセキュリティの設定項目などが影響しているのだと思うが、無効になるアカウントの条件がはっきりしないため、この攻撃方法が有効なアカウントの総数もよくわかっていない*4。まああまり心配する必要はないと思うが、心配な人は「信頼できる連絡先」を登録しておけばよい*5

まとめ

  • Facebookのパスワードリセットの方法はいろいろある。
  • (2)と (3-2)の方法は攻撃者に悪用されるかもしれないので要注意。
  • 通常の方法が使えない緊急時に備えるのであれば、「セキュリティのための質問」は設定しないで、「信頼できる連絡先」を設定しよう
  • アカウントによってどの方法が使えるかはそれぞれ異なる(設定項目の有無や、登録時期など様々な要素が影響すると思われる)。
  • 自分のアカウントではどの方法が使えるのか、一度確認しておくべきFacebookは告知もなしに頻繁に仕様を変更するので、定期的に確認するのもいいかもしれない。
1. 通常の方法
 1-1. Googleアカウントでログインする
 1-2. 登録しているメールアドレスにメールで確認コードを送る
 1-3. 登録している携帯電話に SMSで確認コードを送る
 1-4. コードジェネレータを利用する
2. セキュリティのための質問に回答する
3. 友達の助けを借りる
 3-1. 信頼できる連絡先を事前に登録している場合
 3-2. 信頼できる連絡先を登録していない場合

*1:この他にもあるかもしれないが未確認。

*2:いつからこのような変更が行われたのか、よくわからない。信頼できる連絡先の機能が提供されたあとからか?

*3:Facebookでは新機能が全ユーザに行き渡るまでに数週間かかることが多い。

*4:おそらく近いうちにこの機能は全ユーザで無効になると思われる。

*5:ただし「信頼できる連絡先」を設定しているにもかかわらず、(3-2)の手順が実行できるアカウントが存在する。どういう条件でそうなるのかわからない。

Facebookが狙われた!? "Operation Loopback"

Facebookがかなり本格的なインシデントレスポンスの訓練を実施していることは以前から有名ですが、Ars Technicaにその訓練内容についての記事が出ていました。

At Facebook, zero-day exploits, backdoor code bring war games drill to life | Ars Technica

Early on Halloween morning, members of Facebook's Computer Emergency Response Team received an urgent e-mail from an FBI special agent who regularly briefs them on security matters. The e-mail contained a Facebook link to a PHP script that appeared to give anyone who knew its location unfettered access to the site's front-end system. It also referenced a suspicious IP address that suggested criminal hackers in Beijing were involved.

Arsの記事によると、訓練のシナリオは FBIエージェントから Facebookのセキュリティチームに送られた 1通のメールで始まります。そこには Facebookのネットワークに外部からアクセス可能なバックドアについての情報が記されていたのです。これを見たチームは右往左往します。どうやってこのコードが紛れ込んだのか、誰の仕業なのか、バックドアは他にもあるんじゃないか。その後 24時間かけて、サーバのログ解析や PCのフォレンジック調査などを行い、ついに一人の開発エンジニアのラップトップPCがゼロデイ脆弱性を攻撃されてマルウェアに感染していたことを突き止める…

これが Facebookが昨年10月末に実施した最近の訓練(社内のコードネームは "Operation Loopback")の様子です。FBIエージェントは以前からチームが良く知る人物ですし、バックドアは本当にインストールされたものです(ただし実際に悪用されないように無害化したもの)。ゼロデイ脆弱性を突くエクスプロイトも無論本物。外部のセキュリティ業者の協力を得つつ、できるだけリアルに近いシナリオで実施しようとしていることが伺えます。もちろん訓練であることは従業員には伏せて行われます。これは相当いい訓練になると思います。まあやられるチームの方はたまったものではないと思いますが。

Facebookは定期的にこの手の訓練を実施していて、この記事では別の訓練 "Project Vampire" についても紹介されています。自社でここまでやっているところは米国でも少ないようで、外部の専門業者に依頼してシステムやネットワークの問題を調査してもらう、いわゆるペネトレーションテスト (Penetration Testing)のほうが一般的でしょう。これは日本でも広く行われているセキュリティ診断、脆弱性診断 (Vulnerability Scanning)とは異なります。網羅的に脆弱性を見つけることが目的ではなく、より実際の攻撃に近い形であらゆる方法を利用してシステムへの侵入を試みます。そのためソーシャルエンジニアリングを行ったり、従業員にマルウェアが添付されたメールを送ったり、なんでもアリなのがペネトレーションテストです*1


Arsの記事の後半では、2010年に起きた Googleへの攻撃(Operation Aurora)や最近報道されて話題となった NYTimesや他の大手メディアへの攻撃を例に挙げて、こうした巧妙な攻撃に対抗するためには Facebookが実施しているような訓練やペネトレーションテストが必要とされていることを説明しています。その中で Trustwave (SpiderLabs)が実際に行ったペネトレーションテストの内容が紹介されています。昨年の RSA Conferenceでも発表されたものですが、これはとてもおもしろいです。


数年前にある会社にペネトレーションテストを実施した際、ペンテスターは社内に設置された監視カメラがインターネットに接続されていることを見つけました。この監視カメラのシステムには脆弱性が存在していたため、彼らはシステムに侵入して監視カメラの映像を自由に見ることができるようになりました*2。これを利用し、社員がキーボードから入力するパスワードをカメラの映像から読みとり、社内ネットワークへの侵入に成功したという、ウソのようなホントの話です。


RSA Conferenceでの講演は YouTubeでも公開されています。他のペンテストの例も紹介されているので、興味のある方はどうぞ。

RSA Conference 2012 -- Earth vs. the Giant Spider: Amazingly True Stories of Real Pen-Tests


国内でもメールによる標的型攻撃の訓練とか実施されていますが、もう一歩踏み込んでインシデントレスポンス訓練までできるといいですね。

*1:こういったテストを Ethical Hackingと呼ぶこともあります。

*2:Trustwaveはこの後に該当ベンダーに連絡し、セキュリティアドバイザリも公開しています (https://www.trustwave.com/spiderlabs/advisories/TWSL2010-006.txt)。複数の脆弱性を指摘していますが、あまりにもお粗末な脆弱性ばかりで驚きます。