All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: George Dunlap <George.Dunlap@eu.citrix.com>,
	Ian Jackson <iwj@xenproject.org>,
	Stefano Stabellini <sstabellini@kernel.org>, Wei Liu <wl@xen.org>,
	Julien Grall <julien@xen.org>,
	Dario Faggioli <dfaggioli@suse.com>,
	Meng Xu <mengxu@cis.upenn.edu>,
	Xen-devel <xen-devel@lists.xenproject.org>
Subject: Re: [PATCH v2 01/12] xen/trace: Don't over-read trace objects
Date: Tue, 21 Sep 2021 18:51:20 +0100	[thread overview]
Message-ID: <171e6f01-63cc-e453-7268-1bf2ec6fe7cf@citrix.com> (raw)
In-Reply-To: <731e3474-77bc-b11b-41ca-5dff57831264@suse.com>

On 21/09/2021 07:53, Jan Beulich wrote:
> On 20.09.2021 19:25, Andrew Cooper wrote:
>> In the case that 'extra' isn't a multiple of uint32_t, the calculation rounds
>> the number of bytes up, causing later logic to read unrelated bytes beyond the
>> end of the object.
>>
>> Also, asserting that the object is within TRACE_EXTRA_MAX, but truncating it
>> in release builds is rude.  Instead, reject any out-of-spec records, leaving
>> enough of a message to identify the faulty caller.
>>
>> There is one buggy race record, TRC_RTDS_BUDGET_BURN.  As it must remain
> Nit: I guess s/race/trace/ ?

Oops yes.

>
>> __packed (as cur_budget is misaligned), change bool has_extratime to uint32_t
>> to compensate.
>>
>> The new printk() can also be hit by HVMOP_xentrace, although no over-read is
>> possible.  This has no business being a hypercall in the first place, as it
>> can't be used outside of custom local debugging, so extend the uint32_t
>> requirement to HVMOP_xentrace too.
>>
>> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
> Reviewed-by: Jan Beulich <jbeulich@suse.com>
>
> Two remarks (plus further not directly related ones), nevertheless:
>
>> --- a/xen/arch/x86/hvm/hvm.c
>> +++ b/xen/arch/x86/hvm/hvm.c
>> @@ -5063,8 +5063,9 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
>>          if ( copy_from_guest(&tr, arg, 1 ) )
>>              return -EFAULT;
>>  
>> -        if ( tr.extra_bytes > sizeof(tr.extra)
>> -             || (tr.event & ~((1u<<TRC_SUBCLS_SHIFT)-1)) )
>> +        if ( tr.extra_bytes % sizeof(uint32_t) ||
>> +             tr.extra_bytes > sizeof(tr.extra) ||
>> +             tr.event >> TRC_SUBCLS_SHIFT )
>>              return -EINVAL;
> Despite this being a function that supposedly no-one is to really
> use, you're breaking the interface here when really there would be a
> way to be backwards compatible: Instead of failing, pad the data to
> a 32-bit boundary. As the interface struct is large enough, this
> would look to be as simple as a memset() plus aligning extra_bytes
> upwards. Otherwise the deliberate breaking of potential existing
> callers wants making explicit in the respective paragraph of the
> description.

It is discussed, along with a justification for why an ABI change is fine.

But I could do

tr.extra_bytes = ROUNDUP(tr.extra_bytes, sizeof(uint32_t));

if you'd really prefer.


> As an aside I think at the very least the case block wants enclosing
> in "#ifdef CONFIG_TRACEBUFFER", such that builds without the support
> would indicate so to callers (albeit that indication would then be
> accompanied by a bogus log message in debug builds).

That message really needs deleting.

As a better alternative,

if ( !IS_ENABLED(CONFIG_TRACEBUFFER) )
    return -EOPNOTSUPP;

The call to __trace_var() is safe in !CONFIG_TRACEBUFFER builds.

>
> Seeing the adjacent HVMOP_get_time I also wonder who the intended
> users of that one are.

There is a very large amount of junk in hvm_op(), and to a first
approximation, I would include HVMOP_get_time in that category.

But c/s b91391491c58ac40a935e10cf0703b87d8733c38 explains why it is
necessary.  This just goes to demonstrate how broken our time handling
is.  I'll add this to the pile of things needing fixing in ABI-v2.

>
>> --- a/xen/common/sched/rt.c
>> +++ b/xen/common/sched/rt.c
>> @@ -968,18 +968,20 @@ burn_budget(const struct scheduler *ops, struct rt_unit *svc, s_time_t now)
>>      /* TRACE */
>>      {
>>          struct __packed {
>> -            unsigned unit:16, dom:16;
>> +            uint16_t unit, dom;
>>              uint64_t cur_budget;
>> -            int delta;
>> -            unsigned priority_level;
>> -            bool has_extratime;
>> -        } d;
>> -        d.dom = svc->unit->domain->domain_id;
>> -        d.unit = svc->unit->unit_id;
>> -        d.cur_budget = (uint64_t) svc->cur_budget;
>> -        d.delta = delta;
>> -        d.priority_level = svc->priority_level;
>> -        d.has_extratime = svc->flags & RTDS_extratime;
>> +            uint32_t delta;
> The original field was plain int, and aiui for a valid reason. I
> don't see why you couldn't use int32_t here.

delta can't be negative, because there is a check earlier in the function.

What is a problem is the 63=>32 bit truncation, and uint32_t here is
half as bad as int32_t.

~Andrew



  reply	other threads:[~2021-09-21 17:51 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-20 17:25 [PATCH v2 00/12] xen/trace: Fix leakage of uninitialised stack into the tracebuffer Andrew Cooper
2021-09-20 17:25 ` [PATCH v2 01/12] xen/trace: Don't over-read trace objects Andrew Cooper
2021-09-21  6:53   ` Jan Beulich
2021-09-21 17:51     ` Andrew Cooper [this message]
2021-09-22  7:01       ` Jan Beulich
2021-09-22 12:58         ` Andrew Cooper
2021-09-22 13:32           ` Jan Beulich
2021-09-24 14:35           ` Dario Faggioli
2021-09-24 14:51   ` Dario Faggioli
2021-09-27  7:51     ` Jan Beulich
2021-09-30  8:07       ` Dario Faggioli
2021-12-03 16:29         ` Andrew Cooper
2021-09-20 17:25 ` [PATCH v2 02/12] xen/memory: Remove tail padding from TRC_MEM_* records Andrew Cooper
2021-09-24 16:50   ` Dario Faggioli
2021-09-20 17:25 ` [PATCH v2 03/12] xen/credit2: Remove tail padding from TRC_CSCHED2_* records Andrew Cooper
2021-09-24 16:54   ` Dario Faggioli
2021-09-20 17:25 ` [PATCH v2 04/12] x86/hvm: Reduce stack usage from HVMTRACE_ND() Andrew Cooper
2021-09-21 11:00   ` Jan Beulich
2021-09-21 15:38     ` Andrew Cooper
2021-09-21 15:40       ` Jan Beulich
2021-09-20 17:25 ` [PATCH v2 05/12] x86/hvm: Remove duplicate calls caused by tracing Andrew Cooper
2021-09-21 12:18   ` Jan Beulich
2021-09-21 18:04     ` Andrew Cooper
2021-09-20 17:25 ` [PATCH v2 06/12] xen/credit2: Clean up trace handling Andrew Cooper
2021-09-24 16:55   ` Dario Faggioli
2021-09-20 17:25 ` [PATCH v2 07/12] xen/rt: " Andrew Cooper
2021-09-24 16:56   ` Dario Faggioli
2021-09-20 17:25 ` [PATCH v2 08/12] xen/sched: " Andrew Cooper
2021-09-24 16:57   ` Dario Faggioli
2021-09-20 17:25 ` [PATCH v2 09/12] xen/trace: Minor code cleanup Andrew Cooper
2021-09-21 11:03   ` Jan Beulich
2021-09-24 15:16     ` Dario Faggioli
2021-09-20 17:25 ` [PATCH v2 10/12] x86/pv: Move x86/trace.c to x86/pv/trace.c Andrew Cooper
2021-09-21 15:58   ` Jan Beulich
2021-09-20 17:25 ` [PATCH v2 11/12] xen/arch: Drop asm-*/trace.h Andrew Cooper
2021-09-21 16:01   ` Jan Beulich
2021-10-12 12:31   ` Julien Grall
2021-09-20 17:25 ` [PATCH v2 12/12] x86/trace: Clean up trace handling Andrew Cooper
2021-09-21 16:08   ` Jan Beulich
2021-09-21 18:34     ` Andrew Cooper
2021-09-20 19:29 ` [PATCH v2.1 13/12] xen/trace: Introduce new API Andrew Cooper
2021-09-24 13:21   ` Jan Beulich
2021-09-20 19:32 ` [PATCH v2.1 14/12] xen: Switch to new TRACE() API Andrew Cooper
2021-09-24 13:34   ` Jan Beulich
2021-09-24 15:30   ` Dario Faggioli
2021-09-20 19:33 ` [PATCH v2.1 15/12] xen/trace: Drop old trace macros Andrew Cooper
2021-09-24 13:31   ` Jan Beulich
2021-09-20 19:40 ` [PATCH v2.1 16/12] xen/trace: Restrict CONFIG_TRACEBUFFER to x86 PV Andrew Cooper
2021-09-21  1:10   ` Julien Grall
2021-09-21 20:08 ` [PATCH v2.1 RFC 17/12] xen/trace: Drop cycles parameter Andrew Cooper
2021-09-22  7:03   ` Jan Beulich
2021-09-22  9:38     ` Andrew Cooper

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=171e6f01-63cc-e453-7268-1bf2ec6fe7cf@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=George.Dunlap@eu.citrix.com \
    --cc=dfaggioli@suse.com \
    --cc=iwj@xenproject.org \
    --cc=jbeulich@suse.com \
    --cc=julien@xen.org \
    --cc=mengxu@cis.upenn.edu \
    --cc=sstabellini@kernel.org \
    --cc=wl@xen.org \
    --cc=xen-devel@lists.xenproject.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.