linux/net/tipc
Jérémy Jean 512ccd3d0e tipc: prevent GCM nonce reuse on peer key changes
TIPC can encrypt traffic between nodes using a different transmit key
for each node. In this mode, the AES-GCM nonce for a packet sent to a
known peer consists of a 32-bit prefix (a per-key salt XOR the peer's
address) followed by a 64-bit counter. That counter is stored in the
peer's RX crypto object. When the peer reports a change in which key
it uses to receive packets, TIPC resets this counter. The sender can
still be using the same TX key and salt, so subsequent packets reuse
earlier nonces. This nonce reuse breaks confidentiality and exposes
GCM's authentication key. This makes forgeries trivial: an attacker
can exploit CTR malleability to alter captured ciphertexts and use the
recovered authentication key to compute a valid tag for the modified
ciphertext, under the same key and nonce.

Use the TX key's existing aead->seqno counter instead. All encryptions
using that key object share the same atomic counter, so concurrent
encryptions get distinct nonce counter values. The counter survives
key activation and peer reconnection, and peer key-status reports
cannot reset it. This prevents those transitions from causing nonce
reuse while the same TX key remains installed.

The nonce format is unchanged, and receivers do not require consecutive
counter values, so sharing the counter across peers remains compatible
with existing receivers. A pre-existing check still invokes key
revocation in the unlikely event that the counter wraps to zero.

Fixes: fc1b6d6de2 ("tipc: introduce TIPC encryption & authentication")
Signed-off-by: Jérémy Jean <Jeremy.Jean@oss.cyber.gouv.fr>
Reviewed-by: Tung Nguyen <tung.quang.nguyen@est.tech>
Link: https://patch.msgid.link/20260924202105.3722778-1-Jeremy.Jean@oss.cyber.gouv.fr
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2026-09-28 18:21:34 -07:00
..
addr.c tipc: adjust tipc_nodeid2string() to return string length 2025-09-30 11:22:39 +02:00
addr.h tipc: adjust tipc_nodeid2string() to return string length 2025-09-30 11:22:39 +02:00
bcast.c tipc: fix out-of-bounds read in broadcast Gap ACK blocks 2026-06-29 17:30:20 -07:00
bcast.h tipc: fix out-of-bounds read in broadcast Gap ACK blocks 2026-06-29 17:30:20 -07:00
bearer.c tipc: fix UAF in tipc_l2_send_msg() 2026-06-15 12:50:29 -07:00
bearer.h
core.c tipc: avoid busy looping in tipc_exit_net() 2026-06-25 08:53:00 -07:00
core.h kernel.h: drop hex.h and update all hex.h users 2026-01-20 19:44:19 -08:00
crypto.c tipc: prevent GCM nonce reuse on peer key changes 2026-09-28 18:21:34 -07:00
crypto.h
diag.c sock_diag: add module pointer to "struct sock_diag_handler" 2024-01-23 15:13:54 +01:00
discover.c tipc: fix use-after-free of the discoverer in tipc_disc_rcv() 2026-06-21 14:28:22 -07:00
discover.h
eth_media.c
group.c tipc: reject invalid and unexpected GRP_ACK_MSG to prevent bc_ackers underflow 2026-09-18 15:42:47 -07:00
group.h
ib_media.c
Kconfig ipv6: convert CONFIG_IPV6 to built-in only and clean up Kconfigs 2026-03-29 11:21:22 -07:00
link.c tipc: Dont send random pad bytes in RESET/ACTIVATE messages 2026-08-31 20:02:36 -07:00
link.h tipc: Remove unused declaration tipc_link_build_bc_sync_msg() 2023-08-09 13:03:14 -07:00
Makefile tipc: rename the module name diag to tipc_diag 2024-02-06 13:47:36 +01:00
monitor.c tipc: Fix a data race on mon->peer_cnt in mon_timeout() 2026-09-24 10:21:45 -07:00
monitor.h
msg.c tipc: fix double-free in tipc_buf_append() 2026-04-23 11:45:01 -07:00
msg.h
name_distr.c tipc: reject inverted service ranges from peer bindings 2026-06-11 16:01:16 -07:00
name_distr.h
name_table.c tipc: fix NULL deref in tipc_named_node_up() on empty publication list 2026-08-31 20:01:49 -07:00
name_table.h net: tipc: remove one synchronize_net() from tipc_nametbl_stop() 2024-12-06 17:41:28 -08:00
net.c tipc: Fix use-after-free in tipc_mon_reinit_self(). 2025-11-10 18:14:40 -08:00
net.h
netlink_compat.c tipc: fix infinite loop in __tipc_nl_compat_dumpit 2026-07-21 15:12:23 -07:00
netlink.c tipc: fix u16 MTU truncation in media and bearer MTU validation 2026-07-23 11:41:03 +02:00
netlink.h
node.c tipc: protect node reset trace dump with node lock 2026-08-28 14:35:19 -07:00
node.h
socket.c tipc: avoid use-after-free in poll trace queue dumps 2026-07-27 15:18:59 -07:00
socket.h
subscr.c treewide: Replace kmalloc with kmalloc_obj for non-scalar types 2026-02-21 01:02:28 -08:00
subscr.h
sysctl.c net: Remove ctl_table sentinel elements from several networking subsystems 2024-05-03 13:29:42 +01:00
topsrv.c treewide: Replace kmalloc with kmalloc_obj for non-scalar types 2026-02-21 01:02:28 -08:00
topsrv.h
trace.c
trace.h tracing/treewide: Remove second parameter of __assign_str() 2024-05-22 20:14:47 -04:00
udp_media.c tipc: serialize udp bearer replicast list updates 2026-07-21 11:57:21 -07:00
udp_media.h