All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
To: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"mattjd@gmail.com" <mattjd@gmail.com>,
	"security@xen.org" <security@xen.org>
Subject: Re: [PATCH 11/22] libelf: check all pointer accesses
Date: Tue, 11 Jun 2013 16:28:11 +0100	[thread overview]
Message-ID: <20919.16907.767547.453382@mariner.uk.xensource.com> (raw)
In-Reply-To: <51B66368.6010602@citrix.com>

Andrew Cooper writes ("Re: [PATCH 11/22] libelf: check all pointer accesses"):
> On 07/06/13 19:27, Ian Jackson wrote:
> > diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c
> > index b8089bc..c038d1c 100644
> > --- a/tools/libxc/xc_dom_elfloader.c
> > +++ b/tools/libxc/xc_dom_elfloader.c
> > @@ -128,20 +128,30 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom,
> >
> >      if ( load )
> >      {
> > -        size_t allow_size; /* will be used in a forthcoming XSA-55 patch */
> > +        char *hdr_ptr;
> > +        size_t allow_size;
> > +
> >          if ( !dom->bsd_symtab_start )
> >              return 0;
> >          size = dom->kernel_seg.vend - dom->bsd_symtab_start;
> > -        hdr  = xc_dom_vaddr_to_ptr(dom, dom->bsd_symtab_start, &allow_size);
> > -        *(int *)hdr = size - sizeof(int);
> > +        hdr_ptr = xc_dom_vaddr_to_ptr(dom, dom->bsd_symtab_start, &allow_size);
> > +        elf->caller_xdest_base = hdr_ptr;
> > +        elf->caller_xdest_size = allow_size;
> > +        hdr = ELF_REALPTR2PTRVAL(hdr_ptr);
> > +        elf_store_val(elf, int, hdr, size - sizeof(int));
> >      }
> 
> Is it not sensible to move the later "check failure of
> xc_dom_*_to_ptr()" to here?  It would certainly fall into the category
> of "check all pointer accesses".

I don't have a strong an opinion about where that hunk should go.  But
arguments against moving it to this patch:
  * This patch is already complicated enough;
  * We aren't actually changing the semantics here very much
     although there's a lot of code churn, so it's obviously not
     making matters worse;
  * There are a lot of other call sites which use xc_dom_*_to_ptr
     unchecked, at this point in the series.

It might be possible to move the whole xc_dom_*_to_ptr NULL checking
to _before_ all of these invasive patches but that would be a whole
lot of work and I'd probably mess up some of the massive amounts of
conflict resolution which would be needed.

> > diff --git a/xen/common/libelf/libelf-dominfo.c b/xen/common/libelf/libelf-dominfo.c
> > index ba0dc83..b9a4e25 100644
> > --- a/xen/common/libelf/libelf-dominfo.c
> > +++ b/xen/common/libelf/libelf-dominfo.c
> > @@ -254,7 +254,7 @@ int elf_xen_parse_guest_info(struct elf_binary *elf,
> >      int len;
> >
> >      h = parms->guest_info;
> > -#define STAR(h) (*(h))
> > +#define STAR(h) (elf_access_unsigned(elf, (h), 0, 1))
> 
> Similar query regarding elf_access_unsigned(elf, (h), 0, sizeof(*h))

No, h doesn't have a suitable type.  After this patch h is an
elf_ptrval, ie a uintptr_t.  Hence the use of elf_access_unsigned
rather than (say) elf_uval.

> >  ELF_PTRVAL_VOID elf_get_ptr(struct elf_binary *elf, unsigned long addr)
> >  {
> > -    return elf->dest + addr - elf->pstart;
> > +    return ELF_REALPTR2PTRVAL(elf->dest_base) + addr - elf->pstart;
> 
> Both callsites of this function have addr as a guest supplied
> parameter.  It needs to be checked for overflowing.

No, it doesn't.  The returned value is an elf_ptrval.  That is, it's a
maybe-wrong pseudopointer.  Any callers which want to dereference it
will have to convert it back somehow, typically using
elf_access_unsigned or the like.

The arithmetic is all done using unsigned integers so overflows don't
matter.  They just produce wrong answers which are tolerated.

> > diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h
> > index 0c2c11e..783f125 100644
> > --- a/xen/include/xen/libelf.h
> > +++ b/xen/include/xen/libelf.h
...
> >  /* ------------------------------------------------------------------------ */
> >
> > -
> 
> Spurious whitespace change.

Fixed.

Thanks,
Ian.

  reply	other threads:[~2013-06-11 15:28 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-07 18:27 [PATCH v6 00/22] XSA55 libelf fixes for unstable Ian Jackson
2013-06-07 18:27 ` [PATCH 01/22] libelf: abolish libelf-relocate.c Ian Jackson
2013-06-07 18:27 ` [PATCH 02/22] libxc: introduce xc_dom_seg_to_ptr_pages Ian Jackson
2013-06-10 12:21   ` Andrew Cooper
2013-06-10 13:40     ` Ian Jackson
2013-06-10 13:49       ` Andrew Cooper
2013-06-10 14:02         ` Ian Jackson
2013-06-10 15:24           ` Andrew Cooper
2013-06-07 18:27 ` [PATCH 03/22] libxc: Fix range checking in xc_dom_pfn_to_ptr etc Ian Jackson
2013-06-10 15:46   ` Andrew Cooper
2013-06-10 15:48     ` Ian Jackson
2013-06-10 15:53       ` Andrew Cooper
2013-06-10 15:54         ` Ian Jackson
2013-06-07 18:27 ` [PATCH 04/22] libelf: add `struct elf_binary*' parameter to elf_load_image Ian Jackson
2013-06-07 18:27 ` [PATCH 05/22] libelf: abolish elf_sval and elf_access_signed Ian Jackson
2013-06-07 18:27 ` [PATCH 06/22] libelf: move include of <asm/guest_access.h> to top of file Ian Jackson
2013-06-07 18:27 ` [PATCH 07/22] libelf/xc_dom_load_elf_symtab: Do not use "syms" uninitialised Ian Jackson
2013-06-07 18:27 ` [PATCH 08/22] libelf: introduce macros for memory access and pointer handling Ian Jackson
2013-06-10 16:57   ` Andrew Cooper
2013-06-10 16:58     ` Ian Jackson
2013-06-07 18:27 ` [PATCH 09/22] tools/xcutils/readnotes: adjust print_l1_mfn_valid_note Ian Jackson
2013-06-07 18:27 ` [PATCH 10/22] libelf: check nul-terminated strings properly Ian Jackson
2013-06-10 23:17   ` Andrew Cooper
2013-06-11 15:17     ` Ian Jackson
2013-06-07 18:27 ` [PATCH 11/22] libelf: check all pointer accesses Ian Jackson
2013-06-10 23:38   ` Andrew Cooper
2013-06-11 15:28     ` Ian Jackson [this message]
2013-06-07 18:27 ` [PATCH 12/22] libelf: Check pointer references in elf_is_elfbinary Ian Jackson
2013-06-10 23:04   ` Andrew Cooper
2013-06-11 15:11     ` Ian Jackson
2013-06-11 16:00       ` Andrew Cooper
2013-06-11 16:33         ` Ian Jackson
2013-06-07 18:27 ` [PATCH 13/22] libelf: Make all callers call elf_check_broken Ian Jackson
2013-06-07 18:27 ` [PATCH 14/22] libelf: use C99 bool for booleans Ian Jackson
2013-06-10 22:09   ` Andrew Cooper
2013-06-11  7:17     ` Jan Beulich
2013-06-11 14:50     ` Ian Jackson
2013-06-07 18:27 ` [PATCH 15/22] libelf: use only unsigned integers Ian Jackson
2013-06-10 18:28   ` Andrew Cooper
2013-06-11 13:16     ` Ian Jackson
2013-06-07 18:27 ` [PATCH 16/22] libelf: check loops for running away Ian Jackson
2013-06-10 22:56   ` Andrew Cooper
2013-06-11 15:07     ` Ian Jackson
2013-06-07 18:27 ` [PATCH 17/22] libelf: abolish obsolete macros Ian Jackson
2013-06-07 18:27 ` [PATCH 18/22] libxc: Add range checking to xc_dom_binloader Ian Jackson
2013-06-10 21:37   ` Andrew Cooper
2013-06-11 14:46     ` Ian Jackson
2013-06-07 18:27 ` [PATCH 19/22] libxc: check failure of xc_dom_*_to_ptr, xc_map_foreign_range Ian Jackson
2013-06-10 21:09   ` Andrew Cooper
2013-06-11 14:44     ` Ian Jackson
2013-06-07 18:27 ` [PATCH 20/22] libxc: check return values from malloc Ian Jackson
2013-06-07 18:32   ` Andrew Cooper
2013-06-11 15:53     ` Ian Jackson
2013-06-10 20:38   ` Andrew Cooper
2013-06-11 14:31     ` Ian Jackson
2013-06-07 18:27 ` [PATCH 21/22] libxc: range checks in xc_dom_p2m_host and _guest Ian Jackson
2013-06-07 18:33   ` Andrew Cooper
2013-06-08 12:05     ` Andrew Cooper
2013-06-11 15:58       ` Ian Jackson
2013-06-11 16:19         ` Tim Deegan
2013-06-07 18:27 ` [PATCH 22/22] libxc: check blob size before proceeding in xc_dom_check_gzip Ian Jackson
2013-06-10 20:10   ` Andrew Cooper
2013-06-11 13:46     ` Ian Jackson
2013-06-10 23:44 ` [PATCH v6 00/22] XSA55 libelf fixes for unstable Andrew Cooper
2013-06-07 18:35 [PATCH v6 00/22] XSA55 libelf fixes for Xen 4.2 Ian Jackson
2013-06-07 18:35 ` [PATCH 11/22] libelf: check all pointer accesses Ian Jackson
2013-06-11 18:20 [PATCH v7 00/22] XSA55 libelf fixes for unstable Ian Jackson
2013-06-11 18:20 ` [PATCH 11/22] libelf: check all pointer accesses Ian Jackson
2013-06-11 19:19   ` Andrew Cooper
2013-06-11 18:22 [PATCH v7 00/22] XSA55 libelf fixes for Xen 4.2 Ian Jackson
2013-06-11 18:22 ` [PATCH 11/22] libelf: check all pointer accesses Ian Jackson

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=20919.16907.767547.453382@mariner.uk.xensource.com \
    --to=ian.jackson@eu.citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=mattjd@gmail.com \
    --cc=security@xen.org \
    --cc=xen-devel@lists.xensource.com \
    /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.