OpenCloudOS-Kernel/arch
Alexey Kardashevskiy 76fa4975f3 KVM: PPC: Check if IOMMU page is contained in the pinned physical page
A VM which has:
 - a DMA capable device passed through to it (eg. network card);
 - running a malicious kernel that ignores H_PUT_TCE failure;
 - capability of using IOMMU pages bigger that physical pages
can create an IOMMU mapping that exposes (for example) 16MB of
the host physical memory to the device when only 64K was allocated to the VM.

The remaining 16MB - 64K will be some other content of host memory, possibly
including pages of the VM, but also pages of host kernel memory, host
programs or other VMs.

The attacking VM does not control the location of the page it can map,
and is only allowed to map as many pages as it has pages of RAM.

We already have a check in drivers/vfio/vfio_iommu_spapr_tce.c that
an IOMMU page is contained in the physical page so the PCI hardware won't
get access to unassigned host memory; however this check is missing in
the KVM fastpath (H_PUT_TCE accelerated code). We were lucky so far and
did not hit this yet as the very first time when the mapping happens
we do not have tbl::it_userspace allocated yet and fall back to
the userspace which in turn calls VFIO IOMMU driver, this fails and
the guest does not retry,

This stores the smallest preregistered page size in the preregistered
region descriptor and changes the mm_iommu_xxx API to check this against
the IOMMU page size.

This calculates maximum page size as a minimum of the natural region
alignment and compound page size. For the page shift this uses the shift
returned by find_linux_pte() which indicates how the page is mapped to
the current userspace - if the page is huge and this is not a zero, then
it is a leaf pte and the page is mapped within the range.

Fixes: 121f80ba68 ("KVM: PPC: VFIO: Add in-kernel acceleration for VFIO")
Cc: stable@vger.kernel.org # v4.12+
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
2018-07-18 16:17:17 +10:00
..
alpha alpha: Remove custom dec_and_lock() implementation 2018-06-12 23:33:24 +02:00
arc mm: introduce ARCH_HAS_PTE_SPECIAL 2018-06-07 17:34:35 -07:00
arm ARM: SoC fixes for 4.18-rc 2018-06-30 14:08:06 -07:00
arm64 ARM: SoC fixes for 4.18-rc 2018-06-30 14:08:06 -07:00
c6x Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2018-06-04 20:27:54 -07:00
h8300 Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2018-06-04 20:27:54 -07:00
hexagon hexagon: drop the unused variable zero_page_mask 2018-06-15 07:55:25 +09:00
ia64 - Error path bug fix for overflow tests (Dan) 2018-06-12 18:28:00 -07:00
m68k Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu 2018-06-05 10:51:30 -07:00
microblaze Microblaze patches for 4.18-rc3 2018-06-27 09:49:30 -07:00
mips MIPS: Add ksig argument to rseq_{signal_deliver,handle_notify_resume} 2018-06-24 10:33:03 -07:00
nds32 Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2018-06-04 20:27:54 -07:00
nios2 Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2018-06-04 20:27:54 -07:00
openrisc Kbuild updates for v4.18 2018-06-06 11:00:15 -07:00
parisc parisc: Build kernel without -ffunction-sections 2018-06-29 17:27:20 +02:00
powerpc KVM: PPC: Check if IOMMU page is contained in the pinned physical page 2018-07-18 16:17:17 +10:00
riscv RISC-V Updates for the 4.18 Merge Window 2018-06-16 06:42:43 +09:00
s390 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux 2018-06-19 07:44:51 +09:00
sh arch/*: Kconfig: fix documentation for NMI watchdog 2018-06-15 12:48:59 -03:00
sparc arch/*: Kconfig: fix documentation for NMI watchdog 2018-06-15 12:48:59 -03:00
um Solve a series of broken links for files under Documentation: 2018-06-17 05:25:18 +09:00
unicore32 docs: Fix some broken references 2018-06-15 18:10:01 -03:00
x86 Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2018-06-30 11:42:14 -07:00
xtensa docs: Fix some broken references 2018-06-15 18:10:01 -03:00
.gitignore
Kconfig docs: Fix some broken references 2018-06-15 18:10:01 -03:00