net/ax25/ax25_in.c | 5 +++++ 1 file changed, 5 insertions(+)
A remote station can send a crafted KISS frame that is just long enough
to pass ax25_addr_parse() (minimum 14 address bytes) but carries no
control or PID bytes. After ax25_kiss_rcv() strips the KISS framing
byte and ax25_rcv() strips the address header with skb_pull(), skb->len
drops to zero. The subsequent reads of skb->data[0] (control byte) and
skb->data[1] (PID byte) are then out of bounds, which can crash the
kernel or leak heap memory to a remote attacker.
Use pskb_may_pull(skb, 2) after the skb_pull() to ensure both bytes
are in the linear area before reading them. Discard malformed frames
that carry no control/PID pair.
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Cc: stable@vger.kernel.org
Signed-off-by: Ashutosh Desai <ashutoshdesai993@gmail.com>
---
V2 -> V3: remove incorrect Suggested-by; add symptom, Fixes, Cc stable
V1 -> V2: use pskb_may_pull(skb, 2) instead of skb->len < 2
v2: https://lore.kernel.org/netdev/20260409152400.2219716-1-ashutoshdesai993@gmail.com/
v1: https://lore.kernel.org/netdev/20260409012235.2049389-1-ashutoshdesai993@gmail.com/
net/ax25/ax25_in.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/net/ax25/ax25_in.c b/net/ax25/ax25_in.c
index d75b3e9ed93d..6a71dea876a1 100644
--- a/net/ax25/ax25_in.c
+++ b/net/ax25/ax25_in.c
@@ -217,6 +217,11 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
*/
skb_pull(skb, ax25_addr_size(&dp));
+ if (!pskb_may_pull(skb, 2)) {
+ kfree_skb(skb);
+ return 0;
+ }
+
/* For our port addresses ? */
if (ax25cmp(&dest, dev_addr) == 0 && dp.lastrepeat + 1 == dp.ndigi)
mine = 1;
--
2.34.1
On Wed, 15 Apr 2026 06:36:54 +0000 Ashutosh Desai <ashutoshdesai993@gmail.com> wrote: > A remote station can send a crafted KISS frame that is just long enough > to pass ax25_addr_parse() (minimum 14 address bytes) but carries no > control or PID bytes. After ax25_kiss_rcv() strips the KISS framing > byte and ax25_rcv() strips the address header with skb_pull(), skb->len > drops to zero. The subsequent reads of skb->data[0] (control byte) and > skb->data[1] (PID byte) are then out of bounds, which can crash the > kernel or leak heap memory to a remote attacker. > > Use pskb_may_pull(skb, 2) after the skb_pull() to ensure both bytes > are in the linear area before reading them. Discard malformed frames > that carry no control/PID pair. Is it just worth linearising the skb on entry to all this code? I believe all the frames are relatively short and low frequency. So the actual overhead is insignificant, but it makes all the sanity checks trivial. It is even likely (hand waving) that the extra copy for non-linear data is faster than all the checks for non-linear data. David
On Wed, 15 Apr 2026 08:59:21 +0100, David Laight wrote: > Is it just worth linearising the skb on entry to all this code? Thanks for the feedback, David. skb_linearize() on entry is a nice idea for simplifying sanity checks overall, but it wouldn't fix this particular bug on its own - the issue is skb->len dropping to zero after skb_pull(), not non-linear data. We'd still need a length check regardless. pskb_may_pull(skb, 2) handles both in one call. That said, linearizing on entry to ax25_rcv() as a cleanup to simplify future checks sounds worthwhile - happy to send that as a separate net-next patch.
On Wed, 15 Apr 2026 22:39:13 -0700 (PDT) Ashutosh Desai <ashutoshdesai993@gmail.com> wrote: > On Wed, 15 Apr 2026 08:59:21 +0100, David Laight wrote: > > Is it just worth linearising the skb on entry to all this code? > > Thanks for the feedback, David. > > skb_linearize() on entry is a nice idea for simplifying sanity checks > overall, but it wouldn't fix this particular bug on its own - the issue > is skb->len dropping to zero after skb_pull(), not non-linear data. We'd > still need a length check regardless. pskb_may_pull(skb, 2) handles both > in one call. The skb->len >= 2 check will be a lot cheaper/smaller. > That said, linearizing on entry to ax25_rcv() as a cleanup to simplify > future checks sounds worthwhile - happy to send that as a separate > net-next patch. I think you proposed just checking skb->len in an earlier version and it was pointed out that the skb may not be linear. So perhaps linearize as part of this fix and leave the simplifcation of any other checks to later. David
© 2016 - 2026 Red Hat, Inc.