public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Zefan Li <lizf@kernel.org>
To: stable@vger.kernel.org
Cc: linux-kernel@vger.kernel.org,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Zefan Li <lizefan@huawei.com>
Subject: [PATCH 3.4 08/45] kvm: iommu: fix the third parameter of kvm_iommu_put_pages (CVE-2014-3601)
Date: Tue, 23 Sep 2014 10:31:10 +0800	[thread overview]
Message-ID: <1411439507-30391-8-git-send-email-lizf@kernel.org> (raw)
In-Reply-To: <1411439259-30224-1-git-send-email-lizf@kernel.org>

From: "Michael S. Tsirkin" <mst@redhat.com>

3.4.104-rc1 review patch.  If anyone has any objections, please let me know.

------------------

commit 350b8bdd689cd2ab2c67c8a86a0be86cfa0751a7 upstream.

The third parameter of kvm_iommu_put_pages is wrong,
It should be 'gfn - slot->base_gfn'.

By making gfn very large, malicious guest or userspace can cause kvm to
go to this error path, and subsequently to pass a huge value as size.
Alternatively if gfn is small, then pages would be pinned but never
unpinned, causing host memory leak and local DOS.

Passing a reasonable but large value could be the most dangerous case,
because it would unpin a page that should have stayed pinned, and thus
allow the device to DMA into arbitrary memory.  However, this cannot
happen because of the condition that can trigger the error:

- out of memory (where you can't allocate even a single page)
  should not be possible for the attacker to trigger

- when exceeding the iommu's address space, guest pages after gfn
  will also exceed the iommu's address space, and inside
  kvm_iommu_put_pages() the iommu_iova_to_phys() will fail.  The
  page thus would not be unpinned at all.

Reported-by: Jack Morgenstein <jackm@mellanox.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Zefan Li <lizefan@huawei.com>
---
 virt/kvm/iommu.c |   19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/virt/kvm/iommu.c b/virt/kvm/iommu.c
index 53d34f6..defc9ba 100644
--- a/virt/kvm/iommu.c
+++ b/virt/kvm/iommu.c
@@ -61,6 +61,14 @@ static pfn_t kvm_pin_pages(struct kvm *kvm, struct kvm_memory_slot *slot,
 	return pfn;
 }
 
+static void kvm_unpin_pages(struct kvm *kvm, pfn_t pfn, unsigned long npages)
+{
+	unsigned long i;
+
+	for (i = 0; i < npages; ++i)
+		kvm_release_pfn_clean(pfn + i);
+}
+
 int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot)
 {
 	gfn_t gfn, end_gfn;
@@ -121,6 +129,7 @@ int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot)
 		if (r) {
 			printk(KERN_ERR "kvm_iommu_map_address:"
 			       "iommu failed to map pfn=%llx\n", pfn);
+			kvm_unpin_pages(kvm, pfn, page_size);
 			goto unmap_pages;
 		}
 
@@ -132,7 +141,7 @@ int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot)
 	return 0;
 
 unmap_pages:
-	kvm_iommu_put_pages(kvm, slot->base_gfn, gfn);
+	kvm_iommu_put_pages(kvm, slot->base_gfn, gfn - slot->base_gfn);
 	return r;
 }
 
@@ -274,14 +283,6 @@ out_unlock:
 	return r;
 }
 
-static void kvm_unpin_pages(struct kvm *kvm, pfn_t pfn, unsigned long npages)
-{
-	unsigned long i;
-
-	for (i = 0; i < npages; ++i)
-		kvm_release_pfn_clean(pfn + i);
-}
-
 static void kvm_iommu_put_pages(struct kvm *kvm,
 				gfn_t base_gfn, unsigned long npages)
 {
-- 
1.7.9.5


  parent reply	other threads:[~2014-09-23  2:35 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-23  2:27 [PATCH 3.4 00/45] 3.4.104-rc1 review Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 01/45] stable_kernel_rules: Add pointer to netdev-FAQ for network patches Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 02/45] ASoC: pxa-ssp: drop SNDRV_PCM_FMTBIT_S24_LE Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 03/45] ibmveth: Fix endian issues with rx_no_buffer statistic Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 04/45] HID: fix a couple of off-by-ones Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 05/45] HID: logitech: perform bounds checking on device_id early enough Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 06/45] isofs: Fix unbounded recursion when processing relocated directories Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 07/45] MIPS: OCTEON: make get_system_type() thread-safe Zefan Li
2014-09-23  2:31 ` Zefan Li [this message]
2014-09-23  2:31 ` [PATCH 3.4 09/45] pata_scc: propagate return value of scc_wait_after_reset Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 10/45] iommu/amd: Fix cleanup_domain for mass device removal Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 11/45] md/raid6: avoid data corruption during recovery of double-degraded RAID6 Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 12/45] CIFS: Fix wrong directory attributes after rename Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 13/45] ALSA: hda/realtek - Avoid setting wrong COEF on ALC269 & co Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 14/45] xtensa: replace IOCTL code definitions with constants Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 15/45] xtensa: fix address checks in dma_{alloc,free}_coherent Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 16/45] xtensa: fix TLBTEMP_BASE_2 region handling in fast_second_level_miss Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 17/45] xtensa: fix a6 and a7 handling in fast_syscall_xtensa Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 18/45] staging: et131x: Fix errors caused by phydev->addr accesses before initialisation Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 19/45] USB: option: add VIA Telecom CDS7 chipset device id Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 20/45] USB: ftdi_sio: add Basic Micro ATOM Nano USB2Serial PID Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 21/45] USB: serial: pl2303: add device id for ztek device Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 22/45] USB: ftdi_sio: Added PID for new ekey device Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 23/45] xhci: Treat not finding the event_seg on COMP_STOP the same as COMP_STOP_INVAL Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 24/45] usb: xhci: amd chipset also needs short TX quirk Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 25/45] USB: whiteheat: Added bounds checking for bulk command response Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 26/45] HID: logitech-dj: prevent false errors to be shown Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 27/45] USB: sisusb: add device id for Magic Control USB video Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 28/45] NFSv4: Fix problems with close in the presence of a delegation Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 29/45] HID: magicmouse: sanity check report size in raw_event() callback Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 30/45] HID: picolcd: " Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 31/45] ARM: 8128/1: abort: don't clear the exclusive monitors Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 32/45] ARM: 8129/1: errata: work around Cortex-A15 erratum 830321 using dummy strex Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 33/45] USB: serial: fix potential stack buffer overflow Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 34/45] USB: serial: fix potential heap " Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 35/45] MIPS: perf: Fix build error caused by unused counters_per_cpu_to_total() Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 36/45] MIPS: Fix accessing to per-cpu data when flushing the cache Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 37/45] openrisc: add missing header inclusion Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 38/45] slab/mempolicy: always use local policy from interrupt context Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 39/45] 8250_pci: fix warnings in backport of Broadcom TruManage support Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 40/45] unicore32: select generic atomic64_t support Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 41/45] UniCore32-bugfix: Remove definitions in asm/bug.h to solve difference between native and cross compiler Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 42/45] UniCore32-bugfix: fix mismatch return value of __xchg_bad_pointer Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 43/45] alpha: Fix fall-out from disintegrating asm/system.h Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 44/45] ext2: Fix fs corruption in ext2_get_xip_mem() Zefan Li
2014-09-23  2:31 ` [PATCH 3.4 45/45] alpha: add io{read,write}{16,32}be functions Zefan Li
2014-09-23  2:42 ` [PATCH 3.4 00/45] 3.4.104-rc1 review Guenter Roeck
2014-09-23  2:54   ` Guenter Roeck
2014-09-23  2:54   ` Zefan Li
2014-09-23  2:56 ` Zefan Li
2014-09-23  4:54 ` Satoru Takeuchi
2014-09-23  6:12   ` Zefan Li
2014-09-23  4:58 ` Guenter Roeck
2014-09-23  6:14   ` Zefan Li

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1411439507-30391-8-git-send-email-lizf@kernel.org \
    --to=lizf@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizefan@huawei.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox