In the Linux kernel, the following vulnerability has been resolved:
PCI/ASPM: Fix link state exit during switch upstream function removal
Before 456d8aa37d0f ("PCI/ASPM: Disable ASPM on MFD function removal to avoid use-after-free"), we would free the ASPM link only after the last function on the bus pertaining to the given link was removed.
That was too late. If function 0 is removed before sibling function, link->downstream would point to free'd memory after.
After above change, we freed the ASPM parent link state upon any function removal on the bus pertaining to a given link.
That is too early. If the link is to a PCIe switch with MFD on the upstream port, then removing functions other than 0 first would free a link which still remains parent_link to the remaining downstream ports.
The resulting GPFs are especially frequent during hot-unplug, because pciehp removes devices on the link bus in reverse order.
On that switch, function 0 is the virtual P2P bridge to the internal bus. Free exactly when function 0 is removed -- before the parent link is obsolete, but after all subordinate links are gone.
[kwilczynski: commit log]
[
{
"id": "CVE-2024-58093-5eaadba4",
"digest": {
"line_hashes": [
"112787060212163265051236170782845909931",
"133603423990591883427847465000198088783",
"246852587362564428044521033792571923234",
"282542167994746133797946611248857673900",
"94340221446009453781583459909236562565",
"325268109156243759977210969417495522487"
],
"threshold": 0.9
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@cbf937dcadfd571a434f8074d057b32cd14fbea5",
"target": {
"file": "drivers/pci/pcie/aspm.c"
},
"deprecated": false,
"signature_type": "Line",
"signature_version": "v1"
},
{
"id": "CVE-2024-58093-948822e0",
"digest": {
"length": 451.0,
"function_hash": "267719072626898498556057589656207991635"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@cbf937dcadfd571a434f8074d057b32cd14fbea5",
"target": {
"file": "drivers/pci/pcie/aspm.c",
"function": "pcie_aspm_exit_link_state"
},
"deprecated": false,
"signature_type": "Function",
"signature_version": "v1"
}
]