1

コマンドを実行するためにシステムアプリでルート権限を取得できるかどうかを知りたいと思っています。

このコードでは:

getApplicationInfo().uid

ドキュメントでは、uidはこのアプリケーションに割り当てられたカーネル ユーザー ID であることがわかります。現在、これは一意の ID ではありません (複数のアプリケーションが同じ uid を持つことができます)。

しかし、これはどのように割り当てられますか?,

また、システム アプリに割り当てられた uid には、コマンドを実行するための通常のアプリよりも多くの権限がありますか?

4

2 に答える 2

5

実際には、アプリケーションのプロセスが uid=0 または root として実行されることはありません。これは、作成したコードが 1 行実行される前に通常のユーザー ID に不可逆的に変更されるためです。

人々が「ルート」アプリを作成するとき、アプリケーション プロセス自体をルートに戻すことはありません。これは単純に不可能です。代わりに、ルートとして実行される新しいヘルパー プロセスを実行しています。Java レベルの下では、setuid ビットが設定されたファイルで exec() ファミリ関数を呼び出すことによって、最終的にこれが行われます。このファイルは、ヘルパー プログラム自体である場合もあれば、より一般的には、指定されたヘルパー プログラムをルートとして実行するハッキングされた「su」などの「ルート シム」である場合もあります。このようなヘルパー プログラムはほとんどの場合ネイティブ コードであり、Android レベルの機能を利用できるように Android フレームワークに登録されていない可能性があります。

システムアプリケーションも root として実行されません。彼らが持っていて、サードパーティのアプリが持っていないのは、特別な Android レベルのアクセス許可です。これにより、root または他の特権ユーザー ID として実行されるプラットフォーム サービスが、代わりに特権的なものになりますいくつかの android パーミッションは、特別なアクセス権を持つユーザー グループのメンバーシップを付与することもできます。これらの一部は、サード パーティのアプリで使用できます (たとえば、インターネットのパーミッション) と、一部は使用できません。

于 2013-05-08T19:36:45.780 に答える
3

基本的に、(私は uid に関する Linux の説明全体を掘り下げているわけではありません。興味があれば簡単に見つけることができます)。Android の uid は 2 つのパラメーターで構成されます。

  • アプリケーションID
  • ユーザーID

式は次のとおりです。

uid = app_id+100,000 * user_id

app_id は基本的に、各アプリケーションに割り当てられる乱数 (完全にランダムではなく、デバイスごとに異なります) であり、JellyBean を実行しているタブレットで使用される user_id は、デバイス上のユーザーごとに割り当てられます (ユーザーには番号が割り当てられます)。ユーザー 0 、ユーザー 1、...ユーザー n を開始 - デバイスで定義されたすべての新しいユーザー)。

ここで説明されているように、アプリケーションは ID を共有できます: http://developer.android.com/guide/topics/manifest/manifest-element.html

もちろん、1 つのアプリが 2 人の異なるユーザーに対して同じ uid を持つことはできませんが、同じアプリが、同じユーザーが所有する別のアプリと同じ uid を持つことはできます。

実行されるシステム アプリは、他のユーザーがアクセスできないサービスに実際にアクセスできる唯一のアプリです。これらは、デバイスの /system の下にあります。システム アプリケーションを作成するには、Google から AOSP をダウンロードし、アプリを含めて自分でコンパイルする必要があります。

于 2013-05-08T15:53:43.783 に答える