X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;ds=sidebyside;f=bin%2Fblhc;h=009aec98b7b312ec964c6def99fa5fce22f3a9b2;hb=8f13ff5cfeb4cd6f4102cd0448a9f5dfa089491e;hp=6afff57ff521485c9c6a4db9437bc826ea26b18d;hpb=cda2e04237c0657e09d248b7f33c6ad0dc56612e;p=blhc%2Fblhc.git diff --git a/bin/blhc b/bin/blhc index 6afff57..009aec9 100755 --- a/bin/blhc +++ b/bin/blhc @@ -602,6 +602,7 @@ my @option_ignore_arch_line = (); my $option_all = 0; my $option_arch = undef; my $option_buildd = 0; +my $option_debian = 0; $option_color = 0; if (not Getopt::Long::GetOptions( 'help|h|?' => \$option_help, @@ -620,6 +621,7 @@ if (not Getopt::Long::GetOptions( 'color' => \$option_color, 'arch=s' => \$option_arch, 'buildd' => \$option_buildd, + 'debian' => \$option_debian, )) { require Pod::Usage; Pod::Usage::pod2usage(2); @@ -750,6 +752,13 @@ foreach my $file (@ARGV) { # use a large enough default. my $parallel = 10; + # Don't check for PIE flags if automatically applied by the compiler. Only + # used in buildd and Debian mode. + my $disable_harden_pie = 0; + if ($option_debian) { + $disable_harden_pie = 1; + } + while (my $line = <$fh>) { # Detect architecture automatically unless overridden. For buildd logs # only, doesn't use the dpkg-buildpackage header. Necessary to ignore @@ -772,6 +781,10 @@ foreach my $file (@ARGV) { # flags are not checked. # # Strong stack protector is used since dpkg 1.17.11. + # + # Recent GCC versions automatically use PIE (only on supported + # architectures) and dpkg respects this properly since 1.18.15 and + # doesn't pass PIE flags manually. if ($option_buildd and index($line, 'Toolchain package versions: ') == 0) { require Dpkg::Version; @@ -786,6 +799,9 @@ foreach my $file (@ARGV) { if (Dpkg::Version::version_compare($1, '1.17.11') >= 0) { $disable_strong = 0; } + if (Dpkg::Version::version_compare($1, '1.18.15') >= 0) { + $disable_harden_pie = 1; + } } if ($disable) { @@ -1040,7 +1056,7 @@ foreach my $file (@ARGV) { # Option or auto detected. if ($arch) { - # The following was partially copied from dpkg-dev 1.18.15 + # The following was partially copied from dpkg-dev 1.18.24 # (/usr/share/perl5/Dpkg/Vendor/Debian.pm, _add_hardening_flags()), # copyright Raphaël Hertzog , Kees Cook # , Canonical, Ltd. licensed under GPL version 2 or @@ -1056,6 +1072,11 @@ foreach my $file (@ARGV) { (undef, $os, $cpu) = Dpkg::Arch::debarch_to_debtriplet($arch); } + my %builtin_pie_arch = map { $_ => 1 } qw( + amd64 arm64 armel armhf i386 kfreebsd-amd64 kfreebsd-i386 + mips mipsel mips64el ppc64el s390x sparc sparc64 + ); + # Disable unsupported hardening options. if ($os !~ /^(?:linux|kfreebsd|knetbsd|hurd)$/ or $cpu =~ /^(?:hppa|avr32)$/) { @@ -1069,6 +1090,10 @@ foreach my $file (@ARGV) { $harden_relro = 0; $harden_bindnow = 0; } + + if ($disable_harden_pie and exists $builtin_pie_arch{$arch}) { + $harden_pie = 0; + } } # Default values. @@ -1468,6 +1493,12 @@ error). =back +=item B<--debian> + +Apply Debian-specific settings. At the moment this only disables checking for +PIE which is automatically applied by Debian's GCC and no longer requires a +compiler command line argument. + =item B<--color> Use colored (ANSI) output for warning messages. @@ -1555,6 +1586,13 @@ Use blhc with pbuilder. pbuilder path/to/package.dsc | tee path/log/file blhc path/to/file || echo flags missing +Assume this build log was created on a Debian system and thus don't warn about +missing PIE flags if the current architecture injects them automatically (this +is enabled in buildd mode per default). C<--arch> is necessary if the build +log contains no architecture information as written by dpkg-buildpackage. + + blhc --debian --all --arch=amd64 path/to/log/file + =head1 BUILDD TAGS The following tags are used in I<--buildd> mode. In braces the additional data