summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Bauer <mjbauer95@gmail.com>2018-04-10 19:07:27 -0500
committerMatthew Bauer <mjbauer95@gmail.com>2018-04-10 19:07:27 -0500
commit6c064e6b1f34a8416f990db0cc617a7195f71588 (patch)
tree4c2a16462fab6bcfb64f7b657e40c56226b2456c
parent0dbc0067604eb9629d1458fcf2b226a88e728f14 (diff)
Revert "Merge pull request #28029 from cstrahan/hardening-fix"
This reverts commit 0dbc0067604eb9629d1458fcf2b226a88e728f14, reversing changes made to cb7f7742652acdf3086b3d132163b5ea2c2328eb. Should go into staging.
-rw-r--r--pkgs/build-support/bintools-wrapper/add-flags.sh5
-rw-r--r--pkgs/build-support/bintools-wrapper/add-hardening.sh87
-rw-r--r--pkgs/build-support/bintools-wrapper/ld-wrapper.sh4
-rw-r--r--pkgs/build-support/bintools-wrapper/setup-hook.sh4
-rw-r--r--pkgs/build-support/cc-wrapper/add-flags.sh4
-rw-r--r--pkgs/build-support/cc-wrapper/add-hardening.sh115
-rw-r--r--pkgs/build-support/cc-wrapper/cc-wrapper.sh4
-rw-r--r--pkgs/build-support/cc-wrapper/setup-hook.sh4
-rw-r--r--pkgs/stdenv/generic/make-derivation.nix7
9 files changed, 104 insertions, 130 deletions
diff --git a/pkgs/build-support/bintools-wrapper/add-flags.sh b/pkgs/build-support/bintools-wrapper/add-flags.sh
index a97809258954..7d118d20fc68 100644
--- a/pkgs/build-support/bintools-wrapper/add-flags.sh
+++ b/pkgs/build-support/bintools-wrapper/add-flags.sh
@@ -5,7 +5,6 @@ var_templates_list=(
NIX+LDFLAGS_BEFORE
NIX+LDFLAGS_AFTER
NIX+LDFLAGS_HARDEN
- NIX+HARDENING_ENABLE
)
var_templates_bool=(
NIX+SET_BUILD_ID
@@ -24,10 +23,10 @@ if [ "${NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_TARGET:-}" ]; then
fi
for var in "${var_templates_list[@]}"; do
- mangleVarList "$var" ${role_infixes[@]+"${role_infixes[@]}"}
+ mangleVarList "$var" "${role_infixes[@]}"
done
for var in "${var_templates_bool[@]}"; do
- mangleVarBool "$var" ${role_infixes[@]+"${role_infixes[@]}"}
+ mangleVarBool "$var" "${role_infixes[@]}"
done
if [ -e @out@/nix-support/libc-ldflags ]; then
diff --git a/pkgs/build-support/bintools-wrapper/add-hardening.sh b/pkgs/build-support/bintools-wrapper/add-hardening.sh
index a15be821659f..5282d17fce27 100644
--- a/pkgs/build-support/bintools-wrapper/add-hardening.sh
+++ b/pkgs/build-support/bintools-wrapper/add-hardening.sh
@@ -1,58 +1,53 @@
-declare -a hardeningLDFlags=()
-
-declare -A hardeningEnableMap=()
+hardeningFlags=(relro bindnow)
+# Intentionally word-split in case 'hardeningEnable' is defined in
+# Nix. Also, our bootstrap tools version of bash is old enough that
+# undefined arrays trip `set -u`.
+if [[ -v hardeningEnable[@] ]]; then
+ hardeningFlags+=(${hardeningEnable[@]})
+fi
+hardeningLDFlags=()
-# Intentionally word-split in case 'NIX_HARDENING_ENABLE' is defined in Nix. The
-# array expansion also prevents undefined variables from causing trouble with
-# `set -u`.
-for flag in ${NIX_@infixSalt@_HARDENING_ENABLE-}; do
- hardeningEnableMap["$flag"]=1
-done
+declare -A hardeningDisableMap
-# Remove unsupported flags.
-for flag in @hardening_unsupported_flags@; do
- unset -v hardeningEnableMap["$flag"]
+# Intentionally word-split in case 'hardeningDisable' is defined in Nix.
+for flag in ${hardeningDisable[@]:-IGNORED_KEY} @hardening_unsupported_flags@
+do
+ hardeningDisableMap[$flag]=1
done
if (( "${NIX_DEBUG:-0}" >= 1 )); then
- declare -a allHardeningFlags=(pie relro bindnow)
- declare -A hardeningDisableMap=()
-
- # Determine which flags were effectively disabled so we can report below.
- for flag in "${allHardeningFlags[@]}"; do
- if [[ -z "${hardeningEnableMap[$flag]-}" ]]; then
- hardeningDisableMap[$flag]=1
- fi
- done
-
printf 'HARDENING: disabled flags:' >&2
(( "${#hardeningDisableMap[@]}" )) && printf ' %q' "${!hardeningDisableMap[@]}" >&2
echo >&2
+fi
- if (( "${#hardeningEnableMap[@]}" )); then
+if [[ -z "${hardeningDisableMap[all]:-}" ]]; then
+ if (( "${NIX_DEBUG:-0}" >= 1 )); then
echo 'HARDENING: Is active (not completely disabled with "all" flag)' >&2;
fi
+ for flag in "${hardeningFlags[@]}"
+ do
+ if [[ -z "${hardeningDisableMap[$flag]:-}" ]]; then
+ case $flag in
+ pie)
+ if [[ ! ("$*" =~ " -shared " || "$*" =~ " -static ") ]]; then
+ if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling LDFlags -pie >&2; fi
+ hardeningLDFlags+=('-pie')
+ fi
+ ;;
+ relro)
+ if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling relro >&2; fi
+ hardeningLDFlags+=('-z' 'relro')
+ ;;
+ bindnow)
+ if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling bindnow >&2; fi
+ hardeningLDFlags+=('-z' 'now')
+ ;;
+ *)
+ # Ignore unsupported. Checked in Nix that at least *some*
+ # tool supports each flag.
+ ;;
+ esac
+ fi
+ done
fi
-
-for flag in "${!hardeningEnableMap[@]}"; do
- case $flag in
- pie)
- if [[ ! ("$*" =~ " -shared " || "$*" =~ " -static ") ]]; then
- if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling LDFlags -pie >&2; fi
- hardeningLDFlags+=('-pie')
- fi
- ;;
- relro)
- if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling relro >&2; fi
- hardeningLDFlags+=('-z' 'relro')
- ;;
- bindnow)
- if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling bindnow >&2; fi
- hardeningLDFlags+=('-z' 'now')
- ;;
- *)
- # Ignore unsupported. Checked in Nix that at least *some*
- # tool supports each flag.
- ;;
- esac
-done
diff --git a/pkgs/build-support/bintools-wrapper/ld-wrapper.sh b/pkgs/build-support/bintools-wrapper/ld-wrapper.sh
index 672a3dcbe385..991ed0fe263c 100644
--- a/pkgs/build-support/bintools-wrapper/ld-wrapper.sh
+++ b/pkgs/build-support/bintools-wrapper/ld-wrapper.sh
@@ -57,8 +57,8 @@ fi
source @out@/nix-support/add-hardening.sh
-extraAfter=()
-extraBefore=(${hardeningLDFlags[@]+"${hardeningLDFlags[@]}"})
+extraAfter=("${hardeningLDFlags[@]}")
+extraBefore=()
if [ -z "${NIX_@infixSalt@_LDFLAGS_SET:-}" ]; then
extraAfter+=($NIX_@infixSalt@_LDFLAGS)
diff --git a/pkgs/build-support/bintools-wrapper/setup-hook.sh b/pkgs/build-support/bintools-wrapper/setup-hook.sh
index 831ee9b03872..48a00b0b9b07 100644
--- a/pkgs/build-support/bintools-wrapper/setup-hook.sh
+++ b/pkgs/build-support/bintools-wrapper/setup-hook.sh
@@ -83,10 +83,6 @@ do
fi
done
-# If unset, assume the default hardening flags.
-: ${NIX_HARDENING_ENABLE="fortify stackprotector pic strictoverflow format relro bindnow"}
-export NIX_HARDENING_ENABLE
-
# No local scope in sourced file
unset -v role_pre role_post cmd upper_case
set +u
diff --git a/pkgs/build-support/cc-wrapper/add-flags.sh b/pkgs/build-support/cc-wrapper/add-flags.sh
index e384d30ecbb6..604aaf6b6cf0 100644
--- a/pkgs/build-support/cc-wrapper/add-flags.sh
+++ b/pkgs/build-support/cc-wrapper/add-flags.sh
@@ -30,10 +30,10 @@ fi
# We need to mangle names for hygiene, but also take parameters/overrides
# from the environment.
for var in "${var_templates_list[@]}"; do
- mangleVarList "$var" ${role_infixes[@]+"${role_infixes[@]}"}
+ mangleVarList "$var" "${role_infixes[@]}"
done
for var in "${var_templates_bool[@]}"; do
- mangleVarBool "$var" ${role_infixes[@]+"${role_infixes[@]}"}
+ mangleVarBool "$var" "${role_infixes[@]}"
done
# `-B@out@/bin' forces cc to use ld-wrapper.sh when calling ld.
diff --git a/pkgs/build-support/cc-wrapper/add-hardening.sh b/pkgs/build-support/cc-wrapper/add-hardening.sh
index 026e48671447..a35ff3cb4260 100644
--- a/pkgs/build-support/cc-wrapper/add-hardening.sh
+++ b/pkgs/build-support/cc-wrapper/add-hardening.sh
@@ -1,72 +1,67 @@
-declare -a hardeningCFlags=()
-
-declare -A hardeningEnableMap=()
+hardeningFlags=(fortify stackprotector pic strictoverflow format relro bindnow)
+# Intentionally word-split in case 'hardeningEnable' is defined in
+# Nix. Also, our bootstrap tools version of bash is old enough that
+# undefined arrays trip `set -u`.
+if [[ -v hardeningEnable[@] ]]; then
+ hardeningFlags+=(${hardeningEnable[@]})
+fi
+hardeningCFlags=()
-# Intentionally word-split in case 'NIX_HARDENING_ENABLE' is defined in Nix. The
-# array expansion also prevents undefined variables from causing trouble with
-# `set -u`.
-for flag in ${NIX_@infixSalt@_HARDENING_ENABLE-}; do
- hardeningEnableMap["$flag"]=1
-done
+declare -A hardeningDisableMap
-# Remove unsupported flags.
-for flag in @hardening_unsupported_flags@; do
- unset -v hardeningEnableMap["$flag"]
+# Intentionally word-split in case 'hardeningDisable' is defined in Nix.
+for flag in ${hardeningDisable[@]:-IGNORED_KEY} @hardening_unsupported_flags@
+do
+ hardeningDisableMap[$flag]=1
done
if (( "${NIX_DEBUG:-0}" >= 1 )); then
- declare -a allHardeningFlags=(fortify stackprotector pie pic strictoverflow format)
- declare -A hardeningDisableMap=()
-
- # Determine which flags were effectively disabled so we can report below.
- for flag in "${allHardeningFlags[@]}"; do
- if [[ -z "${hardeningEnableMap[$flag]-}" ]]; then
- hardeningDisableMap["$flag"]=1
- fi
- done
-
printf 'HARDENING: disabled flags:' >&2
(( "${#hardeningDisableMap[@]}" )) && printf ' %q' "${!hardeningDisableMap[@]}" >&2
echo >&2
+fi
- if (( "${#hardeningEnableMap[@]}" )); then
+if [[ -z "${hardeningDisableMap[all]:-}" ]]; then
+ if (( "${NIX_DEBUG:-0}" >= 1 )); then
echo 'HARDENING: Is active (not completely disabled with "all" flag)' >&2;
fi
+ for flag in "${hardeningFlags[@]}"
+ do
+ if [[ -z "${hardeningDisableMap[$flag]:-}" ]]; then
+ case $flag in
+ fortify)
+ if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling fortify >&2; fi
+ hardeningCFlags+=('-O2' '-D_FORTIFY_SOURCE=2')
+ ;;
+ stackprotector)
+ if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling stackprotector >&2; fi
+ hardeningCFlags+=('-fstack-protector-strong' '--param' 'ssp-buffer-size=4')
+ ;;
+ pie)
+ if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling CFlags -fPIE >&2; fi
+ hardeningCFlags+=('-fPIE')
+ if [[ ! ("$*" =~ " -shared " || "$*" =~ " -static ") ]]; then
+ if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling LDFlags -pie >&2; fi
+ hardeningCFlags+=('-pie')
+ fi
+ ;;
+ pic)
+ if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling pic >&2; fi
+ hardeningCFlags+=('-fPIC')
+ ;;
+ strictoverflow)
+ if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling strictoverflow >&2; fi
+ hardeningCFlags+=('-fno-strict-overflow')
+ ;;
+ format)
+ if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling format >&2; fi
+ hardeningCFlags+=('-Wformat' '-Wformat-security' '-Werror=format-security')
+ ;;
+ *)
+ # Ignore unsupported. Checked in Nix that at least *some*
+ # tool supports each flag.
+ ;;
+ esac
+ fi
+ done
fi
-
-for flag in "${!hardeningEnableMap[@]}"; do
- case $flag in
- fortify)
- if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling fortify >&2; fi
- hardeningCFlags+=('-O2' '-D_FORTIFY_SOURCE=2')
- ;;
- stackprotector)
- if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling stackprotector >&2; fi
- hardeningCFlags+=('-fstack-protector-strong' '--param' 'ssp-buffer-size=4')
- ;;
- pie)
- if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling CFlags -fPIE >&2; fi
- hardeningCFlags+=('-fPIE')
- if [[ ! ("$*" =~ " -shared " || "$*" =~ " -static ") ]]; then
- if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling LDFlags -pie >&2; fi
- hardeningCFlags+=('-pie')
- fi
- ;;
- pic)
- if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling pic >&2; fi
- hardeningCFlags+=('-fPIC')
- ;;
- strictoverflow)
- if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling strictoverflow >&2; fi
- hardeningCFlags+=('-fno-strict-overflow')
- ;;
- format)
- if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling format >&2; fi
- hardeningCFlags+=('-Wformat' '-Wformat-security' '-Werror=format-security')
- ;;
- *)
- # Ignore unsupported. Checked in Nix that at least *some*
- # tool supports each flag.
- ;;
- esac
-done
diff --git a/pkgs/build-support/cc-wrapper/cc-wrapper.sh b/pkgs/build-support/cc-wrapper/cc-wrapper.sh
index 8a3cfb694b4f..c2e6c1406358 100644
--- a/pkgs/build-support/cc-wrapper/cc-wrapper.sh
+++ b/pkgs/build-support/cc-wrapper/cc-wrapper.sh
@@ -134,8 +134,8 @@ fi
source @out@/nix-support/add-hardening.sh
# Add the flags for the C compiler proper.
-extraAfter=($NIX_@infixSalt@_CFLAGS_COMPILE)
-extraBefore=(${hardeningCFlags[@]+"${hardeningCFlags[@]}"})
+extraAfter=($NIX_@infixSalt@_CFLAGS_COMPILE "${hardeningCFlags[@]}")
+extraBefore=()
if [ "$dontLink" != 1 ]; then
diff --git a/pkgs/build-support/cc-wrapper/setup-hook.sh b/pkgs/build-support/cc-wrapper/setup-hook.sh
index 15b84dca2794..29a7306b9b7e 100644
--- a/pkgs/build-support/cc-wrapper/setup-hook.sh
+++ b/pkgs/build-support/cc-wrapper/setup-hook.sh
@@ -147,10 +147,6 @@ export ${role_pre}CXX=@named_cxx@
export CC${role_post}=@named_cc@
export CXX${role_post}=@named_cxx@
-# If unset, assume the default hardening flags.
-: ${NIX_HARDENING_ENABLE="fortify stackprotector pic strictoverflow format relro bindnow"}
-export NIX_HARDENING_ENABLE
-
# No local scope in sourced file
unset -v role_pre role_post
set +u
diff --git a/pkgs/stdenv/generic/make-derivation.nix b/pkgs/stdenv/generic/make-derivation.nix
index 7b5f9f7d6b0b..46df958b8396 100644
--- a/pkgs/stdenv/generic/make-derivation.nix
+++ b/pkgs/stdenv/generic/make-derivation.nix
@@ -74,11 +74,6 @@ rec {
# TODO(@Ericson2314): Make this more modular, and not O(n^2).
let
supportedHardeningFlags = [ "fortify" "stackprotector" "pie" "pic" "strictoverflow" "format" "relro" "bindnow" ];
- defaultHardeningFlags = lib.remove "pie" supportedHardeningFlags;
- enabledHardeningOptions =
- if builtins.elem "all" hardeningDisable
- then []
- else lib.subtractLists hardeningDisable (defaultHardeningFlags ++ hardeningEnable);
# hardeningDisable additionally supports "all".
erroneousHardeningFlags = lib.subtractLists supportedHardeningFlags (hardeningEnable ++ lib.remove "all" hardeningDisable);
in if builtins.length erroneousHardeningFlags != 0
@@ -184,8 +179,6 @@ rec {
++ optional (elem "host" configurePlatforms) "--host=${stdenv.hostPlatform.config}"
++ optional (elem "target" configurePlatforms) "--target=${stdenv.targetPlatform.config}";
- } // lib.optionalAttrs (hardeningDisable != [] || hardeningEnable != []) {
- NIX_HARDENING_ENABLE = enabledHardeningOptions;
} // lib.optionalAttrs (stdenv.buildPlatform.isDarwin) {
# TODO: remove lib.unique once nix has a list canonicalization primitive
__sandboxProfile =