Hello there, ('ω')ノ
💣 RCEとは?
RCE(Remote Code Execution)とは、 攻撃者がリモート(遠隔)からコードを送り込み、対象のアプリやシステム上で任意のコードを実行させる攻撃です。
RCEが成立すると、次のようなことが可能になります:
- 端末内のファイルを読み書き
- カメラやマイクを起動
- 他アプリへの攻撃中継(踏み台化)
- 任意のプログラムをダウンロードして実行
⚠️ RCEにありがちな原因
| 原因 | 説明 |
|---|---|
| 外部入力を直接コードとして実行 | eval() や exec() にユーザーの入力が使われている |
| スクリプト機能の誤用 | JavaScriptやWebViewの連携機能で外部コードが通ってしまう |
| デバッグ機能の残存 | 本番でも使える“隠し機能”が悪用される |
| 動的コード読み込み(DexClassLoader) | 外部からダウンロードした .dex ファイルをそのまま実行している |
🧪 RCEの診断ポイント
✅ 1. コードの中で Runtime.exec() や ScriptEngine を探す
MobSF や jadx を使って、以下のようなコードをチェック:
Runtime.getRuntime().exec(userInput);
ScriptEngine engine = new ScriptEngineManager().getEngineByName("rhino"); engine.eval(userInput);
→ ユーザー入力がコマンドやスクリプトとしてそのまま評価される場合、RCEのリスク大です。
✅ 2. WebView × JavaScriptインターフェースの誤用
webView.addJavascriptInterface(new JsBridge(), "Android");
この設定を使っていて、かつ setJavaScriptEnabled(true) になっていると、悪意あるHTMLからJavaのコードが実行される危険性があります。
✅ 3. 外部Dexファイルの読み込み
DexClassLoader dcl = new DexClassLoader(pathToDex, ..., null, classLoader); Class<?> clazz = dcl.loadClass("com.evil.Backdoor");
攻撃者が用意した .dex ファイルをダウンロードして実行できてしまう設計だと、まさにリモートコード実行が成立してしまいます。
🧪 実際に再現するには?
※以下は検証端末・自己所有アプリのみで実行してください。
✅ 再現例①:コマンド実行
String cmd = userInput; // "ls /data/data/"
Runtime.getRuntime().exec(cmd);
→ このようなコードに "cat /proc/version" などを入れると、システム情報の取得が可能になります。
✅ 再現例②:JavaScript経由でコード実行(WebView)
- HTMLファイルを用意:
<script> Android.run("Runtime.getRuntime().exec('ls')"); </script>
- WebViewで読み込むと、Android側で Javaコードが実行される可能性があります(設定による)。
🛡️ 対策方法
| 対策 | 内容 |
|---|---|
| 入力値の検証(バリデーション) | ユーザーからの入力を直接コードとして使わない |
| 動的コード評価の禁止 | eval() や exec() の使用は極力避ける |
| JavaScript連携の制限 | WebViewで addJavascriptInterface() を使う場合、対象や機能を最小限に |
| Dexファイル読み込みの制御 | ダウンロードしたファイルの署名確認やハッシュ検証を必ず行う |
| デバッグ機能の削除 | 開発用のバックドア・隠し機能は本番では必ず削除する |
🧠 実例:RCEによって起きた事故
- チャットアプリのデバッグメニュー経由で任意コマンドが実行され、全ユーザーの端末がマルウェア化
- JavaScriptと連携していたWebViewが、外部サイトから任意の処理を許してしまった
- 一時的なテスト目的で入れていた「eval」呼び出しが、コードインジェクションを許していた
✅ まとめ
- RCE(リモートコード実行)は、攻撃者が外部から任意のコードを実行できてしまう最も深刻な脆弱性
Runtime.exec()やeval()、WebViewの連携機能など、動的なコード評価機能が狙われる- 診断では、ユーザー入力と実行系APIがどこで繋がっているかを中心に調査
- 入力値の制御、評価機能の制限、実行ファイルの検証など、多層的な対策が必須!
Best regards, (^^ゞ