コンシューマキー流出?
朝のTLにTwitter公式クライアントのコンシューマキーなるものが流れてきたので,
なにか面白いことに使えないか
セキュリティ的に何か問題になるのか
考えてみました.
コンシューマキーとは
コンシューマキーとはクライアントの身分証眼書のようなものです. Twitterはコンシューマキーを使用してクライアントを識別します.
このコンシューマキーがどのように使われるのかを知るために, Twitterの認証方式であるOAuthについて簡単なスライドを描いてみました.
OAuthの認証は大きく分けて次の6ステップからなります.
- 認証開始
- Twitterの使用を開始するためにユーザはクライアントに認証の開始を指示します
- 鍵の使用申請書の要求
- 開始指示を受けたクライアントは,コンシューマキーを利用して身分証明を行います
- 証明できたクライアントに対してTwitterは鍵の使用申請書を渡します
- ユーザの使用許可をもらう
- クライアントはユーザに使用申請書を渡し使用許可を求めます
- 使用申請書はウェブページのアドレスの形で渡されるので,多くの場合ここで自動的にブラウザが立ち上がります
- Twitter認証
- ユーザはTwitterにパスワードを渡し,クライアントに使用許可することを伝えます
- ハンコを受け取る
- 使用許可の証としてPINコード(ハンコ)を受け取ります
- PINコードをクライアントに渡します
- 申請書を鍵を交換
- クライアントは使用申請書とTwitterに渡し,鍵をもらいます
- 次回以降,クライアントは鍵を利用してTwitterにアクセスすることができます
コンシューマキーが流出したということは, ステップ2のクライアントの身分証明の際に「自分は公式クライアントだ!」と名乗ることができてしまうという事です.
一般ユーザに対する影響
さて,これによる一般ユーザへの影響について考えてみましょう.
認証画面の偽装
ステップ4のTwitter認証の際,画面にはクライアント名が表示されます. 公式クライアントのコンシューマキーを使えばここに「Twitter for iPhone」「Twitter for Android」等, 公式クライアントの名前を表示することができてしまいます. これは間違えて認証してしまいそうですね!
・・・でも,ちょっと待ってください. ステップ4にたどり着くには,ユーザ自身が「ステップ1.認証開始」をする必要があります. これをするには,ユーザ自身がソフトをダウンロードして,解凍して,実行する必要があります. ** まともな ** な情報リテラシーを持ったユーザであれば,怪しいソフトは実行すらしませんよね?
偽装Webアプリ
Webサイトであれば,アクセスしただけで「ステップ1.認証開始」をしたことにするのは技術的に難しくありません. ステップ1をクリアしてしまえば,流出したクライアントキーを使ってステップ4まで進むことができてしまいます. この時表示されるクライアント名は公式クライアントのものなので,悪意のあるサイトなのか本物なのか見分けが付きません.
ここで間違えてパスワードを入力し,使用許可を出してしまったとしましょう. Twitterにはクライアントアプリ(自分のPCで実行するもの)と Webアプリ(ブラウザを使うもの)の2種類があり,この違いによってステップ5での動作が少し変わります.
公式クライアントアプリに偽装していた場合, ステップ5でPINコードが表示されます. ** まともな ** なTwitterユーザであればこの時点で気が付きますよね? 一般的なWebアプリではPINコードが表示されることはまずありません. WebアプリのくせにPINコードが表示されたら認証を中止しましょう.
Webアプリに偽装していた場合, PINコードに当たるものが自動的にWebアプリに送られます. この送り先はアプリの作者にしか指定することができないため, 悪意のあるサイトの手にわたることはありません.
一般ユーザに対する影響まとめ
コンシューマキーが漏れたからといって特別なことをする必要はありません.
- ** 怪しいアプリは実行しない **
- ** 怪しいサイトでTwitterの認証をしない **
という,当たり前のことさえ気をつけていれば大丈夫です. このことさえ注意していれば鍵が盗まれることはありません. なんか最近犯罪予告の冤罪事件も発生しているので気を付けないといけませんね.
心配であれば,公式Webクライアントを利用すれば安心ですし, Twitterヘルプセンタからリンクをたどれば, 確実に公式アプリにたどりつけるでしょう.
(・・・流出元の意図とは逆だけど・・・でもニセ公式アプリに騙されないためにはこれが一番だと思うんだ・・・)
もちろんサードパーティのクライアントにもいいものはたくさんあるので, Twitterクライアント - TwitterまとめWikiとかを参考にお好みなのを選んでみるといいでしょう. ただし,ご利用は ** 自己責任 **で.
開発者に対する影響
ハックした人のつぶやきによると,公式クライアントのAPI制限は通常より緩いらしいです.
え,ホント?
検証してみた
ご存知の通りTwitter APIには単位時間あたりのアクセス数の上限が決まっています. これを超えてAPIへアクセスすることはできません. application/rate_limit_status というAPIを使うとクライアントが実際に使えるAPI数を知ることができます. 公式クライアント「Twitter for Android」のコンシューマキーを使ってこのAPIを叩いてみました. 結果はこちら.
この結果を普通のアプリの制限と比較してみると
- application/rate_limit_status: 180→15
- friendships/lookup: 15→180
- friendships/show: 15→180
- search/tweets: 180→15
- statuses/home_timeline: 15→60
- users/lookup: 180→15
- users/search: 180→15
- いずれも単位は15分間あたりのリクエスト数
全部増えているわけではないようです. ホーム画面の読み込みとユーザ間の関係取得のAPIは増え,検索系のAPIの制限が厳しくなっています. Android端末ではそんな頻繁に検索はしないだろう,という判断なんですかね. ホーム画面の読み込みが多いのは,モバイル端末でユーザストリームを多用するのが難しいからでしょう. friendshipsは何に使ってるんですかね?
個人的な感想としては,確かに優遇はされているけどリスクを冒してまで使うようなものでは無いかな,と. 僕,そこまで廃人ではないので. 普通のクライアントではstatuses/home_timelineを使うと12000tweets/hしか取得できませんが, それを超えるようならおとなしくユーザストリーム対応のクライアントを使います. 更新ボタン押してたんじゃ間に合いません.
非推奨となった API v1 が350/hから1750/hとなるのも本当だった. クローラとか作りたいなら使えるかも? でもv1.1になって通常クライアントでもユーザタイムラインや検索系のAPIの使用が緩和されています. リクエスト回数はそれぞれ720/hとv1を使った場合より少し見劣りするけど, 怪しい方法使うよりはこっちのほうがいいと思う.
開発者に対する影響まとめ
リバースエンジニアリングとか他のアプリの認証情報を利用するとかは利用規約に抵触する可能性が高いので, やらないように. リスク相応の見返りがあるとは思えません. 普通のクライアントではAPI制限はほとんど問題にならないだろうし, 問題になるようならdev.twitter.comにあるように,APIの結果をキャッシュしたり,ストリーミングAPIを駆使しましょう.
まとめ
リテラシーのあるツイッターユーザのみなさまであればセキュリティ上の問題はほとんどありません. 開発者にとっては使えるAPIが増えるという利点はありますが,こんな怪しい手法に頼らず他の制限回避手法を試したほうが賢明です. それでも不十分なら頑張ってTwitter社を説得してください.
さて,今後Twitter社はどんな対応をするでしょうかね? 僕の勝手な予想では,現段階では何もしないのではないかと.
コンシューマキーを変えればとりあえずは解決しますが,流出はまた必ず起こります. クライアントアプリは自分のPCで実行する都合上 コンシューマキーを完全に隠すことは不可能です. 変えた所でまた誰か解析するでしょう. そのたびにコンシューマキーを変更すれば古いアプリが使えなくなりユーザが混乱します. ここで書いたように流出によるセキュリティ上の脅威はほとんどないので, そうまでしてコンシューマキーを切り替えるだけのメリットが無いと思うんです. 真偽は不明ですが,昔から流出してた,って話もありますしね.
もちろん,公式クライアントのコンシューマキーの使用はTwitter社にとって嬉しいことではないので, 今後乱用されれば何らかの対処をしてくる可能性はあるでしょう. 前述の通りコンシューマキーの使用を完全に防ぐことはできないので, 残る解決方法は公式クライアントのコンシューマキーを使うだけの利点をなくすことです. 全クライアントの規制緩和につながればいいですが,APIアクセス数過多に苦しむTwitter社はどうするでしょうか?
** 使うなよ,絶対だぞ!! **