[Secure-testing-commits] r16078 - bin

Petter Reinholdtsen pere at alioth.debian.org
Mon Feb 7 13:49:42 UTC 2011


Author: pere
Date: 2011-02-07 13:49:40 +0000 (Mon, 07 Feb 2011)
New Revision: 16078

Modified:
   bin/compare-nvd-cve
Log:
Improve CVE/CPE reporting.

Modified: bin/compare-nvd-cve
===================================================================
--- bin/compare-nvd-cve	2011-02-07 13:33:01 UTC (rev 16077)
+++ bin/compare-nvd-cve	2011-02-07 13:49:40 UTC (rev 16078)
@@ -8,63 +8,33 @@
 
 use XML::Simple;
 use Data::Dumper;
+use Getopt::Std;
 
-use vars qw($debug %cpemap %cperevmap %cvemap %reportedmissing);
+use vars qw(%opts $debug %cpealiases %cpemap %cperevmap %cvemap
+ %reportedmissing);
 
 $| = 1;
 
-my %cpealiases;
-open (my $fh, "<", "data/CPE/aliases") || die;
-my $lastcpe = "";
-while (<$fh>) {
-    chomp;
-    s/#.*$//; # Remove comments
-    unless ($_) {
-       $lastcpe = "";
-       next;
-    }
-    if ($lastcpe) {
-        $cpealiases{$_} = $lastcpe;
-    } else {
-        $cpealiases{$_} = $_;
-        $lastcpe = $_;
-    }
-}
-close ($fh);
+getopts('d', \%opts);
+$debug = exists $opts{'d'} ? 1 : 0;
 
-sub cpe_expand_alias {
-    my $cpe = shift;
-    my $retval = $cpe;
-    if (defined $cpe && exists $cpealiases{$cpe}) {
-        $retval = $cpealiases{$cpe};
-    }
-    return $retval;
-}
+cpe_load_aliases("data/CPE/aliases");
+cpe_load_list("data/CPE/list");
 
-open($fh, "<", "data/CPE/list") || die;
-while (<$fh>) {
-    chomp;
-    s/#.*$//; # Remove comments
-    my ($binpkg, $cpe) = split(/;/);
-    $cpe = cpe_expand_alias($cpe);
-#    $cpe = "unknown-$binpkg" unless $cpe;
-    if ($cpe) {
-        $cpemap{$binpkg} = $cpe;
-        $cperevmap{$cpe} = $binpkg;
-    }
-}
-close $fh;
-
-open ($fh, "<", "data/CVE/list") || die;
+open (my $fh, "<", "data/CVE/list") || die;
 my $cve;
 while (<$fh>) {
     chomp;
     $cve = $1 if (m/^(CVE-\S+)\s*/);
     s/^(\s+)\[\S+\] /$1/; # Trim away distribution name
     if ( m/^\s+- (\S+)\S*/
-         && ! m/<not-affected>/
+#         && ! m/<not-affected>/
        ) {
         my $srcpkg = $1;
+        unless (exists $cpemap{$srcpkg}) {
+            my $cpe = "missing-cpe-for-$srcpkg";;
+            cpe_map_debiansrc($cpe, $srcpkg);
+        }
         if (exists $cvemap{$cve}) {
             push(@{$cvemap{$cve}}, $srcpkg);
         } else {
@@ -80,24 +50,24 @@
 for my $cvelist
     (
      "nvdcve-2.0-2011.xml",
-#     "nvdcve-2.0-2010.xml",
-#     "nvdcve-2.0-2009.xml",
-#     "nvdcve-2.0-2008.xml",
-#     "nvdcve-2.0-2007.xml",
-#     "nvdcve-2.0-2006.xml",
-#     "nvdcve-2.0-2005.xml",
-#     "nvdcve-2.0-2004.xml",
+     "nvdcve-2.0-2010.xml",
+     "nvdcve-2.0-2009.xml",
+     "nvdcve-2.0-2008.xml",
+     "nvdcve-2.0-2007.xml",
+     "nvdcve-2.0-2006.xml",
+     "nvdcve-2.0-2005.xml",
+     "nvdcve-2.0-2004.xml",
     ) {
-    print "Loading $cvelist\n" if $debug;
+    print STDERR "Loading $cvelist\n" if $debug;
     my $ref = XMLin("../../" . $cvelist);
     for my $cve (sort {$b cmp $a} keys %{$ref->{entry}}) {
-        print "Checking $cve\n" if $debug;
+        print STDERR "Checking $cve\n" if $debug;
         my $entry = $ref->{entry}->{$cve};
 
         my %info;
         my @debiancpe = get_debian_cpe($cve);
         for my $cpe (@debiancpe) {
-            $info{cpe_expand_alias($cpe)} = 1;
+            $info{cpe_expand_product_alias($cpe)} = 1;
         }
 
         my @products;
@@ -108,11 +78,14 @@
                 @products = ($entry->{'vuln:vulnerable-software-list'}->{'vuln:product'});
             }
         }
+        unless (1 || @products) {
+            print STDERR Dumper($entry);
+        }
         for my $cpe (@products) {
-            if (exists $info{cpe_expand_alias(cpe_product($cpe))}) {
-                $info{cpe_expand_alias(cpe_product($cpe))} += 2;
+            if (exists $info{cpe_expand_product_alias(cpe_product($cpe))}) {
+                $info{cpe_expand_product_alias(cpe_product($cpe))} += 2;
             } else {
-                $info{cpe_expand_alias(cpe_product($cpe))} = 2;
+                $info{cpe_expand_product_alias(cpe_product($cpe))} = 2;
             }
         }
         for my $cpe (sort keys %info) {
@@ -130,7 +103,7 @@
             }
         }
     }
-    print "Done loading $cvelist\n" if $debug;
+    print STDERR "Done loading $cvelist\n" if $debug;
 }
 
 for my $missing (sort { $reportedmissing{$a} <=> $reportedmissing{$b} }
@@ -157,3 +130,53 @@
     my $cpe = shift;
     return join(":", (split(/:/, $cpe))[0..3]);
 }
+
+sub cpe_map_debiansrc {
+    my ($cpe, $srcpkg) = @_;
+    if ($cpe) {
+        $cpemap{$srcpkg} = $cpe;
+        $cperevmap{$cpe} = $srcpkg;
+    }
+}
+
+sub cpe_load_list {
+    my $filename = shift;
+    open(my $fh, "<", $filename) ||
+        die "unable to load CPE list from $filename";
+    while (<$fh>) {
+        chomp;
+        s/#.*$//; # Remove comments
+        my ($srcpkg, $cpe) = split(/;/);
+        $cpe = cpe_expand_product_alias($cpe);
+        cpe_map_debiansrc($cpe, $srcpkg);
+    }
+    close $fh;
+}
+sub cpe_load_aliases {
+    my $filename = shift;
+    open (my $fh, "<", $filename) || die;
+    my $lastcpe = "";
+    while (<$fh>) {
+        chomp;
+        s/#.*$//; # Remove comments
+        unless ($_) {
+            $lastcpe = "";
+            next;
+        }
+        if ($lastcpe) {
+            $cpealiases{$_} = $lastcpe;
+        } else {
+            $cpealiases{$_} = $_;
+            $lastcpe = $_;
+        }
+    }
+    close ($fh);
+}
+sub cpe_expand_product_alias {
+    my $cpe = shift;
+    my $retval = $cpe;
+    if (defined $cpe && exists $cpealiases{$cpe}) {
+        $retval = $cpealiases{$cpe};
+    }
+    return $retval;
+}




More information about the Secure-testing-commits mailing list