Received: by 10.223.176.46 with SMTP id f43csp747064wra; Fri, 19 Jan 2018 01:03:36 -0800 (PST) X-Google-Smtp-Source: ACJfBoslyLswKU1h8svdR1T8y9CwZbuXbOP1TJZytFU0lG9c+W75aadRy1uslykYYBj90sm38jnx X-Received: by 10.98.76.150 with SMTP id e22mr4285683pfj.28.1516352616081; Fri, 19 Jan 2018 01:03:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516352616; cv=none; d=google.com; s=arc-20160816; b=yZtJzXlTQbXgjGo6qzpwBzay0NQ0xsNUWB7Ksb6bxQ3sjcKf11XXmkIDF9jFSF4XSP Y69zbHBTtHUWv1wlNtnvjB16Aoqg28mkZOKugmUME7kl3tAavfNhrisCxeJZKm7c8txw eGY6aiHxjj5xvv6aJXSt4IS9AZOru0TWpPISZZ6sPu/DkNPKCVegCei67yNfJUn3+H23 MNkEV7XFqmbM6HSwhBsOWWa7fJpPbReETRqbLMMLpAxbG2A9j3Ldc0vxZpJZpU68+mU9 0mT2+iCfHFIbFKz1wSWKpfxQaHsq8w22ttnBP4fXSQN2/dOi+UVkAzviCIVuiwv+31Ds ybZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=X04goTFkjWBDG+/W94Nb16GLA8jKdCOm0JbC3ld8Xtk=; b=cWO1c/lkDThaHk+OWSG3QwaDE7j9BavTk3eb4cF20DN7RPzPhlmEy/SziymAA6Bs7C HxEthqxzBSBKLJGnQhb7+dfrTJiQEWjkjlbvioSa/ispg6Zf/5OtHsUuao2Gel6xJYEZ bIc449o5IeF4dfZ/lPlNGGjOUscUGvJQT4CCvAKWR5LpsgRENFEBA3+E97lFGKwqfN56 Rv9mL6cP/FXgLrZLlKsyHTgx5XmXX0fpS/ZATeH3i8Wyu6LkA7GNJhoaEBi7kghq0SZa NmjuvZYEIzSAIvkbV7I0FXWV/KXKxoQmZsNHCjfGPPx2y+Go5DBZESN2cGqjbijipV9C vakw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=PZfQ9W4Y; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m17si7883948pge.720.2018.01.19.01.03.22; Fri, 19 Jan 2018 01:03:36 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=PZfQ9W4Y; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755321AbeASJCF (ORCPT + 99 others); Fri, 19 Jan 2018 04:02:05 -0500 Received: from mail-oi0-f67.google.com ([209.85.218.67]:34112 "EHLO mail-oi0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755169AbeASJB7 (ORCPT ); Fri, 19 Jan 2018 04:01:59 -0500 Received: by mail-oi0-f67.google.com with SMTP id a70so670196oib.1; Fri, 19 Jan 2018 01:01:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=X04goTFkjWBDG+/W94Nb16GLA8jKdCOm0JbC3ld8Xtk=; b=PZfQ9W4YI4qjkUQrG0wie18YUF/Ke4jbDdUryl6v/4rUWFr4XHFYxNb0d8FEGyF2D4 3WlsyPGLpF2dQJ4n1HcQyR64ZGvT0Z2se8jBe71dolY55D55AH3ytQnVzJirhFZKtWsz nF74E2A9379gPFlxIlTb0EYWFEHweboihFUOk9vFBFjEVHYgyb6gS4aaQNZ+dvoAag3u cw7EhQXF+mNGRG5cttyiXfarrLEYo2BL+6U0j3yRajaTuPXqhL5K3QD9b+9kK386YQpN PjLDUz+wmtEhoKDKDkTwrM0EQ4NIcXQtUq9qHJhv3X2Kgu3EyNpx7/n00N21w7mmJkuC opNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=X04goTFkjWBDG+/W94Nb16GLA8jKdCOm0JbC3ld8Xtk=; b=bPlZkp3wbjfVxN4aR28t6Yri0n9BhW+idLhrVgD1nXd0zMD8XBSTQBeo6NuLeEIh+N kduBICRydvBwfVqwK5xNpl1thhbszIZdT3/HIOthWKfs/vK0thv3ntYBCzaPgtYf6MSp gQA8maedwpGKpp09t/4Xl5nF08lU8oSmd8X9XAsK/nTGWhITYR3wB6Tm4QY0xLvmKcn4 rFltdnz6uqtNnCyITQ0Y18uatyajOXwraliLQ1R+Pe/Su1CxKq9qUPxbz3A5GW6JM1l8 RnWsr8ZuXdHqdwGHrtDUDPRzpssBoPALjLvOXZ/VDS1iq410U84L03zFvpCC9NIEcjPI BOVg== X-Gm-Message-State: AKwxytdxwNFdXSfwAdbh5k8DjUJVT1/Gwl0yD8FaB8YaPMp1WaYdYVF7 ErlUwwoWHazQwHUYenjmnnJLzdOk34PfrOMFNuc= X-Received: by 10.202.181.87 with SMTP id e84mr4827697oif.112.1516352518770; Fri, 19 Jan 2018 01:01:58 -0800 (PST) MIME-Version: 1.0 Received: by 10.74.108.81 with HTTP; Fri, 19 Jan 2018 01:01:58 -0800 (PST) In-Reply-To: <20180119081820.30803-1-ebiggers3@gmail.com> References: <94eb2c06f65e7ece95055cf1aafd@google.com> <20180119081820.30803-1-ebiggers3@gmail.com> From: Wanpeng Li Date: Fri, 19 Jan 2018 17:01:58 +0800 Message-ID: Subject: Re: [PATCH] KVM: prevent overlap between user and private memslots To: Eric Biggers Cc: kvm , Paolo Bonzini , =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com, Eric Biggers , "# v3 . 10+" Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 2018-01-19 16:18 GMT+08:00 Eric Biggers : > From: Eric Biggers > > Memslots must not overlap in guest physical memory, since otherwise some > guest physical addresses will not uniquely map to a memslot. Yet, the > overlap check in __kvm_set_memory_region() allows a memslot that > overlaps one of the "private" memslots, e.g. the memslot reserved for > the TSS on x86. > > This seems to be a very old bug that was introduced years ago when > private memory slots were first added. It seems that later refactoring > incorrectly assumed this bug was intentional and preserved it. > > Fix it by removing the loophole for private memslots, so we just check > for overlap against all memslots. > > This bug was found by syzkaller, which used a memslot overlap to make > pte_list_remove() be called for the wrong memslot, hitting a BUG(): > > pte_list_remove: 000000007185ed42 0->BUG > kernel BUG at arch/x86/kvm/mmu.c:1209! > [...] > RIP: 0010:pte_list_remove+0x107/0x110 arch/x86/kvm/mmu.c:1208 > [...] > Call Trace: > mmu_page_zap_pte+0x7e/0xd0 arch/x86/kvm/mmu.c:2499 > kvm_mmu_page_unlink_children arch/x86/kvm/mmu.c:2521 [inline] > kvm_mmu_prepare_zap_page+0x4f/0x340 arch/x86/kvm/mmu.c:2565 > kvm_zap_obsolete_pages arch/x86/kvm/mmu.c:5348 [inline] > kvm_mmu_invalidate_zap_all_pages+0xa6/0x100 arch/x86/kvm/mmu.c:5389 > kvm_mmu_notifier_release+0x4f/0x80 arch/x86/kvm/../../../virt/kvm/kvm_main.c:468 > __mmu_notifier_release+0x63/0x100 mm/mmu_notifier.c:75 > mmu_notifier_release include/linux/mmu_notifier.h:244 [inline] > exit_mmap+0x160/0x170 mm/mmap.c:3009 > __mmput kernel/fork.c:966 [inline] > mmput+0x44/0xd0 kernel/fork.c:987 > exit_mm kernel/exit.c:544 [inline] > do_exit+0x24a/0xb50 kernel/exit.c:856 > do_group_exit+0x34/0xb0 kernel/exit.c:972 > SYSC_exit_group kernel/exit.c:983 [inline] > SyS_exit_group+0xb/0x10 kernel/exit.c:981 > entry_SYSCALL_64_fastpath+0x1e/0x8b > > Reproducer: > > #include > #include > #include > > int main() > { > static char buf[4096*3] __attribute__((aligned(4096))); > int kvm, vm, cpu; > struct kvm_mp_state mp_state = { KVM_MP_STATE_SIPI_RECEIVED }; > struct kvm_userspace_memory_region memreg = { > .memory_size = sizeof(buf), > .userspace_addr = (__u64)buf, > }; > > kvm = open("/dev/kvm", O_RDWR); > vm = ioctl(kvm, KVM_CREATE_VM, 0); > ioctl(vm, KVM_CREATE_IRQCHIP); > cpu = ioctl(vm, KVM_CREATE_VCPU, 0); > ioctl(cpu, KVM_SET_MP_STATE, &mp_state); > ioctl(vm, KVM_SET_TSS_ADDR, 0); > ioctl(cpu, KVM_RUN, 0); > ioctl(vm, KVM_SET_USER_MEMORY_REGION, &memreg); > } > > Reported-by: syzbot > Fixes: e0d62c7f4860 ("KVM: Add kernel-internal memory slots") > Cc: # v2.6.25+ > Signed-off-by: Eric Biggers Please refer to this one. https://patchwork.kernel.org/patch/9645377/ Regards, Wanpeng Li > --- > virt/kvm/kvm_main.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index 210bf820385a..e536977e7b6d 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -974,8 +974,7 @@ int __kvm_set_memory_region(struct kvm *kvm, > /* Check for overlaps */ > r = -EEXIST; > kvm_for_each_memslot(slot, __kvm_memslots(kvm, as_id)) { > - if ((slot->id >= KVM_USER_MEM_SLOTS) || > - (slot->id == id)) > + if (slot->id == id) > continue; > if (!((base_gfn + npages <= slot->base_gfn) || > (base_gfn >= slot->base_gfn + slot->npages))) > -- > 2.16.0 >