Skip to content

Commit 328e679

Browse files
jpd236Android (Google) Code Review
authored andcommitted
Merge "Security-related cleanup for network scoring." into lmp-dev
2 parents 6013583 + ac7285d commit 328e679

3 files changed

Lines changed: 17 additions & 4 deletions

File tree

core/java/android/net/NetworkScoreManager.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package android.net;
1818

19+
import android.Manifest;
1920
import android.annotation.SdkConstant;
2021
import android.annotation.SdkConstant.SdkConstantType;
2122
import android.annotation.SystemApi;
@@ -25,6 +26,7 @@
2526
import android.os.IBinder;
2627
import android.os.RemoteException;
2728
import android.os.ServiceManager;
29+
import android.os.UserHandle;
2830

2931
/**
3032
* Class that manages communication between network subsystems and a network scorer.
@@ -238,7 +240,9 @@ public boolean requestScores(NetworkKey[] networks) throws SecurityException {
238240
intent.setPackage(activeScorer);
239241
intent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
240242
intent.putExtra(EXTRA_NETWORKS_TO_SCORE, networks);
241-
mContext.sendBroadcast(intent);
243+
// A scorer should never become active if its package doesn't hold SCORE_NETWORKS, but
244+
// ensure the package still holds it to be extra safe.
245+
mContext.sendBroadcastAsUser(intent, UserHandle.OWNER, Manifest.permission.SCORE_NETWORKS);
242246
return true;
243247
}
244248

core/java/android/net/NetworkScorerAppManager.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package android.net;
1818

19+
import android.Manifest;
1920
import android.Manifest.permission;
2021
import android.annotation.Nullable;
2122
import android.app.AppOpsManager;
@@ -24,6 +25,7 @@
2425
import android.content.pm.ActivityInfo;
2526
import android.content.pm.PackageManager;
2627
import android.content.pm.ResolveInfo;
28+
import android.os.UserHandle;
2729
import android.provider.Settings;
2830
import android.text.TextUtils;
2931
import android.util.Log;
@@ -86,7 +88,9 @@ public static Collection<NetworkScorerAppData> getAllValidScorers(Context contex
8688
List<NetworkScorerAppData> scorers = new ArrayList<>();
8789

8890
PackageManager pm = context.getPackageManager();
89-
List<ResolveInfo> receivers = pm.queryBroadcastReceivers(SCORE_INTENT, 0 /* flags */);
91+
// Only apps installed under the primary user of the device can be scorers.
92+
List<ResolveInfo> receivers =
93+
pm.queryBroadcastReceivers(SCORE_INTENT, 0 /* flags */, UserHandle.USER_OWNER);
9094
for (ResolveInfo receiver : receivers) {
9195
// This field is a misnomer, see android.content.pm.ResolveInfo#activityInfo
9296
final ActivityInfo receiverInfo = receiver.activityInfo;
@@ -186,10 +190,14 @@ public static boolean isCallerActiveScorer(Context context, int callingUid) {
186190
AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
187191
try {
188192
appOpsMgr.checkPackage(callingUid, defaultApp.mPackageName);
189-
return true;
190193
} catch (SecurityException e) {
191194
return false;
192195
}
196+
197+
// To be extra safe, ensure the caller holds the SCORE_NETWORKS permission. It always
198+
// should, since it couldn't become the active scorer otherwise, but this can't hurt.
199+
return context.checkCallingPermission(Manifest.permission.SCORE_NETWORKS) ==
200+
PackageManager.PERMISSION_GRANTED;
193201
}
194202

195203
/** Returns the {@link NetworkScorerAppData} for the given app, or null if it's not a scorer. */

services/core/java/com/android/server/NetworkScoreService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import android.net.ScoredNetwork;
3030
import android.os.Binder;
3131
import android.os.RemoteException;
32+
import android.os.UserHandle;
3233
import android.text.TextUtils;
3334
import android.util.Log;
3435

@@ -164,7 +165,7 @@ private boolean setScorerInternal(String packageName) {
164165
if (result) {
165166
Intent intent = new Intent(NetworkScoreManager.ACTION_SCORER_CHANGED);
166167
intent.putExtra(NetworkScoreManager.EXTRA_NEW_SCORER, packageName);
167-
mContext.sendBroadcast(intent);
168+
mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
168169
}
169170
return result;
170171
} finally {

0 commit comments

Comments
 (0)