日向夏特殊応援部隊

俺様向けメモ

Re:OpenID account security

自分用のメモです。

アカウントの自動収集

OpenIDの場合はIdentifierがURLなので、ユーザー名の収集は例えばGoogle検索などで行える。

  1. http://www.google.co.jp/search?q=allintitle%3AIdentity+Page+for

例えばこういう感じですね。他のOpenID ProviderのユーザーのIdentifierページも規則性も見出そうと思えば出来るはず。

こうして集めたIDに対して実際に辞書アタックなど掛ける事が出来る。

少なくともユーザー名とパスワードでログインが行われる仕組みの場合だとユーザー名が日の目に晒されている状況は余りよろしくない。

対策としては、当たり前な事もあるけど、

  1. JOE*1アカウントを許可しない
  2. ブルートフォースアタックの対策としてCAPTCHAを使用する
  3. ユーザのIdentifier URLに対するインデックスページを作らない。また検索エンジンにクロールさせない

最後の項目は非常にいいことを言ってると思う。

インデックスページはLiveJournalのようなコミュニティの体を成している場合は難しいかもしれないけど、もし作るならばログイン状態じゃないと見れないようにしておくとかすると良さそう。

また検索エンジンに拾わせないようにrobots.txtを適切に記述するのが良いと思う。

さらに今思ったんですが、こういうのはどうだろう。
大概のOpenIDのIdentifierは、

http://provider/username

で、ログインは、

  1. username
  2. password

だと思うんだけど、これを

  1. mailaddress
  2. password

にしてしまう。

とすれば、ユーザー名が分かったところでメールアドレスが分からなければアタック成功率は下がるんじゃないかなと。

ともあれ、ユーザー名の収集と言う厄介な問題があると言うことは認識した方がいい。

フィッシング

webmasgterとかroot, adminとかってユーザー名をプロバイダのアカウントとして許可してる場合はまずいと言う話だけど、これはまぁ当たり前ですな。

運営側で想定出来るユーザー名は予め抑えておくか、そもそも取れないアカウントとすべき。

ブラウザの脆弱性

ブラウザの脆弱性によって認証トークンが盗まれちゃったりするケース。
対抗策としては、

  1. 認証リクエスト毎にパスワードを求める
  2. 脆弱性があるブラウザに対してのみパスワードの要求をする
  3. 大事な操作には必ずパスワードを求める

だそうです。

まぁ、それに越したことは無いけど二番目の物はちと現場としては現実的じゃない気がしますね。

ブクマ反応 (追記2: 2007-10-22T14:14:56+09:00)

むしろメアドのほうが総当たりを受けそうだけど(何か勘違いしている?)

僕が挙げたユーザー名+パスワードよりも、登録時のメールアドレス+パスワードの方がまし、と言う話だけど総当たりされやすいのは、
この例だとユーザー名+パスワードの方だと僕は思います。

と言うのもクロールするだけでユーザー名の収集が出来る前提で、メールアドレスの場合は確実にそのIdP(OP)のアカウントであると言う証拠は
クロールで得られる程単純には通常得られないんじゃないかなと言うのが理由です。

最も、総当たりはあり得る話なんで、

  1. 同一IPで指定時間内に指定回数同じアカウントに対してパスワードを間違えた場合、アカウントの凍結
    1. これはscript kiddyがやるようなアタックの初歩。IPは変えないとすぐ分かるw
  2. 異なるIPで指定時間内に指定回数同じアカウントに対してパスワードを間違えた場合
    1. これはproxy等かましてアタックかける場合だと推定出来る。
  3. 同一IPで指定時間内に指定回数異なるアカウントに対してパスワードを間違えた場合、アカウントの凍結
    1. これもproxy等かましてアタックかけた際に起こりえる現象だと思います。もちろん会社のproxyかまして来るリモートホストもあるだろうと言う事を考慮して、そこまでしきい値を下げられないだろうけど、対策としては良い方法な気がします。

のような対策は必要だと思います。
もちろん凍結されたアカウントは本人のみリカバリ出来る仕組みは必要だと思いますが。

色々方法はあると思うので、何か別の対策があればご意見頂けると嬉しいです。

追記3: 2007-10-22T14:51:46+09:00

少なくともメアドベースの普通の認証の場合、そのメアドが存在するかどうかはアカウントをクラックするまで分からない。
(稀にまずいリマインダシステムを持ってる所だと、あるか無いかのチェックは出来る可能性があるけど)

で、先の例の話だけど検索エンジンで収集出来ないとしても、ユーザー名の推測やら辞書さえあれば、
そこからIdentifier URLと思しきURLを生成して実際アクセスしていけば収集可能だった。

こればかりは防ぎようが無いので、どうしようもない。。。
やはりパスワード強度に関してユーザーにある程度強制するような仕組みが必要なんだろうなと思った。

*1:username = passwordの形式の事