All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sabrina Dubroca <sd@queasysnail.net>
To: Antonio Quartulli <antonio@openvpn.net>
Cc: Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Donald Hunter <donald.hunter@gmail.com>,
	Shuah Khan <shuah@kernel.org>,
	ryazanov.s.a@gmail.com, Andrew Lunn <andrew@lunn.ch>,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-kselftest@vger.kernel.org
Subject: Re: [PATCH net-next v11 18/23] ovpn: implement peer add/get/dump/delete via netlink
Date: Wed, 20 Nov 2024 12:12:18 +0100	[thread overview]
Message-ID: <Zz3EEl0diYofGkIC@hog> (raw)
In-Reply-To: <e11c5f81-cbc8-43a3-b275-7004efdcb358@openvpn.net>

2024-11-14, 10:21:18 +0100, Antonio Quartulli wrote:
> On 13/11/2024 17:56, Sabrina Dubroca wrote:
> > 2024-11-12, 15:19:50 +0100, Antonio Quartulli wrote:
> > > On 04/11/2024 16:14, Sabrina Dubroca wrote:
> > > > 2024-10-29, 11:47:31 +0100, Antonio Quartulli wrote:
> > > > > +static int ovpn_nl_peer_precheck(struct ovpn_struct *ovpn,
> > > > > +				 struct genl_info *info,
> > > > > +				 struct nlattr **attrs)
> > > > > +{
> > > > > +	if (NL_REQ_ATTR_CHECK(info->extack, info->attrs[OVPN_A_PEER], attrs,
> > > > > +			      OVPN_A_PEER_ID))
> > > > > +		return -EINVAL;
> > > > > +
> > > > > +	if (attrs[OVPN_A_PEER_REMOTE_IPV4] && attrs[OVPN_A_PEER_REMOTE_IPV6]) {
> > > > > +		NL_SET_ERR_MSG_MOD(info->extack,
> > > > > +				   "cannot specify both remote IPv4 or IPv6 address");
> > > > > +		return -EINVAL;
> > > > > +	}
> > > > > +
> > > > > +	if (!attrs[OVPN_A_PEER_REMOTE_IPV4] &&
> > > > > +	    !attrs[OVPN_A_PEER_REMOTE_IPV6] && attrs[OVPN_A_PEER_REMOTE_PORT]) {
> > > > > +		NL_SET_ERR_MSG_MOD(info->extack,
> > > > > +				   "cannot specify remote port without IP address");
> > > > > +		return -EINVAL;
> > > > > +	}
> > > > > +
> > > > > +	if (!attrs[OVPN_A_PEER_REMOTE_IPV4] &&
> > > > > +	    attrs[OVPN_A_PEER_LOCAL_IPV4]) {
> > > > > +		NL_SET_ERR_MSG_MOD(info->extack,
> > > > > +				   "cannot specify local IPv4 address without remote");
> > > > > +		return -EINVAL;
> > > > > +	}
> > > > > +
> > > > > +	if (!attrs[OVPN_A_PEER_REMOTE_IPV6] &&
> > > > > +	    attrs[OVPN_A_PEER_LOCAL_IPV6]) {
> > > > 
> > > > I think these consistency checks should account for v4mapped
> > > > addresses. With remote=v4mapped and local=v6 we'll end up with an
> > > > incorrect ipv4 "local" address (taken out of the ipv6 address's first
> > > > 4B by ovpn_peer_reset_sockaddr). With remote=ipv6 and local=v4mapped,
> > > > we'll pass the last 4B of OVPN_A_PEER_LOCAL_IPV6 to
> > > > ovpn_peer_reset_sockaddr and try to read 16B (the full ipv6 address)
> > > > out of that.
> > > 
> > > Right, a v4mapped address would fool this check.
> > > How about checking if both or none addresses are v4mapped? This way we
> > > should prevent such cases.
> > 
> > I don't know when userspace would use v4mapped addresses,
> 
> It happens when listening on [::] with a v6 socket that has no "IPV6_V6ONLY"
> set to true (you can check ipv6(7) for more details).
> This socket can receive IPv4 connections, which are implemented using
> v4mapped addresses. In this case both remote and local are going to be
> v4mapped.

I'm familiar with v4mapped addresses, but I wasn't sure the userspace
part would actually passed them as peer. But I guess it would when the
peer connects over ipv4 on an ipv6 socket.

So the combination of PEER_IPV4 with LOCAL_IPV6(v4mapped) should never
happen? In that case I guess we just need to check that we got 2
attributes of the same type (both _IPV4 or both _IPV6) and if we got
_IPV6, that they're either both v4mapped or both not. Might be a tiny
bit simpler than what I was suggesting below.

> However, the sanity check should make sure nobody can inject bogus
> combinations.
>
> > but treating
> > a v4mapped address as a "proper" ipv4 address should work with the
> > rest of the code, since you already have the conversion in
> > ovpn_nl_attr_local_ip and ovpn_nl_attr_sockaddr_remote. So maybe you
> > could do something like (rough idea and completely untested):
> > 
> >      static int get_family(attr_v4, attr_v6)
> >      {
> >         if (attr_v4)
> >             return AF_INET;
> >         if (attr_v6) {
> >             if (ipv6_addr_v4mapped(attr_v6)
> >                 return AF_INET;
> >             return AF_INET6;
> >         }
> >         return AF_UNSPEC;
> >      }
> > 
> > 
> >      // in _precheck:
> >      // keep the   attrs[OVPN_A_PEER_REMOTE_IPV4] && attrs[OVPN_A_PEER_REMOTE_IPV6]  check
> >      // maybe add a similar one for   LOCAL_IPV4 && LOCAL_IPV6
> 
> the latter is already covered by:
> 
>  192         if (!attrs[OVPN_A_PEER_REMOTE_IPV4] &&
>  193             attrs[OVPN_A_PEER_LOCAL_IPV4]) {
>  194                 NL_SET_ERR_MSG_MOD(info->extack,
>  195                                    "cannot specify local IPv4 address
> without remote");
>  196                 return -EINVAL;
>  197         }
>  198
>  199         if (!attrs[OVPN_A_PEER_REMOTE_IPV6] &&
>  200             attrs[OVPN_A_PEER_LOCAL_IPV6]) {
>  201                 NL_SET_ERR_MSG_MOD(info->extack,
>  202                                    "cannot specify local IPV6 address
> without remote");
>  203                 return -EINVAL;
>  204         }

LOCAL_IPV4 combined with REMOTE_IPV6 should be fine if the remote is
v4mapped. And conversely, LOCAL_IPV6 combined with REMOTE_IPV6 isn't
ok if remote is v4mapped. So those checks should go away and be
replaced with the "get_family" thing, but that requires at most one of
the _IPV4/_IPV6 attributes to be present to behave consistently.


> > 
> >      remote_family = get_family(attrs[OVPN_A_PEER_REMOTE_IPV4], attrs[OVPN_A_PEER_REMOTE_IPV6]);
> >      local_family = get_family(attrs[OVPN_A_PEER_LOCAL_IPV4], attrs[OVPN_A_PEER_LOCAL_IPV6]);
> >      if (remote_family != local_family) {
> >          extack "incompatible address families";
> >          return -EINVAL;
> >      }
> > 
> > That would mirror the conversion that
> > ovpn_nl_attr_local_ip/ovpn_nl_attr_sockaddr_remote do.
> 
> Yeah, pretty much what I was suggested, but in a more explicit manner.
> I like it.

Cool.

BTW, I guess scope_id should only be used when it's not a v4mapped address?
So the "cannot specify scope id without remote IPv6 address" check
should probably use:

    if (remote_family != AF_INET6)

(or split it into !attrs[OVPN_A_PEER_REMOTE_IPV6] and remote_family !=
AF_INET6 to have a fully specific extack message, but maybe that's
overkill)

-- 
Sabrina

  reply	other threads:[~2024-11-20 11:12 UTC|newest]

Thread overview: 158+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-29 10:47 [PATCH net-next v11 00/23] Introducing OpenVPN Data Channel Offload Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 01/23] netlink: add NLA_POLICY_MAX_LEN macro Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 02/23] net: introduce OpenVPN Data Channel Offload (ovpn) Antonio Quartulli
2024-11-06  0:31   ` Sergey Ryazanov
2024-11-15  9:56     ` Antonio Quartulli
2024-11-19  1:49       ` Sergey Ryazanov
2024-10-29 10:47 ` [PATCH net-next v11 03/23] ovpn: add basic netlink support Antonio Quartulli
2024-11-08 23:15   ` Sergey Ryazanov
2024-11-15 10:05     ` Antonio Quartulli
2024-11-19  2:05       ` Sergey Ryazanov
2024-11-19  8:12         ` Antonio Quartulli
2024-11-08 23:31   ` Sergey Ryazanov
2024-11-15 10:19     ` Antonio Quartulli
2024-11-19  2:23       ` Sergey Ryazanov
2024-11-19  8:16         ` Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 04/23] ovpn: add basic interface creation/destruction/management routines Antonio Quartulli
2024-11-09  1:01   ` Sergey Ryazanov
2024-11-12 16:47     ` Sabrina Dubroca
2024-11-12 23:56       ` Sergey Ryazanov
2024-11-14  8:07       ` Antonio Quartulli
2024-11-14 22:57         ` Sergey Ryazanov
2024-11-15 13:45           ` Antonio Quartulli
2024-11-15 13:00     ` Antonio Quartulli
2024-11-10 20:42   ` Sergey Ryazanov
2024-11-15 14:03     ` Antonio Quartulli
2024-11-19  3:08       ` Sergey Ryazanov
2024-11-19  8:45         ` Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 05/23] ovpn: keep carrier always on Antonio Quartulli
2024-11-09  1:11   ` Sergey Ryazanov
2024-11-15 14:13     ` Antonio Quartulli
2024-11-20 22:56       ` Sergey Ryazanov
2024-11-21 21:17         ` Antonio Quartulli
2024-11-23 22:25           ` Sergey Ryazanov
2024-11-23 22:52             ` Antonio Quartulli
2024-11-25  2:26               ` Sergey Ryazanov
2024-11-25 13:07                 ` Antonio Quartulli
2024-11-25 21:32                   ` Sergey Ryazanov
2024-11-26  8:17                     ` Antonio Quartulli
2024-12-02 10:40                       ` Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 06/23] ovpn: introduce the ovpn_peer object Antonio Quartulli
2024-10-30 16:37   ` Sabrina Dubroca
2024-10-30 20:47     ` Antonio Quartulli
2024-11-05 13:12       ` Sabrina Dubroca
2024-11-12 10:12         ` Antonio Quartulli
2024-11-10 13:38   ` Sergey Ryazanov
2024-11-12 17:31     ` Sabrina Dubroca
2024-11-13  1:37       ` Sergey Ryazanov
2024-11-13 10:03         ` Sabrina Dubroca
2024-11-20 23:22           ` Sergey Ryazanov
2024-11-21 21:23             ` Antonio Quartulli
2024-11-23 21:05               ` Sergey Ryazanov
2024-11-10 19:52   ` Sergey Ryazanov
2024-11-14 14:55     ` Antonio Quartulli
2024-11-20 11:56   ` Sabrina Dubroca
2024-11-21 21:27     ` Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 07/23] ovpn: introduce the ovpn_socket object Antonio Quartulli
2024-11-10 18:26   ` Sergey Ryazanov
2024-11-15 14:28     ` Antonio Quartulli
2024-11-19 13:44       ` Antonio Quartulli
2024-11-20 23:34         ` Sergey Ryazanov
2024-11-21 21:29           ` Antonio Quartulli
2024-11-20 23:58       ` Sergey Ryazanov
2024-11-21 21:36         ` Antonio Quartulli
2024-11-22  8:08           ` Sergey Ryazanov
2024-10-29 10:47 ` [PATCH net-next v11 08/23] ovpn: implement basic TX path (UDP) Antonio Quartulli
2024-10-30 17:14   ` Sabrina Dubroca
2024-10-30 20:58     ` Antonio Quartulli
2024-11-10 22:32   ` Sergey Ryazanov
2024-11-12 17:28     ` Sabrina Dubroca
2024-11-14 15:25     ` Antonio Quartulli
2024-11-10 23:54   ` Sergey Ryazanov
2024-11-15 14:39     ` Antonio Quartulli
2024-11-21  0:29       ` Sergey Ryazanov
2024-11-21 21:39         ` Antonio Quartulli
2024-11-20 11:45   ` Sabrina Dubroca
2024-11-21 21:41     ` Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 09/23] ovpn: implement basic RX " Antonio Quartulli
2024-10-31 11:29   ` Sabrina Dubroca
2024-10-31 13:04     ` Antonio Quartulli
2024-11-11  1:54   ` Sergey Ryazanov
2024-11-15 15:02     ` Antonio Quartulli
2024-11-26  0:32       ` Sergey Ryazanov
2024-11-26  8:49         ` Antonio Quartulli
2024-11-27  1:40           ` Antonio Quartulli
2024-11-29 13:20             ` Sabrina Dubroca
2024-12-01 23:34               ` Antonio Quartulli
2024-11-29 16:10         ` Sabrina Dubroca
2024-12-01 23:39           ` Antonio Quartulli
2024-12-02  3:53           ` Antonio Quartulli
2024-11-12  0:16   ` Sergey Ryazanov
2024-11-15 15:05     ` Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 10/23] ovpn: implement packet processing Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 11/23] ovpn: store tunnel and transport statistics Antonio Quartulli
2024-10-31 11:37   ` Sabrina Dubroca
2024-10-31 13:12     ` Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 12/23] ovpn: implement TCP transport Antonio Quartulli
2024-10-31 14:30   ` Antonio Quartulli
2024-10-31 15:25   ` Sabrina Dubroca
2024-11-16  0:33     ` Antonio Quartulli
2024-11-26  1:05       ` Sergey Ryazanov
2024-11-26  8:51         ` Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 13/23] ovpn: implement multi-peer support Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 14/23] ovpn: implement peer lookup logic Antonio Quartulli
2024-11-04 11:26   ` Sabrina Dubroca
2024-11-12  1:18     ` Sergey Ryazanov
2024-11-12 12:32       ` Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 15/23] ovpn: implement keepalive mechanism Antonio Quartulli
2024-11-05 18:10   ` Sabrina Dubroca
2024-11-12 13:20     ` Antonio Quartulli
2024-11-13 10:36       ` Sabrina Dubroca
2024-11-14  8:12         ` Antonio Quartulli
2024-11-14  9:03           ` Sabrina Dubroca
2024-11-22  9:41       ` Antonio Quartulli
2024-11-22 16:18         ` Sabrina Dubroca
2024-11-24  0:28           ` Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 16/23] ovpn: add support for updating local UDP endpoint Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 17/23] ovpn: add support for peer floating Antonio Quartulli
2024-11-04 11:24   ` Sabrina Dubroca
2024-11-12 13:52     ` Antonio Quartulli
2024-11-12 10:56   ` Sabrina Dubroca
2024-11-12 14:03     ` Antonio Quartulli
2024-11-13 11:25       ` Sabrina Dubroca
2024-11-14  8:26         ` Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 18/23] ovpn: implement peer add/get/dump/delete via netlink Antonio Quartulli
2024-11-04 15:14   ` Sabrina Dubroca
2024-11-12 14:19     ` Antonio Quartulli
2024-11-13 16:56       ` Sabrina Dubroca
2024-11-14  9:21         ` Antonio Quartulli
2024-11-20 11:12           ` Sabrina Dubroca [this message]
2024-11-20 11:34             ` Antonio Quartulli
2024-11-20 12:10               ` Sabrina Dubroca
2024-11-11 15:41   ` Sabrina Dubroca
2024-11-12 14:26     ` Antonio Quartulli
2024-11-13 11:05       ` Sabrina Dubroca
2024-11-14 10:32         ` Antonio Quartulli
2024-11-29 17:00           ` Sabrina Dubroca
2024-12-01 23:43             ` Antonio Quartulli
2024-11-21 16:02   ` Sabrina Dubroca
2024-11-21 21:43     ` Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 19/23] ovpn: implement key add/get/del/swap " Antonio Quartulli
2024-11-05 10:16   ` Sabrina Dubroca
2024-11-12 15:40     ` Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 20/23] ovpn: kill key and notify userspace in case of IV exhaustion Antonio Quartulli
2024-11-05 10:33   ` Sabrina Dubroca
2024-11-12 15:44     ` Antonio Quartulli
2024-11-13 14:28       ` Sabrina Dubroca
2024-11-14 10:38         ` Antonio Quartulli
2024-11-20 12:17           ` Sabrina Dubroca
2024-10-29 10:47 ` [PATCH net-next v11 21/23] ovpn: notify userspace when a peer is deleted Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 22/23] ovpn: add basic ethtool support Antonio Quartulli
2024-10-29 10:47 ` [PATCH net-next v11 23/23] testing/selftests: add test tool and scripts for ovpn module Antonio Quartulli
2024-10-31 10:00 ` [PATCH net-next v11 00/23] Introducing OpenVPN Data Channel Offload Antonio Quartulli
2024-11-01  2:12   ` Jakub Kicinski
2024-11-01  2:20 ` patchwork-bot+netdevbpf
2024-11-06  1:18 ` Sergey Ryazanov
2024-11-14 15:33   ` Antonio Quartulli
2024-11-14 22:10     ` Sergey Ryazanov
2024-11-15 15:08       ` Antonio Quartulli

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Zz3EEl0diYofGkIC@hog \
    --to=sd@queasysnail.net \
    --cc=andrew@lunn.ch \
    --cc=antonio@openvpn.net \
    --cc=donald.hunter@gmail.com \
    --cc=edumazet@google.com \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=ryazanov.s.a@gmail.com \
    --cc=shuah@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.