web-dev-qa-db-ja.com

Androidランタイムコードインジェクション

Androidアプリケーションでマルウェアを検出するのに役立つ静的分析ツールの調査を行っています。Androidでコードインジェクションを実行できるかどうか疑問に思っていますクラスローダーを使用せずに、Dexクラスローダーを使用して実行時にバイトコードをロードできることを知っていますが、クラスローダーを使用せずにこれを実行できるかどうか知りたいのですが、次のようなプロジェクトが見つかりました- https://github.com/miktam/Disabler 、AspectJのようなものを使用して、実行時にログとトレースを追加します。間違っている場合は修正してください。ただし、これはおそらくクラスローダーのどこかを使用していると思いますAspectJライブラリ。

すでにロードされているクラスの任意のバイトコードを使用して、実行時にメソッドを上書き/実装することにより、次に呼び出されたときに元のソース実装から悪意のある/宣言されていないアクションを実行できるように、もっと何かを考えています。これは可能ですか?もしそうなら、どうやってそうするのでしょうか?


更新:私の質問をもう少し明確にしようとしています。

ネイティブコードを直接呼び出したり、Runtime.execを使用したりする必要はありません。私はすでにこれらのJava= APIをツールで使用しています。私が考えていたものの大まかなコードのアイデアを教えてください。

public static void main(String[] args){
    hello(); // BENIGN
    evil("hello", getFile("com.blah.MyClass"));
    hello(); // MALWARE, or alternatively since it might not be loaded also BENIGN until next time application is run.
}

public static void hello(){System.out.println("Hi!");}

public static void evil(String methodName, File classFile){
    byte[] evilMethodImplementation = {0x...}; // some crafted byte code to replace the body of a method in a class file
    RandomAccessFile raf = new RandomAccessFile(classFile, "rw");
    raf.seek(findMethodBody(methodName, classFile)); // seek to the body contents of the method
    raf.write(evilMethodImplementation); // overwrite the current implementation with malicious implementation
    raf.close();
}

これは、私がそれが可能であるかどうかを確認するために検討していたことの単なるアイデアです。基本的に私はそれが私の検出を迂回するある種の乱雑なハックとして反射インターフェイスを使用せずに反射を行う可能性があるかどうか知りたいです。

13
Ben Holland

はい、絶対に、コードインジェクションを行う他の方法があります。たとえば、悪意のあるアプリはネイティブコードを直接実行でき、クラスローダーは必要ありません。

より一般的には、Androidセキュリティモデルでは、唯一のセキュリティ境界はプロセスレベルにあります(notJVMでは)したがって、Androidには、すでに制御しているプロセスへのコードインジェクションを防止します。Android docsの状態として、 ntrusted code cannot Dalvik VM内で安全に隔離される これは、Androidのセキュリティアーキテクチャの基本的な結果にすぎません。

(追加の例として、Runtime.getRuntime().exec()を呼び出してネイティブコードを実行したり、Java Security Managerを無効にしたり、setAccessible(., true)を呼び出したり- その後、プロセスを引き継ぐ 、Javaライブラリのいずれかの脆弱性を悪用する、または他のいくつかの方法のいずれかを使用する。)

(また、Javaでは、一部のセキュリティチェックはコンパイラによって実行され、JVMによって複製されません。そのため、悪意のあるバイトコードはこれらのチェックをバイパスできます。これらのチェックには、たとえば、内部クラスのアクセス制御、例外の安全性、最終フィールド、他にも同じことがDalvikにも当てはまるかどうかはわかりませんが、悪意のあるバイトコードがクラスライブラリを攻撃する可能性のある多くの詳細がここにあります。

13
D.W.