| 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-2022-48853: swiotlb: fix info leak with DMA_FROM_DEVICE |
| |
| Description |
| =========== |
| |
| In the Linux kernel, the following vulnerability has been resolved: |
| |
| swiotlb: fix info leak with DMA_FROM_DEVICE |
| |
| The problem I'm addressing was discovered by the LTP test covering |
| cve-2018-1000204. |
| |
| A short description of what happens follows: |
| 1) The test case issues a command code 00 (TEST UNIT READY) via the SG_IO |
| interface with: dxfer_len == 524288, dxdfer_dir == SG_DXFER_FROM_DEV |
| and a corresponding dxferp. The peculiar thing about this is that TUR |
| is not reading from the device. |
| 2) In sg_start_req() the invocation of blk_rq_map_user() effectively |
| bounces the user-space buffer. As if the device was to transfer into |
| it. Since commit a45b599ad808 ("scsi: sg: allocate with __GFP_ZERO in |
| sg_build_indirect()") we make sure this first bounce buffer is |
| allocated with GFP_ZERO. |
| 3) For the rest of the story we keep ignoring that we have a TUR, so the |
| device won't touch the buffer we prepare as if the we had a |
| DMA_FROM_DEVICE type of situation. My setup uses a virtio-scsi device |
| and the buffer allocated by SG is mapped by the function |
| virtqueue_add_split() which uses DMA_FROM_DEVICE for the "in" sgs (here |
| scatter-gather and not scsi generics). This mapping involves bouncing |
| via the swiotlb (we need swiotlb to do virtio in protected guest like |
| s390 Secure Execution, or AMD SEV). |
| 4) When the SCSI TUR is done, we first copy back the content of the second |
| (that is swiotlb) bounce buffer (which most likely contains some |
| previous IO data), to the first bounce buffer, which contains all |
| zeros. Then we copy back the content of the first bounce buffer to |
| the user-space buffer. |
| 5) The test case detects that the buffer, which it zero-initialized, |
| ain't all zeros and fails. |
| |
| One can argue that this is an swiotlb problem, because without swiotlb |
| we leak all zeros, and the swiotlb should be transparent in a sense that |
| it does not affect the outcome (if all other participants are well |
| behaved). |
| |
| Copying the content of the original buffer into the swiotlb buffer is |
| the only way I can think of to make swiotlb transparent in such |
| scenarios. So let's do just that if in doubt, but allow the driver |
| to tell us that the whole mapped buffer is going to be overwritten, |
| in which case we can preserve the old behavior and avoid the performance |
| impact of the extra bounce. |
| |
| The Linux kernel CVE team has assigned CVE-2022-48853 to this issue. |
| |
| |
| Affected and fixed versions |
| =========================== |
| |
| Fixed in 4.9.320 with commit c132f2ba716b5ee6b35f82226a6e5417d013d753 |
| Fixed in 4.14.281 with commit 971e5dadffd02beba1063e7dd9c3a82de17cf534 |
| Fixed in 4.19.245 with commit 8d9ac1b6665c73f23e963775f85d99679fd8e192 |
| Fixed in 5.4.189 with commit 6bfc5377a210dbda2a237f16d94d1bd4f1335026 |
| Fixed in 5.15.29 with commit 7403f4118ab94be837ab9d770507537a8057bc63 |
| Fixed in 5.16.15 with commit 270475d6d2410ec66e971bf181afe1958dad565e |
| Fixed in 5.17 with commit ddbd89deb7d32b1fbb879f48d68fda1a8ac58e8e |
| |
| 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-2022-48853 |
| 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: |
| Documentation/core-api/dma-attributes.rst |
| include/linux/dma-mapping.h |
| kernel/dma/swiotlb.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/c132f2ba716b5ee6b35f82226a6e5417d013d753 |
| https://git.kernel.org/stable/c/971e5dadffd02beba1063e7dd9c3a82de17cf534 |
| https://git.kernel.org/stable/c/8d9ac1b6665c73f23e963775f85d99679fd8e192 |
| https://git.kernel.org/stable/c/6bfc5377a210dbda2a237f16d94d1bd4f1335026 |
| https://git.kernel.org/stable/c/7403f4118ab94be837ab9d770507537a8057bc63 |
| https://git.kernel.org/stable/c/270475d6d2410ec66e971bf181afe1958dad565e |
| https://git.kernel.org/stable/c/ddbd89deb7d32b1fbb879f48d68fda1a8ac58e8e |