| From bippy-5f407fcff5a0 Mon Sep 17 00:00:00 2001 |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| To: <linux-cve-announce@vger.kernel.org> |
| Reply-to: <cve@kernel.org>, <linux-kernel@vger.kernel.org> |
| Subject: CVE-2024-26745: powerpc/pseries/iommu: IOMMU table is not initialized for kdump over SR-IOV |
| |
| Description |
| =========== |
| |
| In the Linux kernel, the following vulnerability has been resolved: |
| |
| powerpc/pseries/iommu: IOMMU table is not initialized for kdump over SR-IOV |
| |
| When kdump kernel tries to copy dump data over SR-IOV, LPAR panics due |
| to NULL pointer exception: |
| |
| Kernel attempted to read user page (0) - exploit attempt? (uid: 0) |
| BUG: Kernel NULL pointer dereference on read at 0x00000000 |
| Faulting instruction address: 0xc000000020847ad4 |
| Oops: Kernel access of bad area, sig: 11 [#1] |
| LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=2048 NUMA pSeries |
| Modules linked in: mlx5_core(+) vmx_crypto pseries_wdt papr_scm libnvdimm mlxfw tls psample sunrpc fuse overlay squashfs loop |
| CPU: 12 PID: 315 Comm: systemd-udevd Not tainted 6.4.0-Test102+ #12 |
| Hardware name: IBM,9080-HEX POWER10 (raw) 0x800200 0xf000006 of:IBM,FW1060.00 (NH1060_008) hv:phyp pSeries |
| NIP: c000000020847ad4 LR: c00000002083b2dc CTR: 00000000006cd18c |
| REGS: c000000029162ca0 TRAP: 0300 Not tainted (6.4.0-Test102+) |
| MSR: 800000000280b033 <SF,VEC,VSX,EE,FP,ME,IR,DR,RI,LE> CR: 48288244 XER: 00000008 |
| CFAR: c00000002083b2d8 DAR: 0000000000000000 DSISR: 40000000 IRQMASK: 1 |
| ... |
| NIP _find_next_zero_bit+0x24/0x110 |
| LR bitmap_find_next_zero_area_off+0x5c/0xe0 |
| Call Trace: |
| dev_printk_emit+0x38/0x48 (unreliable) |
| iommu_area_alloc+0xc4/0x180 |
| iommu_range_alloc+0x1e8/0x580 |
| iommu_alloc+0x60/0x130 |
| iommu_alloc_coherent+0x158/0x2b0 |
| dma_iommu_alloc_coherent+0x3c/0x50 |
| dma_alloc_attrs+0x170/0x1f0 |
| mlx5_cmd_init+0xc0/0x760 [mlx5_core] |
| mlx5_function_setup+0xf0/0x510 [mlx5_core] |
| mlx5_init_one+0x84/0x210 [mlx5_core] |
| probe_one+0x118/0x2c0 [mlx5_core] |
| local_pci_probe+0x68/0x110 |
| pci_call_probe+0x68/0x200 |
| pci_device_probe+0xbc/0x1a0 |
| really_probe+0x104/0x540 |
| __driver_probe_device+0xb4/0x230 |
| driver_probe_device+0x54/0x130 |
| __driver_attach+0x158/0x2b0 |
| bus_for_each_dev+0xa8/0x130 |
| driver_attach+0x34/0x50 |
| bus_add_driver+0x16c/0x300 |
| driver_register+0xa4/0x1b0 |
| __pci_register_driver+0x68/0x80 |
| mlx5_init+0xb8/0x100 [mlx5_core] |
| do_one_initcall+0x60/0x300 |
| do_init_module+0x7c/0x2b0 |
| |
| At the time of LPAR dump, before kexec hands over control to kdump |
| kernel, DDWs (Dynamic DMA Windows) are scanned and added to the FDT. |
| For the SR-IOV case, default DMA window "ibm,dma-window" is removed from |
| the FDT and DDW added, for the device. |
| |
| Now, kexec hands over control to the kdump kernel. |
| |
| When the kdump kernel initializes, PCI busses are scanned and IOMMU |
| group/tables created, in pci_dma_bus_setup_pSeriesLP(). For the SR-IOV |
| case, there is no "ibm,dma-window". The original commit: b1fc44eaa9ba, |
| fixes the path where memory is pre-mapped (direct mapped) to the DDW. |
| When TCEs are direct mapped, there is no need to initialize IOMMU |
| tables. |
| |
| iommu_table_setparms_lpar() only considers "ibm,dma-window" property |
| when initiallizing IOMMU table. In the scenario where TCEs are |
| dynamically allocated for SR-IOV, newly created IOMMU table is not |
| initialized. Later, when the device driver tries to enter TCEs for the |
| SR-IOV device, NULL pointer execption is thrown from iommu_area_alloc(). |
| |
| The fix is to initialize the IOMMU table with DDW property stored in the |
| FDT. There are 2 points to remember: |
| |
| 1. For the dedicated adapter, kdump kernel would encounter both |
| default and DDW in FDT. In this case, DDW property is used to |
| initialize the IOMMU table. |
| |
| 2. A DDW could be direct or dynamic mapped. kdump kernel would |
| initialize IOMMU table and mark the existing DDW as |
| "dynamic". This works fine since, at the time of table |
| initialization, iommu_table_clear() makes some space in the |
| DDW, for some predefined number of TCEs which are needed for |
| kdump to succeed. |
| |
| The Linux kernel CVE team has assigned CVE-2024-26745 to this issue. |
| |
| |
| Affected and fixed versions |
| =========================== |
| |
| Issue introduced in 6.0 with commit b1fc44eaa9ba31e28c4125d6b9205a3582b47b5d and fixed in 6.1.81 with commit 7eb95e0af5c9c2e6fad50356eaf32d216d0e7bc3 |
| Issue introduced in 6.0 with commit b1fc44eaa9ba31e28c4125d6b9205a3582b47b5d and fixed in 6.6.21 with commit d4d1e4b1513d975961de7bb4f75e450a92d65ebf |
| Issue introduced in 6.0 with commit b1fc44eaa9ba31e28c4125d6b9205a3582b47b5d and fixed in 6.7.9 with commit 5da6d306f315344af1ca2eff4bd9b10b130f0c28 |
| Issue introduced in 6.0 with commit b1fc44eaa9ba31e28c4125d6b9205a3582b47b5d and fixed in 6.8 with commit 09a3c1e46142199adcee372a420b024b4fc61051 |
| Issue introduced in 5.18.18 with commit b9f08b2649dddd4eb0698cb428b173bb01dd2fc5 |
| Issue introduced in 5.19.2 with commit 58942f672c6d04b6a3cd7866cb459671df881538 |
| |
| Please see https://www.kernel.org for a full list of currently supported |
| kernel versions by the kernel community. |
| |
| Unaffected versions might change over time as fixes are backported to |
| older supported kernel versions. The official CVE entry at |
| https://cve.org/CVERecord/?id=CVE-2024-26745 |
| will be updated if fixes are backported, please check that for the most |
| up to date information about this issue. |
| |
| |
| Affected files |
| ============== |
| |
| The file(s) affected by this issue are: |
| arch/powerpc/platforms/pseries/iommu.c |
| |
| |
| Mitigation |
| ========== |
| |
| The Linux kernel CVE team recommends that you update to the latest |
| stable kernel version for this, and many other bugfixes. Individual |
| changes are never tested alone, but rather are part of a larger kernel |
| release. Cherry-picking individual commits is not recommended or |
| supported by the Linux kernel community at all. If however, updating to |
| the latest release is impossible, the individual changes to resolve this |
| issue can be found at these commits: |
| https://git.kernel.org/stable/c/7eb95e0af5c9c2e6fad50356eaf32d216d0e7bc3 |
| https://git.kernel.org/stable/c/d4d1e4b1513d975961de7bb4f75e450a92d65ebf |
| https://git.kernel.org/stable/c/5da6d306f315344af1ca2eff4bd9b10b130f0c28 |
| https://git.kernel.org/stable/c/09a3c1e46142199adcee372a420b024b4fc61051 |