• Alexey Dobriyan's avatar
    execve: warn if process starts with executable stack · 47a2ebb7
    Alexey Dobriyan authored
    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@avx2Signed-off-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
    Cc: Dan Carpenter <dan.carpenter@oracle.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    47a2ebb7
exec.c 47 KB