In the Linux kernel, the following vulnerability has been resolved:
iavf: Fix use-after-free in free_netdev
We do netifnapiadd() for all allocated qvectors[], but potentially do netifnapidel() for part of them, then kfree qvectors and leave invalid pointers at dev->napi_list.
Reproducer:
[root@host ~]# cat repro.sh #!/bin/bash
pfdbsf="0000:41:00.0" vf0dbsf="0000:41:02.0" g_pids=()
function dosetnumvf() { echo 2 >/sys/bus/pci/devices/${pfdbsf}/sriovnumvfs sleep $((RANDOM%3+1)) echo 0 >/sys/bus/pci/devices/${pfdbsf}/sriovnumvfs sleep $((RANDOM%3+1)) }
function dosetchannel() { local nic=$(ls -1 --indicator-style=none /sys/bus/pci/devices/${vf0_dbsf}/net/) [ -z "$nic" ] && { sleep $((RANDOM%3)) ; return 1; } ifconfig $nic 192.168.18.5 netmask 255.255.255.0 ifconfig $nic up ethtool -L $nic combined 1 ethtool -L $nic combined 4 sleep $((RANDOM%3)) }
function onexit() { local pid for pid in "${gpids[@]}"; do kill -0 "$pid" &>/dev/null && kill "$pid" &>/dev/null done g_pids=() }
trap "on_exit; exit" EXIT
while :; do dosetnumvf ; done & gpids+=($!) while :; do dosetchannel ; done & gpids+=($!)
wait
Result:
[ 4093.900222] ================================================================== [ 4093.900230] BUG: KASAN: use-after-free in freenetdev+0x308/0x390 [ 4093.900232] Read of size 8 at addr ffff88b4dc145640 by task repro.sh/6699 [ 4093.900233] [ 4093.900236] CPU: 10 PID: 6699 Comm: repro.sh Kdump: loaded Tainted: G O --------- -t - 4.18.0 #1 [ 4093.900238] Hardware name: Powerleader PR2008AL/H12DSi-N6, BIOS 2.0 04/09/2021 [ 4093.900239] Call Trace: [ 4093.900244] dumpstack+0x71/0xab [ 4093.900249] printaddressdescription+0x6b/0x290 [ 4093.900251] ? freenetdev+0x308/0x390 [ 4093.900252] kasanreport+0x14a/0x2b0 [ 4093.900254] freenetdev+0x308/0x390 [ 4093.900261] iavfremove+0x825/0xd20 [iavf] [ 4093.900265] pcideviceremove+0xa8/0x1f0 [ 4093.900268] devicereleasedriverinternal+0x1c6/0x460 [ 4093.900271] pcistopbusdevice+0x101/0x150 [ 4093.900273] pcistopandremovebusdevice+0xe/0x20 [ 4093.900275] pciiovremovevirtfn+0x187/0x420 [ 4093.900277] ? pciiovaddvirtfn+0xe10/0xe10 [ 4093.900278] ? pcigetsubsys+0x90/0x90 [ 4093.900280] sriovdisable+0xed/0x3e0 [ 4093.900282] ? busfinddevice+0x12d/0x1a0 [ 4093.900290] i40efreevfs+0x754/0x1210 [i40e] [ 4093.900298] ? i40eresetallvfs+0x880/0x880 [i40e] [ 4093.900299] ? pcigetdevice+0x7c/0x90 [ 4093.900300] ? pcigetsubsys+0x90/0x90 [ 4093.900306] ? pcivfsassigned.part.7+0x144/0x210 [ 4093.900309] ? _mutexlockslowpath+0x10/0x10 [ 4093.900315] i40epcisriovconfigure+0x1fa/0x2e0 [i40e] [ 4093.900318] sriovnumvfsstore+0x214/0x290 [ 4093.900320] ? sriovtotalvfsshow+0x30/0x30 [ 4093.900321] ? _mutexlockslowpath+0x10/0x10 [ 4093.900323] ? _checkobjectsize+0x15a/0x350 [ 4093.900326] kernfsfopwrite+0x280/0x3f0 [ 4093.900329] vfswrite+0x145/0x440 [ 4093.900330] ksyswrite+0xab/0x160 [ 4093.900332] ? _ia32sysread+0xb0/0xb0 [ 4093.900334] ? fputmany+0x1a/0x120 [ 4093.900335] ? filpclose+0xf0/0x130 [ 4093.900338] dosyscall64+0xa0/0x370 [ 4093.900339] ? pagefault+0x8/0x30 [ 4093.900341] entrySYSCALL64afterhwframe+0x65/0xca [ 4093.900357] RIP: 0033:0x7f16ad4d22c0 [ 4093.900359] Code: 73 01 c3 48 8b 0d d8 cb 2c 00 f7 d8 64 89 01 48 83 c8 ff c3 66 0f 1f 44 00 00 83 3d 89 24 2d 00 00 75 10 b8 01 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 31 c3 48 83 ec 08 e8 fe dd 01 00 48 89 04 24 [ 4093.900360] RSP: 002b:00007ffd6491b7f8 EFLAGS: 00000246 ORIGRAX: 0000000000000001 [ 4093.900362] RAX: ffffffffffffffda RBX: 0000000000000002 RCX: 00007f16ad4d22c0 [ 4093.900363] RDX: 0000000000000002 RSI: 0000000001a41408 RDI: 0000000000000001 [ 4093.900364] RBP: 0000000001a41408 R08: 00007f16ad7a1780 R09: 00007f16ae1f2700 [ 4093.9003 ---truncated---
{
"cna_assigner": "Linux",
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2023/53xxx/CVE-2023-53556.json"
}"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2023-53556.json"
[
{
"id": "CVE-2023-53556-33761760",
"target": {
"function": "iavf_free_q_vectors",
"file": "drivers/net/ethernet/intel/iavf/iavf_main.c"
},
"signature_version": "v1",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@ca12b98e04b5d1902ac08fe826d3500cb4b6e891",
"digest": {
"function_hash": "170376501697513112278191631131424998454",
"length": 385.0
},
"signature_type": "Function"
},
{
"id": "CVE-2023-53556-3d91210c",
"target": {
"file": "drivers/net/ethernet/intel/iavf/iavf_main.c"
},
"signature_version": "v1",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@5f4fa1672d98fe99d2297b03add35346f1685d6b",
"digest": {
"threshold": 0.9,
"line_hashes": [
"268740732306159802630074591991840277797",
"168934768786662584943992220233270497434",
"15436750556872272483719610878883858442",
"132964724302614465546858691815565096975",
"319084294207066192803798061760994755008",
"197569512502555130367964833258351415926",
"210764058927658290763548031668832997119",
"69394665079817664644538633011598147598",
"236151405330697069076392417858052824681",
"113943146265771152110671329476855867257",
"240147447072987928508996704091668268332",
"58672911561873659601643522998722182758"
]
},
"signature_type": "Line"
},
{
"id": "CVE-2023-53556-4159383f",
"target": {
"function": "iavf_free_q_vectors",
"file": "drivers/net/ethernet/intel/iavf/iavf_main.c"
},
"signature_version": "v1",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@5f4fa1672d98fe99d2297b03add35346f1685d6b",
"digest": {
"function_hash": "170376501697513112278191631131424998454",
"length": 385.0
},
"signature_type": "Function"
},
{
"id": "CVE-2023-53556-68f9b83d",
"target": {
"function": "iavf_free_q_vectors",
"file": "drivers/net/ethernet/intel/iavf/iavf_main.c"
},
"signature_version": "v1",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@17046107ca15d7571551539d94e76aba2bf71fd3",
"digest": {
"function_hash": "170376501697513112278191631131424998454",
"length": 385.0
},
"signature_type": "Function"
},
{
"id": "CVE-2023-53556-73bd05ee",
"target": {
"file": "drivers/net/ethernet/intel/iavf/iavf_main.c"
},
"signature_version": "v1",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@345c44e18cc10cded85cb9134830e1684495c866",
"digest": {
"threshold": 0.9,
"line_hashes": [
"268740732306159802630074591991840277797",
"168934768786662584943992220233270497434",
"15436750556872272483719610878883858442",
"132964724302614465546858691815565096975",
"319084294207066192803798061760994755008",
"197569512502555130367964833258351415926",
"210764058927658290763548031668832997119",
"69394665079817664644538633011598147598",
"236151405330697069076392417858052824681",
"113943146265771152110671329476855867257",
"240147447072987928508996704091668268332",
"58672911561873659601643522998722182758"
]
},
"signature_type": "Line"
},
{
"id": "CVE-2023-53556-7f7135ca",
"target": {
"file": "drivers/net/ethernet/intel/iavf/iavf_main.c"
},
"signature_version": "v1",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@8d781a9c53034813c3194b7d94409c7d24ac73eb",
"digest": {
"threshold": 0.9,
"line_hashes": [
"268740732306159802630074591991840277797",
"168934768786662584943992220233270497434",
"15436750556872272483719610878883858442",
"132964724302614465546858691815565096975",
"319084294207066192803798061760994755008",
"197569512502555130367964833258351415926",
"210764058927658290763548031668832997119",
"69394665079817664644538633011598147598",
"236151405330697069076392417858052824681",
"113943146265771152110671329476855867257",
"240147447072987928508996704091668268332",
"58672911561873659601643522998722182758"
]
},
"signature_type": "Line"
},
{
"id": "CVE-2023-53556-868fae11",
"target": {
"function": "iavf_free_q_vectors",
"file": "drivers/net/ethernet/intel/iavf/iavf_main.c"
},
"signature_version": "v1",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@345c44e18cc10cded85cb9134830e1684495c866",
"digest": {
"function_hash": "170376501697513112278191631131424998454",
"length": 385.0
},
"signature_type": "Function"
},
{
"id": "CVE-2023-53556-8cf0e35a",
"target": {
"function": "iavf_free_q_vectors",
"file": "drivers/net/ethernet/intel/iavf/iavf_main.c"
},
"signature_version": "v1",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@a4635f190f332304db4a49e827ece790b804b5db",
"digest": {
"function_hash": "170376501697513112278191631131424998454",
"length": 385.0
},
"signature_type": "Function"
},
{
"id": "CVE-2023-53556-a40ac4d3",
"target": {
"file": "drivers/net/ethernet/intel/iavf/iavf_main.c"
},
"signature_version": "v1",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@ca12b98e04b5d1902ac08fe826d3500cb4b6e891",
"digest": {
"threshold": 0.9,
"line_hashes": [
"268740732306159802630074591991840277797",
"168934768786662584943992220233270497434",
"15436750556872272483719610878883858442",
"132964724302614465546858691815565096975",
"319084294207066192803798061760994755008",
"197569512502555130367964833258351415926",
"210764058927658290763548031668832997119",
"69394665079817664644538633011598147598",
"236151405330697069076392417858052824681",
"113943146265771152110671329476855867257",
"240147447072987928508996704091668268332",
"58672911561873659601643522998722182758"
]
},
"signature_type": "Line"
},
{
"id": "CVE-2023-53556-c42b2596",
"target": {
"file": "drivers/net/ethernet/intel/iavf/iavf_main.c"
},
"signature_version": "v1",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@a4635f190f332304db4a49e827ece790b804b5db",
"digest": {
"threshold": 0.9,
"line_hashes": [
"268740732306159802630074591991840277797",
"168934768786662584943992220233270497434",
"15436750556872272483719610878883858442",
"132964724302614465546858691815565096975",
"319084294207066192803798061760994755008",
"197569512502555130367964833258351415926",
"210764058927658290763548031668832997119",
"69394665079817664644538633011598147598",
"236151405330697069076392417858052824681",
"113943146265771152110671329476855867257",
"240147447072987928508996704091668268332",
"58672911561873659601643522998722182758"
]
},
"signature_type": "Line"
},
{
"id": "CVE-2023-53556-e1ebf042",
"target": {
"function": "iavf_free_q_vectors",
"file": "drivers/net/ethernet/intel/iavf/iavf_main.c"
},
"signature_version": "v1",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@8d781a9c53034813c3194b7d94409c7d24ac73eb",
"digest": {
"function_hash": "170376501697513112278191631131424998454",
"length": 385.0
},
"signature_type": "Function"
},
{
"id": "CVE-2023-53556-ea841d44",
"target": {
"file": "drivers/net/ethernet/intel/iavf/iavf_main.c"
},
"signature_version": "v1",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@17046107ca15d7571551539d94e76aba2bf71fd3",
"digest": {
"threshold": 0.9,
"line_hashes": [
"268740732306159802630074591991840277797",
"168934768786662584943992220233270497434",
"15436750556872272483719610878883858442",
"132964724302614465546858691815565096975",
"319084294207066192803798061760994755008",
"197569512502555130367964833258351415926",
"210764058927658290763548031668832997119",
"69394665079817664644538633011598147598",
"236151405330697069076392417858052824681",
"113943146265771152110671329476855867257",
"240147447072987928508996704091668268332",
"58672911561873659601643522998722182758"
]
},
"signature_type": "Line"
}
]