All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Keir Fraser <keir@xen.org>, Tim Deegan <tim@xen.org>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	mpohlack@amazon.de, ross.lagerwall@citrix.com,
	Jan Beulich <jbeulich@suse.com>,
	sasha.levin@oracle.com, xen-devel@lists.xenproject.org
Subject: Re: [PATCH v6 08/24] xsplice: Add helper elf routines
Date: Fri, 8 Apr 2016 23:10:20 +0100	[thread overview]
Message-ID: <57082C4C.7020309@citrix.com> (raw)
In-Reply-To: <20160408212657.GG27946@char.us.oracle.com>

On 08/04/16 22:26, Konrad Rzeszutek Wilk wrote:
> On Fri, Apr 08, 2016 at 03:53:44PM +0100, Andrew Cooper wrote:
>> On 07/04/16 04:49, Konrad Rzeszutek Wilk wrote:
>>> +static int elf_resolve_sections(struct xsplice_elf *elf, const void *data)
>>> +{
>>> +    struct xsplice_elf_sec *sec;
>>> +    unsigned int i;
>>> +    Elf_Off delta;
>>> +    int rc;
>>> +
>>> +    /* xsplice_elf_load sanity checked e_shnum. */
>>> +    sec = xmalloc_array(struct xsplice_elf_sec, elf->hdr->e_shnum);
>>> +    if ( !sec )
>>> +    {
>>> +        printk(XENLOG_ERR XSPLICE"%s: Could not allocate memory for section table!\n",
>>> +               elf->name);
>>> +        return -ENOMEM;
>>> +    }
>>> +
>>> +    elf->sec = sec;
>>> +
>>> +    delta = elf->hdr->e_shoff + elf->hdr->e_shnum * elf->hdr->e_shentsize;
>> Have we verified any of these to be sane yet?  (i.e. what about
>> calculation overflow?)
>>
>> (Edit: e_shnum yes, e_shentsize and e_shoff look to be no)
> e_shentsize is uint16_t
> e_shoff is uint64_t or uint32_t.
>
> Where you think a check against UINT_MAX/ULONG_MAX for the e_shoff?

e_shoff needs checking to be within elf->len alone, before a calculation
involving e_shoff is checked against elf->len.

Specifically, if it were say (uint64_t)-1 in the elf header, then this
calculation would overflow and the check below would pass.

Similarly, something should check e_shentsize against an exact value,
given that its size is used to infer the layout of the section header
fields.

>
>>> +    if ( delta >= elf->len )
> This should have been >
>
> As I found out some linkers are happy to place that whole section table
> at the end of the file. Which means that this checks gets triggered.

This is normal.  Traditionally, program headers live at the start of the
image, and section headers at the end.

The spec doesn't enforce this however.

>>> +    {
>>> +            dprintk(XENLOG_DEBUG, XSPLICE "%s: Section table is past end of payload!\n",
>>> +                    elf->name);
>>> +            return -EINVAL;
>>> +    }
>> (Mis)-alignment
>>
>>
>>> +static int elf_get_sym(struct xsplice_elf *elf, const void *data)
>>> +{
>>> +    const struct xsplice_elf_sec *symtab_sec, *strtab_sec;
>>> +    struct xsplice_elf_sym *sym;
>>> +    unsigned int i, delta, offset, nsym;
>>> +
>>> +    symtab_sec = elf->symtab;
>>> +    strtab_sec = elf->strtab;
>>> +
>>> +    /* Pointers arithmetic to get file offset. */
>>> +    offset = strtab_sec->data - data;
>>> +
>>> +    /* Checked already in elf_resolve_sections, but just in case. */
>>> +    ASSERT(offset == strtab_sec->sec->sh_offset);
>>> +    ASSERT(offset < elf->len && (offset + strtab_sec->sec->sh_size <= elf->len));
>>> +
>>> +    /* symtab_sec->data was computed in elf_resolve_sections. */
>>> +    ASSERT((symtab_sec->sec->sh_offset + data) == symtab_sec->data);
>>> +
>>> +    /* No need to check values as elf_resolve_sections did it. */
>>> +    nsym = symtab_sec->sec->sh_size / symtab_sec->sec->sh_entsize;
>> Has anything checked sh_entsize for being 0 or -1 ?
> Let me double-check.

Git grep says elf_resolve_sections() has

    if ( !elf->symtab->sec->sh_size ||
         elf->symtab->sec->sh_entsize < sizeof(Elf_Sym) )
    {
        dprintk(XENLOG_DEBUG, XSPLICE "%s: Symbol table header is
corrupted!\n",
                elf->name);
        return -EINVAL;
    }

I would check for !=, rather than <

Nothing good can come of having sh_entsize being bigger than what we
expect an Elf_Sym to be.

Also be aware that Elf_Sym.sh_entsize and Ehdr.e_shentsize appear to be
multiple locations containing the same information.  I would also cross
check them.

~Andrew

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

  reply	other threads:[~2016-04-08 22:10 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-07  3:49 [PATCH v6] xSplice v1 design and implementation Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 01/24] xsplice: Design document Konrad Rzeszutek Wilk
2016-04-07 16:34   ` Ian Jackson
2016-04-07  3:49 ` [PATCH v6 02/24] xen/xsplice: Hypervisor implementation of XEN_XSPLICE_op Konrad Rzeszutek Wilk
2016-04-07 14:47   ` Andrew Cooper
2016-04-08 18:30   ` Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 03/24] libxc: Implementation of XEN_XSPLICE_op in libxc Konrad Rzeszutek Wilk
2016-04-07 19:53   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 04/24] xen-xsplice: Tool to manipulate xsplice payloads Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 05/24] arm/x86: Use struct virtual_region to do bug, symbol, and (x86) exception tables lookup Konrad Rzeszutek Wilk
2016-04-07 20:12   ` Andrew Cooper
2016-04-08 15:30   ` Julien Grall
2016-04-07  3:49 ` [PATCH v6 06/24] x86: Alter nmi_callback_t typedef Konrad Rzeszutek Wilk
2016-04-07 16:35   ` Ian Jackson
2016-04-07 20:13   ` Andrew Cooper
2016-04-08 20:44     ` Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 07/24] arm/x86/vmap: Add vmalloc_type and vm_init_type Konrad Rzeszutek Wilk
2016-04-08 14:22   ` Andrew Cooper
2016-04-08 17:19     ` Jan Beulich
2016-04-09  1:10       ` Konrad Rzeszutek Wilk
2016-04-08 15:32   ` Julien Grall
2016-04-07  3:49 ` [PATCH v6 08/24] xsplice: Add helper elf routines Konrad Rzeszutek Wilk
2016-04-07 16:19   ` Ian Jackson
2016-04-07 17:23     ` Jan Beulich
2016-04-07 20:32     ` Andrew Cooper
2016-04-08 13:26       ` Ian Jackson
2016-04-07 20:43     ` Konrad Rzeszutek Wilk
2016-04-08 14:53   ` Andrew Cooper
2016-04-08 21:26     ` Konrad Rzeszutek Wilk
2016-04-08 22:10       ` Andrew Cooper [this message]
2016-04-08 22:48         ` Jan Beulich
2016-04-07  3:49 ` [PATCH v6 09/24] xsplice: Implement payload loading Konrad Rzeszutek Wilk
2016-04-08 15:31   ` Andrew Cooper
2016-04-08 21:10     ` Konrad Rzeszutek Wilk
2016-04-08 21:18       ` Jan Beulich
2016-04-08 22:45         ` Konrad Rzeszutek Wilk
2016-04-08 22:50           ` Jan Beulich
2016-04-09  0:37             ` Konrad Rzeszutek Wilk
2016-04-09 11:48               ` Konrad Rzeszutek Wilk
2016-04-11 15:53               ` Jan Beulich
2016-04-11 16:03                 ` Konrad Rzeszutek Wilk
2016-04-11 16:34                   ` Konrad Rzeszutek Wilk
2016-04-11 16:55                     ` Jan Beulich
2016-04-11 17:08                       ` Konrad Rzeszutek Wilk
2016-04-11 17:26                         ` Jan Beulich
2016-04-11 18:21                           ` Konrad Rzeszutek Wilk
2016-04-11 18:57                             ` Konrad Rzeszutek Wilk
2016-04-08 15:35   ` Julien Grall
2016-04-07  3:49 ` [PATCH v6 10/24] xsplice: Implement support for applying/reverting/replacing patches Konrad Rzeszutek Wilk
2016-04-08 15:36   ` Julien Grall
2016-04-08 16:33   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 11/24] x86/xen_hello_world.xsplice: Test payload for patching 'xen_extra_version' Konrad Rzeszutek Wilk
2016-04-08 15:37   ` Julien Grall
2016-04-08 16:38   ` Andrew Cooper
2016-04-09  0:45   ` Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 12/24] xsplice, symbols: Implement symbol name resolution on address Konrad Rzeszutek Wilk
2016-04-08 16:55   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 13/24] x86, xsplice: Print payload's symbol name and payload name in backtraces Konrad Rzeszutek Wilk
2016-04-08 17:00   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 14/24] xsplice: Add support for bug frames Konrad Rzeszutek Wilk
2016-04-08 17:03   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 15/24] xsplice: Add support for exception tables Konrad Rzeszutek Wilk
2016-04-08 17:16   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 16/24] xsplice: Add support for alternatives Konrad Rzeszutek Wilk
2016-04-08 17:34   ` Andrew Cooper
2016-04-08 17:57     ` Jan Beulich
2016-04-07  3:49 ` [PATCH v6 17/24] build_id: Provide ld-embedded build-ids Konrad Rzeszutek Wilk
2016-04-08 15:39   ` Julien Grall
2016-04-08 18:07   ` Andrew Cooper
2016-04-08 19:34     ` Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 18/24] HYPERCALL_version_op: Add VERSION_build_id to retrieve build-id Konrad Rzeszutek Wilk
2016-04-08 18:07   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 19/24] libxl: info: Display build_id of the hypervisor using XEN_VERSION_build_id Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 20/24] xsplice: Print build_id in keyhandler and on bootup Konrad Rzeszutek Wilk
2016-04-08 18:12   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 21/24] xsplice: Stacking build-id dependency checking Konrad Rzeszutek Wilk
2016-04-08 18:19   ` Andrew Cooper
2016-04-09  1:43     ` Konrad Rzeszutek Wilk
2016-04-07  3:49 ` [PATCH v6 22/24] xsplice/xen_replace_world: Test-case for XSPLICE_ACTION_REPLACE Konrad Rzeszutek Wilk
2016-04-08 18:20   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 23/24] xsplice: Prevent duplicate payloads from being loaded Konrad Rzeszutek Wilk
2016-04-07 16:36   ` Ian Jackson
2016-04-08 18:21   ` Andrew Cooper
2016-04-07  3:49 ` [PATCH v6 24/24] MAINTAINERS/xsplice: Add myself and Ross as the maintainers Konrad Rzeszutek Wilk
2016-04-08 18:21   ` 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=57082C4C.7020309@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=keir@xen.org \
    --cc=konrad.wilk@oracle.com \
    --cc=mpohlack@amazon.de \
    --cc=ross.lagerwall@citrix.com \
    --cc=sasha.levin@oracle.com \
    --cc=tim@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.