Merge "Fix permanent denial of service via apis with illegal intent filter" into tm-qpr-dev am: 2e8ec83590
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20559211 Change-Id: I9aa6c68957a7b74810e7f04ace58d687b52e25bc Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -2405,6 +2405,29 @@ public class IntentFilter implements Parcelable {
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a check on data paths and scheme specific parts of the intent filter.
|
||||||
|
* Return true if it passed.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public boolean checkDataPathAndSchemeSpecificParts() {
|
||||||
|
final int numDataPath = mDataPaths == null
|
||||||
|
? 0 : mDataPaths.size();
|
||||||
|
final int numDataSchemeSpecificParts = mDataSchemeSpecificParts == null
|
||||||
|
? 0 : mDataSchemeSpecificParts.size();
|
||||||
|
for (int i = 0; i < numDataPath; i++) {
|
||||||
|
if (!mDataPaths.get(i).check()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < numDataSchemeSpecificParts; i++) {
|
||||||
|
if (!mDataSchemeSpecificParts.get(i).check()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/** @hide */
|
/** @hide */
|
||||||
public IntentFilter(Parcel source) {
|
public IntentFilter(Parcel source) {
|
||||||
mActions = new ArrayList<String>();
|
mActions = new ArrayList<String>();
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package android.os;
|
package android.os;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
import android.util.proto.ProtoOutputStream;
|
import android.util.proto.ProtoOutputStream;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -151,6 +152,23 @@ public class PatternMatcher implements Parcelable {
|
|||||||
proto.end(token);
|
proto.end(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a check on the matcher for the pattern type of {@link #PATTERN_ADVANCED_GLOB}.
|
||||||
|
* Return true if it passed.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public boolean check() {
|
||||||
|
try {
|
||||||
|
if (mType == PATTERN_ADVANCED_GLOB) {
|
||||||
|
return Arrays.equals(mParsedPattern, parseAndVerifyAdvancedPattern(mPattern));
|
||||||
|
}
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
Log.w(TAG, "Failed to verify advanced pattern: " + e.getMessage());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public int describeContents() {
|
public int describeContents() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3395,6 +3395,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
|
|||||||
enforceOwnerRights(snapshot, ownerPackage, callingUid);
|
enforceOwnerRights(snapshot, ownerPackage, callingUid);
|
||||||
PackageManagerServiceUtils.enforceShellRestriction(mInjector.getUserManagerInternal(),
|
PackageManagerServiceUtils.enforceShellRestriction(mInjector.getUserManagerInternal(),
|
||||||
UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, sourceUserId);
|
UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, sourceUserId);
|
||||||
|
if (!intentFilter.checkDataPathAndSchemeSpecificParts()) {
|
||||||
|
EventLog.writeEvent(0x534e4554, "246749936", callingUid);
|
||||||
|
throw new IllegalArgumentException("Invalid intent data paths or scheme specific parts"
|
||||||
|
+ " in the filter.");
|
||||||
|
}
|
||||||
if (intentFilter.countActions() == 0) {
|
if (intentFilter.countActions() == 0) {
|
||||||
Slog.w(TAG, "Cannot set a crossProfile intent filter with no filter actions");
|
Slog.w(TAG, "Cannot set a crossProfile intent filter with no filter actions");
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import android.os.Build;
|
|||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.EventLog;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.LogPrinter;
|
import android.util.LogPrinter;
|
||||||
import android.util.PrintStreamPrinter;
|
import android.util.PrintStreamPrinter;
|
||||||
@@ -388,6 +389,11 @@ final class PreferredActivityHelper {
|
|||||||
throw new SecurityException(
|
throw new SecurityException(
|
||||||
"addPersistentPreferredActivity can only be run by the system");
|
"addPersistentPreferredActivity can only be run by the system");
|
||||||
}
|
}
|
||||||
|
if (!filter.checkDataPathAndSchemeSpecificParts()) {
|
||||||
|
EventLog.writeEvent(0x534e4554, "246749702", callingUid);
|
||||||
|
throw new IllegalArgumentException("Invalid intent data paths or scheme specific parts"
|
||||||
|
+ " in the filter.");
|
||||||
|
}
|
||||||
if (filter.countActions() == 0) {
|
if (filter.countActions() == 0) {
|
||||||
Slog.w(TAG, "Cannot set a preferred activity with no filter actions");
|
Slog.w(TAG, "Cannot set a preferred activity with no filter actions");
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -670,6 +670,13 @@ public class WatchedIntentFilter
|
|||||||
return mFilter.debugCheck();
|
return mFilter.debugCheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IntentFilter#checkDataPathAndSchemeSpecificParts()
|
||||||
|
*/
|
||||||
|
public boolean checkDataPathAndSchemeSpecificParts() {
|
||||||
|
return mFilter.checkDataPathAndSchemeSpecificParts();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see IntentFilter#getHostsList()
|
* @see IntentFilter#getHostsList()
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user