mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
module: validate string table section types
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. Cc: stable@vger.kernel.org Signed-off-by: Thiébaud Weksteen <tweek@google.com> Reviewed-by: Aaron Tomlin <atomlin@atomlin.com> Reviewed-by: Petr Pavlu <petr.pavlu@suse.com> Signed-off-by: Petr Pavlu <petr.pavlu@suse.com>
This commit is contained in:
parent
2a7ecc5fbd
commit
9a5ff45689
|
|
@ -2010,6 +2010,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
|
||||
|
|
@ -2037,6 +2038,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
|
||||
|
|
@ -2203,7 +2209,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.
|
||||
*/
|
||||
|
|
@ -2217,6 +2223,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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user