NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/60669: netipsec key_sp2msg buffer overrun
Great, thanks for the review, I will incorporate it into an updated
patch shortly!
> Date: Mon, 7 Sep 2026 12:16:19 +0900
> From: Kengo Nakahara <k-nakahara%iij.ad.jp@localhost>
>
> # Add CC to ohishi who is IIJ IPsec co-worker
>
> On 2026/09/01 1:26, Taylor R Campbell wrote:
> > Patch attached to fix and add tests for setsockopt/getsockopt2
> > IPV6_IPSEC_POLICY buffer overrun. Review welcome!
> >
> > Questions: Does it make sense to have mismatched src/dst address
> > families in a single IPsec policy? Does it make sense to have a
> > number of addresses in a policy other than zero or two? If not, we
> > can block those various cases earlier and update the tests.
>
> It does not make sense neither of them. So, I think those cases
> can be blocked.
>
>
> > Should maybe do similarly for IPv4 but there's currently no getsockopt
> > or getsockopt2 path for it anyway -- it's under #if 0:
> >
> > 1392 #if 0 /* defined(IPSEC) */
> > 1393 case IP_IPSEC_POLICY:
> > 1394 {
> > 1395 struct mbuf *m = NULL;
> > 1396
> > 1397 /* XXX this will return EINVAL as sopt is empty */
> > 1398 error = ipsec_get_policy(inp, sopt->sopt_data,
> > 1399 sopt->sopt_size, &m);
> > 1400 if (error == 0)
> > 1401 error = sockopt_setmbuf(sopt, m);
> > 1402 break;
> > 1403 }
> > 1404 #endif /*IPSEC*/
> >
> > https://nxr.NetBSD.org/xref/src/sys/netinet/ip_output.c?r=1.330#1392
> >
> > The IPv6 version has the same comment but it is wrong because
> > getsockopt2 does allow the caller to pass input through sopt:
> >
> > 1934 #if defined(IPSEC)
> > 1935 case IPV6_IPSEC_POLICY:
> > 1936 if (ipsec_used) {
> > 1937 struct mbuf *m = NULL;
> > 1938
> > 1939 /*
> > 1940 * XXX: this will return EINVAL as sopt is
> > 1941 * empty
> > 1942 */
> > 1943 error = ipsec_get_policy(inp, sopt->sopt_data,
> > 1944 sopt->sopt_size, &m);
> > 1945 if (!error)
> > 1946 error = sockopt_setmbuf(sopt, m);
> > 1947 } else
> > 1948 error = ENOPROTOOPT;
> > 1949 break;
> > 1950 #endif /* IPSEC */
> >
> > https://nxr.NetBSD.org/xref/src/sys/netinet6/ip6_output.c?r=1.235#1934
>
> I think that codes would be changed as they are old codes originated
> from FAST_IPSEC,
>
>
> At a glance of patch,
> - It seems IS_PFKEY_ALIGNED (or more appropriate name macro)
> should be introduced instead by (foo % 8) != 0 directly
> - The following diff should be used KASSERTMSG instead of a comment
> and KASSERT
> ====================
> @@ -2024,11 +2044,7 @@ static struct secpolicy *
> tlen -= xisr->sadb_x_ipsecrequest_len;
>
> /* validity check */
> - if (tlen < 0) {
> - IPSECLOG(LOG_DEBUG, "becoming tlen < 0.\n");
> - *error = EINVAL;
> - goto free_exit;
> - }
> + KASSERT(tlen >= 0);
> ====================
>
> The other parts look good to me.
>
>
> --
> //////////////////////////////////////////////////////////////////////
> Internet Initiative Japan Inc.
>
> Device Engineering Section,
> Core Product Development Department,
> Network Division,
> Network Services Business Unit
>
> Kengo NAKAHARA <k-nakahara%iij.ad.jp@localhost>
>
>
>
Home |
Main Index |
Thread Index |
Old Index