In the Linux kernel, the following vulnerability has been resolved:
afunix: Update unixsk(sk)->oobskb under skreceive_queue lock.
Billy Jheng Bing-Jhong reported a race between _unixgc() and queue_oob().
_unixgc() tries to garbage-collect close()d inflight sockets, and then if the socket has MSGOOB in unixsk(sk)->oob_skb, GC will drop the reference and set NULL to it locklessly.
However, the peer socket still can send MSGOOB message and queueoob() can update unixsk(sk)->oobskb concurrently, leading NULL pointer dereference. [0]
To fix the issue, let's update unixsk(sk)->oobskb under the skreceivequeue's lock and take it everywhere we touch oob_skb.
Note that we defer kfreeskb() in manageoob() to silence lockdep false-positive (See [1]).
PF: supervisor write access in kernel mode PF: errorcode(0x0002) - not-present page PGD 8000000009f5e067 P4D 8000000009f5e067 PUD 9f5d067 PMD 0 Oops: 0002 [#1] PREEMPT SMP PTI CPU: 3 PID: 50 Comm: kworker/3:1 Not tainted 6.9.0-rc5-00191-gd091e579b864 #110 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.org 04/01/2014 Workqueue: events delayedfput RIP: 0010:skbdequeue (./include/linux/skbuff.h:2386 ./include/linux/skbuff.h:2402 net/core/skbuff.c:3847) Code: 39 e3 74 3e 8b 43 10 48 89 ef 83 e8 01 89 43 10 49 8b 44 24 08 49 c7 44 24 08 00 00 00 00 49 8b 14 24 49 c7 04 24 00 00 00 00 <48> 89 42 08 48 89 10 e8 e7 c5 42 00 4c 89 e0 5b 5d 41 5c c3 cc cc RSP: 0018:ffffc900001bfd48 EFLAGS: 00000002 RAX: 0000000000000000 RBX: ffff8880088f5ae8 RCX: 00000000361289f9 RDX: 0000000000000000 RSI: 0000000000000206 RDI: ffff8880088f5b00 RBP: ffff8880088f5b00 R08: 0000000000080000 R09: 0000000000000001 R10: 0000000000000003 R11: 0000000000000001 R12: ffff8880056b6a00 R13: ffff8880088f5280 R14: 0000000000000001 R15: ffff8880088f5a80 FS: 0000000000000000(0000) GS:ffff88807dd80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000008 CR3: 0000000006314000 CR4: 00000000007506f0 PKRU: 55555554 Call Trace: <TASK> unixreleasesock (net/unix/afunix.c:654) unixrelease (net/unix/afunix.c:1050) _sockrelease (net/socket.c:660) sockclose (net/socket.c:1423) _fput (fs/filetable.c:423) delayedfput (fs/filetable.c:444 (discriminator 3)) processonework (kernel/workqueue.c:3259) workerthread (kernel/workqueue.c:3329 kernel/workqueue.c:3416) kthread (kernel/kthread.c:388) retfromfork (arch/x86/kernel/process.c:153) retfromforkasm (arch/x86/entry/entry64.S:257) </TASK> Modules linked in: CR2: 0000000000000008
[
{
"id": "CVE-2024-36972-0bfb8708",
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9841991a446c87f90f66f4b9fee6fe934c1336a2",
"target": {
"file": "net/unix/af_unix.c"
},
"digest": {
"line_hashes": [
"254304164795536250053127170783492138677",
"105462636328949246489903629108269668046",
"20573765473696067324831203188464769490",
"93832483395875750720796689483312547147",
"217780774133683158965324523859977731519",
"123215435071613848545107460336807057226",
"183142727679165382842700200721568998597",
"138051571796102409297802863785801489657",
"288484838968544984887739437775807415209",
"186019269047928716193985603977616600697",
"260693522245445690795225260964522969388",
"160081501034026980599823995568734046322",
"40305284401451820825613319017533599205",
"60532195400591136061990257697395378796",
"42821201480983946584326479636174284240",
"314639969027777242298588520473308271249",
"104288012559777059553736187259329671803",
"44265179350399165397171526591519960331",
"28612329891590521977152249056041237075",
"318925668682420257738872829661125961678",
"137172568043226062402333322073562116441",
"217083988873519472629542845744417000441",
"286067593580821388333339314075367549241",
"107129081346080638717275927934007700197",
"86944875138486024571549413838200342761",
"170660616878980343628198244979802036273",
"234557122560131040946338613905752951770",
"257990560573202138337444553177717994482",
"161065187970028706209042947438959079168",
"325960809431862154301076418446353217715",
"114146366935522974299599549901205903696"
],
"threshold": 0.9
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-1246f95b",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@4708f49add84a57ce0ccc7bf9a6269845c631cc3",
"target": {
"file": "net/unix/af_unix.c",
"function": "unix_stream_recv_urg"
},
"digest": {
"function_hash": "273387260747125013363523233215867240594",
"length": 739.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-4b8507db",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@d59ae9314b97e01c76a4171472441e55721ba636",
"target": {
"file": "net/unix/af_unix.c",
"function": "manage_oob"
},
"digest": {
"function_hash": "204840386611737069431911908430986124914",
"length": 762.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-4ee7bdcb",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9841991a446c87f90f66f4b9fee6fe934c1336a2",
"target": {
"file": "net/unix/af_unix.c",
"function": "manage_oob"
},
"digest": {
"function_hash": "204840386611737069431911908430986124914",
"length": 762.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-58c5de82",
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@d59ae9314b97e01c76a4171472441e55721ba636",
"target": {
"file": "net/unix/af_unix.c"
},
"digest": {
"line_hashes": [
"254304164795536250053127170783492138677",
"105462636328949246489903629108269668046",
"20573765473696067324831203188464769490",
"93832483395875750720796689483312547147",
"217780774133683158965324523859977731519",
"123215435071613848545107460336807057226",
"183142727679165382842700200721568998597",
"138051571796102409297802863785801489657",
"288484838968544984887739437775807415209",
"186019269047928716193985603977616600697",
"260693522245445690795225260964522969388",
"160081501034026980599823995568734046322",
"40305284401451820825613319017533599205",
"60532195400591136061990257697395378796",
"42821201480983946584326479636174284240",
"314639969027777242298588520473308271249",
"104288012559777059553736187259329671803",
"44265179350399165397171526591519960331",
"28612329891590521977152249056041237075",
"318925668682420257738872829661125961678",
"137172568043226062402333322073562116441",
"217083988873519472629542845744417000441",
"286067593580821388333339314075367549241",
"107129081346080638717275927934007700197",
"86944875138486024571549413838200342761",
"170660616878980343628198244979802036273",
"234557122560131040946338613905752951770",
"257990560573202138337444553177717994482",
"161065187970028706209042947438959079168",
"325960809431862154301076418446353217715",
"114146366935522974299599549901205903696"
],
"threshold": 0.9
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-615d8360",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@4bf6964451c3cb411fbaa1ae8b214b3d97a59bf1",
"target": {
"file": "net/unix/af_unix.c",
"function": "manage_oob"
},
"digest": {
"function_hash": "204840386611737069431911908430986124914",
"length": 762.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-6c05f5e6",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@4bf6964451c3cb411fbaa1ae8b214b3d97a59bf1",
"target": {
"file": "net/unix/af_unix.c",
"function": "unix_stream_recv_urg"
},
"digest": {
"function_hash": "273387260747125013363523233215867240594",
"length": 739.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-76120c1a",
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@518a994aa0b87d96f1bc6678a7035df5d1fcd7a1",
"target": {
"file": "net/unix/af_unix.c"
},
"digest": {
"line_hashes": [
"254304164795536250053127170783492138677",
"105462636328949246489903629108269668046",
"20573765473696067324831203188464769490",
"93832483395875750720796689483312547147",
"217780774133683158965324523859977731519",
"123215435071613848545107460336807057226",
"183142727679165382842700200721568998597",
"138051571796102409297802863785801489657",
"288484838968544984887739437775807415209",
"186019269047928716193985603977616600697",
"260693522245445690795225260964522969388",
"160081501034026980599823995568734046322",
"40305284401451820825613319017533599205",
"60532195400591136061990257697395378796",
"42821201480983946584326479636174284240",
"314639969027777242298588520473308271249",
"104288012559777059553736187259329671803",
"44265179350399165397171526591519960331",
"28612329891590521977152249056041237075",
"318925668682420257738872829661125961678",
"137172568043226062402333322073562116441",
"217083988873519472629542845744417000441",
"286067593580821388333339314075367549241",
"107129081346080638717275927934007700197",
"86944875138486024571549413838200342761",
"170660616878980343628198244979802036273",
"234557122560131040946338613905752951770",
"257990560573202138337444553177717994482",
"161065187970028706209042947438959079168",
"325960809431862154301076418446353217715",
"114146366935522974299599549901205903696"
],
"threshold": 0.9
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-8277bd4b",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9841991a446c87f90f66f4b9fee6fe934c1336a2",
"target": {
"file": "net/unix/af_unix.c",
"function": "unix_stream_recv_urg"
},
"digest": {
"function_hash": "273387260747125013363523233215867240594",
"length": 739.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-872760f0",
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@4bf6964451c3cb411fbaa1ae8b214b3d97a59bf1",
"target": {
"file": "net/unix/af_unix.c"
},
"digest": {
"line_hashes": [
"254304164795536250053127170783492138677",
"105462636328949246489903629108269668046",
"20573765473696067324831203188464769490",
"93832483395875750720796689483312547147",
"217780774133683158965324523859977731519",
"123215435071613848545107460336807057226",
"183142727679165382842700200721568998597",
"138051571796102409297802863785801489657",
"288484838968544984887739437775807415209",
"186019269047928716193985603977616600697",
"260693522245445690795225260964522969388",
"160081501034026980599823995568734046322",
"40305284401451820825613319017533599205",
"60532195400591136061990257697395378796",
"42821201480983946584326479636174284240",
"314639969027777242298588520473308271249",
"104288012559777059553736187259329671803",
"44265179350399165397171526591519960331",
"28612329891590521977152249056041237075",
"318925668682420257738872829661125961678",
"137172568043226062402333322073562116441",
"217083988873519472629542845744417000441",
"286067593580821388333339314075367549241",
"107129081346080638717275927934007700197",
"86944875138486024571549413838200342761",
"170660616878980343628198244979802036273",
"234557122560131040946338613905752951770",
"257990560573202138337444553177717994482",
"161065187970028706209042947438959079168",
"325960809431862154301076418446353217715",
"114146366935522974299599549901205903696"
],
"threshold": 0.9
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-8b5b38cb",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@518a994aa0b87d96f1bc6678a7035df5d1fcd7a1",
"target": {
"file": "net/unix/af_unix.c",
"function": "unix_stream_recv_urg"
},
"digest": {
"function_hash": "273387260747125013363523233215867240594",
"length": 739.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-8e1e92ef",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@4708f49add84a57ce0ccc7bf9a6269845c631cc3",
"target": {
"file": "net/unix/af_unix.c",
"function": "queue_oob"
},
"digest": {
"function_hash": "78752625956467784290503026470283977553",
"length": 967.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-93be9ca3",
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@4708f49add84a57ce0ccc7bf9a6269845c631cc3",
"target": {
"file": "net/unix/af_unix.c"
},
"digest": {
"line_hashes": [
"254304164795536250053127170783492138677",
"105462636328949246489903629108269668046",
"20573765473696067324831203188464769490",
"93832483395875750720796689483312547147",
"217780774133683158965324523859977731519",
"123215435071613848545107460336807057226",
"183142727679165382842700200721568998597",
"138051571796102409297802863785801489657",
"288484838968544984887739437775807415209",
"186019269047928716193985603977616600697",
"260693522245445690795225260964522969388",
"160081501034026980599823995568734046322",
"40305284401451820825613319017533599205",
"60532195400591136061990257697395378796",
"42821201480983946584326479636174284240",
"314639969027777242298588520473308271249",
"104288012559777059553736187259329671803",
"44265179350399165397171526591519960331",
"28612329891590521977152249056041237075",
"318925668682420257738872829661125961678",
"137172568043226062402333322073562116441",
"217083988873519472629542845744417000441",
"286067593580821388333339314075367549241",
"107129081346080638717275927934007700197",
"86944875138486024571549413838200342761",
"170660616878980343628198244979802036273",
"234557122560131040946338613905752951770",
"257990560573202138337444553177717994482",
"161065187970028706209042947438959079168",
"325960809431862154301076418446353217715",
"114146366935522974299599549901205903696"
],
"threshold": 0.9
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-96cf01bc",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9841991a446c87f90f66f4b9fee6fe934c1336a2",
"target": {
"file": "net/unix/af_unix.c",
"function": "queue_oob"
},
"digest": {
"function_hash": "78752625956467784290503026470283977553",
"length": 967.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-ad1d02dc",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@4708f49add84a57ce0ccc7bf9a6269845c631cc3",
"target": {
"file": "net/unix/af_unix.c",
"function": "manage_oob"
},
"digest": {
"function_hash": "204840386611737069431911908430986124914",
"length": 762.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-b4c3e0f5",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@4bf6964451c3cb411fbaa1ae8b214b3d97a59bf1",
"target": {
"file": "net/unix/af_unix.c",
"function": "queue_oob"
},
"digest": {
"function_hash": "78752625956467784290503026470283977553",
"length": 967.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-dcdc723a",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@d59ae9314b97e01c76a4171472441e55721ba636",
"target": {
"file": "net/unix/af_unix.c",
"function": "unix_stream_recv_urg"
},
"digest": {
"function_hash": "273387260747125013363523233215867240594",
"length": 739.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-ddf5e85c",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@518a994aa0b87d96f1bc6678a7035df5d1fcd7a1",
"target": {
"file": "net/unix/af_unix.c",
"function": "queue_oob"
},
"digest": {
"function_hash": "78752625956467784290503026470283977553",
"length": 967.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-f82dc25f",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@518a994aa0b87d96f1bc6678a7035df5d1fcd7a1",
"target": {
"file": "net/unix/af_unix.c",
"function": "manage_oob"
},
"digest": {
"function_hash": "204840386611737069431911908430986124914",
"length": 762.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-36972-fb8b4261",
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@d59ae9314b97e01c76a4171472441e55721ba636",
"target": {
"file": "net/unix/af_unix.c",
"function": "queue_oob"
},
"digest": {
"function_hash": "78752625956467784290503026470283977553",
"length": 967.0
},
"deprecated": false,
"signature_version": "v1"
}
]