---
id: "CVE-2026-98531"
kind: "vulnerability"
aliases: ["CVE-2026-98531"]
title: "Linux kernel: short SEG6 netlink attribute leaks kernel heap memory to userspace"
severity: "low"
cvss: null
epss: null
exploited: false
status: "open"
category: "infrastructure"
products: []
ecosystems: []
tags: ["infrastructure", "kernel", "linux", "self-hosted", "srv6"]
not_affected_if: ["default-config", "no-srv6"]
published_at: "2026-10-18T16:17:04+00:00"
first_seen_at: "2026-10-23T21:57:15+00:00"
updated_at: "2026-10-25T05:23:53+00:00"
sources: [{"source": "nvd", "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-98531", "first_seen_at": "2026-10-23T21:57:15+00:00"}]
---

# Linux kernel: short SEG6 netlink attribute leaks kernel heap memory to userspace

A short SEG6_ATTR_DST netlink attribute makes the kernel copy 16 bytes past the end of a buffer into the SRv6 tunnel source address. That value is then returned to userspace through SEG6_CMD_GET_TUNSRC, leaking uninitialized kernel heap memory.

_Summary, check and fix written by a model from the sources; labelled as such._

## How to check

- `uname -r` and compare against the kernel release that contains the upstream fix for this CVE; the sources do not name the fixed version
- `lsmod | grep seg6` or `grep -i seg6 /proc/net/ipv6_route` to see whether SRv6 (seg6) support is in use
- unknown whether the sources name a specific vulnerable version range

## Fix

- Update the Linux kernel to a release that includes the upstream commit enforcing exact length for SEG6_ATTR_DST (version not named in the sources)
- Until patched, restrict Generic Netlink access to the IPv6 SEG6 family to trusted root processes only

## Timeline

- 2026-10-23T21:57:15+00:00 nvd https://nvd.nist.gov/vuln/detail/CVE-2026-98531

## From the sources

In the Linux kernel, the following vulnerability has been resolved:

ipv6: sr: enforce exact attribute length for SEG6_ATTR_DST

In seg6_genl_policy, SEG6_ATTR_DST is defined with .type = NLA_BINARY and
.len = sizeof(struct in6_addr). For NLA_BINARY, .len only enforces the
maximum payload length and permits shorter payloads (e.g., 0 bytes).
When seg6_genl_set_tunsrc() copies sizeof(struct in6_addr) bytes via
kmemdup(val, sizeof(*val), GFP_KERNEL), a short SEG6_ATTR_DST attribute
triggers a 16-byte out-of-bounds read past skb->tail into uninitialized
skb->head memory, which is stored in sdata->tun_src and leaked back to
userspace via SEG6_CMD_GET_TUNSRC.

Switch SEG6_ATTR_DST in seg6_genl_policy to
NLA_POLICY_EXACT_LEN(sizeof(struct in6_addr)) so that generic netlink
validation rejects any attribute whose length is not exactly
sizeof(struct in6_addr) with -ERANGE.

Tested in QEMU against Linux 7.3.0-rc3 by sending a SEG6_CMD_SET_TUNSRC
Generic Netlink message with a 0-byte SEG6_ATTR_DST attribute followed
by SEG6_CMD_GET_TUNSRC. On the unfixed kernel, SEG6_CMD_SET_TUNSRC
succeeds (err = 0) and SEG6_CMD_GET_TUNSRC leaks 16 bytes of
uninitialized kernel heap memory (tun_src =
836a61ecc4d25a1042a8d60411cfb378); with this patch applied,
SEG6_CMD_SET_TUNSRC is rejected by netlink policy validation with
-ERANGE (-34) and tun_src remains zeroed.

---

_Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai_
