[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[lintian] 05/08: c/binaries: Implement hardening-no-fortify-functions



This is an automated email from the git hooks/post-receive script.

nthykier pushed a commit to branch master
in repository lintian.

commit daaef1a8561105c5c4e54424a460cf0deea249e7
Author: Niels Thykier <niels@thykier.net>
Date:   Sat Sep 17 20:22:16 2016 +0000

    c/binaries: Implement hardening-no-fortify-functions
    
    Signed-off-by: Niels Thykier <niels@thykier.net>
---
 checks/binaries.pm               | 34 ++++++++++++----
 data/binaries/hardened-functions | 88 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 113 insertions(+), 9 deletions(-)

diff --git a/checks/binaries.pm b/checks/binaries.pm
index a9ba42f..bf17de8 100644
--- a/checks/binaries.pm
+++ b/checks/binaries.pm
@@ -98,6 +98,7 @@ sub _split_hash {
 
 our $HARDENING= Lintian::Data->new('binaries/hardening-tags', qr/\s*\|\|\s*/o,
     \&_split_hash);
+our $HARDENED_FUNCTIONS = Lintian::Data->new('binaries/hardened-functions');
 our $LFS_SYMBOLS = Lintian::Data->new('binaries/lfs-symbols');
 
 our $ARCH_32_REGEX;
@@ -127,7 +128,7 @@ sub run {
 
     foreach my $file (sort keys %{$info->objdump_info}) {
         my $objdump = $info->objdump_info->{$file};
-        my $has_lfs;
+        my ($has_lfs, %unharded_functions, @hardened_functions);
         my $is_profiled = 0;
         # $file can be an object inside a static lib.  These do
         # not appear in the output of our file_info collection.
@@ -153,6 +154,20 @@ sub run {
         foreach my $symbol (@{$objdump->{SYMBOLS}}) {
             my ($foo, $sec, $sym) = @{$symbol};
 
+            if ($foo eq 'UND') {
+                my $name = $sym;
+                my $hardened;
+                $hardened = 1 if $name =~ s/^__(\S+)_chk$/$1/;
+                if ($HARDENED_FUNCTIONS->known($name)) {
+                    if ($hardened) {
+                        push(@hardened_functions, $name);
+                    } else {
+                        $unharded_functions{$name} = 1;
+                    }
+                }
+
+            }
+
             unless (defined $has_lfs) {
                 if ($foo eq 'UND' and $LFS_SYMBOLS->known($sym)) {
                     # Using a 32bit only interface call, some parts of the
@@ -179,6 +194,13 @@ sub run {
             tag 'binary-compiled-with-profiling-enabled', $file
               if $is_profiled;
         }
+        if (    %unharded_functions
+            and not @hardened_functions
+            and not $built_with_golang
+            and $arch_hardening->{'hardening-no-fortify-functions'}) {
+            tag 'hardening-no-fortify-functions', $file;
+        }
+
         tag 'apparently-corrupted-elf-binary', $file
           if $objdump->{'ERRORS'};
         tag 'binary-file-built-without-LFS-support', $file
@@ -565,7 +587,7 @@ sub run {
                 tag 'hardening-no-bindnow', $file;
             }
 
-            if ($arch_hardening->{'hardening-no-pie'}
+            if (    $arch_hardening->{'hardening-no-pie'}
                 and $objdump->{'ELF-TYPE'} eq 'EXEC') {
                 tag 'hardening-no-pie', $file;
             }
@@ -578,13 +600,7 @@ sub run {
                     foreach my $t (@{$info->hardening_info->{$fname}}) {
                         my $tag = "hardening-$t";
                         # Implemented elsewhere
-                        next if $t eq 'no-relro' or $t eq 'no-bindnow' or $t eq 'no-pie';
-                        # Binaries built by the Go compiler do not support all
-                        # hardening measures.
-                        next
-                          if ($t eq 'no-relro'
-                            ||$t eq 'no-fortify-functions')
-                          &&$built_with_golang;
+                        next if $t ne 'no-stackprotector';
                         tag $tag, $file if $arch_hardening->{$tag};
                     }
                 }
diff --git a/data/binaries/hardened-functions b/data/binaries/hardened-functions
new file mode 100644
index 0000000..2187ec9
--- /dev/null
+++ b/data/binaries/hardened-functions
@@ -0,0 +1,88 @@
+# Set of C functions that have a hardened variant
+#
+# Known functions which are deliberately omitted
+# (due to false positives):
+#
+#    memcpy
+#    memset
+#    memmove
+#
+# The list is manually updated, please keep it
+# sorted by name
+#
+
+asprintf
+confstr
+dprintf
+fdelt
+fgets
+fgets_unlocked
+fgetws
+fgetws_unlocked
+fprintf
+fread
+fread_unlocked
+fwprintf
+getcwd
+getdomainname
+getgroups
+gethostname
+getlogin_r
+gets
+getwd
+longjmp
+mbsnrtowcs
+mbsrtowcs
+mbstowcs
+mempcpy
+obstack_printf
+obstack_vprintf
+poll
+ppoll
+pread64
+pread
+printf
+ptsname_r
+read
+readlink
+readlinkat
+realpath
+recv
+recvfrom
+snprintf
+sprintf
+stpcpy
+stpncpy
+strcat
+strcpy
+strncat
+strncpy
+swprintf
+syslog
+ttyname_r
+vasprintf
+vdprintf
+vfprintf
+vfwprintf
+vprintf
+vsnprintf
+vsprintf
+vswprintf
+vsyslog
+vwprintf
+wcpcpy
+wcpncpy
+wcrtomb
+wcscat
+wcscpy
+wcsncat
+wcsncpy
+wcsnrtombs
+wcsrtombs
+wcstombs
+wctomb
+wmemcpy
+wmemmove
+wmempcpy
+wmemset
+wprintf

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/lintian/lintian.git


Reply to: