今日は、Twitterでこんなのを見かけました。
[#Silhouette攻撃に関して 1/3]
— 内閣サイバー(注意・警戒情報) (@nisc_forecast) July 18, 2018
SNSでログイン状態のまま悪意のあるサイトを閲覧すると、アカウントが特定されるという脅威Silhouetteに関して報道されていますが、成立条件はブロック機能のある多数のSNSに同時にログインしていることなど、ややハードルは高いものとなっています。
要するに悪意あるサイトにアクセスしただけで、SNSのアカウントが特定されてしまう「かもしれない」ということです。かなり不安になりますが、結論から言うとTwitterなどは既に対策されているので心配しなくて大丈夫です。
とはいえ、不思議です。同じオリジンに属していない場合はSOPによってデータ取得を制限されているはずだから、そのブラウザでSNSにログインしていてもそのアカウント情報は取得できないはずです。どのようにしてアカウント特定が可能となったのでしょうか。
SOP(同一生成元ポリシー)
SOP自体については過去記事で解説しているのでこちらをご覧ください。http://blog.cosnomi.com/archives/716
Silhouette攻撃が成立するためには、ユーザーが同じブラウザでSNSにログイン済みであることが必要です。しかし、ログイン済みであっても、Twitterとその「悪意あるサイト」は異なるオリジンに属していますから、ログイン中のアカウントのデータを取得しようとしてもブラウザによって阻害されます。今回のSilhouette攻撃はSOPを回避しているわけではありません。つまり、SOPは正常に働いており、クロスオリジンで応答の中身を取得することは不可能です。
しかし、中身は得られなくても得られる情報はあります。応答の時間です。Twitterにアクセスを試みてから、「応答の中身は教えられません」とブラウザからスクリプトに通知されるまでの時間を計測することは可能です。とはいえ、応答時間からどのような情報が得られるというのでしょうか。
サイドチャネル攻撃
応答時間など、現実の世界の要素から情報を盗み出す攻撃をサイドチャネル攻撃といいます。少し前に話題となったSpectreやMeltdownといった脆弱性は、低レイヤーという点で違いがあるものの応答時間を利用しているわけですから、Silhouette攻撃と共通する部分があります。
では、応答時間から何が分かるのでしょうか。今回の場合は、**「ユーザーがある特定のアカウントをブロックされているか」**が得られます。ブロックされている場合とそうでない場合で応答時間に統計学的な差が生じるのです。
攻撃者はそのSNSで多数のアカウントを作成し、計画的にユーザーをブロックします。そして、悪意あるサイトに、そのユーザーが自分の作成したアカウントをブロックしているかを調べるスクリプトを埋め込みます。膨大な数のアカウントがあれば、ブロック/非ブロックの組み合わせから、そのユーザーのTwitterアカウントをある程度絞り込むことができます。
この攻撃への対処状況
各サービス、あるいはブラウザはこの攻撃にどのように対処しているのでしょうか。この脆弱性を発見した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属性を付与するべきでしょう
- 本来は取得できないはずの情報が応答時間から推測されることがないように、わざと応答を遅らせることも考えるべきかもしれません
参考文献
- http://www.ntt.co.jp/news2018/1807/180718a.html
- 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
最後までお読みいただきありがとうございました。