[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 12/22] libelf: Check pointer references in elf_is_elfbinary
On 07/06/13 19:27, Ian Jackson wrote: > elf_is_elfbinary didn't take a length parameter and could potentially > access out of range when provided with a very short image. > > This is part of the fix to a security issue, XSA-55. > > Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> > Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> > Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> > > v2: Style fix. > Fix commit message subject. > --- > tools/libxc/xc_dom_elfloader.c | 2 +- > xen/arch/x86/bzimage.c | 4 ++-- > xen/common/libelf/libelf-loader.c | 2 +- > xen/common/libelf/libelf-tools.c | 9 ++++++--- > xen/include/xen/libelf.h | 2 +- > 5 files changed, 11 insertions(+), 8 deletions(-) > > diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c > index c038d1c..f14b053 100644 > --- a/tools/libxc/xc_dom_elfloader.c > +++ b/tools/libxc/xc_dom_elfloader.c > @@ -93,7 +93,7 @@ static int check_elf_kernel(struct xc_dom_image *dom, int > verbose) > return -EINVAL; > } > > - if ( !elf_is_elfbinary(dom->kernel_blob) ) > + if ( !elf_is_elfbinary(dom->kernel_blob, dom->kernel_size) ) > { > if ( verbose ) > xc_dom_panic(dom->xch, > diff --git a/xen/arch/x86/bzimage.c b/xen/arch/x86/bzimage.c > index c5519d8..58fda16 100644 > --- a/xen/arch/x86/bzimage.c > +++ b/xen/arch/x86/bzimage.c > @@ -220,7 +220,7 @@ unsigned long __init bzimage_headroom(char *image_start, > image_length = hdr->payload_length; > } > > - if ( elf_is_elfbinary(image_start) ) > + if ( elf_is_elfbinary(image_start, image_length) ) > return 0; > > orig_image_len = image_length; > @@ -251,7 +251,7 @@ int __init bzimage_parse(char *image_base, char > **image_start, unsigned long *im > *image_len = hdr->payload_length; > } > > - if ( elf_is_elfbinary(*image_start) ) > + if ( elf_is_elfbinary(*image_start, *image_len) ) > return 0; > > BUG_ON(!(image_base < *image_start)); > diff --git a/xen/common/libelf/libelf-loader.c > b/xen/common/libelf/libelf-loader.c > index 878552e..6c43c34 100644 > --- a/xen/common/libelf/libelf-loader.c > +++ b/xen/common/libelf/libelf-loader.c > @@ -29,7 +29,7 @@ int elf_init(struct elf_binary *elf, const char > *image_input, size_t size) > ELF_HANDLE_DECL(elf_shdr) shdr; > uint64_t i, count, section, offset; > > - if ( !elf_is_elfbinary(image_input) ) > + if ( !elf_is_elfbinary(image_input, size) ) > { > elf_err(elf, "%s: not an ELF binary\n", __FUNCTION__); > return -1; > diff --git a/xen/common/libelf/libelf-tools.c > b/xen/common/libelf/libelf-tools.c > index 08ab027..b613593 100644 > --- a/xen/common/libelf/libelf-tools.c > +++ b/xen/common/libelf/libelf-tools.c > @@ -332,11 +332,14 @@ ELF_HANDLE_DECL(elf_note) elf_note_next(struct > elf_binary *elf, ELF_HANDLE_DECL( > > /* ------------------------------------------------------------------------ > */ > > -int elf_is_elfbinary(const void *image) > +int elf_is_elfbinary(const void *image_start, size_t image_size) > { > - const Elf32_Ehdr *ehdr = image; > + const Elf32_Ehdr *ehdr = image_start; > > - return IS_ELF(*ehdr); /* fixme unchecked */ > + if ( image_size < sizeof(*ehdr) ) > + return 0; > + > + return IS_ELF(*ehdr); > } sizeof(Elf32_Ehdr) == 52 sizeof(Elf64_Ehdr) == 64 As stated by a trivial C program containing 'printf("32: %zu, 64: %zu\n", sizeof(Elf32_Ehdr), sizeof(Elf64_Ehdr));' Therefore, the sizeof check is insufficient if given a 64bit elf. It needs to check first against sizeof e_ident which is consistent between the two, look up EI_CLASS in the ident, then choose the appropriate structure. ~Andrew > > int elf_phdr_is_loadable(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) > phdr) > diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h > index 783f125..c54c90b 100644 > --- a/xen/include/xen/libelf.h > +++ b/xen/include/xen/libelf.h > @@ -349,7 +349,7 @@ uint64_t elf_note_numeric_array(struct elf_binary *, > ELF_HANDLE_DECL(elf_note), > unsigned int unitsz, unsigned int idx); > ELF_HANDLE_DECL(elf_note) elf_note_next(struct elf_binary *elf, > ELF_HANDLE_DECL(elf_note) note); > > -int elf_is_elfbinary(const void *image); > +int elf_is_elfbinary(const void *image_start, size_t image_size); > int elf_phdr_is_loadable(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) > phdr); > > /* ------------------------------------------------------------------------ > */ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |