In the Linux kernel, the following vulnerability has been resolved:
seg6: fix parameter passing when calling NF_HOOK() in End.DX4 and End.DX6 behaviors
inputactionenddx4() and inputactionenddx6() are called NFHOOK() for PREROUTING hook, in PREROUTING hook, we should passing a valid indev, and a NULL outdev to NFHOOK(), otherwise may trigger a NULL pointer dereference, as below:
[74830.647293] BUG: kernel NULL pointer dereference, address: 0000000000000090
[74830.655633] #PF: supervisor read access in kernel mode
[74830.657888] #PF: error_code(0x0000) - not-present page
[74830.659500] PGD 0 P4D 0
[74830.660450] Oops: 0000 [#1] PREEMPT SMP PTI
...
[74830.664953] Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
[74830.666569] RIP: 0010:rpfilter_mt+0x44/0x15e [ipt_rpfilter]
...
[74830.689725] Call Trace:
[74830.690402] <IRQ>
[74830.690953] ? show_trace_log_lvl+0x1c4/0x2df
[74830.692020] ? show_trace_log_lvl+0x1c4/0x2df
[74830.693095] ? ipt_do_table+0x286/0x710 [ip_tables]
[74830.694275] ? __die_body.cold+0x8/0xd
[74830.695205] ? page_fault_oops+0xac/0x140
[74830.696244] ? exc_page_fault+0x62/0x150
[74830.697225] ? asm_exc_page_fault+0x22/0x30
[74830.698344] ? rpfilter_mt+0x44/0x15e [ipt_rpfilter]
[74830.699540] ipt_do_table+0x286/0x710 [ip_tables]
[74830.700758] ? ip6_route_input+0x19d/0x240
[74830.701752] nf_hook_slow+0x3f/0xb0
[74830.702678] input_action_end_dx4+0x19b/0x1e0
[74830.703735] ? input_action_end_t+0xe0/0xe0
[74830.704734] seg6_local_input_core+0x2d/0x60
[74830.705782] lwtunnel_input+0x5b/0xb0
[74830.706690] __netif_receive_skb_one_core+0x63/0xa0
[74830.707825] process_backlog+0x99/0x140
[74830.709538] __napi_poll+0x2c/0x160
[74830.710673] net_rx_action+0x296/0x350
[74830.711860] __do_softirq+0xcb/0x2ac
[74830.713049] do_softirq+0x63/0x90
inputactionenddx4() passing a NULL indev to NFHOOK(), and finally trigger a NULL dereference in rpfiltermt()->rpfilteris_loopback():
static bool
rpfilter_is_loopback(const struct sk_buff *skb,
const struct net_device *in)
{
// in is NULL
return skb->pkt_type == PACKET_LOOPBACK ||
in->flags & IFF_LOOPBACK;
}
[
{
"signature_type": "Line",
"deprecated": false,
"target": {
"file": "net/ipv6/seg6_local.c"
},
"digest": {
"line_hashes": [
"164457310457610540274048716585600107871",
"317405441756421568586162215725723976939",
"232173707820377754568847562708441652586",
"112537778728950590411125657879027143237",
"239027692763360624645316168539033995275",
"191713322869440693724339832916349678950",
"31883665925236750844525303215787700755",
"18449001219789432680335240449340236203",
"335766982723495666389473300227288896853",
"161379884539804500852740714453503592378"
],
"threshold": 0.9
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9a3bc8d16e0aacd65c31aaf23a2bced3288a7779",
"signature_version": "v1",
"id": "CVE-2024-40957-22e60509"
},
{
"signature_type": "Line",
"deprecated": false,
"target": {
"file": "net/ipv6/seg6_local.c"
},
"digest": {
"line_hashes": [
"164457310457610540274048716585600107871",
"317405441756421568586162215725723976939",
"232173707820377754568847562708441652586",
"112537778728950590411125657879027143237",
"239027692763360624645316168539033995275",
"191713322869440693724339832916349678950",
"31883665925236750844525303215787700755",
"18449001219789432680335240449340236203",
"335766982723495666389473300227288896853",
"161379884539804500852740714453503592378"
],
"threshold": 0.9
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@d62df86c172033679d744f07d89e93e367dd11f6",
"signature_version": "v1",
"id": "CVE-2024-40957-25e371bc"
},
{
"signature_type": "Function",
"deprecated": false,
"target": {
"file": "net/ipv6/seg6_local.c",
"function": "input_action_end_dx6"
},
"digest": {
"length": 537.0,
"function_hash": "191133065979154922632106526573977589157"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@d62df86c172033679d744f07d89e93e367dd11f6",
"signature_version": "v1",
"id": "CVE-2024-40957-8b19b9c1"
},
{
"signature_type": "Line",
"deprecated": false,
"target": {
"file": "net/ipv6/seg6_local.c"
},
"digest": {
"line_hashes": [
"164457310457610540274048716585600107871",
"317405441756421568586162215725723976939",
"232173707820377754568847562708441652586",
"112537778728950590411125657879027143237",
"239027692763360624645316168539033995275",
"191713322869440693724339832916349678950",
"31883665925236750844525303215787700755",
"18449001219789432680335240449340236203",
"335766982723495666389473300227288896853",
"161379884539804500852740714453503592378"
],
"threshold": 0.9
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@af90e3d73dc45778767b2fb6e7edd57ebe34380d",
"signature_version": "v1",
"id": "CVE-2024-40957-b99eee8f"
},
{
"signature_type": "Function",
"deprecated": false,
"target": {
"file": "net/ipv6/seg6_local.c",
"function": "input_action_end_dx4"
},
"digest": {
"length": 581.0,
"function_hash": "204286372896530070269657077249322430834"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@d62df86c172033679d744f07d89e93e367dd11f6",
"signature_version": "v1",
"id": "CVE-2024-40957-c2ba3cc8"
},
{
"signature_type": "Function",
"deprecated": false,
"target": {
"file": "net/ipv6/seg6_local.c",
"function": "input_action_end_dx6"
},
"digest": {
"length": 537.0,
"function_hash": "191133065979154922632106526573977589157"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@af90e3d73dc45778767b2fb6e7edd57ebe34380d",
"signature_version": "v1",
"id": "CVE-2024-40957-d4d039b2"
},
{
"signature_type": "Function",
"deprecated": false,
"target": {
"file": "net/ipv6/seg6_local.c",
"function": "input_action_end_dx6"
},
"digest": {
"length": 537.0,
"function_hash": "191133065979154922632106526573977589157"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9a3bc8d16e0aacd65c31aaf23a2bced3288a7779",
"signature_version": "v1",
"id": "CVE-2024-40957-e4273d06"
},
{
"signature_type": "Function",
"deprecated": false,
"target": {
"file": "net/ipv6/seg6_local.c",
"function": "input_action_end_dx4"
},
"digest": {
"length": 581.0,
"function_hash": "204286372896530070269657077249322430834"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@af90e3d73dc45778767b2fb6e7edd57ebe34380d",
"signature_version": "v1",
"id": "CVE-2024-40957-e715a164"
},
{
"signature_type": "Function",
"deprecated": false,
"target": {
"file": "net/ipv6/seg6_local.c",
"function": "input_action_end_dx4"
},
"digest": {
"length": 581.0,
"function_hash": "204286372896530070269657077249322430834"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9a3bc8d16e0aacd65c31aaf23a2bced3288a7779",
"signature_version": "v1",
"id": "CVE-2024-40957-ff55d0b7"
}
]