2016-10-14 8 views
1

最近、私はCVE-2014-7911に関するいくつかの記事を読んで、PoCオブジェクトの逆シリアル化された値を持つBinderProxyクラスのインスタンスを作成し、system_serverに送信します。 GCがそれを扱うとき、PoCはシステム権限で呼び出されます(system_serverが持つ権限)Android GCで使用できるアクセス

しかし、通常のSerializableクラスをsystem_serverに送信しようとすると、PoCと同じ方法を使用します。システム権限を必要とするfinalize()メソッドは実行されません。

質問:なぜ私のコードはGCであるときにシステム権限を取得できませんでしたか?

これは私のJavaコードです:

public class Seria implements Serializable { 
    private static final long serialVersionUID = 0; 

    static { 
     System.loadLibrary("gc-permission"); 
    } 

    @Override 
    protected void finalize() throws Throwable { 
     destroy(); 
    } 

    private native void destroy(); 
} 

そして、私のCコード:

#include <jni.h> 
#include <stdlib.h> 

JNIEXPORT void JNICALL 
Java_android_study_gcpremission_Seria_destroy(JNIEnv *env, jobject instance) { 

    // TODO 
    int a = -1; 
    a = system("echo 'a' > /sdcard/test/b.txt"); // normal premission 
    a = system("echo 'a' > /data/b.txt"); // need system permission 
    a = system("chmod 777 /data/b.txt"); // need system permission 
} 
+1

ガベージコレクションの際にあなたのコード*がシステム権限を取得すると思われるのはなぜですか? – immibis

+0

まあ、それほど感謝していません。Android GCについての記事を読んでいます。 –

答えて

0

ないのはなぜコードのgetシステム権限であることができGC?

クラスがsystem-serverに存在しないため、system-serverがクラスを逆直列化するとClassNotFoundExceptionがスローされ、何も起こりません。この悪用は、system-serverにすでに存在するクラスの使用に依存します。

+0

@KailNethunterまた、JNIを使​​用する必要はありません。あなたはあなたが望むクラスをシステムサーバーに送るだけで、システム権限で動作する 'readObject'メソッドを使ってクラスを書くことができます。 – immibis

関連する問題