blob: 6b33d281df16f0662b2066c7cfa0aa0dad410ef0 [file] [log] [blame]
# Check for major issues with built executables: insecure RPATHs,
# text relocations, executable stacks
elf_check() {
if ! type -P scanelf >/dev/null || has binchecks ${RESTRICT}; then
return
fi
local insecure_rpath=0 tmp_quiet=${PORTAGE_QUIET}
local f x
# display warnings when using stricter because we die afterwards
if has stricter ${FEATURES} ; then
local PORTAGE_QUIET
fi
# Make sure we disallow insecure RUNPATH/RPATHs.
# 1) References to PORTAGE_BUILDDIR are banned because it's a
# security risk. We don't want to load files from a
# temporary directory.
# 2) If ROOT != "/", references to ROOT are banned because
# that directory won't exist on the target system.
# 3) Null paths are banned because the loader will search $PWD when
# it finds null paths.
local forbidden_dirs=( "${PORTAGE_BUILDDIR}" )
if [[ "${ROOT:-/}" != "/" ]]; then
forbidden_dirs+=( "${ROOT}" )
fi
local dir l rpath_files=$(scanelf -F '%F:%r' -qBR "${ED}")
f=""
for dir in "${forbidden_dirs[@]}"; do
while read l; do
f+=" ${l/:/\n RPATH: }\n"
if ! has stricter ${FEATURES}; then
__vecho "Auto fixing rpaths for ${l%%:*}"
TMPDIR="${dir}" scanelf -BXr "${l%%:*}" -o /dev/null
fi
done < <(echo "${rpath_files}" | grep -F -e ":${dir}" -e "::" -e ": ")
done
# Reject set*id binaries with $ORIGIN in RPATH #260331
x=$(
find "${ED}" -type f '(' -perm -u+s -o -perm -g+s ')' \
-exec scanelf -qyRF '%r %p' {} + | grep '$ORIGIN'
)
# Print QA notice.
if [[ -n ${f}${x} ]] ; then
__vecho -ne '\n'
eqawarn "QA Notice: The following files contain insecure RUNPATHs"
eqawarn " Please file a bug about this at https://bugs.gentoo.org/"
eqawarn " with the maintainer of the package."
eqawarn "${f}${f:+${x:+\n}}${x}"
__vecho -ne '\n'
if [[ -n ${x} ]] || has stricter ${FEATURES} ; then
insecure_rpath=1
fi
fi
# TEXTRELs are baaaaaaaad
# Allow devs to mark things as ignorable ... e.g. things that are
# binary-only and upstream isn't cooperating (nvidia-glx) ... we
# allow ebuild authors to set QA_TEXTRELS_arch and QA_TEXTRELS ...
# the former overrides the latter ... regexes allowed ! :)
local qa_var="QA_TEXTRELS_${ARCH/-/_}"
[[ -n ${!qa_var} ]] && QA_TEXTRELS=${!qa_var}
[[ -n ${QA_STRICT_TEXTRELS} ]] && QA_TEXTRELS=""
export QA_TEXTRELS="${QA_TEXTRELS} lib*/modules/*.ko"
f=$(scanelf -qyRF '%t %p' "${ED%/}/" | grep -v 'usr/lib/debug/')
if [[ -n ${f} ]] ; then
scanelf -qyRAF '%T %p' "${PORTAGE_BUILDDIR}"/ &> "${T}"/scanelf-textrel.log
__vecho -ne '\n'
eqawarn "QA Notice: The following files contain runtime text relocations"
eqawarn " Text relocations force the dynamic linker to perform extra"
eqawarn " work at startup, waste system resources, and may pose a security"
eqawarn " risk. On some architectures, the code may not even function"
eqawarn " properly, if at all."
eqawarn " For more information, see:"
eqawarn
eqawarn " https://wiki.gentoo.org/wiki/Hardened/HOWTO_locate_and_fix_textrels"
eqawarn
eqawarn " Please include the following list of files in your report:"
eqawarn "${f}"
__vecho -ne '\n'
die_msg="${die_msg} textrels,"
sleep 1
fi
# Also, executable stacks only matter on linux (and just glibc atm ...)
f=""
case ${CTARGET:-${CHOST}} in
*-linux-gnu*)
# Check for files with executable stacks, but only on arches which
# are supported at the moment. Keep this list in sync with
# https://wiki.gentoo.org/wiki/Hardened/GNU_stack_quickstart#Arch_Status
case ${CTARGET:-${CHOST}} in
arm*|i?86*|ia64*|m68k*|s390*|sh*|x86_64*)
# Allow devs to mark things as ignorable ... e.g. things
# that are binary-only and upstream isn't cooperating ...
# we allow ebuild authors to set QA_EXECSTACK_arch and
# QA_EXECSTACK ... the former overrides the latter ...
# regexes allowed ! :)
qa_var="QA_EXECSTACK_${ARCH/-/_}"
[[ -n ${!qa_var} ]] && QA_EXECSTACK=${!qa_var}
[[ -n ${QA_STRICT_EXECSTACK} ]] && QA_EXECSTACK=""
qa_var="QA_WX_LOAD_${ARCH/-/_}"
[[ -n ${!qa_var} ]] && QA_WX_LOAD=${!qa_var}
[[ -n ${QA_STRICT_WX_LOAD} ]] && QA_WX_LOAD=""
export QA_EXECSTACK="${QA_EXECSTACK} lib*/modules/*.ko"
export QA_WX_LOAD="${QA_WX_LOAD} lib*/modules/*.ko"
f=$(scanelf -qyRAF '%e %p' "${ED%/}/" | grep -v 'usr/lib/debug/')
;;
esac
;;
esac
if [[ -n ${f} ]] ; then
# One more pass to help devs track down the source
scanelf -qyRAF '%e %p' "${PORTAGE_BUILDDIR}"/ &> "${T}"/scanelf-execstack.log
__vecho -ne '\n'
eqawarn "QA Notice: The following files contain writable and executable sections"
eqawarn " Files with such sections will not work properly (or at all!) on some"
eqawarn " architectures/operating systems. A bug should be filed at"
eqawarn " https://bugs.gentoo.org/ to make sure the issue is fixed."
eqawarn " For more information, see:"
eqawarn
eqawarn " https://wiki.gentoo.org/wiki/Hardened/GNU_stack_quickstart"
eqawarn
eqawarn " Please include the following list of files in your report:"
eqawarn " Note: Bugs should be filed for the respective maintainers"
eqawarn " of the package in question and not hardened@gentoo.org."
eqawarn "${f}"
__vecho -ne '\n'
die_msg="${die_msg} execstacks"
sleep 1
fi
if [[ ${insecure_rpath} -eq 1 ]] ; then
die "Aborting due to serious QA concerns with RUNPATH/RPATH"
elif [[ -n ${die_msg} ]] && has stricter ${FEATURES} ; then
die "Aborting due to QA concerns: ${die_msg}"
fi
}
elf_check
: # guarantee successful exit
# vim:ft=sh