私は、JavaAndroidアプリケーションや独自のJNIでスーパーユーザー特権を取得するための可能な方法を調査しています。よく知られている答えは、そこから「su」サブシェルとコマンドラインコマンドを実行することしかできないということです。これは、きちんとしても実用的でもありません。私はこの決議を喜んで受け入れますが、それでもこの「もしも」のシナリオについての意見を聞きたいと思います。
java.com.android.server.am.ActivityManagerService
の近くのAndroidソースjava.android.os.Process
とdalvik_system_Zygote.cpp
ファイルを読むと、アプリケーションの起動中に、アプリケーションレコードのUIDと(リスト)GIDが調べられ、これらすべての値がソケットを介してZygoteに渡されるようです。その後、Zはデータを取得し、それ以上のチェックを行わずに、呼び出しsetuid()
の後でデータを渡します。fork()
したがって、Activity Managerの経路が変更された場合、Zygoteソケットに渡すだけで--setuid=0
、おそらく--setgid=0
Zygoteソケットに渡すだけで、ルートUIDを使用してアクティビティを実行できるようになります。
それはすべてほとんど単純すぎるように思えます、私は途中で何かがうまくいかないだろうと思います。残念ながら、私のような経験の浅いプログラマーが実際に行って試すには、コードや新しいものが多すぎます。誰かがこのように行ったことがありますか、またはこれが機能しない明らかな理由はありますか?