Re: How bad is KVM_EXIT_INTERNAL_ERROR?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Dec 22, 2016 at 10:05 AM, Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote:
>> On Wed, Dec 21, 2016 at 2:26 PM, Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote:
>> >
>> >
>> > On 21/12/2016 12:06, Dmitry Vyukov wrote:
>> >> On Wed, Dec 21, 2016 at 12:00 PM, Paolo Bonzini <pbonzini@xxxxxxxxxx>
>> >> wrote:
>> >>>
>> >>>
>> >>> On 21/12/2016 10:41, Dmitry Vyukov wrote:
>> >>>> Hello,
>> >>>>
>> >>>> I am getting some KVM_EXIT_INTERNAL_ERROR/KVM_INTERNAL_ERROR_EMULATION
>> >>>> while fuzzing KVM. Does it indicate a bug in kvm code?
>> >>>
>> >>> No, it just indicates something that isn't implemented.  Other
>> >>> KVM_EXIT_INTERNAL_ERROR cases indicate a bug in the userspace code.
>> >>
>> >> Something is not implemented where? You mean host userspace (VMM)?
>> >
>> > No, in KVM's instruction emulator.
>>
>> You mean that KVM_INTERNAL_ERROR_EMULATION means that something is not
>> implemented in KVM's instruction emulator, right?
>>
>> What about other error codes? You said that they indicate a bug in the
>> userspace code. What userspace code?
>
> For example setting processor state (KVM_SET_SREGS) to something that
> makes no sense.

For now I always set sregs to simple "canonical" values that put the
processor into 64-bit long mode. But I guess that guest can do the
setup that makes no sense later.

>> > KVM_INTERNAL_ERROR_EMULATION only kills the whole VM at CPL=0.  At CPL=3
>> > or in a nested VM it would be translated to an undefined opcode
>> > exception, exactly for this reason.
>> >
>> > Feel free to send one or two examples, they should be easy to analyze.
>> > But I suspect it's just a combination of executing garbage instructions
>> > with garbage processor state.  If so, an unprivileged guest that can
>> > trigger KVM_INTERNAL_ERROR_EMULATION in a kernel most likely has gotten
>> > arbitrary code execution already.
>>
>> What's the simplest way to verify that the error was triggered by
>> CPL=0 code? Do KVM_GET_SREGS and check value code segment?
>
> CPL is actually SS.DPL, so that's what you would have to check.  But
> really the only case of KVM_INTERNAL_ERROR_EMULATION that fuzzing can
> produce is probably this one:
>
>         if (!is_guest_mode(vcpu) && kvm_x86_ops->get_cpl(vcpu) == 0) {
>                 vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
>                 vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_EMULATION;
>                 vcpu->run->internal.ndata = 0;
>                 r = EMULATE_FAIL;
>         }
>         kvm_queue_exception(vcpu, UD_VECTOR);
>
> There are other cases of KVM_INTERNAL_ERROR_EMULATION corresponding to
> hardware task switching.  Neither Linux nor Windows provide userspace with
> means to trigger those, but nested virtualization probably could on AMD.

Yes, I am getting only that one (added WARN to the other one and it
does not fire).


I understand the picture now. I will ignore all KVM_EXIT_INTERNAL_ERROR.

Thanks!
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux