Enforce ComponentName belongs to caller app
Add checks that enforce ComponentName's package belongs to calling app in MediaButtonReceiverHolder and MediaSessionRecord. This avoids privileged execution of arbitrary code. Bug: 238177121 Test: atest CtsMediaBetterTogetherTestCases Change-Id: Iac143d8bbc9422f3ca3f42f8c0154b9906ecd897 Merged-In: Iac143d8bbc9422f3ca3f42f8c0154b9906ecd897
This commit is contained in:
@@ -32,6 +32,7 @@ import android.os.Handler;
|
|||||||
import android.os.PowerWhitelistManager;
|
import android.os.PowerWhitelistManager;
|
||||||
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.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
|
|
||||||
@@ -117,6 +118,12 @@ final class MediaButtonReceiverHolder {
|
|||||||
int componentType = getComponentType(pendingIntent);
|
int componentType = getComponentType(pendingIntent);
|
||||||
ComponentName componentName = getComponentName(pendingIntent, componentType);
|
ComponentName componentName = getComponentName(pendingIntent, componentType);
|
||||||
if (componentName != null) {
|
if (componentName != null) {
|
||||||
|
if (!TextUtils.equals(componentName.getPackageName(), sessionPackageName)) {
|
||||||
|
EventLog.writeEvent(0x534e4554, "238177121", -1, ""); // SafetyNet logging
|
||||||
|
throw new IllegalArgumentException("ComponentName does not belong to "
|
||||||
|
+ "sessionPackageName. sessionPackageName = " + sessionPackageName
|
||||||
|
+ ", ComponentName pkg = " + componentName.getPackageName());
|
||||||
|
}
|
||||||
return new MediaButtonReceiverHolder(userId, pendingIntent, componentName,
|
return new MediaButtonReceiverHolder(userId, pendingIntent, componentName,
|
||||||
componentType);
|
componentType);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ import android.os.RemoteException;
|
|||||||
import android.os.ResultReceiver;
|
import android.os.ResultReceiver;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.EventLog;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
|
|
||||||
@@ -934,6 +935,14 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR
|
|||||||
@Override
|
@Override
|
||||||
public void setMediaButtonReceiver(PendingIntent pi, String sessionPackageName)
|
public void setMediaButtonReceiver(PendingIntent pi, String sessionPackageName)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
|
//mPackageName has been verified in MediaSessionService.enforcePackageName().
|
||||||
|
if (!TextUtils.equals(sessionPackageName, mPackageName)) {
|
||||||
|
EventLog.writeEvent(0x534e4554, "238177121", -1, ""); // SafetyNet logging
|
||||||
|
throw new IllegalArgumentException("sessionPackageName name does not match "
|
||||||
|
+ "package name provided to MediaSessionRecord. sessionPackageName = "
|
||||||
|
+ sessionPackageName + ", pkg = "
|
||||||
|
+ mPackageName);
|
||||||
|
}
|
||||||
final long token = Binder.clearCallingIdentity();
|
final long token = Binder.clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
if ((mPolicies & MediaSessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_RECEIVER)
|
if ((mPolicies & MediaSessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_RECEIVER)
|
||||||
@@ -952,6 +961,15 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR
|
|||||||
public void setMediaButtonBroadcastReceiver(ComponentName receiver) throws RemoteException {
|
public void setMediaButtonBroadcastReceiver(ComponentName receiver) throws RemoteException {
|
||||||
final long token = Binder.clearCallingIdentity();
|
final long token = Binder.clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
|
//mPackageName has been verified in MediaSessionService.enforcePackageName().
|
||||||
|
if (receiver != null && !TextUtils.equals(
|
||||||
|
mPackageName, receiver.getPackageName())) {
|
||||||
|
EventLog.writeEvent(0x534e4554, "238177121", -1, ""); // SafetyNet logging
|
||||||
|
throw new IllegalArgumentException("receiver does not belong to "
|
||||||
|
+ "package name provided to MediaSessionRecord. Pkg = " + mPackageName
|
||||||
|
+ ", Receiver Pkg = " + receiver.getPackageName());
|
||||||
|
}
|
||||||
|
|
||||||
if ((mPolicies & MediaSessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_RECEIVER)
|
if ((mPolicies & MediaSessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_RECEIVER)
|
||||||
!= 0) {
|
!= 0) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user