In the Linux kernel, the following vulnerability has been resolved:
KVM: PPC: Book3S HV: Prevent UAF in kvmspaprtceattachiommu_group()
Al reported a possible use-after-free (UAF) in kvmspaprtceattachiommu_group().
It looks up stt from tablefd, but then continues to use it after doing
fdput() on the returned fd. After the fdput() the tablefd is free to be
closed by another thread. The close calls kvmspaprtcerelease() and
then releasespaprtcetable() (via call_rcu()) which frees stt.
Although there are calls to rcureadlock() in
kvmspaprtceattachiommu_group() they are not sufficient to prevent
the UAF, because stt is used outside the locked regions.
With an artifcial delay after the fdput() and a userspace program which triggers the race, KASAN detects the UAF:
BUG: KASAN: slab-use-after-free in kvmspaprtceattachiommugroup+0x298/0x720 [kvm] Read of size 4 at addr c000200027552c30 by task kvm-vfio/2505 CPU: 54 PID: 2505 Comm: kvm-vfio Not tainted 6.10.0-rc3-next-20240612-dirty #1 Hardware name: 8335-GTH POWER9 0x4e1202 opal:skiboot-v6.5.3-35-g1851b2a06 PowerNV Call Trace: dumpstacklvl+0xb4/0x108 (unreliable) printreport+0x2b4/0x6ec kasanreport+0x118/0x2b0 _asanload4+0xb8/0xd0 kvmspaprtceattachiommugroup+0x298/0x720 [kvm] kvmvfiosetattr+0x524/0xac0 [kvm] kvmdeviceioctl+0x144/0x240 [kvm] sysioctl+0x62c/0x1810 systemcallexception+0x190/0x440 systemcallvectoredcommon+0x15c/0x2ec ... Freed by task 0: ... kfree+0xec/0x3e0 releasespaprtcetable+0xd4/0x11c [kvm] rcucore+0x568/0x16a0 handlesoftirqs+0x23c/0x920 dosoftirqownstack+0x6c/0x90 dosoftirqownstack+0x58/0x90 _irqexitrcu+0x218/0x2d0 irqexit+0x30/0x80 archlocalirqrestore+0x128/0x230 archlocalirqenable+0x1c/0x30 cpuidleenterstate+0x134/0x5cc cpuidleenter+0x6c/0xb0 callcpuidle+0x7c/0x100 doidle+0x394/0x410 cpustartupentry+0x60/0x70 startsecondary+0x3fc/0x410 startsecondaryprolog+0x10/0x14
Fix it by delaying the fdput() until stt is no longer in use, which
is effectively the entire function. To keep the patch minimal add a call
to fdput() at each of the existing return paths. Future work can convert
the function to goto or __cleanup style cleanup.
With the fix in place the test case no longer triggers the UAF.
[
{
"id": "CVE-2024-41070-14dfe6b5",
"target": {
"file": "arch/powerpc/kvm/book3s_64_vio.c"
},
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@5f856023971f97fff74cfaf21b48ec320147b50a",
"digest": {
"threshold": 0.9,
"line_hashes": [
"301224933246596244261327400346684856350",
"279271609363476737699066295964245354894",
"8230220474137871474127553522698245281",
"201917576615739310081939749413415081074",
"197360611309623740703315754630149448754",
"183427359326564373821915170192573286504",
"258698818045112363356788872262644933088",
"202552359418050143270800949835467071126",
"61547958899269820717749617439575073260",
"254035377704695498480318753473516932431",
"10888997367020574239612248200804282254",
"74190569060484353811080584779415645686",
"173853200400701259813136047446425733276",
"199485548497199766215430740885071626746",
"315426187327617941662737491965973250452",
"36034544697284806684367175598123279160",
"202417219645586627351216774680460154329",
"26206119502298134960022374385156433967",
"287601458342327515126230931737219405999",
"183405425770727986354832916331422914052",
"146945759966801940757500644407746702709",
"62067828110427767806965792982477254183",
"201918836905228248949764986627093512652",
"247247108918160699191063239044887125815",
"91723805097914383505483800296800604390",
"312273870034773559205378088584119097992",
"120732382979820529692640840676427457784",
"321595860499012884037852684976132520024"
]
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-41070-4a2a3464",
"target": {
"file": "arch/powerpc/kvm/book3s_64_vio.c"
},
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@be847bb20c809de8ac124431b556f244400b0491",
"digest": {
"threshold": 0.9,
"line_hashes": [
"301224933246596244261327400346684856350",
"279271609363476737699066295964245354894",
"8230220474137871474127553522698245281",
"201917576615739310081939749413415081074",
"197360611309623740703315754630149448754",
"183427359326564373821915170192573286504",
"258698818045112363356788872262644933088",
"202552359418050143270800949835467071126",
"61547958899269820717749617439575073260",
"254035377704695498480318753473516932431",
"10888997367020574239612248200804282254",
"74190569060484353811080584779415645686",
"173853200400701259813136047446425733276",
"199485548497199766215430740885071626746",
"315426187327617941662737491965973250452",
"36034544697284806684367175598123279160",
"202417219645586627351216774680460154329",
"26206119502298134960022374385156433967",
"287601458342327515126230931737219405999",
"183405425770727986354832916331422914052",
"146945759966801940757500644407746702709",
"62067828110427767806965792982477254183",
"201918836905228248949764986627093512652",
"247247108918160699191063239044887125815",
"91723805097914383505483800296800604390",
"312273870034773559205378088584119097992",
"120732382979820529692640840676427457784",
"321595860499012884037852684976132520024"
]
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-41070-505765bb",
"target": {
"file": "arch/powerpc/kvm/book3s_64_vio.c"
},
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@b26c8c85463ef27a522d24fcd05651f0bb039e47",
"digest": {
"threshold": 0.9,
"line_hashes": [
"301224933246596244261327400346684856350",
"279271609363476737699066295964245354894",
"8230220474137871474127553522698245281",
"201917576615739310081939749413415081074",
"197360611309623740703315754630149448754",
"183427359326564373821915170192573286504",
"258698818045112363356788872262644933088",
"202552359418050143270800949835467071126",
"61547958899269820717749617439575073260",
"254035377704695498480318753473516932431",
"10888997367020574239612248200804282254",
"74190569060484353811080584779415645686",
"173853200400701259813136047446425733276",
"199485548497199766215430740885071626746",
"315426187327617941662737491965973250452",
"36034544697284806684367175598123279160",
"202417219645586627351216774680460154329",
"26206119502298134960022374385156433967",
"287601458342327515126230931737219405999",
"183405425770727986354832916331422914052",
"146945759966801940757500644407746702709",
"62067828110427767806965792982477254183",
"201918836905228248949764986627093512652",
"247247108918160699191063239044887125815",
"91723805097914383505483800296800604390",
"312273870034773559205378088584119097992",
"120732382979820529692640840676427457784",
"321595860499012884037852684976132520024"
]
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-41070-66c812c2",
"target": {
"file": "arch/powerpc/kvm/book3s_64_vio.c"
},
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@82c7a4cf14aa866f8f7f09e662b02eddc49ee0bf",
"digest": {
"threshold": 0.9,
"line_hashes": [
"301224933246596244261327400346684856350",
"279271609363476737699066295964245354894",
"8230220474137871474127553522698245281",
"201917576615739310081939749413415081074",
"197360611309623740703315754630149448754",
"183427359326564373821915170192573286504",
"258698818045112363356788872262644933088",
"202552359418050143270800949835467071126",
"61547958899269820717749617439575073260",
"254035377704695498480318753473516932431",
"10888997367020574239612248200804282254",
"74190569060484353811080584779415645686",
"173853200400701259813136047446425733276",
"199485548497199766215430740885071626746",
"315426187327617941662737491965973250452",
"36034544697284806684367175598123279160",
"202417219645586627351216774680460154329",
"26206119502298134960022374385156433967",
"287601458342327515126230931737219405999",
"183405425770727986354832916331422914052",
"146945759966801940757500644407746702709",
"62067828110427767806965792982477254183",
"201918836905228248949764986627093512652",
"247247108918160699191063239044887125815",
"91723805097914383505483800296800604390",
"312273870034773559205378088584119097992",
"120732382979820529692640840676427457784",
"321595860499012884037852684976132520024"
]
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-41070-7377b77d",
"target": {
"function": "kvm_spapr_tce_attach_iommu_group",
"file": "arch/powerpc/kvm/book3s_64_vio.c"
},
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@be847bb20c809de8ac124431b556f244400b0491",
"digest": {
"function_hash": "158711170332803409476261667021298206878",
"length": 1426.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-41070-7e4d2ca3",
"target": {
"function": "kvm_spapr_tce_attach_iommu_group",
"file": "arch/powerpc/kvm/book3s_64_vio.c"
},
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@b26c8c85463ef27a522d24fcd05651f0bb039e47",
"digest": {
"function_hash": "158711170332803409476261667021298206878",
"length": 1426.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-41070-83d4e732",
"target": {
"function": "kvm_spapr_tce_attach_iommu_group",
"file": "arch/powerpc/kvm/book3s_64_vio.c"
},
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@a986fa57fd81a1430e00b3c6cf8a325d6f894a63",
"digest": {
"function_hash": "158711170332803409476261667021298206878",
"length": 1426.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-41070-978a8082",
"target": {
"file": "arch/powerpc/kvm/book3s_64_vio.c"
},
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@4cdf6926f443c84f680213c7aafbe6f91a5fcbc0",
"digest": {
"threshold": 0.9,
"line_hashes": [
"301224933246596244261327400346684856350",
"279271609363476737699066295964245354894",
"8230220474137871474127553522698245281",
"201917576615739310081939749413415081074",
"197360611309623740703315754630149448754",
"183427359326564373821915170192573286504",
"258698818045112363356788872262644933088",
"202552359418050143270800949835467071126",
"61547958899269820717749617439575073260",
"254035377704695498480318753473516932431",
"10888997367020574239612248200804282254",
"74190569060484353811080584779415645686",
"173853200400701259813136047446425733276",
"199485548497199766215430740885071626746",
"315426187327617941662737491965973250452",
"36034544697284806684367175598123279160",
"202417219645586627351216774680460154329",
"26206119502298134960022374385156433967",
"287601458342327515126230931737219405999",
"183405425770727986354832916331422914052",
"146945759966801940757500644407746702709",
"62067828110427767806965792982477254183",
"201918836905228248949764986627093512652",
"247247108918160699191063239044887125815",
"91723805097914383505483800296800604390",
"312273870034773559205378088584119097992",
"120732382979820529692640840676427457784",
"321595860499012884037852684976132520024"
]
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-41070-98c824de",
"target": {
"file": "arch/powerpc/kvm/book3s_64_vio.c"
},
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@a986fa57fd81a1430e00b3c6cf8a325d6f894a63",
"digest": {
"threshold": 0.9,
"line_hashes": [
"301224933246596244261327400346684856350",
"279271609363476737699066295964245354894",
"8230220474137871474127553522698245281",
"201917576615739310081939749413415081074",
"197360611309623740703315754630149448754",
"183427359326564373821915170192573286504",
"258698818045112363356788872262644933088",
"202552359418050143270800949835467071126",
"61547958899269820717749617439575073260",
"254035377704695498480318753473516932431",
"10888997367020574239612248200804282254",
"74190569060484353811080584779415645686",
"173853200400701259813136047446425733276",
"199485548497199766215430740885071626746",
"315426187327617941662737491965973250452",
"36034544697284806684367175598123279160",
"202417219645586627351216774680460154329",
"26206119502298134960022374385156433967",
"287601458342327515126230931737219405999",
"183405425770727986354832916331422914052",
"146945759966801940757500644407746702709",
"62067828110427767806965792982477254183",
"201918836905228248949764986627093512652",
"247247108918160699191063239044887125815",
"91723805097914383505483800296800604390",
"312273870034773559205378088584119097992",
"120732382979820529692640840676427457784",
"321595860499012884037852684976132520024"
]
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-41070-a5405f57",
"target": {
"function": "kvm_spapr_tce_attach_iommu_group",
"file": "arch/powerpc/kvm/book3s_64_vio.c"
},
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@82c7a4cf14aa866f8f7f09e662b02eddc49ee0bf",
"digest": {
"function_hash": "158711170332803409476261667021298206878",
"length": 1426.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-41070-bcc96e81",
"target": {
"function": "kvm_spapr_tce_attach_iommu_group",
"file": "arch/powerpc/kvm/book3s_64_vio.c"
},
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9975f93c760a32453d7639cf6fcf3f73b4e71ffe",
"digest": {
"function_hash": "158711170332803409476261667021298206878",
"length": 1426.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-41070-cc9d3bb7",
"target": {
"file": "arch/powerpc/kvm/book3s_64_vio.c"
},
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9975f93c760a32453d7639cf6fcf3f73b4e71ffe",
"digest": {
"threshold": 0.9,
"line_hashes": [
"301224933246596244261327400346684856350",
"279271609363476737699066295964245354894",
"8230220474137871474127553522698245281",
"201917576615739310081939749413415081074",
"197360611309623740703315754630149448754",
"183427359326564373821915170192573286504",
"258698818045112363356788872262644933088",
"202552359418050143270800949835467071126",
"61547958899269820717749617439575073260",
"254035377704695498480318753473516932431",
"10888997367020574239612248200804282254",
"74190569060484353811080584779415645686",
"173853200400701259813136047446425733276",
"199485548497199766215430740885071626746",
"315426187327617941662737491965973250452",
"36034544697284806684367175598123279160",
"202417219645586627351216774680460154329",
"26206119502298134960022374385156433967",
"287601458342327515126230931737219405999",
"183405425770727986354832916331422914052",
"146945759966801940757500644407746702709",
"62067828110427767806965792982477254183",
"201918836905228248949764986627093512652",
"247247108918160699191063239044887125815",
"91723805097914383505483800296800604390",
"312273870034773559205378088584119097992",
"120732382979820529692640840676427457784",
"321595860499012884037852684976132520024"
]
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-41070-e3b426e2",
"target": {
"function": "kvm_spapr_tce_attach_iommu_group",
"file": "arch/powerpc/kvm/book3s_64_vio.c"
},
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@4cdf6926f443c84f680213c7aafbe6f91a5fcbc0",
"digest": {
"function_hash": "158711170332803409476261667021298206878",
"length": 1426.0
},
"deprecated": false,
"signature_version": "v1"
},
{
"id": "CVE-2024-41070-f95437ca",
"target": {
"function": "kvm_spapr_tce_attach_iommu_group",
"file": "arch/powerpc/kvm/book3s_64_vio.c"
},
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@5f856023971f97fff74cfaf21b48ec320147b50a",
"digest": {
"function_hash": "158711170332803409476261667021298206878",
"length": 1426.0
},
"deprecated": false,
"signature_version": "v1"
}
]