summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Lorenzo Colitti <lorenzo@google.com> 2018-09-28 11:31:55 +0900
committer Lorenzo Colitti <lorenzo@google.com> 2018-10-01 12:05:42 +0900
commit2e31a7c0044bbb477bcd967f5b13b00b2da085f6 (patch)
tree8d51dcbc95aef3b3b117605b5f13ada5f63ab0b6
parent5604cc2516c788ab6242aef72f851e8771a31161 (diff)
Make requestRouteToHost a no-op for system callers.
Everything in the system should now be using proper multinetwork APIs instead of this insecure and error-prone API. Make this method do nothing when called by the system. For now, keep the code around for backwards compatibility for apps targeting Android releases before M. Bug: 25824776 Bug: 25876485 Test: FrameworksNetTests pass Test: CtsNetTestCasesLegacyApi22 pass Test: CtsNetTestCasesLegacyPermission22 pass Test: android.net.cts.ConnectivityManagerTest passes Change-Id: I9b3557faccccc95c7b954db6a13b853b4c7edea0
-rw-r--r--core/java/android/net/ConnectivityManager.java11
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java17
2 files changed, 20 insertions, 8 deletions
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index f2e907833612..8333b817add0 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -26,7 +26,6 @@ import android.annotation.UnsupportedAppUsage;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
@@ -3801,8 +3800,9 @@ public class ConnectivityManager {
private void unsupportedStartingFrom(int version) {
if (Process.myUid() == Process.SYSTEM_UID) {
- // The getApplicationInfo() call we make below is not supported in system context, and
- // we want to allow the system to use these APIs anyway.
+ // The getApplicationInfo() call we make below is not supported in system context. Let
+ // the call through here, and rely on the fact that ConnectivityService will refuse to
+ // allow the system to use these APIs anyway.
return;
}
@@ -3819,11 +3819,6 @@ public class ConnectivityManager {
// functions by accessing ConnectivityService directly. However, it should be clear that doing
// so is unsupported and may break in the future. http://b/22728205
private void checkLegacyRoutingApiAccess() {
- if (mContext.checkCallingOrSelfPermission("com.android.permission.INJECT_OMADM_SETTINGS")
- == PackageManager.PERMISSION_GRANTED) {
- return;
- }
-
unsupportedStartingFrom(VERSION_CODES.M);
}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index e41a09ef672e..0ea2052b9f35 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -1476,6 +1476,20 @@ public class ConnectivityService extends IConnectivityManager.Stub
};
/**
+ * Ensures that the system cannot call a particular method.
+ */
+ private boolean disallowedBecauseSystemCaller() {
+ // TODO: start throwing a SecurityException when GnssLocationProvider stops calling
+ // requestRouteToHost.
+ if (isSystem(Binder.getCallingUid())) {
+ log("This method exists only for app backwards compatibility"
+ + " and must not be called by system services.");
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Ensure that a network route exists to deliver traffic to the specified
* host via the specified network interface.
* @param networkType the type of the network over which traffic to the
@@ -1486,6 +1500,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/
@Override
public boolean requestRouteToHostAddress(int networkType, byte[] hostAddress) {
+ if (disallowedBecauseSystemCaller()) {
+ return false;
+ }
enforceChangePermission();
if (mProtectedNetworks.contains(networkType)) {
enforceConnectivityInternalPermission();