• Michael Kelley's avatar
    iommu/dma: fix zeroing of bounce buffer padding used by untrusted devices · 2650073f
    Michael Kelley authored
    iommu_dma_map_page() allocates swiotlb memory as a bounce buffer when an
    untrusted device wants to map only part of the memory in an granule.  The
    goal is to disallow the untrusted device having DMA access to unrelated
    kernel data that may be sharing the granule.  To meet this goal, the
    bounce buffer itself is zeroed, and any additional swiotlb memory up to
    alloc_size after the bounce buffer end (i.e., "post-padding") is also
    zeroed.
    
    However, as of commit 901c7280 ("Reinstate some of "swiotlb: rework
    "fix info leak with DMA_FROM_DEVICE"""), swiotlb_tbl_map_single() always
    initializes the contents of the bounce buffer to the original memory.
    Zeroing the bounce buffer is redundant and probably wrong per the
    discussion in that commit. Only the post-padding needs to be zeroed.
    
    Also, when the DMA min_align_mask is non-zero, the allocated bounce
    buffer space may not start on a granule boundary.  The swiotlb memory
    from the granule boundary to the start of the allocated bounce buffer
    might belong to some unrelated bounce buffer. So as described in the
    "second issue" in [1], it can't be zeroed to protect against untrusted
    devices. But as of commit af133562 ("swiotlb: extend buffer
    pre-padding to alloc_align_mask if necessary"), swiotlb_tbl_map_single()
    allocates pre-padding slots when necessary to meet min_align_mask
    requirements, making it possible to zero the pre-padding area as well.
    
    Finally, iommu_dma_map_page() uses the swiotlb for untrusted devices
    and also for certain kmalloc() memory. Current code does the zeroing
    for both cases, but it is needed only for the untrusted device case.
    
    Fix all of this by updating iommu_dma_map_page() to zero both the
    pre-padding and post-padding areas, but not the actual bounce buffer.
    Do this only in the case where the bounce buffer is used because
    of an untrusted device.
    
    [1] https://lore.kernel.org/all/20210929023300.335969-1-stevensd@google.com/Signed-off-by: default avatarMichael Kelley <mhklinux@outlook.com>
    Reviewed-by: default avatarPetr Tesarik <petr@tesarici.cz>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    2650073f
dma-iommu.c 50.6 KB