In the Linux kernel, the following vulnerability has been resolved:
powerpc/pseries: Fix use after free in removephbdynamic()
In removephbdynamic() we use &phb->ioresource, after we've called deviceunregister(&hostbridge->dev). But the unregister may have freed phb, because pcibiosfreecontrollerdeferred() is the release function for the host_bridge.
If there are no outstanding references when we call device_unregister() then phb will be freed out from under us.
This has gone mainly unnoticed, but with slubdebug and pagepoison enabled it can lead to a crash:
PID: 7574 TASK: c0000000d492cb80 CPU: 13 COMMAND: "drmgr" #0 [c0000000e4f075a0] crashkexec at c00000000027d7dc #1 [c0000000e4f075d0] oopsend at c000000000029608 #2 [c0000000e4f07650] _badpagefault at c0000000000904b4 #3 [c0000000e4f076c0] dobadslbfault at c00000000009a5a8 #4 [c0000000e4f076f0] dataaccessslbcommonvirt at c000000000008b30 Data SLB Access [380] exception frame: R0: c000000000167250 R1: c0000000e4f07a00 R2: c000000002a46100 R3: c000000002b39ce8 R4: 00000000000000c0 R5: 00000000000000a9 R6: 3894674d000000c0 R7: 0000000000000000 R8: 00000000000000ff R9: 0000000000000100 R10: 6b6b6b6b6b6b6b6b R11: 0000000000008000 R12: c00000000023da80 R13: c0000009ffd38b00 R14: 0000000000000000 R15: 000000011c87f0f0 R16: 0000000000000006 R17: 0000000000000003 R18: 0000000000000002 R19: 0000000000000004 R20: 0000000000000005 R21: 000000011c87ede8 R22: 000000011c87c5a8 R23: 000000011c87d3a0 R24: 0000000000000000 R25: 0000000000000001 R26: c0000000e4f07cc8 R27: c00000004d1cc400 R28: c0080000031d00e8 R29: c00000004d23d800 R30: c00000004d1d2400 R31: c00000004d1d2540 NIP: c000000000167258 MSR: 8000000000009033 OR3: c000000000e9f474 CTR: 0000000000000000 LR: c000000000167250 XER: 0000000020040003 CCR: 0000000024088420 MQ: 0000000000000000 DAR: 6b6b6b6b6b6b6ba3 DSISR: c0000000e4f07920 Syscall Result: fffffffffffffff2 [NIP : releaseresource+56] [LR : releaseresource+48] #5 [c0000000e4f07a00] releaseresource at c000000000167258 (unreliable) #6 [c0000000e4f07a30] removephbdynamic at c000000000105648 #7 [c0000000e4f07ab0] dlparremoveslot at c0080000031a09e8 [rpadlpario] #8 [c0000000e4f07b50] removeslotstore at c0080000031a0b9c [rpadlpario] #9 [c0000000e4f07be0] kobjattrstore at c000000000817d8c #10 [c0000000e4f07c00] sysfskfwrite at c00000000063e504 #11 [c0000000e4f07c20] kernfsfopwriteiter at c00000000063d868 #12 [c0000000e4f07c70] newsyncwrite at c00000000054339c #13 [c0000000e4f07d10] vfswrite at c000000000546624 #14 [c0000000e4f07d60] ksyswrite at c0000000005469f4 #15 [c0000000e4f07db0] systemcallexception at c000000000030840 #16 [c0000000e4f07e10] systemcallvectored_common at c00000000000c168
To avoid it, we can take a reference to the host_bridge->dev until we're done using phb. Then when we drop the reference the phb will be freed.
[
{
"id": "CVE-2022-49196-1a75fc5d",
"signature_type": "Line",
"signature_version": "v1",
"digest": {
"line_hashes": [
"169554425877206160535700250018455140184",
"235623648831724602628279131589936039511",
"107020704770454509221538759738607619686",
"266760339473597653079970344626518800390",
"110287471473177662092566380610367898043",
"67110156440411506764580937750614734482"
],
"threshold": 0.9
},
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@403f9e0bc5535a0a5184d1352fa3a70e6ffacb6f",
"target": {
"file": "arch/powerpc/platforms/pseries/pci_dlpar.c"
}
},
{
"id": "CVE-2022-49196-209b7e80",
"signature_type": "Line",
"signature_version": "v1",
"digest": {
"line_hashes": [
"169554425877206160535700250018455140184",
"235623648831724602628279131589936039511",
"107020704770454509221538759738607619686",
"266760339473597653079970344626518800390",
"110287471473177662092566380610367898043",
"67110156440411506764580937750614734482"
],
"threshold": 0.9
},
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@895ca4ae1f72e0a0160ab162723e59c9f265ec93",
"target": {
"file": "arch/powerpc/platforms/pseries/pci_dlpar.c"
}
},
{
"id": "CVE-2022-49196-31ba9e33",
"signature_type": "Line",
"signature_version": "v1",
"digest": {
"line_hashes": [
"169554425877206160535700250018455140184",
"235623648831724602628279131589936039511",
"107020704770454509221538759738607619686",
"266760339473597653079970344626518800390",
"110287471473177662092566380610367898043",
"67110156440411506764580937750614734482"
],
"threshold": 0.9
},
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@fe2640bd7a62f1f7c3f55fbda31084085075bc30",
"target": {
"file": "arch/powerpc/platforms/pseries/pci_dlpar.c"
}
},
{
"id": "CVE-2022-49196-351767ce",
"signature_type": "Line",
"signature_version": "v1",
"digest": {
"line_hashes": [
"169554425877206160535700250018455140184",
"235623648831724602628279131589936039511",
"107020704770454509221538759738607619686",
"266760339473597653079970344626518800390",
"110287471473177662092566380610367898043",
"67110156440411506764580937750614734482"
],
"threshold": 0.9
},
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@33d39efb61a84e055ca2386157d39ebbdf6b7d31",
"target": {
"file": "arch/powerpc/platforms/pseries/pci_dlpar.c"
}
},
{
"id": "CVE-2022-49196-8fbcc138",
"signature_type": "Function",
"signature_version": "v1",
"digest": {
"length": 854.0,
"function_hash": "146236128843829780532751651012913726186"
},
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@33d39efb61a84e055ca2386157d39ebbdf6b7d31",
"target": {
"function": "remove_phb_dynamic",
"file": "arch/powerpc/platforms/pseries/pci_dlpar.c"
}
},
{
"id": "CVE-2022-49196-cfbd3a01",
"signature_type": "Function",
"signature_version": "v1",
"digest": {
"length": 854.0,
"function_hash": "146236128843829780532751651012913726186"
},
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@895ca4ae1f72e0a0160ab162723e59c9f265ec93",
"target": {
"function": "remove_phb_dynamic",
"file": "arch/powerpc/platforms/pseries/pci_dlpar.c"
}
},
{
"id": "CVE-2022-49196-da7f1a4d",
"signature_type": "Function",
"signature_version": "v1",
"digest": {
"length": 854.0,
"function_hash": "146236128843829780532751651012913726186"
},
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@fe2640bd7a62f1f7c3f55fbda31084085075bc30",
"target": {
"function": "remove_phb_dynamic",
"file": "arch/powerpc/platforms/pseries/pci_dlpar.c"
}
},
{
"id": "CVE-2022-49196-fd7ace14",
"signature_type": "Function",
"signature_version": "v1",
"digest": {
"length": 854.0,
"function_hash": "146236128843829780532751651012913726186"
},
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@403f9e0bc5535a0a5184d1352fa3a70e6ffacb6f",
"target": {
"function": "remove_phb_dynamic",
"file": "arch/powerpc/platforms/pseries/pci_dlpar.c"
}
}
]