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

Re: [Xen-devel] [PATCH v2] x86/viridian: Add Partition Reference Time enlightenment



>>> On 13.10.14 at 10:53, <chegger@xxxxxxxxx> wrote:
> On 10.10.14 13:55, Egger, Christoph wrote:
>> On 29.09.14 12:28, Paul Durrant wrote:
>> Reviewed-by: Christoph Egger <chegger@xxxxxxxxx>
> 
> I found one issue in update_reference_tsc(). See below.

As pointed out before.

>>> +    /*
>>> +     * The guest will calculate reference time according to the following
>>> +     * formula:
>>> +     *
>>> +     * ReferenceTime = ((RDTSC() * TscScale) >> 64) + TscOffset
>>> +     *
>>> +     * Windows uses a 100ns tick, so we need a scale which is cpu
>>> +     * ticks per 100ns shifted left by 64.
>>> +     */
>>> +    p->TscScale = ((10000ul << 32) / d->arch.tsc_khz) << 32;
>>> +
>>> +    do {
>>> +        p->TscSequence++;
>>> +    } while ( p->TscSequence == 0xFFFFFFFF ||
>>> +              p->TscSequence == 0 ); /* Avoid both 'invalid' values */
> 
> This is reading guest memory so a malicious guest can spin writing 0 and
> cause a DoS.
> 
> Better do here:
> 
>         p->TscSequence++;
>         if ( p->TscSequence == 0xFFFFFFFF || p->TscSequence == 0 )
>             p->TscSequence = 1;

        switch ( ++p->TscSequence )
        {
        case 0: case 0xffffffff:
                p->TscSequence = 1;
        }

And then again I would think it's wrong to store an "invalid" value
here even temporarily. I.e. we'd probably be better off computing
old value plus one into a local variable, skip the "invalid" values if
necessary, and only then store the new sequence number.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.