今更ながらaddJavascriptInterface使うなの話

もうaddJavascriptInterface使わないだろうと思ってても根強く生き残ってるので改めて。

[JavaScript] WebViewの脆弱性を利用するJavaScriptの例題 - Pastebin.com

基本的には上記を見れば「あー↑」ってなると思うものの、内容を把握せずに「対応したよ!」って回答もらって「あー↓」ってなることがあるので下に流れも書くなど。


01.addJavascriptInterfaceでJavaScriptからアプリの適当なオブジェクト、たとえばmyJSInterface(=new Object())にアクセスできるようにする。


A02.JavaScript内でmyJSInterface.getClass().getClassLoader().loadClass("android.webkit.JniUtil")でJniUtilクラスを取得する。
A03.リフレクションでJniUtilのクラス変数「sContext」を取得する。
A04.Contextに基づいた各種操作ができる(アプリ内でできる操作)。


B02.JavaScript内でmyJSInterface.getClass().getClassLoader().loadClass("java.lang.Runtime")でRuntimeクラスを取得する。
B03.リフレクションでRuntimeのクラスメソッド「getRuntime」を実行してRuntimeインスタンスを取得する。
B04.Runtimeインスタンスに基づいた各種操作ができる(アプリの実行者権限に基づくAndroid OS上での操作)。


↑のようにリフレクションで取得したクラスのクラス変数やクラスメソッドを基に色々できるので、実はaddJavascriptInterfaceにどんなオブジェクトを設定しても(クラスローダーから辿れるので)穴ができあがる。

addJavascriptInterfaceしたオブジェクトをそのまま残しつつそのオブジェクトのメソッドを呼ばないようにしただけで「対応したよ!」って言われても困るのですよ。