Re: [PATCH net] sctp: validate STALE_COOKIE cause length before reading staleness

Xin Long <[email protected]> Sun, 5 Jul 2026 15:12:10 -0400
Newsgroups org.kernel.vger.linux-sctp,org.kernel.vger.netdev,org.kernel.vger.stable
Message-ID <CADvbK_eJ+qePAuDF0u=rmQ2brixwmxhJRrUHi=jnbWoh169OfQ@mail.gmail.com>
On Fri, Jul 3, 2026 at 11:35 PM Weiming Shi <[email protected]> wrote:
>
> When an ERROR chunk with a STALE_COOKIE cause is received in the
> COOKIE_ECHOED state, sctp_sf_do_5_2_6_stale() reads the 4-byte Measure
> of Staleness that follows the cause header:
>
>         err   = (struct sctp_errhdr *)(chunk->skb->data);
>         stale = ntohl(*(__be32 *)((u8 *)err + sizeof(*err)));
>
> err is the first cause in the chunk, not the STALE_COOKIE cause that
> caused the dispatch, and nothing guarantees the staleness field is
> present. sctp_walk_errors() only requires a cause to be as long as the
> 4-byte header, so for a STALE_COOKIE cause of length 4 the read runs
> past the cause, and for a minimal ERROR chunk past skb->tail. The value
> is echoed to the peer in the Cookie Preservative of the reply INIT,
> leaking uninitialized memory.
>
> sctp_sf_cookie_echoed_err() already walks to the STALE_COOKIE cause, so
> check its length there and pass it to sctp_sf_do_5_2_6_stale(), which
> reads that cause instead of the first one. A STALE_COOKIE cause too
> short to hold the staleness field is discarded.
>
> The read is reachable by any peer that can drive an association into
> COOKIE_ECHOED, including an unprivileged process using a raw SCTP socket
> in a user and network namespace.
>
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Reported-by: Xiang Mei <[email protected]>
> Assisted-by: Claude:claude-opus-4-8
> Cc: [email protected]
> Signed-off-by: Weiming Shi <[email protected]>

Acked-by: Xin Long <[email protected]>