Merge Android 24Q2 Release (ab/11526283) to aosp-main-future

Bug: 337098550
Merged-In: I50f3d3b8205a5a9ee8154a649318a2c175edbb71
Change-Id: I744085a52a290ba39beec9df7c27247ee5cc007f
This commit is contained in:
Xin Li 2024-05-24 08:25:30 -07:00
commit a9c4e57fd0
3 changed files with 57 additions and 2 deletions

View file

@ -1529,7 +1529,11 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
}
@Override
public INetworkStatsSession openSessionForUsageStats(int flags, String callingPackage) {
public INetworkStatsSession openSessionForUsageStats(
int flags, @NonNull String callingPackage) {
Objects.requireNonNull(callingPackage);
PermissionUtils.enforcePackageNameMatchesUid(
mContext, Binder.getCallingUid(), callingPackage);
return openSessionInternal(flags, callingPackage);
}
@ -2046,6 +2050,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
final int callingPid = Binder.getCallingPid();
final int callingUid = Binder.getCallingUid();
PermissionUtils.enforcePackageNameMatchesUid(mContext, callingUid, callingPackage);
@NetworkStatsAccess.Level int accessLevel = checkAccessLevel(callingPackage);
DataUsageRequest normalizedRequest;
final long token = Binder.clearCallingIdentity();

View file

@ -64,6 +64,7 @@ import static android.text.format.DateUtils.HOUR_IN_MILLIS;
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
import static android.text.format.DateUtils.WEEK_IN_MILLIS;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doThrow;
import static com.android.server.net.NetworkStatsEventLogger.POLL_REASON_RAT_CHANGED;
import static com.android.server.net.NetworkStatsEventLogger.PollEvent.pollReasonNameOf;
import static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_POLL;
@ -101,6 +102,7 @@ import android.annotation.NonNull;
import android.app.AlarmManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.net.DataUsageRequest;
@ -131,6 +133,7 @@ import android.os.Looper;
import android.os.PowerManager;
import android.os.Process;
import android.os.SimpleClock;
import android.os.UserHandle;
import android.provider.Settings;
import android.system.ErrnoException;
import android.telephony.TelephonyManager;
@ -255,6 +258,7 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
private static @Mock WifiInfo sWifiInfo;
private @Mock INetd mNetd;
private @Mock TetheringManager mTetheringManager;
private @Mock PackageManager mPm;
private @Mock NetworkStatsFactory mStatsFactory;
@NonNull
private final TestNetworkStatsSettings mSettings =
@ -324,6 +328,16 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
mBaseContext = base;
}
@Override
public PackageManager getPackageManager() {
return mPm;
}
@Override
public Context createContextAsUser(UserHandle user, int flags) {
return this;
}
@Override
public Object getSystemService(String name) {
if (Context.TELEPHONY_SERVICE.equals(name)) return mTelephonyManager;
@ -445,6 +459,9 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
any(), tetheringEventCbCaptor.capture());
mTetheringEventCallback = tetheringEventCbCaptor.getValue();
doReturn(Process.myUid()).when(mPm)
.getPackageUid(eq(mServiceContext.getPackageName()), anyInt());
mUsageCallback = new TestableUsageCallback(mUsageCallbackBinder);
}
@ -1704,7 +1721,7 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
// Register and verify request and that binder was called
DataUsageRequest request = mService.registerUsageCallback(
mServiceContext.getOpPackageName(), inputRequest, mUsageCallback);
mServiceContext.getPackageName(), inputRequest, mUsageCallback);
assertTrue(request.requestId > 0);
assertTrue(Objects.equals(sTemplateWifi, request.template));
long minThresholdInBytes = 2 * 1024 * 1024; // 2 MB
@ -2978,6 +2995,38 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
assertDumpContains(dump, pollReasonNameOf(POLL_REASON_RAT_CHANGED));
}
@Test
public void testEnforcePackageNameMatchesUid() throws Exception {
final String testMyPackageName = "test.package.myname";
final String testRedPackageName = "test.package.red";
final String testInvalidPackageName = "test.package.notfound";
doReturn(UID_RED).when(mPm).getPackageUid(eq(testRedPackageName), anyInt());
doReturn(Process.myUid()).when(mPm).getPackageUid(eq(testMyPackageName), anyInt());
doThrow(new PackageManager.NameNotFoundException()).when(mPm)
.getPackageUid(eq(testInvalidPackageName), anyInt());
assertThrows(SecurityException.class, () ->
mService.openSessionForUsageStats(0 /* flags */, testRedPackageName));
assertThrows(SecurityException.class, () ->
mService.openSessionForUsageStats(0 /* flags */, testInvalidPackageName));
assertThrows(NullPointerException.class, () ->
mService.openSessionForUsageStats(0 /* flags */, null));
// Verify package name belongs to ourselves does not throw.
mService.openSessionForUsageStats(0 /* flags */, testMyPackageName);
long thresholdInBytes = 10 * 1024 * 1024; // 10 MB
DataUsageRequest request = new DataUsageRequest(
2 /* requestId */, sTemplateImsi1, thresholdInBytes);
assertThrows(SecurityException.class, () ->
mService.registerUsageCallback(testRedPackageName, request, mUsageCallback));
assertThrows(SecurityException.class, () ->
mService.registerUsageCallback(testInvalidPackageName, request, mUsageCallback));
assertThrows(NullPointerException.class, () ->
mService.registerUsageCallback(null, request, mUsageCallback));
mService.registerUsageCallback(testMyPackageName, request, mUsageCallback);
}
@Test
public void testDumpSkDestroyListenerLogs() throws ErrnoException {
doAnswer((invocation) -> {

View file

@ -21,6 +21,7 @@ package {
android_test {
name: "CtsThreadNetworkTestCases",
defaults: ["cts_defaults"],
min_sdk_version: "33",
sdk_version: "test_current",
manifest: "AndroidManifest.xml",