Skip to content

Commit 47a2ebb

Browse files
Alexey Dobriyantorvalds
authored andcommitted
execve: warn if process starts with executable stack
There were few episodes of silent downgrade to an executable stack over years: 1) linking innocent looking assembly file will silently add executable stack if proper linker options is not given as well: $ cat f.S .intel_syntax noprefix .text .globl f f: ret $ cat main.c void f(void); int main(void) { f(); return 0; } $ gcc main.c f.S $ readelf -l ./a.out GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 RWE 0x10 ^^^ 2) converting C99 nested function into a closure https://nullprogram.com/blog/2019/11/15/ void intsort2(int *base, size_t nmemb, _Bool invert) { int cmp(const void *a, const void *b) { int r = *(int *)a - *(int *)b; return invert ? -r : r; } qsort(base, nmemb, sizeof(*base), cmp); } will silently require stack trampolines while non-closure version will not. Without doubt this behaviour is documented somewhere, add a warning so that developers and users can at least notice. After so many years of x86_64 having proper executable stack support it should not cause too many problems. Link: http://lkml.kernel.org/r/20191208171918.GC19716@avx2 Signed-off-by: Alexey Dobriyan <[email protected]> Cc: Dan Carpenter <[email protected]> Cc: Will Deacon <[email protected]> Cc: "Eric W. Biederman" <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent aacee54 commit 47a2ebb

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

fs/exec.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,11 @@ int setup_arg_pages(struct linux_binprm *bprm,
761761
goto out_unlock;
762762
BUG_ON(prev != vma);
763763

764+
if (unlikely(vm_flags & VM_EXEC)) {
765+
pr_warn_once("process '%pD4' started with executable stack\n",
766+
bprm->file);
767+
}
768+
764769
/* Move stack pages down in memory. */
765770
if (stack_shift) {
766771
ret = shift_arg_pages(vma, stack_shift);

0 commit comments

Comments
 (0)