「MMS経由でAndroid端末が乗っ取られる」という話題について
大変に恐ろしげな Android の脆弱性が発表され、話題となっております。
大本は、Zimperium という iOS/Android 向けのセキュリティソリューションを提供している会社が書いた以下のエントリです。
ブコメでは「やべー」「こえー」「やっぱ Android ダメだ」「だから Nexus にしろと」などのコメントが飛び交っておりますが、どうも技術的に大事な部分をあまりみなさん理解しないで、センセーショナルな書きぶりに踊らされてビビっている感じがします。
脆弱性がらみの問題に関しては、ソフトウェアにバグは絶対に付き物ですから (軽々しく「絶対に」という言葉を使うのは好きではありませんが、ここは自信を持って絶対にと言えますw)、脆弱性があった、発見されたということそのものより、
が大事だと思いますので、一つずつ確認していきましょう。
どのくらいの範囲に影響を及ぼすのか
Android OS では、"Stagefright" と呼ばれるメディア再生エンジンを採用しています。
今回見つかった脆弱性はこの Stagefright の NDK で実装された部分の、メモリ周りのバグにあると発表されています。メモリ周りということなので、典型的なバッファーオーバーフローを利用した任意コードの実行かと思われます。
Zimperium の発表では Starfright が採用されたAndroid 2.2 以降のバージョンがこの脆弱性の影響を受けるとのことです。また特に 2.2 ~ 4.0 (ICS) のものは、不十分な脆弱性対策のために、より危険だとしています。これは Starfright の脆弱性そのものが 2.2~4.0ではさらに危険という意味ではなく、OSバージョンアップに伴って採用されている各種脆弱性対策 (アドレス空間配置のランダム化とかカーネルアドレスの漏洩を避ける機能とか) が入っていないため、という意味だと思われます。
最新版の Lollipop 5.1.1 にもまだ本件に対する更新は入っていないため、2.2~5.1.1 が対象ということになりますが、今現在さすがに 2.1 Eclair の端末を現役で使っている人もいないと思いますので、ざっくり、Android 端末全てが影響を受けると言ってもよいのではないかと思います。
どのような被害が予想されるのか
次に、予想される被害ですけれど、今回は Starfright でのバッファオーバーラン攻撃と思われますが詳細は不明、でも Google は今回の脆弱性の重要度を「高」としていますので、一般にインストール可能なサードパーティーアプリと同様の、非特権レベルでの任意のコードが実行可能です。
Security updates and resources | Android Open Source Project
要するに「通常アプリの範囲で出来ること」が実行可能と思えばよいと思います。
悪意を持ったマルウェアの類がやりそうなことと言ったら、以下のような内容でしょうか。
- 連絡先や端末の電話番号、発着信履歴を読み取り、どこかのサーバへ送信する
- クリップボードを監視し、以下同
- SD カード内のアクセス可能なデータ (写真など) を読み出し、以下同
- マイクを監視し、周囲の音を盗聴して以下同
- 現在位置を取得し、以下同
- SMS を送信する
一方、Android では「他のアプリ」のデータにはサンドボックスによりアクセスできないため (これは NDK を使っている場合でも同じです)、例えば以下のようなことはできません。
- バックグラウンドでキー入力を読み取ってどこかに送信する (キーロガー)
- バンキングアプリのデータを読み取って口座情報や残高情報を取得する
- ブラウザのデータを読み取ってクレジットカード情報等を盗む
Android では、「危険レベル」のアプリ権限でも、毎実行時に例えば「連絡帳へのアクセスを許可しますか?」みたいに問い合わせる仕様になっていないので、一度攻撃が発動してしまえば、電話番号やら位置情報やらのいわゆる個人情報が気づかないうちにわりとフルコースで盗まれる可能性はなくはない、といったところでしょうか。(どういう権限がついた状態でコードが実行されるか分からないので、何とも言えないですが)
どうすれば脆弱性を回避できるのか
今回の脆弱性は根本的には Starfright のメモリ周りのバグなので、どのような手段であれ、「バッファオーバーランするよう細工をしたメディアデータを Starfright に食わせる」ことが出来れば発動させることが可能と思われます。
記事にあるように MMS 経由でというのはそのうち一つの方法でしかなく、MMS であれば電話番号を宛先として送ることもできるので、「電話番号知ってるだけで Android 端末乗っ取りイェーイ!」というセンセーショナルな見出しのために例に挙げられたまでかと思います。
MMS 経由の場合、Android で標準的に SMS/MMS クライアントとしてインストールされている Hangout であれば、MMS を受信した段階で自動的にメディアファイルを処理する (恐らく、MMS を表示する際の動画のプレビュー用サムネイルを生成するため?) ために「MMS に動画を添付して送りつける」だけで脆弱性を突かれてしまうという合わせ技となります。
MMS クライアントがそのような処理をせず、添付された動画ファイルなりをユーザが開くまでは Starfright が呼ばれないなら、少なくともそのタイミングまでは攻撃はされないと思います。んで、できればその間に「知らん奴からのMMSや」ということで開かずに削除したり、アンチマルウェアソフトとかでその exploit が含まれたデータを検疫できればなお良い。
ということで、対処の一つには、MMS を受信しない設定にする、あるいはMMS を利用するのであれば MMS クライアントを Hangout ではなく他のものに変えてみる、という手は有効かもしれませんが、あくまで MMS クライアントの挙動次第です。(※そもそも MMS が受信可能なのかどうかという話がありますがそれは後述)
当然、MMS 以外でも、例えば Gmail などでも、細工されたメディアファイルを添付し、それを開いたら Starfright で処理されるのであれば、当然攻撃を受けることになると思いますし、細工した動画の URL をどっかに書き込んで、閲覧した人がその URL を踏んで Starfright に処理が渡ったらアウト、というシナリオも考えられます。(この場合は当然、攻撃者はターゲットのメールアドレスを知っている必要があるので電話番号よりは難易度が上がるし、URL で誘導する場合には「ユーザが一切気づかないうちに」とはいかなくなります)
Starfright を利用するアプリが何であるかはすぐにはリストアップできないので、正直、有効な回避策はコレ!と言うのはなかなか難しいところです。
もちろん根本的には Starfright に対する修正パッチを適用する、というのが回避方法であるのは言うまでもありません。(それができないから皆困ってるんだけども)
最もお手軽な攻撃の起点とされる MMS について
べつだん MMS が原因なわけではないことは先に述べましたが、電話番号さえ知ってれば一方的に送れて、かつ Hangout ユーザであれば相手の知らないうちに攻撃を発動させられるもっともお手軽な方法として MMS が有効なので、可能であれば MMS の受信自体を防いでしまいたいところです。
ただ、ワールドワイドでは SMS/MMS の利用が一般的で、スマートフォン時代になった今でも E-Mail やメッセンジャーではなく MMS の利用も一定あるのかなと思いますが、こと国内に置いては、そもそも MMS ははっきり言って全く普及していません。
まず、ドコモは一切 MMS サーバを提供していませんので、ドコモの電話番号宛てに MMS を送ることはできません。
au は iPhone 向けにだけ MMS サービスを提供していて、Android 向けには提供していません。一般に MMS サーバの設定はアクセスポイントの設定に付随して設定されるので、au で iPhone を契約し、その AP 情報から MMS サーバの情報を拾って Android 端末でも設定すれば使えるかもしれませんが、あまりに一般的でないのでここでは例外とします。
ソフトバンクはキャリアメールとして MMS を採用しているので、Android ユーザでも MMS が受信可能になっています。
また、ワイモバイルも MMS サービスを提供しています。
MMS|メール|通信|サービス|Y!mobile(ワイモバイル)
MVNO については、UQ mobile が珍しく MMS サービスを提供しているようですが、その他の MVNO では聞いたことがありません。僕は IIJ mio と mineo を利用していますが、どちらも MMS サービスは提供しておらず、また試してみたところ実際に送受信もできませんでした。
オプションサービス設定方法(メールサービス) | 各種設定方法について | ご利用ガイド、製品サポート | サポート・FAQ | 格安スマホ・格安SIMのUQ mobile
ということで、「MMS 経由で今回の脆弱性を攻撃される」可能性があるのは、現時点ではソフトバンクモバイルの Android ユーザと、Y!mobile の Android ユーザだけということになりそうです。
(ただし Y!mobile の Nexus5/6 にはたぶん近いうち修正パッチが来るんじゃないかなと思います)
ここからは筆者の感覚的な物言いですが、ソフトバンクユーザは iPhone チョイス率がとても高いと思いますので、Android ユーザどんだけいるのかなと思います。(2014/2 時点のリサーチ結果ですが、ソフトバンク内でのシェアは、iPhone 74%、それ以外 26% のようです)
また、Y!mobile でも Aquos や DIGNO 等の Android 端末が販売されていますが、これも感覚的には、わざわざ Y!mobile をチョイスする人は、Nexus 端末使いたくてチョイスしてる気がすごくしますので、これもソースがなくて申し訳ありませんが、Y!mobile でかつ Nexus 以外の端末使ってる人は、ほぼいないんじゃないかと思います。もしこの記事を読んでいる方で該当の方がいましたらマジごめんなさい。(ちなみに先ほどのリサーチですと、docomo/au/softbank 以外のキャリアでのスマートフォン利用者は、2% となっています)
ということで、大本の記事では、「95%の Android 端末がこの脆弱性の影響を受ける!」とセンセーショナルに書いてありますけれど、同様に数字のマジックを使ってセンセーショナルに書けば、「だが日本ではMMSを受信可能なAndroidはスマートフォンユーザ全体のわずか8%である!」とも書けます。(とても恣意的!)
母数を各キャリアの Android ユーザだけに絞っても、13%という計算になります。
現時点でこの脆弱性を利用した実際の攻撃は観測されていないみたいなので、なかなかに影響も被害もデカいセキュリティーホールだなあとは思いますが、実際に被害をこうむる人は国内に限っては意外と少なかったりするのではないかなー、とかのんきに考えています。
ただ、こういう深刻な脆弱性が発見されたときに、アップルが直接 OS のアップデートをエンドユーザに配る iOS と違って、Android の場合 Google はパッチは出すけどそれを採用した OS アップデートを配るのは各キャリアやベンダという構造になっていますから、各キャリアやベンダがさっさとアップデートを配るなら問題ないんですけど、現実には「キャリアやベンダのカスタマイズ部分の都合」で大幅にリリースが遅れたりリリースされなかったりするので、キビシーです。
最近 webview がOSの組み込みコンポーネントでなくアプリ扱いになって、Google Play 経由で更新できるようになりましたけど、その他の重要なコンポーネントについても、OS のバージョンアップではなく Google Play 経由で更新できるようにどんどん切り出していくと良いんじゃないのかなあと思います。(たぶんもうやってるんだろうけど)
ダラダラ書いてたらスゲー長くなったけど推敲するのがめんどうなのでこのまま公開します。間違い等の指摘ありましたらどんどんお願いします。どっとはらい。
追記 (2015/07/31)
JVN の記事によれば、Stagefright エンジンのバグは整数オーバーフロー/アンダーフローだったようです。
JVNVU#92141772: Android Stagefright に複数の脆弱性
当座のワークアラウンドとしてはやはり、使っている MMS クライアントで
- MMS の受信を、信用できる相手 (=連絡先に登録されている相手) だけのみにするオプションをオンにする。
- 添付ファイル (マルチメディアファイル) の自動取得オプションをオフにする
といったあたりが挙げられています。もちろん、MMS を利用できない/受信していない場合は関係ありません。
今の所、実際にこの exploit が出回っているという話は耳に入ってないのですが (といってもそんなに調べているわけでもないんですが)、しばらくは MMS に限らずメールの添付ファイル等も用心した方が良さそうです。
また、可能性としては "Web で細工されたビデオのリンクを踏んで攻撃に会う" というシナリオも考えられます。Android 版 Firefox は HTML5 のビデオ再生に Stagefright を使っているのですが、バージョン 38 でこの問題を既に潰しているようなので、用心のためブラウザは Firefox 38 以降を使うようにするのも良いと思います。
Buffer overflow and out-of-bounds read while parsing MP4 video metadata — Mozilla
Firefox for Android - Google Play の Android アプリ
(※バージョン38以降が利用可能かは、使っている端末次第です)