From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Ian Jackson <ian.jackson@eu.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 v7 00/22] XSA55 libelf fixes for unstable
Date: Tue, 11 Jun 2013 20:30:02 +0100 [thread overview]
Message-ID: <51B77ABA.20304@citrix.com> (raw)
In-Reply-To: <1370974865-19554-1-git-send-email-ian.jackson@eu.citrix.com>
On 11/06/13 19:20, Ian Jackson wrote:
> This is version 7 of my series to try to fix libelf and the domain
> loader.
Fantastic. This entire series is now
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
I shall get the latest version into testing, but given the delta I do
not expect any issues.
~Andrew
>
> This is available via git:
> http://xenbits.xen.org/gitweb/?p=people/iwj/xen-unstable.git;a=summary
> git://xenbits.xen.org/people/iwj/xen-unstable.git
> in the commits
> xsa55-unstable-base-rebasing..xsa55-unstable-rebasing
>
> Here is a summary of the state of series:
>
> A 01/21 libelf: abolish libelf-relocate.c
> 02/21 libxc: introduce xc_dom_seg_to_ptr_pages
> 03/21 libxc: Fix range checking in xc_dom_pfn_to_ptr etc.
> A 04/21 libelf: add `struct elf_binary*' parameter to elf_load_image
> A 05/21 libelf: abolish elf_sval and elf_access_signed
> A 06/21 libelf: move include of <asm/guest_access.h> to top of file
> A 07/21 libelf/xc_dom_load_elf_symtab: Do not use "syms" uninitialised
> A* 08/21 libxl: introduce macros for memory access and pointer handling
> A 09/21 tools/xcutils/readnotes: adjust print_l1_mfn_valid_note
> A- 10/21 libelf: check nul-terminated strings properly
> - 11/21 libxl: check all pointer accesses
> A- 12/21 libxl: Check pointer references in elf_is_elfbinary
> A 13/21 libelf: Make all callers call elf_check_broken
> a 14/21 libelf: use C99 bool for booleans
> 15/21 libelf: use only unsigned integers
> 16/21 libelf: check loops for running away
> A 17/21 libelf: abolish obsolete macros
> 18/21 libxc: Add range checking to xc_dom_binloader
> * 19/21 libxc: check failure of xc_dom_*_to_ptr, xc_map_foreign_range
> * 20/21 libxc: check return values from malloc
> 21/21 libxc: range checks in xc_dom_p2m_host and _guest
> 22/22 libxc: check blob size before proceeding in xc_dom_check_gzip
>
> Key to symbols:
> * Updated in this version of the series.
> + New patch in this version.
> / Updated but only to remove changes into a separate patch.
> - Updated with style, comment or commit message changes only.
> a Acked/reviwed by one reviewer.
> A Acked/reviwed by more than one reviewer.
> Also in every patch:
> Updated commit msgs to correct email address for me.
>
>
> libelf, and some of its callers, did not do nearly enough checking on
> their input. Invalid inputs could cause signed integer arithmetic
> overflows and wild pointer dereferences.
>
> In this series we try to systematically eliminate this problem in a
> way which has a reasonable chance of (i) still accepting all
> previously-accepted ELF images (ii) not having remaining security
> bugs, in a form which can be reviewied to verify (i) and (ii).
>
> Additionally, we fix some related security bugs in the domain loading
> code.
>
> The approach is:
>
> (i) Remove all uses of signed integers (of any kind). That
> elmininates all integer overflows as sources of undefined
> behaviour. Of course it still means that we can get incorrect
> values throughout the code.
>
> (ii) Replace all uses of pointers, both pointers into the supplied
> ELF image, and pointers into the output (where we are loading)
> by uintptr_t. That eliminates all pointer arithmetic overflows as
> sources of undefined behaviour. Of course it still means that we
> can get incorrect and unreasonable "pointer" values.
>
> (iii) But these pointer values will be in uintptr_t, which cannot be
> simply dereferenced by mistake. We will replace all dereferences
> by macros which do range checking; out of range reads will read 0
> and out of range writes will be ignored. Happily most (but not
> all) of the reads in the code already go through macros which
> abstract endianness[1] and/or 32/64bitness.
>
> [1] Although not all the accesses use endian-aware techniques so
> in fact the code can't cope with foreign-endian ELFs. This is a
> problem for another day.
>
> (iv) Look for all loops and check that they are guaranteed to
> terminate.
>
> To enable verification of correctness of these changes I provide them
> as a series roughly as follows:
>
> 1-6:
> Pre-patches which make a few semantically neutral or semantically
> correct changes. For human review.
>
> 7: Introduces a set of macros to abstract away pointer arithmetic and
> input and output image memory accesses in libelf. Use these macros
> everwhere they are applicable. However, define the macros in a way
> that corresponds to the existing code. That this patch has no
> functional change can be verified by comparing the before-and-after
> assembler output from the compiler.
>
> 9. Introduce some macros for dealing with nul-terminated strings,
> defined so as not to have any functional change at this stage.
>
> 10. Change the macro definitions, and introduce the new pseudopointer
> types, pointer range checking, etc. For close human review. Each
> macro change is justified in the commit message. This patch
> eliminates most of the potential wild pointer accesses.
>
> 8,11-12,14-15:
> Smaller patches for human review, fixing some leftover bugs,
> including ensuring that all loops terminate.
>
> 13: Eliminate signed integers. Replace every "int", "int*_t",
> "long" and most "char"s by corresponding unsigned types. This
> eliminates all integer arithmetic overflows.
>
> After this patch, libelf should be safe against hostile input:
>
> * All arithmetic operations on values from the input file use
> unsigned arithmetic which is guaranteed to be defined (although
> it may of course result in wrong answers);
>
> * All pointer accesses based on pointers to locations which depend on
> the input file go via our range-checking accessors; accesses which
> are not to the input or output regions are ignored (reads returning
> 0).
>
> * The loops have been checked to ensure that they terminate and are at
> worst O(image_size).
>
> * Whenever an array variable was declared, the code has been manually
> reviewed looking for possible out-of-bounds accesses.
>
> This is XSA-55.
next prev parent reply other threads:[~2013-06-11 19:30 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-11 18:20 [PATCH v7 00/22] XSA55 libelf fixes for unstable Ian Jackson
2013-06-11 18:20 ` [PATCH 01/22] libelf: abolish libelf-relocate.c Ian Jackson
2013-06-11 18:20 ` [PATCH 02/22] libxc: introduce xc_dom_seg_to_ptr_pages Ian Jackson
2013-06-11 18:44 ` Andrew Cooper
2013-06-11 18:20 ` [PATCH 03/22] libxc: Fix range checking in xc_dom_pfn_to_ptr etc Ian Jackson
2013-06-11 19:01 ` Andrew Cooper
2013-06-11 18:20 ` [PATCH 04/22] libelf: add `struct elf_binary*' parameter to elf_load_image Ian Jackson
2013-06-11 18:20 ` [PATCH 05/22] libelf: abolish elf_sval and elf_access_signed Ian Jackson
2013-06-11 18:20 ` [PATCH 06/22] libelf: move include of <asm/guest_access.h> to top of file Ian Jackson
2013-06-11 18:20 ` [PATCH 07/22] libelf/xc_dom_load_elf_symtab: Do not use "syms" uninitialised Ian Jackson
2013-06-11 18:20 ` [PATCH 08/22] libelf: introduce macros for memory access and pointer handling Ian Jackson
2013-06-11 18:20 ` [PATCH 09/22] tools/xcutils/readnotes: adjust print_l1_mfn_valid_note Ian Jackson
2013-06-11 18:20 ` [PATCH 10/22] libelf: check nul-terminated strings properly Ian Jackson
2013-06-11 19:14 ` Andrew Cooper
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:20 ` [PATCH 12/22] libelf: Check pointer references in elf_is_elfbinary Ian Jackson
2013-06-11 19:03 ` Andrew Cooper
2013-06-11 18:20 ` [PATCH 13/22] libelf: Make all callers call elf_check_broken Ian Jackson
2013-06-11 18:20 ` [PATCH 14/22] libelf: use C99 bool for booleans Ian Jackson
2013-06-11 19:04 ` Andrew Cooper
2013-06-11 18:20 ` [PATCH 15/22] libelf: use only unsigned integers Ian Jackson
2013-06-11 19:22 ` Andrew Cooper
2013-06-11 18:20 ` [PATCH 16/22] libelf: check loops for running away Ian Jackson
2013-06-11 19:28 ` Andrew Cooper
2013-06-11 18:21 ` [PATCH 17/22] libelf: abolish obsolete macros Ian Jackson
2013-06-11 18:21 ` [PATCH 18/22] libxc: Add range checking to xc_dom_binloader Ian Jackson
2013-06-11 19:11 ` Andrew Cooper
2013-06-11 18:21 ` [PATCH 19/22] libxc: check failure of xc_dom_*_to_ptr, xc_map_foreign_range Ian Jackson
2013-06-11 19:10 ` Andrew Cooper
2013-06-11 18:21 ` [PATCH 20/22] libxc: check return values from malloc Ian Jackson
2013-06-11 19:05 ` Andrew Cooper
2013-06-11 18:21 ` [PATCH 21/22] libxc: range checks in xc_dom_p2m_host and _guest Ian Jackson
2013-06-11 19:06 ` Andrew Cooper
2013-06-12 16:02 ` George Dunlap
2013-06-12 16:06 ` Ian Jackson
2013-06-12 16:08 ` George Dunlap
2013-06-12 18:26 ` Tim Deegan
2013-06-11 18:21 ` [PATCH 22/22] libxc: check blob size before proceeding in xc_dom_check_gzip Ian Jackson
2013-06-11 19:08 ` Andrew Cooper
2013-06-11 19:30 ` Andrew Cooper [this message]
2013-06-12 13:45 ` [PATCH v7 00/22] XSA55 libelf fixes for unstable Ian Jackson
2013-06-12 14:02 ` Ian Jackson
2013-06-12 14:19 ` 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=51B77ABA.20304@citrix.com \
--to=andrew.cooper3@citrix.com \
--cc=ian.jackson@eu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).