Cosnomi
Cosnomi

医療×IT / 医学生 / Web(React, Flask) / 機械学習(画像認識, Keras)

Twitter / GitHub / Keybase

アクセスしただけでSNSのアカウント特定されるかもしれない「Silhouette攻撃」

今日は、Twitter でこんなのを見かけました。

要するに悪意あるサイトにアクセスしただけで、SNS のアカウントが特定されてしまう「かもしれない」ということですね。かなり不安になりますが、結論から言うとTwitterなどは既に対策されているので心配しなくて大丈夫です

とはいえ、不思議です。同じオリジンに属していない場合は SOP によってデータ取得を制限されているはずだから、そのブラウザで SNS にログインしていてもそのアカウント情報は取得できないはずです。今回の攻撃では確かにそこは破られていません。では、どのようにしてアカウント特定に至るのでしょうか。

SOP(同一生成元ポリシー)

SOP 自体については過去記事で解説しているのでこちらをご覧ください。http://blog.cosnomi.com/archives/716

Silhouette攻撃が成立するためには、ユーザーが同じブラウザで SNS にログイン済みであることが必要です。しかし、ログイン済みであっても、Twitter とその「悪意あるサイト」は異なるオリジンに属していますから、ログイン中のアカウントのデータを取得しようとしてもブラウザによって阻害されます。今回の Silhouette 攻撃はSOP を回避しているわけではありません。つまり、SOP は正常に働いており、クロスオリジンで応答の中身を取得することは不可能です。そう、応答の中身は。

中身は得られなくても得られる情報はあります。応答の時間です。Twitter にアクセスを試みてから、「応答の中身は教えられません」とブラウザからスクリプトに通知されるまでの時間を計測することは可能です。しかし、応答時間からどのような情報が得られるというのでしょうか。

サイドチャネル攻撃

応答時間など、現実の世界の要素から情報を盗み出す攻撃をサイドチャネル攻撃といいます。少し前に話題になったSpectre や Meltdownといった攻撃は、低レイヤーという点で違いがあるものの応答時間を利用しているわけですから、サイドチャネル攻撃という点でSilhouette攻撃と共通する部分があります。

では、応答時間から何が分かるのでしょうか。今回の場合は、「ユーザーがある特定のアカウントをブロックされているか否か」が得られます。ブロックされている場合とそうでない場合で応答時間に統計学的な差が生じるのです。

攻撃者はその SNSで多数のアカウントを作成し、計画的にユーザーをブロックします。そして、悪意あるサイトに、そのユーザーが自分の作成したアカウントをブロックしているかを調べるスクリプトを埋め込めば、ブロック/非ブロックの組み合わせから、そのユーザーの Twitter アカウントをある程度絞り込むことができますし、攻撃者が十分な数のアカウントを所持していれば、1 つに絞り込むことも可能でしょう。膨大な数のアカウントが必要になりそうですが…。

この攻撃への対処状況

各サービス、あるいはブラウザはこの攻撃にどのように対処しているのでしょうか。この脆弱性を発見した NTT のサイトでは次のように述べられています。

また、NTT は影響を受けるサービス事業者やブラウザベンダに対し、被害が発生する前に事前の情報共有を行うとともに、Twitter などの実際のウェブサービスや Microsoft Edge、Internet Explorer、Mozilla Firefox といったウェブブラウザの対策実施に対し評価手法を用いて協力することで、本脅威による第三者からのアカウント名特定は不可能となり、より安全に利用者の皆様がご利用いただけるようになりました。

(引用: 参考文献[1]より)

つまり、主要なブラウザを利用している場合、または、主要な SNS に対する攻撃の場合は、既に対処がされており、心配する必要はないということです。後述しますが、ここに Chrome がないのは、Chrome では既にこの対策がされていたからです。

SNS 側がどのように対処したかは「仕様変更」と書いてあるだけで、詳しくは述べられていませんが、ブラウザ側の対応としては Cookie の SameSite 属性の追加とあります。

SameSite 属性

SameSite 属性は Cookie が持つ属性で、この属性を持つ Cookie はクロスオリジンなリクエストに付与されなくなります。つまり、Twitter などの発行する Cookie にこの SameSite 属性が付加されていた場合、攻撃の成立要件の 1 つである「同じブラウザでログイン中である」という要件が実質満たされなくなるわけですね。なぜなら、Cookie が送信されないということは、Twitter にアクセスしても未ログイン状態と同じ挙動をするため、ブロックされているかの情報を取得することが出来ないからです。

実はこの属性、Chrome などの chromium 系ブラウザには前から実装されていたらしく、今回は他のブラウザもこれを実装することで、ほぼ Silhouette 攻撃を無効化することができたというわけですね。

私達(ユーザー)はどうすればいい?

対策済みなので、特にするべきことはありません。あなたが古代のブラウザを使っている場合を除いて。

開発者はどうするべき?

  • できる限り、Cookie には SameSite 属性を付与するべきでしょう。
  • 本来は取得できないはずの情報が応答時間から推測されることがないように、わざと応答を遅らせることも考えるべきかもしれません。

参考文献

  1. http://www.ntt.co.jp/news2018/1807/180718a.html
  2. http://iot-jp.com/iotsummary/iottech/%E3%82%B5%E3%82%A4%E3%83%89%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E6%94%BB%E6%92%83%EF%BC%88side-channel-attack%EF%BC%89/.html

最後までお読みいただきありがとうございました。


コメントフォームは設置していませんので、ご意見・ご感想などはTwitter(@cosnomi)などへお願いします。