The following commit has been merged in the master branch:
commit c4b489e62d9cc55e9ed0fdb26da291e958457010
Author: Kees Cook <[email protected]>
Date:   Wed Dec 28 15:03:44 2011 -0800

    Dpkg::Vendor::Debian: refactor compiler hardening logic
    
    Refactor the hardened compiler flag logic so the "use_feature" variable ends
    up controlling the final stance of each given hardening feature.
    
    Signed-off-by: Kees Cook <[email protected]>
    Signed-off-by: Raphaël Hertzog <[email protected]>

diff --git a/scripts/Dpkg/Vendor/Debian.pm b/scripts/Dpkg/Vendor/Debian.pm
index e824d0e..f363fee 100644
--- a/scripts/Dpkg/Vendor/Debian.pm
+++ b/scripts/Dpkg/Vendor/Debian.pm
@@ -83,7 +83,7 @@ sub add_hardening_flags {
     my $arch = get_host_arch();
     my ($abi, $os, $cpu) = debarch_to_debtriplet($arch);
 
-    # Decide what's enabled
+    # Features enabled by default for all builds.
     my %use_feature = (
        "pie" => 0,
        "stackprotector" => 1,
@@ -92,6 +92,8 @@ sub add_hardening_flags {
        "relro" => 1,
        "bindnow" => 0
     );
+
+    # Adjust features based on Maintainer's desires.
     my $opts = Dpkg::BuildOptions->new(envvar => "DEB_BUILD_MAINT_OPTIONS");
     foreach my $feature (split(",", $opts->get("hardening") // "")) {
        $feature = lc($feature);
@@ -112,43 +114,62 @@ sub add_hardening_flags {
        }
     }
 
-    # PIE
-    if ($use_feature{"pie"} and
-       $os =~ /^(linux|knetbsd|hurd)$/ and
-       $cpu !~ /^(hppa|m68k|mips|mipsel|avr32)$/) {
-       # Only on linux/knetbsd/hurd (see #430455 and #586215)
+    # Mask features that are not available on certain architectures.
+    if ($os !~ /^(linux|knetbsd|hurd)$/ or
+       $cpu =~ /^(hppa|m68k|mips|mipsel|avr32)$/) {
+       # Disabled on non-linux/knetbsd/hurd (see #430455 and #586215).
        # Disabled on hppa, m68k (#451192), mips/mipsel (#532821), avr32
-       # (#574716)
-       $flags->append("CFLAGS", "-fPIE");
-       $flags->append("CXXFLAGS", "-fPIE");
-       $flags->append("LDFLAGS", "-fPIE -pie");
+       #  (#574716).
+       $use_feature{"pie"} = 0;
     }
-    # Stack protector
-    if ($use_feature{"stackprotector"} and
-       $cpu !~ /^(ia64|alpha|mips|mipsel|hppa)$/ and $arch ne "arm") {
+    if ($cpu =~ /^(ia64|alpha|mips|mipsel|hppa)$/ or $arch eq "arm") {
        # Stack protector disabled on ia64, alpha, mips, mipsel, hppa.
        #   "warning: -fstack-protector not supported for this target"
        # Stack protector disabled on arm (ok on armel).
        #   compiler supports it incorrectly (leads to SEGV)
+       $use_feature{"stackprotector"} = 0;
+    }
+    if ($cpu =~ /^(ia64|hppa|avr32)$/) {
+       # relro not implemented on ia64, hppa, avr32.
+       $use_feature{"relro"} = 0;
+    }
+
+    # Handle logical feature interactions.
+    if ($use_feature{"relro"} == 0) {
+       # Disable bindnow if relro is not enabled, since it has no
+       # hardening ability without relro and may incur load penalties.
+       $use_feature{"bindnow"} = 0;
+    }
+
+    # PIE
+    if ($use_feature{"pie"}) {
+       $flags->append("CFLAGS", "-fPIE");
+       $flags->append("CXXFLAGS", "-fPIE");
+       $flags->append("LDFLAGS", "-fPIE -pie");
+    }
+
+    # Stack protector
+    if ($use_feature{"stackprotector"}) {
        $flags->append("CFLAGS", "-fstack-protector --param=ssp-buffer-size=4");
        $flags->append("CXXFLAGS", "-fstack-protector 
--param=ssp-buffer-size=4");
     }
-    # Fortify
+
+    # Fortify Source
     if ($use_feature{"fortify"}) {
        $flags->append("CPPFLAGS", "-D_FORTIFY_SOURCE=2");
     }
-    # Format
+
+    # Format Security
     if ($use_feature{"format"}) {
        $flags->append("CFLAGS", "-Wformat -Wformat-security 
-Werror=format-security");
        $flags->append("CXXFLAGS", "-Wformat -Wformat-security 
-Werror=format-security");
     }
-    # Relro
-    if ($use_feature{"relro"} and $cpu !~ /^(ia64|hppa|avr32)$/) {
+
+    # Read-only Relocations
+    if ($use_feature{"relro"}) {
        $flags->append("LDFLAGS", "-Wl,-z,relro");
-    } else {
-       # Disable full relro if relro is not enabled.
-       $use_feature{"bindnow"} = 0;
     }
+
     # Bindnow
     if ($use_feature{"bindnow"}) {
        $flags->append("LDFLAGS", "-Wl,-z,now");

-- 
dpkg's main repository


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to