Ignore vendor apex priv-app permission allowlists
Apexes contain the allowlists for privileged permissions used by their respective apk's, however vendor (partner) apexes should be forbidden from using this mechanism. Test: atest FrameworksServicesTests:SystemConfigTest Bug: 190375768 Change-Id: I34bf2a80fb66f2b2a732234111a338e3af1e919b
This commit is contained in:
@@ -663,6 +663,7 @@ public class SystemConfig {
|
||||
readPermissions(parser, Environment.buildPath(f, "etc", "permissions"),
|
||||
apexPermissionFlag);
|
||||
}
|
||||
pruneVendorApexPrivappAllowlists();
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
@@ -1526,6 +1527,21 @@ public class SystemConfig {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prunes out any privileged permission allowlists bundled in vendor apexes.
|
||||
*/
|
||||
@VisibleForTesting
|
||||
public void pruneVendorApexPrivappAllowlists() {
|
||||
for (String moduleName: mAllowedVendorApexes.keySet()) {
|
||||
if (mApexPrivAppPermissions.containsKey(moduleName)
|
||||
|| mApexPrivAppDenyPermissions.containsKey(moduleName)) {
|
||||
Slog.w(TAG, moduleName + " is a vendor apex, ignore its priv-app allowlist");
|
||||
mApexPrivAppPermissions.remove(moduleName);
|
||||
mApexPrivAppDenyPermissions.remove(moduleName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void readInstallInUserType(XmlPullParser parser,
|
||||
Map<String, Set<String>> doInstallMap,
|
||||
Map<String, Set<String>> nonInstallMap)
|
||||
|
||||
@@ -360,6 +360,67 @@ public class SystemConfigTest {
|
||||
.containsExactly("android.permission.BAR");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void pruneVendorApexPrivappAllowlists_removeVendor()
|
||||
throws Exception {
|
||||
File apexDir = createTempSubfolder("apex");
|
||||
|
||||
// Read non-vendor apex permission allowlists
|
||||
final String allowlistNonVendorContents =
|
||||
"<privapp-permissions package=\"com.android.apk_in_non_vendor_apex\">"
|
||||
+ "<permission name=\"android.permission.FOO\"/>"
|
||||
+ "<deny-permission name=\"android.permission.BAR\"/>"
|
||||
+ "</privapp-permissions>";
|
||||
File nonVendorPermDir =
|
||||
createTempSubfolder("apex/com.android.non_vendor/etc/permissions");
|
||||
File nonVendorPermissionFile =
|
||||
createTempFile(nonVendorPermDir, "permissions.xml", allowlistNonVendorContents);
|
||||
XmlPullParser nonVendorParser = readXmlUntilStartTag(nonVendorPermissionFile);
|
||||
mSysConfig.readApexPrivAppPermissions(nonVendorParser, nonVendorPermissionFile,
|
||||
apexDir.toPath());
|
||||
|
||||
// Read vendor apex permission allowlists
|
||||
final String allowlistVendorContents =
|
||||
"<privapp-permissions package=\"com.android.apk_in_vendor_apex\">"
|
||||
+ "<permission name=\"android.permission.BAZ\"/>"
|
||||
+ "<deny-permission name=\"android.permission.BAT\"/>"
|
||||
+ "</privapp-permissions>";
|
||||
File vendorPermissionFile =
|
||||
createTempFile(createTempSubfolder("apex/com.android.vendor/etc/permissions"),
|
||||
"permissions.xml", allowlistNonVendorContents);
|
||||
XmlPullParser vendorParser = readXmlUntilStartTag(vendorPermissionFile);
|
||||
mSysConfig.readApexPrivAppPermissions(vendorParser, vendorPermissionFile,
|
||||
apexDir.toPath());
|
||||
|
||||
// Read allowed vendor apex list
|
||||
final String allowedVendorContents =
|
||||
"<config>\n"
|
||||
+ " <allowed-vendor-apex package=\"com.android.vendor\" "
|
||||
+ "installerPackage=\"com.installer\" />\n"
|
||||
+ "</config>";
|
||||
final File allowedVendorFolder = createTempSubfolder("folder");
|
||||
createTempFile(allowedVendorFolder, "vendor-apex-allowlist.xml", allowedVendorContents);
|
||||
readPermissions(allowedVendorFolder, /* Grant all permission flags */ ~0);
|
||||
|
||||
// Finally, prune non-vendor allowlists.
|
||||
// There is no guarantee in which order the above reads will be done, however pruning
|
||||
// will always happen last.
|
||||
mSysConfig.pruneVendorApexPrivappAllowlists();
|
||||
|
||||
assertThat(mSysConfig.getApexPrivAppPermissions("com.android.non_vendor",
|
||||
"com.android.apk_in_non_vendor_apex"))
|
||||
.containsExactly("android.permission.FOO");
|
||||
assertThat(mSysConfig.getApexPrivAppDenyPermissions("com.android.non_vendor",
|
||||
"com.android.apk_in_non_vendor_apex"))
|
||||
.containsExactly("android.permission.BAR");
|
||||
assertThat(mSysConfig.getApexPrivAppPermissions("com.android.vendor",
|
||||
"com.android.apk_in_vendor_apex"))
|
||||
.isNull();
|
||||
assertThat(mSysConfig.getApexPrivAppDenyPermissions("com.android.vendor",
|
||||
"com.android.apk_in_vendor_apex"))
|
||||
.isNull();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that readPermissions works correctly for a library with on-bootclasspath-before
|
||||
* and on-bootclasspath-since.
|
||||
|
||||
Reference in New Issue
Block a user