[LEDE-DEV] [PATCH ubox] kmodloader: Check module endian before loading

Yousong Zhou yszhou4tech at gmail.com
Sun Jul 2 01:49:50 PDT 2017


On 1 July 2017 at 07:34, Florian Fainelli <f.fainelli at gmail.com> wrote:
> If we manage to accidentally get a module installed that does not match
> the system endianess (there is currently nothing preventing that in
> OpenWrt/LEDE) we will hit a segmentation fault when doing this:
>
> sh = (Elf32_Shdr *) (map + e->e_shoff);
>
> because e->e_shoff will be wrongly encoded and this most likely will
> result in an invalid offset to de-reference from.
>
> Update elf_find_section() to check that the build time endianess of
> kmodloader matches that of the module, otherwise nothing would work
> really.
>
> Signed-off-by: Florian Fainelli <f.fainelli at gmail.com>

The change looks good.   Ack from me ;)

                yousong

> ---
>  kmodloader.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
>
> diff --git a/kmodloader.c b/kmodloader.c
> index 1a63c9810a99..a6aa795a81d4 100644
> --- a/kmodloader.c
> +++ b/kmodloader.c
> @@ -214,6 +214,19 @@ static int elf32_find_section(char *map, const char *section, unsigned int *offs
>  static int elf_find_section(char *map, const char *section, unsigned int *offset, unsigned int *size)
>  {
>         int clazz = map[EI_CLASS];
> +       int endian = map[EI_DATA];
> +
> +#if defined(__LITTLE_ENDIAN)
> +       if (endian != ELFDATA2LSB)
> +#elif defined(__BIG_ENDIAN)
> +       if (endian != ELFDATA2MSB)
> +#else
> +#error "unsupported endian"
> +#endif
> +       {
> +               ULOG_ERR("invalid endianess: %d\n", endian);
> +               return -1;
> +       }
>
>         if (clazz == ELFCLASS32)
>                 return elf32_find_section(map, section, offset, size);
> --
> 2.9.3
>



More information about the Lede-dev mailing list