Public bug reported: Ubuntu package dnssec-tools provides a broken zonesigner script, which fails when any the -kskdirectory, -zskdirectory, or -keydirectory options is used. The script (/usr/sbin/zonesigner) fails to dereference file globs when invoking external 'mv' or 'cp' commands. The upstream version (from http://www.dnssec-tools.org/download/ , installed in /usr/local/bin) avoids this problem. The Ubuntu script claims the same version number as the upstream one, but differs.
The difference between the original and Ubuntu versions of the script appears to be due to an incompletely considered attempt to protect against shell command injection. The Ubuntu script needs to be changed either to use the original code or to dereference file globs explicitly before invoking the relevant external command. Details follow below. joe(user)2097: /usr/sbin/zonesigner -Version zonesigner version: 2.1.0 DNSSEC-Tools Version: 2.1 joe(user)2098: /usr/local/bin/zonesigner -Version zonesigner version: 2.1.0 DNSSEC-Tools Version: 2.1 joe(user)2099: cat /etc/os-release NAME="Ubuntu" VERSION="16.04.2 LTS (Xenial Xerus)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 16.04.2 LTS" VERSION_ID="16.04" HOME_URL="http://www.ubuntu.com/" SUPPORT_URL="http://help.ubuntu.com/" BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" VERSION_CODENAME=xenial UBUNTU_CODENAME=xenial joe(user)2100: diff -b -u /usr/sbin/zonesigner /usr/local/bin/zonesigner --- /usr/sbin/zonesigner 2016-01-22 23:10:55.000000000 +0000 +++ /usr/local/bin/zonesigner 2017-02-13 13:56:56.000000000 +0000 @@ -1087,11 +1087,11 @@ # # Ensure that the zone file has not been signed yet. # - #if(presigned()) - #{ - # print STDERR "zone file $zonefile already signed\n"; - # exit(17); - #} + if(presigned()) + { + print STDERR "zone file $zonefile already signed\n"; + exit(17); + } } #---------------------------------------------------------------------- @@ -1985,7 +1985,6 @@ my $keys; # Keys we're modifying. my @keylist; # Keys inna list. - my @args; # # Change the type of the given signing set to the specified type. @@ -2021,11 +2020,6 @@ vmed_print("setting revoke bit($cwd): $cmd\n"); System($cmd); - if ($? != 0) - { - print STDERR "'$cmd' returned $?\n" if($verbose); - exit($?); - } # # Record the time when key is revoked. @@ -2057,13 +2051,7 @@ if(! -e $archdir) { vmed_print("creating key archive directory $archdir\n\n"); - @args = ($MKDIR, "-p", "-m 0700", $archdir); - System(@args); - if ($? != 0) - { - print STDERR "'@args' returned $?\n" if($verbose); - exit($?); - } + System("$MKDIR -p -m 0700 $archdir"); } else { @@ -2091,13 +2079,7 @@ $newname = "$archdir/$kronos.$archfn"; vhigh_print("moving $key to $newname\n\n"); - @args = ($MV, $archfn, $newname); - System(@args); - if ($? != 0) - { - print STDERR "'@args' returned $?\n" if($verbose); - exit($?); - } + System("$MV $archfn $newname"); if($archfn =~ /\.key$/) { @@ -2182,7 +2164,6 @@ sub keydirs { my $cwd = getcwd(); # Current directory. - my @args; vmed_print("checking key directories\n"); @@ -2205,24 +2186,12 @@ foreach my $ksk (@kskcurlist) { - @args = ($MV, "$ksk.*", $kskdir); - System(@args); - if ($? != 0) - { - print STDERR "'@args' returned $?\n" if($verbose); - exit($?) - } + System("$MV $ksk.* $kskdir"); } foreach my $ksk (@kskpublist) { - @args = ($MV, "$ksk.*", $kskdir); - System(@args); - if ($? != 0) - { - print STDERR "'@args' returned $?\n" if($verbose); - exit($?) - } + System("$MV $ksk.* $kskdir"); } } @@ -2246,35 +2215,17 @@ foreach my $zsk (@zskcurlist) { - @args = ($MV, "$zsk.*", $zskdir); - System(@args); - if ($? != 0) - { - print STDERR "'@args' returned $?\n" if($verbose); - exit($?) - } + System("$MV $zsk.* $zskdir"); } foreach my $zsk (@zskpublist) { - @args = ($MV, "$zsk.*", $zskdir); - System(@args); - if ($? != 0) - { - print STDERR "'@args' returned $?\n" if($verbose); - exit($?) - } + System("$MV $zsk.* $zskdir"); } foreach my $zsk (@zsknewlist) { - @args = ($MV, "$zsk.*", $zskdir); - System(@args); - if ($? != 0) - { - print STDERR "'@args' returned $?\n" if($verbose); - exit($?) - } + System("$MV $zsk.* $zskdir"); } } @@ -2291,7 +2242,6 @@ my $file; # Zone's contents. my $flen; # Zone file's length. my $newserial; # Zone's new serial number. - my @args; vhigh_print("\n"); vprint("adding key includes to zone file\n"); @@ -2397,16 +2347,7 @@ # # Copy the zone data to a new file. # - if ($zonefile ne $zoneftmp) - { - @args = ($CP, $zonefile, $zoneftmp); - System(@args); - if ($? != 0) - { - print STDERR "'@args' returned $?\n" if($verbose); - exit($?); - } - } + System("$CP $zonefile $zoneftmp") if($zonefile ne $zoneftmp); open(ZF,"+< $zonefile"); @zonestat = stat($zonefile); } @@ -2417,16 +2358,7 @@ # # Copy the zone data to a new file. # - @args = ($CP, $zonefile, $zoneftmp); - if($zonefile ne $zoneftmp) - { - System(@args); - if ($? != 0) - { - print STDERR "'@args' returned $?\n" if($verbose); - exit($?); - } - } + System("$CP $zonefile $zoneftmp") if($zonefile ne $zoneftmp); # # Get the include-keys section. @@ -2461,7 +2393,6 @@ my $status; # Execution return code. my $zscmd; # Zone-signing command line. my $zcq = '-q'; # Quiet option for zone checker. - my @args; # # Get the most recent revoked keys if we're rolling KSKs or if @@ -2530,8 +2461,8 @@ # vprint("checking zone\n"); $zcq = '' if($verbose > $VERBOSE_LOW); - System("$zonecheck $zcopts $zcq $zone $szone"); - if($? != 0) + $status = System("$zonecheck $zcopts $zcq $zone $szone"); + if($status != 0) { print STDERR "problems with zone signing\n"; System("$zonecheck $zcopts $zone $szone"); @@ -2661,22 +2592,10 @@ { my $now = time(); my $newzftmp = "$zoneftmp.$now"; - @args = ($CP, $zoneftmp, $newzftmp); - System(@args); - if ($? != 0) - { - print STDERR "'@args' returned $?\n" if($verbose); - exit($?); - } + System("$CP $zoneftmp $newzftmp"); } - @args = ($RM, $zoneftmp); - System(@args); - if ($? != 0) - { - print STDERR "'@args' returned $?\n" if($verbose); - exit($?); - } + System("$RM $zoneftmp"); } return(0); joe(user)2101: ** Affects: dnssec-tools (Ubuntu) Importance: Undecided Status: New -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/1664277 Title: zonesigner (dnssec-tools) is broken To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/dnssec-tools/+bug/1664277/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs