1. ホーム
  2. android

Androidにおけるシステムアプリと特権アプリの違いは何ですか?

2023-09-25 18:13:42

質問

4.3 では、システム アプリケーションという概念がありました。APK は /system/app に配置された APK にはシステム特権が与えられていました。4.4では、新しい概念として、"特権アプリ"が存在します。特権アプリは /system/priv-app ディレクトリに格納され、異なる方法で扱われるようです。AOSPのソースコードを見てみると PackageManagerService の下に、次のような新しいメソッドがあるのがわかるでしょう。

static boolean locationIsPrivileged(File path) {
    try {
        final String privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app")
                .getCanonicalPath();
        return path.getCanonicalPath().startsWith(privilegedAppDir);
    } catch (IOException e) {
        Slog.e(TAG, "Unable to access code path " + path);
    }
    return false;
}

では、これらが異なる場合の例です。

public final void addActivity(PackageParser.Activity a, String type) {
...
if (!systemApp && intent.getPriority() > 0 && "activity".equals(type)) {
                intent.setPriority(0);
                Log.w(TAG, "Package " + a.info.applicationInfo.packageName + " has activity "
                        + a.className + " with priority > 0, forcing to 0");
            }
...

これは、システムアプリケーションとして定義されていないすべてのアクティビティの優先度に影響します。これは、システム アプリケーションでない限り、優先順位が 0 よりも高いアクティビティをパッケージ マネージャーに追加できないことを意味しているようです。これは ではなく は特権アプリを除外します (ここには多くの論理があり、私は間違っているかもしれません。)。

私の質問は、これは正確に何を意味するのでしょうか。私のアプリが特権的であっても、システムではない場合、どのような違いがあるのでしょうか? では PackageManagerService には、システム アプリと特権アプリの違いを示すさまざまなものがありますが、それらはまったく同じものではありません。特権アプリの背後には何らかの思想があるはずで、そうでなければただ言っただけでしょう。

if locationIsPrivileged: app.flags |= FLAG_SYSTEM

とされています。これは新しい概念で、4.4の時点でAOSP開発をしている人は、この種のアプリの違いを知っておくことが重要だろうと思うのです。

どのように解決するのか?

いくつかの調査の結果、priv-app にあるアプリはシステム アクセス許可を得る資格があり、古いアプリが system-app にあることでシステム アクセス許可を主張する資格があったのと同じであることが明らかになりました。この件に関する Google の公式文書は、コミットメッセージの形でしか見つかりませんでした。 コミット ハッシュ: ccbf84f44c9e6a5ed3c08673614826bb237afc54

あるシステム アプリは他のシステム アプリより

signatureOrSystem" 権限は、/system パーティションに存在するすべてのアプリで使用できなくなりました。 権限は、もはや /system パーティションに存在するすべてのアプリにはありません。 その代わりに、新しい その代わりに、/system/priv-app ディレクトリが新たに作成され、そのディレクトリに APK があるアプリのみが signatureOrSystem の使用を許可されます。 ディレクトリにある APK を持つアプリのみが、プラットフォーム証明書を共有せずに signatureOrSystem パーミッションの使用を許可されます。 プラットフォーム証明書を共有することなく、signatureOrSystem パーミッションの使用が許可されます。これにより、システムバンドルが悪用される可能性があるアプリの表面積が これにより、システムにバンドルされたアプリケーションを悪用して、パーミッションで保護された操作にアクセスしようとする可能性のある表面領域を減らすことができます。 これにより、システムにバンドルされたアプリケーションが、パーミッションで保護された操作にアクセスするために悪用される可能性がある表面を減らすことができます。

ApplicationInfo.FLAG_SYSTEM フラグは、ドキュメントに書かれているとおりの意味を持ち続けています。 アプリケーション apk が /system パーティにバンドルされたことを示します。 アプリケーション apk が /system パーティションにバンドルされていることを示します。 新しい隠しフラグFLAG_PRIVILEGEDが導入されました。 これらのパーミッションにアクセスする実際の権利を反映する、新しい隠しフラグ FLAG_PRIVILEGED が導入されました。 パーミッションにアクセスする実際の権利を反映する新しい隠しフラグが導入されました。

更新: Android 8.0 の priv-app は、Privileged Permission Whitelisting が追加され、若干変更されました。priv-app に入っているだけでなく、さまざまなシステム権限を得るために、アプリをホワイトリストに追加する必要があります。これに関する情報は、こちらを参照してください。 https://source.android.com/devices/tech/config/perms-whitelist