From 025aae1fc90348bd60c80a1ad2415fe424c15c6e Mon Sep 17 00:00:00 2001 From: Nathan Harold Date: Fri, 2 Feb 2018 18:34:25 -0800 Subject: [PATCH] Require NETWORK_STACK Permission for IpSec Tunnel Mode At least until further permissions are agreed upon, the NETWORK_STACK permission is sufficient to ensure that access to the tunnel mode APIs is secure, and this permission will always be a sufficient condition. Thus, adding NETWORK_STACK. Bug: 66955045 Test: compilation Change-Id: I2dc36896a52d2e71fad55041507d68ca91191ffc --- core/java/android/net/IpSecManager.java | 3 +++ core/java/android/net/IpSecTransform.java | 10 ++++++++++ .../core/java/com/android/server/IpSecService.java | 8 ++++++++ 3 files changed, 21 insertions(+) diff --git a/core/java/android/net/IpSecManager.java b/core/java/android/net/IpSecManager.java index 24a078fccc..b60984771a 100644 --- a/core/java/android/net/IpSecManager.java +++ b/core/java/android/net/IpSecManager.java @@ -19,6 +19,7 @@ import static com.android.internal.util.Preconditions.checkNotNull; import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; @@ -761,6 +762,7 @@ public final class IpSecManager { * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public IpSecTunnelInterface createIpSecTunnelInterface(@NonNull InetAddress localAddress, @NonNull InetAddress remoteAddress, @NonNull Network underlyingNetwork) throws ResourceUnavailableException, IOException { @@ -780,6 +782,7 @@ public final class IpSecManager { * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void applyTunnelModeTransform(IpSecTunnelInterface tunnel, int direction, IpSecTransform transform) throws IOException { try { diff --git a/core/java/android/net/IpSecTransform.java b/core/java/android/net/IpSecTransform.java index 0829b4a3e9..38759a9183 100644 --- a/core/java/android/net/IpSecTransform.java +++ b/core/java/android/net/IpSecTransform.java @@ -21,6 +21,7 @@ import static com.android.internal.util.Preconditions.checkNotNull; import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.content.Context; import android.os.Binder; @@ -266,6 +267,10 @@ public final class IpSecTransform implements AutoCloseable { * @hide */ @SystemApi + @RequiresPermission(anyOf = { + android.Manifest.permission.NETWORK_STACK, + android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD + }) public void startNattKeepalive(@NonNull NattKeepaliveCallback userCallback, int intervalSeconds, @NonNull Handler handler) throws IOException { checkNotNull(userCallback); @@ -305,6 +310,10 @@ public final class IpSecTransform implements AutoCloseable { * @hide */ @SystemApi + @RequiresPermission(anyOf = { + android.Manifest.permission.NETWORK_STACK, + android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD + }) public void stopNattKeepalive() { synchronized (mKeepaliveCallback) { if (mKeepalive == null) { @@ -449,6 +458,7 @@ public final class IpSecTransform implements AutoCloseable { * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public IpSecTransform buildTunnelModeTransform( @NonNull InetAddress sourceAddress, @NonNull IpSecManager.SecurityParameterIndex spi) diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java index a07a982abc..45a4dfb91b 100644 --- a/services/core/java/com/android/server/IpSecService.java +++ b/services/core/java/com/android/server/IpSecService.java @@ -1438,7 +1438,9 @@ public class IpSecService extends IIpSecService.Stub { switch (config.getMode()) { case IpSecTransform.MODE_TRANSPORT: + break; case IpSecTransform.MODE_TUNNEL: + enforceNetworkStackPermission(); break; default: throw new IllegalArgumentException( @@ -1446,6 +1448,11 @@ public class IpSecService extends IIpSecService.Stub { } } + private void enforceNetworkStackPermission() { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.NETWORK_STACK, + "IpSecService"); + } + private void createOrUpdateTransform( IpSecConfig c, int resourceId, SpiRecord spiRecord, EncapSocketRecord socketRecord) throws RemoteException { @@ -1615,6 +1622,7 @@ public class IpSecService extends IIpSecService.Stub { @Override public synchronized void applyTunnelModeTransform( int tunnelResourceId, int direction, int transformResourceId) throws RemoteException { + enforceNetworkStackPermission(); checkDirection(direction); UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());