In the Linux kernel, the following vulnerability has been resolved:
net: gso: fix tcp fraglist segmentation after pull from frag_list
Detect tcp gso fraglist skbs with corrupted geometry (see below) and pass these to skbsegment instead of skbsegment_list, as the first can segment them correctly.
Valid SKBGSOFRAGLIST skbs - consist of two or more segments - the headskb holds the protocol headers plus first gsosize - one or more fraglist skbs hold exactly one segment - all but the last must be gsosize
Optional datapath hooks such as NAT and BPF (bpfskbpull_data) can modify these skbs, breaking these invariants.
In extreme cases they pull all data into skb linear. For TCP, this causes a NULL ptr deref in _tcpv4gsosegmentlistcsum at tcphdr(seg->next).
Detect invalid geometry due to pull, by checking headskb size. Don't just drop, as this may blackhole a destination. Convert to be able to pass to regular skbsegment.
Approach and description based on a patch by Willem de Bruijn.
[
{
"id": "CVE-2024-49979-122258ce",
"signature_version": "v1",
"digest": {
"threshold": 0.9,
"line_hashes": [
"56387134809962608341494010905859999562",
"227103517599621073544104981159870196350",
"87263406355633740603457103025065243381",
"200653149844315740259174967157819596276",
"250889090244361684796187743949254983295"
]
},
"deprecated": false,
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@2d4a83a44428de45bfe9dccb0192a3711d1097e0",
"target": {
"file": "net/ipv6/tcpv6_offload.c"
}
},
{
"id": "CVE-2024-49979-6f17203f",
"signature_version": "v1",
"digest": {
"threshold": 0.9,
"line_hashes": [
"212290896144711036329098654200154777314",
"186530196652517783846253127969123995117",
"65422015830399982319461704833716288904",
"95673438848089595686462915441403890505",
"208526324895084836083301095907164036249"
]
},
"deprecated": false,
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@2d4a83a44428de45bfe9dccb0192a3711d1097e0",
"target": {
"file": "net/ipv4/tcp_offload.c"
}
},
{
"id": "CVE-2024-49979-7eeeb602",
"signature_version": "v1",
"digest": {
"length": 606.0,
"function_hash": "220537836834447767687717296563233807669"
},
"deprecated": false,
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@3fdd8c83e83fa5e82f1b5585245c51e0355c9f46",
"target": {
"file": "net/ipv4/tcp_offload.c",
"function": "tcp4_gso_segment"
}
},
{
"id": "CVE-2024-49979-ace02a5a",
"signature_version": "v1",
"digest": {
"threshold": 0.9,
"line_hashes": [
"212290896144711036329098654200154777314",
"186530196652517783846253127969123995117",
"65422015830399982319461704833716288904",
"95673438848089595686462915441403890505",
"208526324895084836083301095907164036249"
]
},
"deprecated": false,
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@3fdd8c83e83fa5e82f1b5585245c51e0355c9f46",
"target": {
"file": "net/ipv4/tcp_offload.c"
}
},
{
"id": "CVE-2024-49979-c322cc2f",
"signature_version": "v1",
"digest": {
"length": 624.0,
"function_hash": "205894184038906144734909421365586707403"
},
"deprecated": false,
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@2d4a83a44428de45bfe9dccb0192a3711d1097e0",
"target": {
"file": "net/ipv6/tcpv6_offload.c",
"function": "tcp6_gso_segment"
}
},
{
"id": "CVE-2024-49979-cf265f0d",
"signature_version": "v1",
"digest": {
"length": 606.0,
"function_hash": "220537836834447767687717296563233807669"
},
"deprecated": false,
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@17bd3bd82f9f79f3feba15476c2b2c95a9b11ff8",
"target": {
"file": "net/ipv4/tcp_offload.c",
"function": "tcp4_gso_segment"
}
},
{
"id": "CVE-2024-49979-d8ae3d19",
"signature_version": "v1",
"digest": {
"threshold": 0.9,
"line_hashes": [
"212290896144711036329098654200154777314",
"186530196652517783846253127969123995117",
"65422015830399982319461704833716288904",
"95673438848089595686462915441403890505",
"208526324895084836083301095907164036249"
]
},
"deprecated": false,
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@17bd3bd82f9f79f3feba15476c2b2c95a9b11ff8",
"target": {
"file": "net/ipv4/tcp_offload.c"
}
},
{
"id": "CVE-2024-49979-da4fddbf",
"signature_version": "v1",
"digest": {
"length": 624.0,
"function_hash": "205894184038906144734909421365586707403"
},
"deprecated": false,
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@17bd3bd82f9f79f3feba15476c2b2c95a9b11ff8",
"target": {
"file": "net/ipv6/tcpv6_offload.c",
"function": "tcp6_gso_segment"
}
},
{
"id": "CVE-2024-49979-de5bdd3c",
"signature_version": "v1",
"digest": {
"threshold": 0.9,
"line_hashes": [
"56387134809962608341494010905859999562",
"227103517599621073544104981159870196350",
"87263406355633740603457103025065243381",
"200653149844315740259174967157819596276",
"250889090244361684796187743949254983295"
]
},
"deprecated": false,
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@3fdd8c83e83fa5e82f1b5585245c51e0355c9f46",
"target": {
"file": "net/ipv6/tcpv6_offload.c"
}
},
{
"id": "CVE-2024-49979-e1f320b1",
"signature_version": "v1",
"digest": {
"length": 606.0,
"function_hash": "220537836834447767687717296563233807669"
},
"deprecated": false,
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@2d4a83a44428de45bfe9dccb0192a3711d1097e0",
"target": {
"file": "net/ipv4/tcp_offload.c",
"function": "tcp4_gso_segment"
}
},
{
"id": "CVE-2024-49979-e7fe850c",
"signature_version": "v1",
"digest": {
"length": 624.0,
"function_hash": "205894184038906144734909421365586707403"
},
"deprecated": false,
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@3fdd8c83e83fa5e82f1b5585245c51e0355c9f46",
"target": {
"file": "net/ipv6/tcpv6_offload.c",
"function": "tcp6_gso_segment"
}
},
{
"id": "CVE-2024-49979-e928ef34",
"signature_version": "v1",
"digest": {
"threshold": 0.9,
"line_hashes": [
"56387134809962608341494010905859999562",
"227103517599621073544104981159870196350",
"87263406355633740603457103025065243381",
"200653149844315740259174967157819596276",
"250889090244361684796187743949254983295"
]
},
"deprecated": false,
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@17bd3bd82f9f79f3feba15476c2b2c95a9b11ff8",
"target": {
"file": "net/ipv6/tcpv6_offload.c"
}
}
]