3

私は、JavaAndroidアプリケーションや独自のJNIでスーパーユーザー特権を取得するための可能な方法を調査しています。よく知られている答えは、そこから「su」サブシェルとコマンドラインコマンドを実行することしかできないということです。これは、きちんとしても実用的でもありません。私はこの決議を喜んで受け入れますが、それでもこの「もしも」のシナリオについての意見を聞きたいと思います。

java.com.android.server.am.ActivityManagerServiceの近くのAndroidソースjava.android.os.Processdalvik_system_Zygote.cppファイルを読むと、アプリケーションの起動中に、アプリケーションレコードのUIDと(リスト)GIDが調べられ、これらすべての値がソケットを介してZygoteに渡されるようです。その後、Zはデータを取得し、それ以上のチェックを行わずに、呼び出しsetuid()の後でデータを渡します。fork()したがって、Activity Managerの経路が変更された場合、Zygoteソケットに渡すだけで--setuid=0、おそらく--setgid=0Zygoteソケットに渡すだけで、ルートUIDを使用してアクティビティを実行できるようになります。

それはすべてほとんど単純すぎるように思えます、私は途中で何かがうまくいかないだろうと思います。残念ながら、私のような経験の浅いプログラマーが実際に行って試すには、コードや新しいものが多すぎます。誰かがこのように行ったことがありますか、またはこれが機能しない明らかな理由はありますか?

4

1 に答える 1

2

私は自分自身の質問に対する答えを見つけたと思います。クレジットは、エミュレーターの使用について私に指摘し、これがいかにばかげた状況になるかを指摘した @Chris Stratton に送られます。

キーは、Zygote ソケットを介したコマンドの送信と Zygote バイナリ自体の間の、私が見ていなかった 1 つの場所にありました。チェックが行われるポイントはcom.android.internal.os.ZygoteConnection、メソッドapplyUidSecurityPolicyです。呼び出し元プロセスがルートに属している場合、スポーンの UID は実際にゼロ (またはそれ以外) であることが要求される場合があります。通常のユーザーもソケットを使用できますが、新しい UID または GID を要求すると、ZygoteSecurityException.

于 2012-07-19T21:56:48.897 に答える