From nobody Thu Oct 2 19:28:26 2025 Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 973A72F363A for ; Thu, 11 Sep 2025 23:23:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757633010; cv=none; b=IIRxp0aV+lmH8C2Jztobvlurh0S58xO3R677kcDwFuOQMw7ullCdx0Cn2/pesF9dX5Kf9VlOsTyIc/H0VjkV93uyx0DPTdBtKiCh/43kDRUJRJxbKIzt3W2s/0kwC++/1c0nRXVFwfCyWi2LQaY9GrQNr3twiXSSv5glX6pCj3Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757633010; c=relaxed/simple; bh=OK4EM30A44/2NRD+i7sqe2wrH7v7/w7Fs43IiXrmW/k=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=OLorXKIy7TR5lKxsRw+odYYkvqLeDJgk6BlMUVcyc2mMzy538lhr0Hu8ECKGPXl67fQNMFaGE7e8U1z7sadTTJGNoCNxd2Gfi1yuLv+mTOGowu7SBuevwayTkzS2BfR9IqIvF252Qa4M76yoNWMlfrQ7+K/DC0r3ljSWMazmorI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=allelesecurity.com; spf=pass smtp.mailfrom=allelesecurity.com; dkim=pass (1024-bit key) header.d=allelesecurity.com header.i=@allelesecurity.com header.b=ebbjXFRj; arc=none smtp.client-ip=209.85.210.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=allelesecurity.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=allelesecurity.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=allelesecurity.com header.i=@allelesecurity.com header.b="ebbjXFRj" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-7722c8d2694so1371496b3a.3 for ; Thu, 11 Sep 2025 16:23:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=allelesecurity.com; s=google; t=1757633008; x=1758237808; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=xUAVZ0bvWLEB4KH4GpIrKampHs79U2eTT5vozQ57bm4=; b=ebbjXFRjyCj5eIvDcF1CwlLMPTmbjFm2KyQj2hoge9FYUM2k7WThi235HJJRA6KNBd aDAAMUIG9xAnvGOvxnSoKFglsrCwUo/FO+UGeGY4MZ6RVTMxGEsJ2UqhWZV//8CbUX9d stHyBOPWq4s6RkJYoHvWBD0qSiCfIhHrcnU24= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757633008; x=1758237808; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=xUAVZ0bvWLEB4KH4GpIrKampHs79U2eTT5vozQ57bm4=; b=cMjEpF9uUchcjxDwBhOCz1rg6NYdkKM1uESUT17BetzZSBM7b6hdJ3YfLYoIqyXKXl s8qToZDEjXgu8Ambjaf6jJDbK82hhLMElfQgjKzA7TufqS9HF6rDG8PQZ3xmme6VVs/W HA3F/s1emt/tIqHP7X7c3S8/4Z93SaG9tQ98sIdD/BV0NtahbYYBnXPhwTUtCpJOzsrg pGsshXK1O2CmBd7gajAD+OxtJjVHJFJXBdJDQlql/IUAfy4Vp2QuFT3gODn490GhdXRU qYrLdkcx0kHlXuJosS7vibIRSWRpnlPLveOcDPiBJ2ptDK/w+iWBg3eoX1md3+KPFMx7 jMfg== X-Forwarded-Encrypted: i=1; AJvYcCXR7bO/1cT6N+WCiDiOzDm0cGqwFPLyBOiA2JGxmVnZurT/69Xmm6bZJrjGv3vFlR8DkxxLsJLZwKDe/vk=@vger.kernel.org X-Gm-Message-State: AOJu0YylAuk15XAJOb6ItGXV9wt93Qbi9h6aGEofitlU/k5sZNnUaEFv iROpwakwtUylLuB0MtZzY7WJmpEvFwMQJBpUR4C0zzV/i/iqRWw1jbD08jz1NF/lNM8= X-Gm-Gg: ASbGncvX/SFDHpbiGgi23D2Xrn7TlXo2ZuFnhezN76+83ik2C8lu2L4+ntu2I1RXtLG maP+DvarhzkZIIpu7m7oz4pCXYv3dGG9DXVF6+y5SnjCV5iwn3k7S8jbVVFA+Zq3WHm/NOB5p9d vNr3tn+8CcgWviAm8h8tXFxmZOmeulsrczESE9+PXkio92YUFyfczdKTjMgegmXFEynx3VdjwEn fCmbcwDXfS9EjmVTyF+WhBUpSH/E2aJxUUgE1MgfSfSTK5zfeOPnwAOFiFR1le+cil0yu/ugRjl hKXO4Y6qicXZ4t0yScmep8u6xJINy55q4invE/hazxJOfkV4Yit+/mVzacLkYvLQlbO31uuPe+h fmksOSGM3iUYXsMu3BmsR03ZGRQvgF4h1X41Kp/iel5lHlQs= X-Google-Smtp-Source: AGHT+IFvKd338ahGShVcXp/lcPNOy/KrM/N8yKlB9s8nlHQO0F4Ghy1Sxbe8aSBOfbnPHwLPS++9sg== X-Received: by 2002:a05:6a00:b4e:b0:771:e451:4ee3 with SMTP id d2e1a72fcca58-776120e50c8mr1094199b3a.12.1757633007810; Thu, 11 Sep 2025 16:23:27 -0700 (PDT) Received: from fedoraserver42research ([179.105.152.82]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7760955263fsm2927152b3a.8.2025.09.11.16.23.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Sep 2025 16:23:27 -0700 (PDT) From: Anderson Nascimento To: Eric Dumazet , Neal Cardwell , Kuniyuki Iwashima , "David S. Miller" , David Ahern , Jakub Kicinski , Paolo Abeni , Simon Horman , Dmitry Safonov <0x7f454c46@gmail.com>, Salam Noureddine , Francesco Ruggeri Cc: Anderson Nascimento , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org Subject: [PATCH v3] net/tcp: Fix a NULL pointer dereference when using TCP-AO with TCP_REPAIR Date: Thu, 11 Sep 2025 20:07:44 -0300 Message-ID: <20250911230743.2551-3-anderson@allelesecurity.com> X-Mailer: git-send-email 2.51.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" A NULL pointer dereference can occur in tcp_ao_finish_connect() during a connect() system call on a socket with a TCP-AO key added and TCP_REPAIR enabled. The function is called with skb being NULL and attempts to dereference it on tcp_hdr(skb)->seq without a prior skb validation. Fix this by checking if skb is NULL before dereferencing it. The commentary is taken from bpf_skops_established(), which is also called in the same flow. Unlike the function being patched, bpf_skops_established() validates the skb before dereferencing it. int main(void){ struct sockaddr_in sockaddr; struct tcp_ao_add tcp_ao; int sk; int one =3D 1; memset(&sockaddr,'\0',sizeof(sockaddr)); memset(&tcp_ao,'\0',sizeof(tcp_ao)); sk =3D socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr.sin_family =3D AF_INET; memcpy(tcp_ao.alg_name,"cmac(aes128)",12); memcpy(tcp_ao.key,"ABCDEFGHABCDEFGH",16); tcp_ao.keylen =3D 16; memcpy(&tcp_ao.addr,&sockaddr,sizeof(sockaddr)); setsockopt(sk, IPPROTO_TCP, TCP_AO_ADD_KEY, &tcp_ao, sizeof(tcp_ao)); setsockopt(sk, IPPROTO_TCP, TCP_REPAIR, &one, sizeof(one)); sockaddr.sin_family =3D AF_INET; sockaddr.sin_port =3D htobe16(123); inet_aton("127.0.0.1", &sockaddr.sin_addr); connect(sk,(struct sockaddr *)&sockaddr,sizeof(sockaddr)); return 0; } $ gcc tcp-ao-nullptr.c -o tcp-ao-nullptr -Wall $ unshare -Urn # ip addr add 127.0.0.1 dev lo # ./tcp-ao-nullptr BUG: kernel NULL pointer dereference, address: 00000000000000b6 PGD 1f648d067 P4D 1f648d067 PUD 1982e8067 PMD 0 Oops: Oops: 0000 [#1] SMP NOPTI Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 11/12/2020 RIP: 0010:tcp_ao_finish_connect (net/ipv4/tcp_ao.c:1182) Fixes: 7c2ffaf ("net/tcp: Calculate TCP-AO traffic keys") Signed-off-by: Anderson Nascimento Reviewed-by: Dmitry Safonov <0x7f454c46@gmail.com> Reviewed-by: Eric Dumazet --- Changes in v3 - Remove the attribution of 'ao->risn' to '0' in the else case. - Do not add the full decoded stack trace - Link to v2: https://lore.kernel.org/all/20250911034337.43331-2-anderson@a= llelesecurity.com/ Changes in v2: - Wrap the description at 75 columns - Add full decoded stack trace - Link to v1: https://lore.kernel.org/all/20250911013052.2233-1-anderson@al= lelesecurity.com/ net/ipv4/tcp_ao.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/net/ipv4/tcp_ao.c b/net/ipv4/tcp_ao.c index bbb8d5f0eae7..3338b6cc85c4 100644 --- a/net/ipv4/tcp_ao.c +++ b/net/ipv4/tcp_ao.c @@ -1178,7 +1178,9 @@ void tcp_ao_finish_connect(struct sock *sk, struct sk= _buff *skb) if (!ao) return; =20 - WRITE_ONCE(ao->risn, tcp_hdr(skb)->seq); + /* sk with TCP_REPAIR_ON does not have skb in tcp_finish_connect */ + if (skb) + WRITE_ONCE(ao->risn, tcp_hdr(skb)->seq); ao->rcv_sne =3D 0; =20 hlist_for_each_entry_rcu(key, &ao->head, node, lockdep_sock_is_held(sk)) --=20 2.51.0