The offset value is used in pointer math on skb->data.
Since ipv6_skip_exthdr may return -1 the pointer to uh and th
may not point to the actual udp and tcp headers and potentially
overwrite other stuff. This is why I think this should be checked.
Signed-off-by: Jordy Zomer <redacted>
---
net/ipv6/esp6.c | 5 +++++
1 file changed, 5 insertions(+)
@@ -808,6 +808,11 @@ int esp6_input_done2(struct sk_buff *skb, int err)structtcphdr*th;offset=ipv6_skip_exthdr(skb,offset,&nexthdr,&frag_off);++if(offset<0)+err=-EINVAL;+gotoout;+uh=(void*)(skb->data+offset);th=(void*)(skb->data+offset);hdr_len+=offset;
On Wed, Nov 17, 2021 at 07:16:10PM +0100, Jordy Zomer wrote:
quoted hunk
The offset value is used in pointer math on skb->data.
Since ipv6_skip_exthdr may return -1 the pointer to uh and th
may not point to the actual udp and tcp headers and potentially
overwrite other stuff. This is why I think this should be checked.
Signed-off-by: Jordy Zomer <redacted>
---
net/ipv6/esp6.c | 5 +++++
1 file changed, 5 insertions(+)
@@ -808,6 +808,11 @@ int esp6_input_done2(struct sk_buff *skb, int err)structtcphdr*th;offset=ipv6_skip_exthdr(skb,offset,&nexthdr,&frag_off);++if(offset<0)+err=-EINVAL;+gotoout;+
Ew. Yeah, it seems like ipv6_skip_exthdr() needs to be checked in a lot
of places. If this is part of protocol decoding, I'm surprised fuzzers
haven't found this? Is this state reachable?
I assume so, as there have been similar fixes in the past:
https://git.kernel.org/linus/92c6058024e87087cf1b99b0389d67c0a886360e
On Wed, Nov 17, 2021 at 07:16:10PM +0100, Jordy Zomer wrote:
quoted hunk
The offset value is used in pointer math on skb->data.
Since ipv6_skip_exthdr may return -1 the pointer to uh and th
may not point to the actual udp and tcp headers and potentially
overwrite other stuff. This is why I think this should be checked.
Signed-off-by: Jordy Zomer <redacted>
---
net/ipv6/esp6.c | 5 +++++
1 file changed, 5 insertions(+)
@@ -808,6 +808,11 @@ int esp6_input_done2(struct sk_buff *skb, int err)structtcphdr*th;offset=ipv6_skip_exthdr(skb,offset,&nexthdr,&frag_off);++if(offset<0)+err=-EINVAL;+gotoout;+
The offset value is used in pointer math on skb->data.
Since ipv6_skip_exthdr may return -1 the pointer to uh and th
may not point to the actual udp and tcp headers and potentially
overwrite other stuff. This is why I think this should be checked.
EDIT: added {}'s, thanks Kees
Signed-off-by: Jordy Zomer <redacted>
---
net/ipv6/esp6.c | 6 ++++++
1 file changed, 6 insertions(+)
@@ -808,6 +808,12 @@ int esp6_input_done2(struct sk_buff *skb, int err)structtcphdr*th;offset=ipv6_skip_exthdr(skb,offset,&nexthdr,&frag_off);++if(offset<0){+err=-EINVAL;+gotoout;+}+uh=(void*)(skb->data+offset);th=(void*)(skb->data+offset);hdr_len+=offset;
Hello:
This patch was applied to netdev/net.git (master)
by David S. Miller [off-list ref]:
On Wed, 17 Nov 2021 20:06:48 +0100 you wrote:
The offset value is used in pointer math on skb->data.
Since ipv6_skip_exthdr may return -1 the pointer to uh and th
may not point to the actual udp and tcp headers and potentially
overwrite other stuff. This is why I think this should be checked.
EDIT: added {}'s, thanks Kees
[...]