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]>