スポンサーリンク
LINE運営は、PINコードの設定を義務化したことにより、LINEアカウントへの不正ログイン(乗っ取り)を軽減する効果があると主張しています。たしかに、効果が無いなんてことはありません(完璧とも言えない)。しかし、それ以前に、PINコードの運用方法に問題があるのではないかという話を書いておきます。
簡単に言うと、PINコードを必須化しても、PINコードを設定した状態のアカウントを効率よく乗っ取る方法が現状成立しているみたいだから、そっちを先に対策しないと無意味かも知れないよ?という話です。
目次
- 1. LINEのログイン時の認証
- 2. PINコード認証
- 3. PINコード未登録の場合
- 4. PINコード未登録ユーザーを保護するための必須化
- 5. PINコード必須化の効果は?
- 6. PINコード設定済みでも脆弱なら無意味
- 7. PINコードは4ケタだけど、問題は利用方法
- 8. 銀行ATMで考える
- 9. LINEのPINコード再試行回数が無制限
- 10. PINコードの実験について
- 11. PINコードの回数制限がなさそう
- 12. リトライ制限(回数無し時間のみ)があっても成立する攻撃
- 13. PINコード必須化が意味なく終わる可能性
- 14. 利用した仮定
- 15. じゃぁユーザーはどうすれば良いの?
- 16. 限界はある
- 17. 総当たり攻撃の基本的な対策との関連(追加)
- 18. まとめ
- 19. 感想
- 20. おまけ
スポンサーリンク
LINEのログイン時の認証
最初に、LINEのログイン時の認証手続きを説明します。
LINEは、機種変更などに伴うログイン時に、3つの認証を行います(Facebookを利用するケースもありますが、そこは本題をややこしくするので割愛します)。
- 1.メールアドレス&パスワード認証
- 2.電話番号認証
- 3.PINコード認証
メールアドレス&パスワード認証
まず、最も重要なのが、「メールアドレス」と「パスワード」による認証です。
これが、LINEアカウントの持ち主であることを証明するためのもっとも中心となる認証です。
しかし、メールアドレスやパスワードが他社サービスから流出し、それをLINEにも使い回していた人が、乗っ取られるという問題が急増しました。
電話番号認証
そして、次に行われるのが、電話番号認証です。
これ単体では、電話番号の持ち主であることは認証しますが、LINEアカウントの持ち主であることは認証しません。
ここを勘違いしないようにしてください。これは、電話番号が解約後再割り当てされる可能性に起因します。
なので、乗っ取りとは無関係で、乗っ取り行為に、電話番号認証はあまり関係ありません。大事なのは、パスワードを知っているかどうかです。
※この認証は、Facebook認証でも代用できます。このFacebook認証も、LINEアカウントの持ち主であることを認証するものではありません。なので、乗っ取り犯は電話番号よりFacebookアカウントを用意する方が簡単なので、捨てアカ(使い捨てのアカウント)を作ることで、先に進むことでしょう。
PINコード認証
重要なのは、最終層にあるPINコード認証です。
これは、乗っ取り問題が大きくなった結果、7月17日に導入された認証です。
ユーザは、事前にPINコードを設定しておくことで、PINコード認証を利用できます。
PINコードは4桁の数字で、その4桁の数字を正しく入力することで、ログインが完了します。
ただし、2番目の電話番号認証で利用された電話番号が、以前LINEアカウントで使っていたものと一致した場合は、飛ばされます。つまり、パスワード認証+電話番号認証、または、パスワード認証+PINコード認証というわけです。
しかし、乗っ取り犯は、メールアドレスとパスワードは知っているものの、登録されていた電話番号を利用する権限(受信SMSの本文を読む権限)はないので、基本的にPINコードに攻撃を仕掛けることになります。 )
PINコード未登録の場合
しかし、PINコードに攻撃を仕掛けるにあたって、1つ分岐があります。
それは、PINコードの登録が今まで任意だったので、未登録だったらどうなるのか、ということです。
このとき、PINコードが未登録であっても、ログイン時に、PINコードの入力を求めるシステムになっていました。
どういうことかというと、PINコードには初期値がありました。
しかし、初期値は、「ユーザーなら知っていて」、「ユーザー毎に違う」必要があります。その結果、LINE運営が採用したのが、以前登録していた電話番号の下4ケタでした。
そのため、犯人がもし、メールアドレス&パスワードと一緒に、電話番号を入手していた場合、PINコードが未登録であると、簡単に突破されてしまうという仕様でした(前述リンク先で説明)。
PINコード未登録ユーザーを保護するための必須化
そして、実際に電話番号も一緒に流出したケース(次のツイートの後半)を考え、今回の必須化が行われたようです(実際にそういう事例が確認されたかは読み取れない)。
【LINEのPINコード強制化広報コメント22日11時】本日14時から起動時にPINコード設定表示▼今まで未設定者は電話番号末尾4桁だったがこれを中止し強制に▼IDパスワードの他、電話番号がセットで他社から流出→乗っ取りの可能性があるため
— 三上洋 (@mikamiyoh) 2014, 9月 22
PINコード必須化の効果は?
こうやって見ると、PINコードの必須化によって、PINコード未登録ユーザーが保護され、不正ログインが大きく減るように思えます。
しかし、正確には、PINコード未登録ユーザーのセキュリティ保護レベルが、PINコード設定済みユーザーのセキュリティ保護レベルに到達しただけです。
PINコード設定済みでも脆弱なら無意味
つまり、PINコード設定済みユーザーが正しく保護されていなければ、必須だとか必須じゃないとか、それ以前の問題となります。
今回指摘したいのはこの部分です。
PINコードは4ケタだけど、問題は利用方法
さて、今回PINコード必須化になって、「4ケタなんて脆弱(セキュリティ的に弱い)だ」という発言が目立ちます。
lineのPINコード数字4桁とかないのと一緒やろ
— せかいでいちばんえらいしずか (@sizuka_s) 2014, 9月 23
LINEでPINコード云々って言ってるけど、たった1万通りじゃセキュリティ甘い気がする。
— 咎/*とが*/@孤独人 (@togaerror) 2014, 9月 22
(テレビのニュースを見ての独り言)
そうそう。そうなんだよ。
パスワード英数字8桁でさえ安全度が低い扱いされることがあるのに、LINEのPINコードの数字のみ4桁って安全度低いよね。
しかも、PINコード登録必須になったらしいけど、お知らせ等の通知って一切来ないのね。
— ろろん (@lolon_ss) 2014, 9月 22
基本的に4ケタより8ケタ、数字のみより英数字記号のほうが強固なのは確かですが、それ以上に、運用方法のほうが重要です。
銀行ATMで考える
銀行ATMで利用されるシンプルな暗証番号の話を考えてみます。
たとえば、生体認証とかは別にして、とりあえず多くのキャッシュカード(銀行口座)の暗証番号は4ケタです。
ATMでは、4ケタの数字を入力するだけで、お金を引き出すことができます。
これは、たったの1万通りだから簡単なのでしょうか?
そうではありません。
これについては、2つの理由があります。
キャッシュカード所持が第一の認証
銀行ATMを利用するためには、まずキャッシュカードを所持していることの認証が必要です。
もちろん偽造もあり得ますし、それに対してICチップが利用されていますが、それはともかく、暗証番号単体ではなく、キャッシュカード所持を中心とする、追加認証になっているということが大事です。
これによって、キャッシュカードを盗まれても、暗証番号がバレなければセーフとなりますし、暗証番号だけ知られていたとしても、キャッシュカードが盗まれていなければ、基本的にセーフです。両方同時に突破されるのが問題である場合の、補助的要素になっています。
暗証番号の回数制限
もう一つが、暗証番号に回数制限がある点です。
キャッシュカードが盗まれて、暗証番号はバレていない場合であっても、暗証番号を回数無制限で挑戦できるのであれば、時間はかかるものの、突破されてしまうということはわかるかと思います。
例えば、キャッシュカードは正しくても、暗証番号を3回間違えたら、キャッシュカードそのものが無効になり、再発行するまで使えなくなるというシステムが導入されています。
この「運用方法」のおかげで、回数制限によりキャッシュカードを無効化することで、盗まれたという、第一の認証を突破された状態から回復できるのです。
そして、たった3回という回数制限があるからこそ、4ケタでも(4ケタの割に)かなりの強さになるのです。
LINEのPINコード再試行回数が無制限
さて、ここまでで、LINEのPINコード4ケタも、なかなかよさそうな気もしてくるかと思うのですが、銀行の暗証番号4ケタと、LINEのPINコード4ケタには大きな違いがあります。
それは、回数制限がないということです。
これは、先ほどの例からすれば、キャッシュカードが無効化されず、何度でも挑戦可能であることを意味しています。
この後説明しますが、時間はかかるものの、現実的な時間でいつか突破できてしまいます。
PINコードの実験について
この点について、先日のエントリで実験を行いました。また、PINコード必須化後の本日も、実験をして再確認しました。
その実験の結果、次のことを確認しています。
- PINコード認証に10回失敗すると、PINコード認証ができなくなる
- しかし、1時間で復活
- 少なくとも、30回まで実験し、30回以上の失敗の後、正解のPINコードを入力し突破できることを確認
- PINコードを間違えたことに関する警告通知や、パスワードリセットは無し
PINコードの回数制限がなさそう
早い話が、PINコードを3回入力したら、パスワードが無効になる、という仕組みはないということです。
実験では、PINコードの挑戦を30回まで確認していますが、この時点で30回「も」挑戦できてしまっていますし、今後もずっと回数無制限で挑戦できそうでした。このはっきりしない具合が「懸念」であって、ここを1000回確認できれば、かなり「断定」に近くなると思っています。
リトライ制限(回数無し時間のみ)があっても成立する攻撃
実験の結果、さすがに全く配慮していないわけではなく、10回の入力ごとに1時間の入力制限が発生することがわかっています。
これが、LINE運営のPINコードの運用方法の判断結果です。
先ほどの銀行の例では3回でパスワード無効化だったので、全く違います。
何が問題かというと、次のような攻撃システムが構築されてしまいます。
1端末でならきびしい
Android端末1台で、PINコード10パターンを試すのに手動で操作して3分かかるとすると、1時間休みがある関係上、1時間で60分/3分=20アカウントに10パターン試すことができます(端末がロックされるわけではないので、1時間の制限時間中でも、別アカウントにはPINコードを入力できることを確認済み)。 。
これで1000時間(41.6日)かければ、24時間スタミナがもたないとかは別にして、20アカウントを乗っ取ることが(確率的でなく、)確実にできてしまい、1アカウント50時間、つまり、だいたい2日で1アカウントになります。
これでは、遅すぎる気がします。
並列化すれば
では、ここで安いアルバイトなりを雇って10台に同時にやらせればどうなるかというと、単純に10倍で、1000時間で200アカウントを乗っ取ることができます。
5時間で1アカウントなので、まだ遅い気がします。
それでも、これだけ時間をかければかならず乗っ取ることができるというのがポイントです。
銀行の暗証番号のような、パスワードを途中で無効化するシステムがあれば、こう簡単ではありません(先ほどの例ではキャッシュカードを数十万枚手に入れれば確率的にちょっとは行けそうだけど)。
また、1回乗っ取れば、その友だち、すなわち数十人なんかに、詐欺メッセージを送信できるので、これでもそれなりのスピードになってきました。
自動化すれば
ここでさらに、Androidのエミュレータを使ってパソコンから操作し、作業をすべて自動化したとします。
作業は決められたパスワードとメールアドレスとPINコードという単純な値の入力なので、自動化する困難は大きくありません(CAPTCHAみたいな、読みにくい文字の画像を読んで入力する、のようなちょっと面倒な画面もないので)。
完全に自動化すれば、人間の体力も関係ありません。
すると、1アカウントに10パターン試すのに、30秒くらいかもしれません。
そして、パスワードが売買された結果、LINEに攻撃を仕掛ける人数が増え、並列度がどんどん上がって、100並列くらいになったとします。
これだけ作業が速くなっても、パスワードが大量にあれば、並列数にも終盤を除けば実質制限がありません。
すると、3分が30秒になって6倍速、100並列になって10倍速として、合計60倍速なので、1000時間で12000アカウント、実に1時間に12アカウント、つまり5分に1アカウントのペースで乗っ取ることが可能です。
PINコードに規則性があれば
さらに、そもそもPINコードが正解した時点でやめてOKなので、完全に予想できず、10000パターンに対して半分の平均5000回のチャレンジで成功したとすれば、2.5分=150秒に1アカウントになり、誕生日やぞろ目を優先した結果、平均500回のチャレンジで成功したと考えれば、さらにその10倍で15秒に1アカウントを乗っ取れてしまうことになります。
PINコード必須化が意味なく終わる可能性
こうやって考えてみると、話は変わってきていて、PINコードを必須化したところで、PINコードを効率よく、ハイスピードで突破できるシステムを既に構築されてしまっていれば、あんまり関係ないというか、載せるベルトコンベアが変わるだけで、乗っ取ることができるという結果に変わりは無いことになります。
PINコードをしらみつぶしにするシステムが構築されていない乗っ取り業者はダメージを受けますが、構築済みであったとすれば、「まぁちょっと時間かかるなぁ」くらいになってしまいます。
利用した仮定
ここでは、30回の実験結果から、今後も際限なく再挑戦ができると仮定しています。その点だけは注意してください。
しかし、このあたりのことを考えていたとすれば、10回の時点で時間制限なんかではなく、もう3回くらいでパスワードリセットをかけよう(メールアドレスに再設定メールを送ろう)とか考えるはずなので、非常に怪しく感じます。
30回はチャレンジできるけど、50回でパスワードがリセットされる、というのもかなり不思議な話ですし。
というわけで、今回は際限なく再挑戦できるものとして、乗っ取りスピードを考えてみました。
また、スピードを計算する際に、大量のアクセスを同一IPアドレスから送ったら、遮断する可能性は考えていません。しかし、実験で数十PINコードを、2つのアカウントに対して、同じWi-Fi経由のフレッツ光のIPから挑戦しても、何も問題はありませんでした。
じゃぁユーザーはどうすれば良いの?
現状ユーザーがどうすれば良いのか、を考えると、そもそも守るべきはPINコードという防壁でなく、LINEアカウントそのものなので、PINコードはおまけくらいに考えて、パスワードという防壁をばっちりにするように心がけることです。使い回さないだとか、推測されやすいパスワードは避けるだとか。パスワードが突破される人のための追加機能がPINコードの現状の立ち位置なので。
限界はある
ちなみに、ここで例えば3回の回数制限を設けると、たしかに急激に強固になりますが、それでも大量にメアドとパスワードの一覧があると、例えば8473という推測されにくいかもしれない番号を固定して、メアドとパスワードを変更しまくれば、(1万パターンしかないので、)そのうち8473を設定していた人が乗っ取られると思います(およそ1万分の1=0.01%)。
とはいえ、無効化機能があるので、これをあと2番号分やった時点で有効なメアド&パスワードが急に約1万分の1になり、限界はあるものの、その違いは大きいです。
総当たり攻撃の基本的な対策との関連(追加)
今回紹介した攻撃は、総当たり攻撃(ブルートフォースアタック)と呼ばれるものなのですが、Wikipediaの「総当たり攻撃」のページに、4つの代表的な防衛手段が書かれています(全てを満たさなければならないというものではなく、1つが強力なのでもよいことに注意)。
- パスワードの長さを大きくする
- パスワードの試行回数を制限する
- アクセス元を制限する
- 一定の速度以上でのパスワード試行を禁止する
これらについて、今回の事例で考えてみると、以下のようになります。パスワードがあって、それが破られている状態を仮定しての対策であることにも注意して読んでください。
- パスワードの長さを大きくする → 数字4ケタなのでこれでは守れない
- パスワードの試行回数を制限する → 制限がなさそうで守れてなさそう
- アクセス元を制限する → 制限がなさそうで守れてなさそう
- 一定の速度以上でのパスワード試行を禁止する → 1時間で10パターンなので、前述の計算的に不十分そう
今回の記事の内容は、このように整理できそうです。
まとめ
今回は、LINEにおけるPINコードの立ち位置と、4桁であることよりも、運用が大事、という前提を紹介し、LINEの、さっぱりパスワードをリセットしてくれないという実験結果から、これでは必須化しても無意味なのでは?という話を紹介しました。
実際、どれくらいのスピードで乗っ取り犯が攻撃しているのかはわかりませんが、パスワードリセットをしない限り、これではいつか突破されてしまうということに変わりはありません。もちろん、強い暗号化手法なんかでも、いつかは突破されてしまうと言えたりしますが、それは天文学的数字("現実的な時間でない")であったりするわけで、それに対して今回はたったの1000時間です。並列化が可能なので、実際その数値はさらに悪くなります。
感想
「PINコード必須化」で「LINEのセキュリティが向上した」「乗っ取り対策だ」と紹介されています。
たしかに、完全に無駄ではありません。効果が無いわけでもありません。一定の効果はあります。
しかし、その効果の程度はあまり注目されませんし、優先して改善すべき部分があるように、私には思えました。
おまけ
関連する、よくありそうな質問について。
メールアドレスに一時的なパスワードを発行すれば?
自分も、認証時に、登録メール宛に一時的なURLか一時的なパスワードを送信して、それを入力させることで、メールアドレスが利用可能かどうかを検証すれば良いのでは?と思いました。
ただ、もしかすると、メールアドレスの利用権限も、パスワードを知られていることで乗っ取られているかも知れないじゃん!とかって考えて、それは止めたのかもなぁ、と思っています。ただ、現状のPINコードよりは、良さそうな気もします。
SMSで認証すれば?(2段階認証)
登録電話番号にSMSを送信し、一時的な番号を発行すれば?というのも考えられます。いわゆる2段階認証です。
しかし、現在のLINEの方針では、電話番号が変わってしまったときにも、LINEアカウントを手放さないでいいように配慮しています。というか、LINEは現状のシステムで利便性をいろいろ優先していたりして、そのあたりの仕様を保ちつつ、というのが難しいです。
それを許さないように仕様変更すれば、なかなか良いかも、と思います。ただ、電話番号が変わってしまう(解約してしまう)ことの考慮を継続するのであれば、ちょっと難しそうです。電話番号を必須にして、電話番号変更プロセスを用意する、とかいろいろ変更すれば?(ちなみに、現状電話番号を変更する設定は無く、ログインし直すことによって登録電話番号が変更できるシステム)
PINコードの変更に現在のPINコードが不要だけどいいの?
あったほうがセキュリティ的に多少は強くなると思いますが、利便性が大きく損なわれることと(忘れたときのプロセス追加)、現在のPINコードを入力する画面がなくても、パスワードと現在のPINコードを知らないと到達できないところに設定画面があることと、端末を一時的に利用されたとしても、メールアドレスとパスワードを変更するのには、現在のパスワードの入力が必要になっている(このブログで取り上げて実装された)ので、ましかな、と。
つまり、現在のPINコードが不要で困るケースというか、現在のPINコードを入力を必須にして守られるケースは、「パスワードとメールアドレスが知られている状態(リモート可)で、さらに端末を一時的に操作されてしまうケース(リモート不可)」あたりで、リスクとしてはかなり小さいものと思われます。このあたり程度の問題だらけですが、まぁ、これはそれほど強く言うべき問題ではないかと。
パスワードが知られておらず、ただ単に一時的に操作される状況が発生したとしても、PINコードを変更されて、それに気が付かずに次回ログインするタイミングでログインできずに困る(ただし、現在のPINがいらないので、さらに上書きできれば挽回可能)だけで、パスワードが盗まれる(or 上書きされる)わけではないので、これ自体では乗っ取りにはなりません。
PINコードでぞろ目が設定禁止だったりしてるけど、逆に推測しやすくなるんじゃないの?
PINコード設定では、現在推測しやすいとされる番号が登録不可になっています。
現状のPINコードの回数制限無し縛りで考えるのであれば、設定できる番号の制限は、推測しやすくなる効果があり、乗っ取り効率を上げてしまいます。しかし、そんな縛りは不要で、ちゃんと厳しい回数制限を設けたとすれば、設定禁止は効果的な対策となります(例えば0000が登録可能なら、そこを狙い撃ちすると効率が上がってしまう)。つまり、推測されやすい番号を禁止にすることによって、推測しやすくなってしまうなんて状況がまずい、というわけです。
スポンサーリンク
2014年9月28日(日) 13:23
メールアドレスを登録していない場合から電話番号認証すればメアドパス不要でログインできちゃう気がします