Block incoming non-VPN packets to apps under fully-routed VPN
When a fully-routed VPN is running, we want to prevent normal apps under the VPN from receiving packets originating from any local non-VPN interfaces. This is achieved by using eBPF to create a per-UID input interface whitelist and populate the whitelist such that all non-bypassable apps under a VPN can only receive packets from the VPN's TUN interface (and loopback implicitly) This is the framework part of the change that build the whitelist. The whitelist needs to be updated in the following cases: * When a VPN is connected and disconnected This will cover the change to allowBypass bit, since that can't be changed without reconnecting. * When a VPN's NetworkCapabilites is changed (whitelist/blacklist app changes) * When a new app is installed * When an existing app is removed * When a VPN becomes fully-routed or is no longer fully-routed New user/profile creation will automatically result in a whitelist app change transition so it doesn't need to be handled specially here. Due to the limitation of the kernel IPSec interacting with eBPF (sk_buf->ifindex does not point to the virtual tunnel interface for kernel IPSec), the whitelist will only apply to app VPNs but not legacy VPN connections, to prevent breaking connectivity with kernel IPSec entirely. Test: atest PermissionMonitorTest Test: atest android.net.RouteInfoTest Test: atest com.android.server.ConnectivityServiceTest Test: atest HostsideVpnTests Bug: 114231106 Change-Id: I143b03d60e46cb1b04732b4a4034f5847b4d1b1a
Loading
Please register or sign in to comment