预装和特权保护级别之间的区别

6
API 23已将权限保护级别system更名为privileged。它还引入��一个preinstalled保护级别。 privileged是否意味着preinstalled?换句话说,如果应用程序可以访问privileged权限(即它是系统应用程序),即使那些权限没有列为privileged(仅列为preinstalled),它是否也可以访问preinstalled权限?
2个回答

2
答案似乎是肯定的,只要一个privileged应用程序是系统映像的一部分(即预安装)。包管理器将授予一个preinstalled权限给它内部所谓的系统应用程序,请参见grantSignaturePermission()
if (!allowed && (bp.protectionLevel
        & PermissionInfo.PROTECTION_FLAG_PREINSTALLED) != 0
        && isSystemApp(pkg)) {
    // Any pre-installed system app is allowed to get this permission.
    allowed = true;
}

在内部,系统应用实际上是一个预装的应用程序(重构仅限于公共API,而不是源代码),请参见ActivityInfo

/**
 * Value for {@link #flags}: if set, this application is installed in the
 * device's system image.
 */
public static final int FLAG_SYSTEM = 1<<0;

// Many lines not shown

public boolean isSystemApp() {
    return (flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}

2

应用程序可以预装但没有提升的系统权限(例如计算器)。这就是为什么存在这两个标志之间的区别,以及为什么system保护级别已被废弃为privileged


然而,作为系统映像的一部分,计算器应用程序可以被授予“预安装”保护级别权限:CHANGE_NETWORK_STATE,SYSTEM_ALERT_WINDOW和WRITE_SETTINGS(我还没有检查它是否实际请求其中任何一个)。我怀疑特权应用程序(在Marshmallow意义上,例如Google Play服务)也可以这样做,尽管这些权限在系统的清单中没有明确标记为“特权”。 - cuihtlauac
这个区别并不是很新,除了公共API的更改来表示它以及权限授予的处理。在KK时期,当系统启用完整SE时,平台区分系统和系统特权应用程序。在此之前,它是pkg签名的组合(必须使用“platform”密钥进行签名)和Linux UID(必须是“system”或1000)。现在它真正的组合是这些,并且将应用程序分为SE策略中的不同安全域。这里的“预安装”最大的区别在于用户不会被提示授予权限。 - Larry Schiefer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接