Merge "Fix duplicate permission privilege escalation" into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
6953052d83
@@ -26,6 +26,7 @@ import android.content.res.Resources;
|
|||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
import android.content.res.XmlResourceParser;
|
import android.content.res.XmlResourceParser;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
|
import android.util.EventLog;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
|
|
||||||
import com.android.internal.R;
|
import com.android.internal.R;
|
||||||
@@ -36,6 +37,7 @@ import org.xmlpull.v1.XmlPullParserException;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @hide
|
* @hide
|
||||||
@@ -277,8 +279,28 @@ public class ParsedPermissionUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return {@code true} if the package declares duplicate permissions with different
|
* Determines if a duplicate permission is malformed .i.e. defines different protection level
|
||||||
* protection levels.
|
* or group.
|
||||||
|
*/
|
||||||
|
private static boolean isMalformedDuplicate(ParsedPermission p1, ParsedPermission p2) {
|
||||||
|
// Since a permission tree is also added as a permission with normal protection
|
||||||
|
// level, we need to skip if the parsedPermission is a permission tree.
|
||||||
|
if (p1 == null || p2 == null || p1.isTree() || p2.isTree()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p1.getProtectionLevel() != p2.getProtectionLevel()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!Objects.equals(p1.getGroup(), p2.getGroup())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {@code true} if the package declares malformed duplicate permissions.
|
||||||
*/
|
*/
|
||||||
public static boolean declareDuplicatePermission(@NonNull ParsingPackage pkg) {
|
public static boolean declareDuplicatePermission(@NonNull ParsingPackage pkg) {
|
||||||
final List<ParsedPermission> permissions = pkg.getPermissions();
|
final List<ParsedPermission> permissions = pkg.getPermissions();
|
||||||
@@ -289,10 +311,10 @@ public class ParsedPermissionUtils {
|
|||||||
final ParsedPermission parsedPermission = permissions.get(i);
|
final ParsedPermission parsedPermission = permissions.get(i);
|
||||||
final String name = parsedPermission.getName();
|
final String name = parsedPermission.getName();
|
||||||
final ParsedPermission perm = checkDuplicatePerm.get(name);
|
final ParsedPermission perm = checkDuplicatePerm.get(name);
|
||||||
// Since a permission tree is also added as a permission with normal protection
|
if (isMalformedDuplicate(parsedPermission, perm)) {
|
||||||
// level, we need to skip if the parsedPermission is a permission tree.
|
// Fix for b/213323615
|
||||||
if (perm != null && !(perm.isTree() || parsedPermission.isTree())
|
EventLog.writeEvent(0x534e4554, "213323615",
|
||||||
&& perm.getProtectionLevel() != parsedPermission.getProtectionLevel()) {
|
"The package " + pkg.getPackageName() + " seems malicious");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
checkDuplicatePerm.put(name, parsedPermission);
|
checkDuplicatePerm.put(name, parsedPermission);
|
||||||
|
|||||||
@@ -968,7 +968,7 @@ public class ParsingPackageUtils {
|
|||||||
if (ParsedPermissionUtils.declareDuplicatePermission(pkg)) {
|
if (ParsedPermissionUtils.declareDuplicatePermission(pkg)) {
|
||||||
return input.error(
|
return input.error(
|
||||||
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,
|
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,
|
||||||
"Declare duplicate permissions with different protection levels."
|
"Found duplicate permission with a different attribute value."
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user