diff --git a/Tethering/res/values-mcc310-mnc004-eu/strings.xml b/Tethering/res/values-mcc310-mnc004-eu/strings.xml index c970dd753f..ff2a505a03 100644 --- a/Tethering/res/values-mcc310-mnc004-eu/strings.xml +++ b/Tethering/res/values-mcc310-mnc004-eu/strings.xml @@ -18,7 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Konexioa partekatzeko aukerak ez du Interneteko konexiorik" "Ezin dira konektatu gailuak" - "Desaktibatu konexioa partekatzeko aukera" + "Desaktibatu konexioa partekatzea" "Wifi-gunea edo konexioa partekatzeko aukera aktibatuta dago" "Baliteke tarifa gehigarriak ordaindu behar izatea ibiltaritza erabili bitartean" diff --git a/service-t/src/com/android/server/net/NetworkStatsService.java b/service-t/src/com/android/server/net/NetworkStatsService.java index 53233920c4..114cf2ecc2 100644 --- a/service-t/src/com/android/server/net/NetworkStatsService.java +++ b/service-t/src/com/android/server/net/NetworkStatsService.java @@ -1544,7 +1544,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); } @@ -2061,6 +2065,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(); diff --git a/service/ServiceConnectivityResources/res/values-de/strings.xml b/service/ServiceConnectivityResources/res/values-de/strings.xml index 536ebda8ff..f58efb0146 100644 --- a/service/ServiceConnectivityResources/res/values-de/strings.xml +++ b/service/ServiceConnectivityResources/res/values-de/strings.xml @@ -29,7 +29,7 @@ "Für Optionen tippen" "Mobiles Netzwerk hat keinen Internetzugriff" "Netzwerk hat keinen Internetzugriff" - "Auf den privaten DNS-Server kann nicht zugegriffen werden" + "Auf den Server des privaten DNS kann nicht zugegriffen werden" "Schlechte Verbindung mit %1$s" "Tippen, um die Verbindung trotzdem herzustellen" "Zu %1$s gewechselt" diff --git a/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java index c997b0136c..7e0a225bd0 100644 --- a/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java +++ b/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java @@ -65,6 +65,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; @@ -102,6 +103,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; @@ -132,6 +134,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; @@ -256,6 +259,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 = @@ -326,6 +330,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; @@ -447,6 +461,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); } @@ -1714,7 +1731,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 @@ -3004,6 +3021,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) -> { diff --git a/thread/tests/cts/Android.bp b/thread/tests/cts/Android.bp index 8cdf38ded2..c1cf0a09ee 100644 --- a/thread/tests/cts/Android.bp +++ b/thread/tests/cts/Android.bp @@ -21,6 +21,7 @@ package { android_test { name: "CtsThreadNetworkTestCases", + defaults: ["cts_defaults"], min_sdk_version: "33", sdk_version: "test_current", manifest: "AndroidManifest.xml",