> On Wed, 20 Apr 2016 20:29:09 +0200 > Radim Krčmář <rkrcmar@xxxxxxxxxx> wrote: > > > 2016-04-20 17:44+0200, Greg Kurz: > > > Commit 338c7dbadd26 ("KVM: Improve create VCPU parameter (CVE-2013-4587)") > > > introduced a check to prevent potential kernel memory corruption in case > > > the vcpu id is too great. > > > > > > Unfortunately this check assumes vcpu ids grow in sequence with a common > > > difference of 1, which is wrong: archs are free to use vcpu id as they fit. > > > For example, QEMU originated vcpu ids for PowerPC cpus running in boot3s_hv > > > mode, can grow with a common difference of 2, 4 or 8: if KVM_MAX_VCPUS is > > > 1024, guests may be limited down to 128 vcpus on POWER8. > > > > > > This means the check does not belong here and should be moved to some arch > > > specific function: kvm_arch_vcpu_create() looks like a good candidate. > > > > > > ARM and s390 already have such a check. > > > > > > I could not spot any path in the PowerPC or common KVM code where a vcpu > > > id is used as described in the above commit: I believe PowerPC can live > > > without this check. > > > > The only problematic path I see is kvm_get_vcpu_by_id(), which returns > > NULL for any id above KVM_MAX_VCPUS. > > Oops my bad, I started to work on a 4.4 tree and I missed this check brought > by commit c896939f7cff (KVM: use heuristic for fast VCPU lookup by id). > > But again, I believe the check is wrong there also: the changelog just mentions > this is a fastpath for the usual case where "VCPU ids match the array index"... > why does the patch add a NULL return path if id >= KVM_MAX_VCPUS ? > > > kvm_vm_ioctl_create_vcpu() uses kvm_get_vcpu_by_id() to check for > > duplicate ids, so PowerPC could end up with many VCPUs of the same id. > > I'm not sure what could fail, but code doesn't expect this situation. > > Patching kvm_get_vcpu_by_id() is easy, though. > > > > Something like this ? > > if (id < 0) > return NULL; > if (id < KVM_MAX_VCPUS) > vcpu = kvm_get_vcpu(kvm, id); > > In the same patch ? So the heuristic would only trigger if id < KVM_MAX_VCPUS. By initializing vcpu to NULL this would work. David