Hi, These patches introduces the PT_GNU_COMPAT segment header to indicate the kernel whether an ELF binary or a shared library needs to have all readable virtual memory mappings also executable (i.e. READ_IMPLIES_EXEC personality) and if necessary, it allows more compatibility modes to be implemented in the future. Currently, an binary that needs only executable stack have unnecessarily all readable virtual memory mappings also executable. This is because the kernel does not know if the PF_X flag set in the PT_GNU_STACK segment header of the binary indicates it needs only stack executable or all readable virtual memory mappings also executable. Consequently, the kernel sets the READ_IMPLIES_EXEC personality upon loading any binary with the PT_GNU_STACK segment header and the PF_X flag set. Furthermore, if the PT_GNU_STACK segment header with the PT_X flag is set in any of the shared libraries a binary is linked, the kernel does not know if the PF_X flag set in the PT_GNU_STACK segment header of the shared library indicates it needs only stack executable or all readable virtual memory mappings also executable either. Consequently, GCC sets the PT_GNU_STACK segment header with the PF_X flag set upon compiling any binary linked to a shared library with the PT_GNU_STACK segment header and the PF_X flag set. This can result in applications unnoticeably having not only the stack, but also all readable virtual memory mappings also executable. These patches returns the original meaning and purpose of the PT_GNU_STACK segment header. >From the security standpoint, these binaries will rely upon lesser security extensions, such as heap consistency checking and others. Thus, improving the security of binaries that needs only the stack executable. These patches does not affect the current binaries that have the PT_GNU_STACK segment header, neither legacy binaries that most likely does not have this segment header either. For the existing binaries that necessarily need to have all readable virtual memory mappings also executable, the PT_GNU_STACK segment header can be easily converted to a PT_GNU_COMPAT segment header without recompilation. The following are important details about the changes made to the linker: * The PT_GNU_STACK and PT_GNU_COMPAT segment headers are mutually exclusive. * The PT_GNU_STACK segment header has precedence over the PT_GNU_COMPAT segment header. * The PT_GNU_COMPAT segment header IS NOT created by default. * The PT_GNU_STACK segment header IS ALWAYS created by default--which is the original behaviour of the linker. These patches are completely non-intrusive. Over the time, once this compatibility mode is no longer needed, they can be removed with no subsequent effect. -- Ramon de C Valle / Red Hat Security Response Team