From 4eea29a54a0d632f41b62568681777588a449d09 Mon Sep 17 00:00:00 2001 From: Guillem Jover Date: Tue, 17 Jun 2014 04:25:51 -0400 Subject: dpkg: Security Advisory - CVE-2014-0471 v2 changes: * update format for commit log * add Upstream-Status for patch commit a82651188476841d190c58693f95827d61959b51 upstream Dkpkg::Source::Patch: Correctly parse C-style diff filenames We need to strip the surrounding quotes, and unescape any escape sequence, so that we check the same files that the patch program will be using, otherwise a malicious package could overpass those checks, and perform directory traversal attacks on source package unpacking. Fixes: CVE-2014-0471 Reported-by: Jakub Wilk [drop the text for debian/changelog,because it's not suitable for the veriosn] (From OE-Core rev: 81880b34a8261e824c5acafaa4cb321908e554a0) Signed-off-by: Wenlin Kang Signed-off-by: Wenzong Fan Signed-off-by: Richard Purdie --- .../dpkg/dpkg/dpkg-1.17.4-CVE-2014-0471.patch | 97 ++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 meta/recipes-devtools/dpkg/dpkg/dpkg-1.17.4-CVE-2014-0471.patch (limited to 'meta/recipes-devtools/dpkg/dpkg') diff --git a/meta/recipes-devtools/dpkg/dpkg/dpkg-1.17.4-CVE-2014-0471.patch b/meta/recipes-devtools/dpkg/dpkg/dpkg-1.17.4-CVE-2014-0471.patch new file mode 100644 index 0000000..195d309 --- /dev/null +++ b/meta/recipes-devtools/dpkg/dpkg/dpkg-1.17.4-CVE-2014-0471.patch @@ -0,0 +1,97 @@ +dpkg: Security Advisory - CVE-2014-0471 + +commit a82651188476841d190c58693f95827d61959b51 upstream + +Directory traversal vulnerability in the unpacking functionality in +dpkg before 1.15.9, 1.16.x before 1.16.13, and 1.17.x before 1.17.8 +allows remote attackers to write arbitrary files via a crafted source +package, related to "C-style filename quoting." + +Upstream-Status: Backport + +Signed-off-by: Wenlin Kang +Signed-off-by: Wenzong Fan +=================================================== +diff -uarN dpkg-1.17.1-org/scripts/Dpkg/Source/Patch.pm dpkg-1.17.1/scripts/Dpkg/Source/Patch.pm +--- dpkg-1.17.1-org/scripts/Dpkg/Source/Patch.pm 2014-06-05 15:24:07.422446284 +0800 ++++ dpkg-1.17.1/scripts/Dpkg/Source/Patch.pm 2014-06-05 15:41:37.746446314 +0800 +@@ -324,14 +324,53 @@ + return $line; + } + +-# Strip timestamp +-sub _strip_ts { +- my $header = shift; +- +- # Tab is the official separator, it's always used when +- # filename contain spaces. Try it first, otherwise strip on space +- # if there's no tab +- $header =~ s/\s.*// unless ($header =~ s/\t.*//); ++my %ESCAPE = (( ++ 'a' => "\a", ++ 'b' => "\b", ++ 'f' => "\f", ++ 'n' => "\n", ++ 'r' => "\r", ++ 't' => "\t", ++ 'v' => "\cK", ++ '\\' => '\\', ++ '"' => '"', ++), ( ++ map { sprintf('%03o', $_) => chr($_) } (0..255) ++)); ++ ++sub _unescape { ++ my ($diff, $str) = @_; ++ ++ if (exists $ESCAPE{$str}) { ++ return $ESCAPE{$str}; ++ } else { ++ error(_g('diff %s patches file with unknown escape sequence \\%s'), ++ $diff, $str); ++ } ++} ++ ++# Fetch the header filename ignoring the optional timestamp ++sub _fetch_filename { ++ my ($diff, $header) = @_; ++ ++ # Strip any leading spaces. ++ $header =~ s/^\s+//; ++ ++ # Is it a C-style string? ++ if ($header =~ m/^"/) { ++ $header =~ m/^"((?:[^\\"]|\\.)*)"/; ++ error(_g('diff %s patches file with unbalanced quote'), $diff) ++ unless defined $1; ++ ++ $header = $1; ++ $header =~ s/\\([0-3][0-7]{2}|.)/_unescape($diff, $1)/eg; ++ } else { ++ # Tab is the official separator, it's always used when ++ # filename contain spaces. Try it first, otherwise strip on space ++ # if there's no tab ++ $header =~ s/\s.*// unless $header =~ s/\t.*//; ++ } ++ + return $header; + } + +@@ -400,7 +439,7 @@ + unless(s/^--- //) { + error(_g("expected ^--- in line %d of diff `%s'"), $., $diff); + } +- $path{old} = $_ = _strip_ts($_); ++ $path{old} = $_ = _fetch_filename($diff, $_); + $fn{old} = $_ if $_ ne '/dev/null' and s{^[^/]*/+}{$destdir/}; + if (/\.dpkg-orig$/) { + error(_g("diff `%s' patches file with name ending .dpkg-orig"), $diff); +@@ -412,7 +451,7 @@ + unless (s/^\+\+\+ //) { + error(_g("line after --- isn't as expected in diff `%s' (line %d)"), $diff, $.); + } +- $path{new} = $_ = _strip_ts($_); ++ $path{new} = $_ = _fetch_filename($diff, $_); + $fn{new} = $_ if $_ ne '/dev/null' and s{^[^/]*/+}{$destdir/}; + + unless (defined $fn{old} or defined $fn{new}) { -- cgit v1.1