Messages in this thread | | | Date | Mon, 6 Apr 2020 12:46:17 +0200 | From | Jessica Yu <> | Subject | Re: [PATCH] module: Harden STRICT_MODULE_RWX |
| |
+++ Miroslav Benes [06/04/20 11:55 +0200]: >On Fri, 3 Apr 2020, Josh Poimboeuf wrote: > >> On Fri, Apr 03, 2020 at 06:37:16PM +0200, Peter Zijlstra wrote: >> > +{ >> > + int i; >> > + >> > + for (i = 0; i < hdr->e_shnum; i++) { >> > + if (sechdrs[i].sh_flags & (SHF_EXECINSTR|SHF_WRITE)) >> > + return -ENOEXEC; >> >> I think you only want the error when both are set? >> >> if (sechdrs[i].sh_flags & (SHF_EXECINSTR|SHF_WRITE) == (SHF_EXECINSTR|SHF_WRITE)) > >A section with SHF_EXECINSTR and SHF_WRITE but without SHF_ALLOC would be >strange though, no? It wouldn't be copied to the final module later >anyway.
That's right - move_module() ignores !SHF_ALLOC sections and does not copy them over to their final location. So I think we want to look for SHF_EXECINSTR|SHF_WRITE|SHF_ALLOC here..
>Looking at layout_sections()... a section with >SHF_EXECINSTR|SHF_WRITE|SHF_ALLOC would not be counted at all.
Also correct, a section with SHF_EXECINSTR|SHF_WRITE|SHF_ALLOC would be ignored as it matches none of the masks listed in layout_sections() - its section->sh_entsize will stay ~0UL.
>However, >move_module() later copies everything with SHF_ALLOC flag to the final >module. If there is WXA section, there would be a bug because the >allocation there would not get the correct size. In that case it is >important to error out early as you're proposing.
That would be a bug indeed, - we'd get a completely wrong offset to copy into since sh_entsize was never initialized. Actually, there should probably be a check for that in move_module() :-/
>Am I missing something?
Nope, thanks for double checking everything!
Jessica
| |