CVE-2024-35814
Severity CVSS v4.0:
Pending analysis
Type:
CWE-415
Double Free
Publication date:
17/05/2024
Last modified:
19/09/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
swiotlb: Fix double-allocation of slots due to broken alignment handling<br />
<br />
Commit bbb73a103fbb ("swiotlb: fix a braino in the alignment check fix"),<br />
which was a fix for commit 0eee5ae10256 ("swiotlb: fix slot alignment<br />
checks"), causes a functional regression with vsock in a virtual machine<br />
using bouncing via a restricted DMA SWIOTLB pool.<br />
<br />
When virtio allocates the virtqueues for the vsock device using<br />
dma_alloc_coherent(), the SWIOTLB search can return page-unaligned<br />
allocations if &#39;area->index&#39; was left unaligned by a previous allocation<br />
from the buffer:<br />
<br />
# Final address in brackets is the SWIOTLB address returned to the caller<br />
| virtio-pci 0000:00:07.0: orig_addr 0x0 alloc_size 0x2000, iotlb_align_mask 0x800 stride 0x2: got slot 1645-1649/7168 (0x98326800)<br />
| virtio-pci 0000:00:07.0: orig_addr 0x0 alloc_size 0x2000, iotlb_align_mask 0x800 stride 0x2: got slot 1649-1653/7168 (0x98328800)<br />
| virtio-pci 0000:00:07.0: orig_addr 0x0 alloc_size 0x2000, iotlb_align_mask 0x800 stride 0x2: got slot 1653-1657/7168 (0x9832a800)<br />
<br />
This ends badly (typically buffer corruption and/or a hang) because<br />
swiotlb_alloc() is expecting a page-aligned allocation and so blindly<br />
returns a pointer to the &#39;struct page&#39; corresponding to the allocation,<br />
therefore double-allocating the first half (2KiB slot) of the 4KiB page.<br />
<br />
Fix the problem by treating the allocation alignment separately to any<br />
additional alignment requirements from the device, using the maximum<br />
of the two as the stride to search the buffer slots and taking care<br />
to ensure a minimum of page-alignment for buffers larger than a page.<br />
<br />
This also resolves swiotlb allocation failures occuring due to the<br />
inclusion of ~PAGE_MASK in &#39;iotlb_align_mask&#39; for large allocations and<br />
resulting in alignment requirements exceeding swiotlb_max_mapping_size().
Impact
Base Score 3.x
8.80
Severity 3.x
HIGH
Vulnerable products and versions
| CPE | From | Up to |
|---|---|---|
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.3 (including) | 6.6.24 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.7 (including) | 6.7.12 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.8 (including) | 6.8.3 (excluding) |
To consult the complete list of CPE names with products and versions, see this page
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/04867a7a33324c9c562ee7949dbcaab7aaad1fb4
- https://git.kernel.org/stable/c/3e7acd6e25ba77dde48c3b721c54c89cd6a10534
- https://git.kernel.org/stable/c/777391743771040e12cc40d3d0d178f70c616491
- https://git.kernel.org/stable/c/c88668aa6c1da240ea3eb4d128b7906e740d3cb8
- https://git.kernel.org/stable/c/04867a7a33324c9c562ee7949dbcaab7aaad1fb4
- https://git.kernel.org/stable/c/3e7acd6e25ba77dde48c3b721c54c89cd6a10534
- https://git.kernel.org/stable/c/777391743771040e12cc40d3d0d178f70c616491
- https://git.kernel.org/stable/c/c88668aa6c1da240ea3eb4d128b7906e740d3cb8



