2013年12月18日水曜日

Androidの脆弱性を見つけちゃった話

JVN#53768697 Android OS において任意の Java のメソッドが実行される脆弱性 が公表されました。
不肖私が昨年9月にIPAに届け出たものです。
これまでは情報非開示依頼があったので多くを語ることができませんでした。
ヤバい内容なのでみんなに注意喚起したかったけれどそれができない苦しさ。
周りでICS端末を使ってる人を見かけたら「事情は言えないけどブラウザにはChromeを使って。標準ブラウザ使わないで」と言うくらいしかできなくて申し訳ありませんでしたm(_ _)m

当時のいきさつを日記から掘り起こして記録に残しておきたいと思います。

2012年9月15日(土)
WebViewを使ったビジネスアプリのフレームワークを作りたいという構想があって(PhoneGapにはないビジネス用の固有の機能を入れようと思って。バーコードリーダーとか印刷機能とか)、そういえば addJavascriptInterface()がキケンという話があったのでブログ記事等を参考に検証してみる。
その頃JCROMをいじっていたので念のためAndroidのソースコードを追いかけてみたら、なんと、WebView自体が内部的に addJavascriptInterface()と同じことをしているのを発見。え?あれ?
JellyBeanなGalaxyNexusで試してみたら、たしかにそこを入口として標準ブラウザ上でJavaScriptからContextにアクセスできちゃう。当時常用していたGingerbreadなGalaxyNoteでは発生しないのでHoneycombかから?ICSから?JellyBeanから?
KDDI標準ICSなXOOMでも発生する。
このときはまだContextにアクセスできることの致命的なヤバさに気付いていなくて、ブラウザからIntent飛ばして他アプリを起動したり android.os.Build やWi-Fi情報を取得できるくらいかなーと思っていたんだけど。
とは言え脆弱性だと思うので誰かに伝えないと。IPA? AOSP?
ひとまずAOSPに詳しくて信用のできる眼鏡の先生にDMで相談。
仮眠後に追加検証してみたら Runtime#load() とか呼び出せちゃうのでわりとクリティカルにヤバげな気がしてくる。
  1. こっそりSDカードに外部ライブラリ(Android用にビルドした .so)をダウンロード
  2. Runtime#load() を呼び出してその外部ライブラリをロード
  3. 外部ライブラリの JNI_OnLoad() で任意のネイティブコードが実行される
A山さんのアドバイスでIPAとAndroid Security Teamにメールで報告をすることに。PGPめんどくさいーと言いながらAppleMailのセットアップ(普段はGmailしか使ってないから)
13:57、IPAにソフトウエア製品脆弱性関連情報の届出だん。
16:04、Android Security Teamにもなんちゃって英語メールだん。
一通り今できることは終わった…



2012年9月18日(火)
日本時間9:50にAndroid Security Teamから
This does indeed appear to be a serious issue
というメールが届く。デスヨネー
11:21 にIPAから
取扱い対象かどうかを検討いたします
ていう定型メールが届く。IPAさんにお手紙するの初めてだったのでこんなもんなのかーって感想。もっと早く動いてくれるわけじゃないのね。



2012年9月21日(金)
最初の届出を出してから1週間。ようやくIPAから届出情報受理の連絡(19:18)
これでまぁ、あとはキャリアやGoogleとよろしく調整してくれることでしょう。



2012年9月22日(土)
週末を使って脆弱性検証の続きをしてみる。
ファイルのコピーができちゃうなー。com.android.browser のプライベートファイルをSDカードにコピーできるし、外部ライブラリからソケット通信でサーバに送ることもできちゃうなー。
それどころかJavaScriptからCookieや保存したパスワード情報とか取り出せるんちゃうか…!(標準ブラウザのソースを読むに、保存時に暗号化とかしてなさそうだった)
JavaScriptの検証コード書いて常用GalaxyNote(検証のためICSにバージョンアップ)でアクセスしてみたら、、
表示された。自分のユーザ名&パスワード。
これはトラウマになる衝撃だった。自分しか知らない、どこにも書き留めていないパスワードが平文で表示されるの。今でも思い出して想像しただけで息が苦しい><
(パスワード保存すんなって話はもっともで、PCのブラウザではパスワード保存していないけれど、モバイル端末はパスワード入力が大変でめんどくさくてつい…)
これは、つまり、あれだよ? このカラクリを仕込んだWebページにICSの標準ブラウザでアクセスすると、DBからユーザ名&パスワード情報やCookieを読み取られて、Ajaxでサーバに送信されてしまう可能性がある。
Cookieを設定すればGmailとか丸見え! ユーザ名&パスワードが保存されていれば勝手にログインしてなりすましできちゃう! /(^o^)\
あかん。これはあかん。
任意のネイティブコードが実行できると言ってもLinuxカーネルレベルのセキュリティはあって、別アプリの情報まで読み書きはできないので大丈夫… みたく思ってたけど、標準ブラウザだけで保存されたパスワードやCookieが読み取れるとなると話が違う。
例えばこんな感じ。
  1. 「ICS端末を使ってる人は注意!こんな情報が http://bit.ly/...」みたいなツイートをする
  2. 短縮URLのリンク先にあるJavaScriptでCookieやユーザ名&パスワードを取得してサーバにAjax送信
  3. その後(自動的に)本当の情報のあるページにリダイレクト
気付かないうちにCookieや(保存していれば)ユーザ名&パスワードが抜かれちゃう。
これからどんどんICS端末が増えていく = 脆弱性のある製品に機種変更する人が増えていく。一歩間違うと(誰かがセンセーショナルに話題にしたりすると)Android終了になりかねないのでは。マズいよう。恐いよう>< 自分が悪いわけじゃないのに「どうしよう、どうしよう…」て抱え込んでた時期。
検証コードと追加情報をIPAとAndroid Security Teamに報告。



2012年9月27日(木)
IPAから
2012年9月27日(起算日)に製品開発者との調整機関である JPCERT/CC から製品開発者へ連絡を開始
との連絡が。初報から12日も経ってるよう><



その後Android 4.2(Jelly Bean)で件の問題が修正されているのを確認したり、ときおりIPAに状況を問い合せたりしながら、結局1年以上かかって昨日(2013年12月17日)JVN公表に至りました。長かった…

この一件で得たもの。
  • トラウマ。Android OSいじるの怖くなっちゃった。昨夏はJCROMにいろいろ機能を入れて遊んでいたけれど「またAndroidのバグ見つけたらどうしよう」「自分が脆弱性を入れこんじゃったらどうしよう」という恐怖心を抱くように。
  • Androidこえー。オープンソースであんなにみんな見てるはずなのにICSがリリースされてから数ヶ月、件の問題を誰も見つけていなかったの…? そしてメーカーも機種も多様で、今もまだ対策されていない(バージョンアップできない)機種があるわけで、メーカー各社にはがんばっていただきたいです。(ソースが公開されていないiOSの方がもっと恐いのは言うまでもありません。iOSのクリティカルなバグはA社によってもみ消されているかもしれないし今もまだ放置されているかもしれないわけで)
  • 1年は長い。こんなクリティカルな脆弱性を1年以上も黙ってるのしんどいし、その間みんなキケンに晒されていたわけで。自分が知らない同様なキケンは今もあるのかもって思うとやっぱりコワい。
最初に書いた通り、標準ブラウザを使わなければとりあえず回避できる問題もあります(WebViewを使ったアプリで何かあるとしてもそれはアプリ側の問題)。
Android版Chromeを使えば回避できるはずです。
一人でも多くのICSユーザの方にこの問題を知っていただき、できるかぎり最新OSにバージョンアップして、標準ブラウザは使わずにChromeを使ってもらえるように願います。

こちらのまとめもご一読ください

2 件のコメント:

  1. はじめまして。
    ガジェット通信というウェブニュース媒体を運営しております編集部の寄稿チームと申します。

    Androidの脆弱性を見つけちゃった話
    http://tama-sand.blogspot.jp/2013/12/JVN53768697.html

    こちらの記事を弊社媒体に寄稿記事として掲載させていただきたくご連絡申し上げました。

    お手数かとは存じますが、詳細をお伝えしたく、ガジェット通信編集部(kiko at razil.jp)まで一度ご連絡いただければ幸いに存じます。

    何卒ご検討のほどよろしくお願い申し上げます。

    返信削除
  2. こんにちは。はじめまして。

    2012年7月に、私からも同じ問題をAOSPに報告しました。
    経緯は以下のような感じでした。

    2012/07/?? 問題を発見
     Chrome for Androidについて調べていて、たまたま発見。
    2012/07/27 私 -> AOSPに届ける
     Runtime.exec()するPoCを付けてreport。
    2012/07/27 AOSP -> 私(自動返信)
    2012/07/28 AOSP -> 私(ありがとう、調べるよ的ないつもの文章)
    2012/09/09 私 -> AOSPに状況問い合わせ
    2012/09/11 AOSP -> 私
     We're still looking into long-term fixes for the underlying problem, but
     we believe we've fixed the immediate issues you outlined below and will be
     rolling that fix out to partners soon.

    #もっと前に見つけていた人がいるのかもしれませんが。。。

    tamaさんも書いている通り、標準ブラウザではなくChromeを使った方がよい、
    というのは強く思います(この脆弱性の件に限った話ではなく)。

    返信削除