linux/virt/kvm
Andre Przywara e580744e77 KVM: arm/arm64: check IRQ number on userland injection
[ Upstream commit fd1d0ddf2a ]

When userland injects a SPI via the KVM_IRQ_LINE ioctl we currently
only check it against a fixed limit, which historically is set
to 127. With the new dynamic IRQ allocation the effective limit may
actually be smaller (64).
So when now a malicious or buggy userland injects a SPI in that
range, we spill over on our VGIC bitmaps and bytemaps memory.
I could trigger a host kernel NULL pointer dereference with current
mainline by injecting some bogus IRQ number from a hacked kvmtool:
-----------------
....
DEBUG: kvm_vgic_inject_irq(kvm, cpu=0, irq=114, level=1)
DEBUG: vgic_update_irq_pending(kvm, cpu=0, irq=114, level=1)
DEBUG: IRQ #114 still in the game, writing to bytemap now...
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = ffffffc07652e000
[00000000] *pgd=00000000f658b003, *pud=00000000f658b003, *pmd=0000000000000000
Internal error: Oops: 96000006 [#1] PREEMPT SMP
Modules linked in:
CPU: 1 PID: 1053 Comm: lkvm-msi-irqinj Not tainted 4.0.0-rc7+ #3027
Hardware name: FVP Base (DT)
task: ffffffc0774e9680 ti: ffffffc0765a8000 task.ti: ffffffc0765a8000
PC is at kvm_vgic_inject_irq+0x234/0x310
LR is at kvm_vgic_inject_irq+0x30c/0x310
pc : [<ffffffc0000ae0a8>] lr : [<ffffffc0000ae180>] pstate: 80000145
.....

So this patch fixes this by checking the SPI number against the
actual limit. Also we remove the former legacy hard limit of
127 in the ioctl code.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
CC: <stable@vger.kernel.org> # 4.0, 3.19, 3.18
[maz: wrap KVM_ARM_IRQ_GIC_MAX with #ifndef __KERNEL__,
as suggested by Christopher Covington]
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
History 2015-05-17 19:11:50 -04:00
..
arm KVM: arm/arm64: check IRQ number on userland injection 2015-05-17 19:11:50 -04:00
assigned-dev.c KVM: Use PCI device flag helper functions 2014-09-16 16:18:40 -06:00
async_pf.c kvm: Faults which trigger IO release the mmap_sem 2014-09-24 14:07:54 +02:00
async_pf.h KVM: Halt vcpu if page it tries to access is swapped out 2011-01-12 11:21:39 +02:00
coalesced_mmio.c KVM: return an error code in kvm_vm_ioctl_register_coalesced_mmio() 2014-01-30 11:56:09 +01:00
coalesced_mmio.h KVM: Make coalesced mmio use a device per zone 2011-09-25 19:17:57 +03:00
eventfd.c KVM: EVENTFD: Remove inclusion of irq.h 2014-09-24 12:06:25 +02:00
ioapic.c kvm: ioapic: conditionally delay irq delivery duringeoi broadcast 2014-09-16 14:44:48 +02:00
ioapic.h kvm: ioapic: conditionally delay irq delivery duringeoi broadcast 2014-09-16 14:44:48 +02:00
iodev.h KVM: remove in_range from io devices 2009-09-10 08:33:05 +03:00
iommu.c kvm: fix excessive pages un-pinning in kvm_iommu_map error path. 2014-10-24 13:30:37 +02:00
irq_comm.c KVM: Move all accesses to kvm::irq_routing into irqchip.c 2014-08-05 14:26:20 +02:00
irqchip.c KVM: Move irq notifier implementation into eventfd.c 2014-08-05 14:26:24 +02:00
Kconfig KVM: Give IRQFD its own separate enabling Kconfig option 2014-08-05 14:26:28 +02:00
kvm_main.c KVM: use slowpath for cross page cached accesses 2015-05-17 19:11:49 -04:00
vfio.c kvm: vfio: fix unregister kvm_device_ops of vfio 2014-10-24 13:30:47 +02:00
vfio.h kvm: vfio: fix unregister kvm_device_ops of vfio 2014-10-24 13:30:47 +02:00