Re: [PATCH] module: validate string table section types

From: Aaron Tomlin

Date: Fri Jul 10 2026 - 11:42:27 EST


On Wed, Jul 08, 2026 at 11:21:07AM +1000, Thiébaud Weksteen wrote:
> In elf_validity_cache_sechdrs, section sizes and offsets are validated,
> unless the section type is SHT_NULL or SHT_NOBITS.
>
> Later, elf_validity_cache_secstrings and elf_validity_cache_index_str
> access the section name table (.shstrtab) and symbol string table
> (.strtab) headers without first ensuring that their types are
> SHT_STRTAB. If a section type is SHT_NULL or SHT_NOBITS, sh_offset has
> not been validated and may reference out-of-bounds memory when
> dereferenced in elf_validity_cache_secstrings or
> elf_validity_cache_strtab.
>
> Validate that both string section headers are of type SHT_STRTAB before
> caching them.
>
> Signed-off-by: Thiébaud Weksteen <tweek@xxxxxxxxxx>
> ---
> kernel/module/main.c | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/module/main.c b/kernel/module/main.c
> index 46dd8d25a605..7cbc8f0e28c6 100644
> --- a/kernel/module/main.c
> +++ b/kernel/module/main.c
> @@ -2011,6 +2011,7 @@ static int elf_validity_cache_sechdrs(struct load_info *info)
> * Specifically checks:
> *
> * * Section name table index is inbounds of section headers
> + * * Section name table type is SHT_STRTAB
> * * Section name table is not empty
> * * Section name table is NUL terminated
> * * All section name offsets are inbounds of the section
> @@ -2038,6 +2039,11 @@ static int elf_validity_cache_secstrings(struct load_info *info)
>
> strhdr = &info->sechdrs[info->hdr->e_shstrndx];
>
> + if (strhdr->sh_type != SHT_STRTAB) {
> + pr_err("Invalid ELF section name table type: %u\n", strhdr->sh_type);
> + return -ENOEXEC;
> + }
> +
> /*
> * The section name table must be NUL-terminated, as required
> * by the spec. This makes strcmp and pr_* calls that access
> @@ -2204,7 +2210,7 @@ static int elf_validity_cache_index_sym(struct load_info *info)
> * Must have &load_info->index.sym populated.
> *
> * Looks at the symbol table's associated string table, makes sure it is
> - * in-bounds, and caches it.
> + * in-bounds and of type SHT_STRTAB, and caches it.
> *
> * Return: %0 if valid, %-ENOEXEC on failure.
> */
> @@ -2218,6 +2224,12 @@ static int elf_validity_cache_index_str(struct load_info *info)
> return -ENOEXEC;
> }
>
> + if (info->sechdrs[str_idx].sh_type != SHT_STRTAB) {
> + pr_err("Invalid ELF symbol string table type: %u\n",
> + info->sechdrs[str_idx].sh_type);
> + return -ENOEXEC;
> + }
> +
> info->index.str = str_idx;
> return 0;
> }
> --
> 2.55.0.795.g602f6c329a-goog
>

Reviewed-by: Aaron Tomlin <atomlin@xxxxxxxxxxx>

--
Aaron Tomlin