diff options
author | Chong Lu <Chong.Lu@windriver.com> | 2014-09-26 09:49:19 +0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-09-29 17:49:10 +0100 |
commit | 3dd692fcf2b0c11731b3f30abdf2b1878458a898 (patch) | |
tree | 5b0bb9632a200f53d99d96de67d056d50522d5c5 /meta/recipes-devtools | |
parent | a414b17e1d783ad68a2d0f7d5922967449c05797 (diff) | |
download | openembedded-core-3dd692fcf2b0c11731b3f30abdf2b1878458a898.tar.gz openembedded-core-3dd692fcf2b0c11731b3f30abdf2b1878458a898.tar.bz2 openembedded-core-3dd692fcf2b0c11731b3f30abdf2b1878458a898.zip |
apt: fix for CVE-2014-0478
APT before 1.0.4 does not properly validate source packages, which allows
man-in-the-middle attackers to download and install Trojan horse packages
by removing the Release signature.
http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-0478
Signed-off-by: Wenlin Kang <wenlin.kang@windriver.com>
Signed-off-by: Chong Lu <Chong.Lu@windriver.com>
Diffstat (limited to 'meta/recipes-devtools')
-rw-r--r-- | meta/recipes-devtools/apt/apt-0.9.9.4/apt-0.9.9.4-CVE-2014-0478.patch | 193 | ||||
-rw-r--r-- | meta/recipes-devtools/apt/apt.inc | 1 |
2 files changed, 194 insertions, 0 deletions
diff --git a/meta/recipes-devtools/apt/apt-0.9.9.4/apt-0.9.9.4-CVE-2014-0478.patch b/meta/recipes-devtools/apt/apt-0.9.9.4/apt-0.9.9.4-CVE-2014-0478.patch new file mode 100644 index 0000000000..79a6897572 --- /dev/null +++ b/meta/recipes-devtools/apt/apt-0.9.9.4/apt-0.9.9.4-CVE-2014-0478.patch @@ -0,0 +1,193 @@ +This patch comes from: +https://bugs.debian.org/cgi-bin/bugreport.cgi?msg=73;filename=apt_0.9.7.9%2Bdeb7u2.debdiff;att=1;bug=749795 + +Upstream-Status: Backport + +Signed-off-by: Wenlin Kang <wenlin.kang@windriver.com> +Signed-off-by: Chong Lu <Chong.Lu@windriver.com> + +diff -uarN apt-0.9.9.4-org/cmdline/apt-get.cc apt-0.9.9.4/cmdline/apt-get.cc +--- apt-0.9.9.4-org/cmdline/apt-get.cc 2014-08-29 15:37:42.587156134 +0800 ++++ apt-0.9.9.4/cmdline/apt-get.cc 2014-08-29 15:51:16.672334086 +0800 +@@ -1046,25 +1046,8 @@ + return true; + } + /*}}}*/ +-// CheckAuth - check if each download comes form a trusted source /*{{{*/ +-// --------------------------------------------------------------------- +-/* */ +-static bool CheckAuth(pkgAcquire& Fetcher) ++static bool AuthPrompt(std::string UntrustedList, bool const PromptUser) + { +- string UntrustedList; +- for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); I < Fetcher.ItemsEnd(); ++I) +- { +- if (!(*I)->IsTrusted()) +- { +- UntrustedList += string((*I)->ShortDesc()) + " "; +- } +- } +- +- if (UntrustedList == "") +- { +- return true; +- } +- + ShowList(c2out,_("WARNING: The following packages cannot be authenticated!"),UntrustedList,""); + + if (_config->FindB("APT::Get::AllowUnauthenticated",false) == true) +@@ -1073,6 +1056,9 @@ + return true; + } + ++ if (PromptUser == false) ++ return _error->Error(_("Some packages could not be authenticated")); ++ + if (_config->FindI("quiet",0) < 2 + && _config->FindB("APT::Get::Assume-Yes",false) == false) + { +@@ -1090,6 +1076,28 @@ + return _error->Error(_("There are problems and -y was used without --force-yes")); + } + /*}}}*/ ++// CheckAuth - check if each download comes form a trusted source /*{{{*/ ++// --------------------------------------------------------------------- ++/* */ ++static bool CheckAuth(pkgAcquire& Fetcher, bool PromptUser=true) ++{ ++ string UntrustedList; ++ for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); I < Fetcher.ItemsEnd(); ++I) ++ { ++ if (!(*I)->IsTrusted()) ++ { ++ UntrustedList += string((*I)->ShortDesc()) + " "; ++ } ++ } ++ ++ if (UntrustedList == "") ++ { ++ return true; ++ } ++ ++ return AuthPrompt(UntrustedList, PromptUser); ++} ++ + // InstallPackages - Actually download and install the packages /*{{{*/ + // --------------------------------------------------------------------- + /* This displays the informative messages describing what is going to +@@ -2482,6 +2490,7 @@ + + // Load the requestd sources into the fetcher + unsigned J = 0; ++ std::string UntrustedList; + for (const char **I = CmdL.FileList + 1; *I != 0; I++, J++) + { + string Src; +@@ -2491,7 +2500,10 @@ + delete[] Dsc; + return _error->Error(_("Unable to find a source package for %s"),Src.c_str()); + } +- ++ ++ if (Last->Index().IsTrusted() == false) ++ UntrustedList += Src + " "; ++ + string srec = Last->AsStr(); + string::size_type pos = srec.find("\nVcs-"); + while (pos != string::npos) +@@ -2575,7 +2587,11 @@ + Last->Index().SourceInfo(*Last,*I),Src); + } + } +- ++ ++ // check authentication status of the source as well ++ if (UntrustedList != "" && !AuthPrompt(UntrustedList, false)) ++ return false; ++ + // Display statistics + unsigned long long FetchBytes = Fetcher.FetchNeeded(); + unsigned long long FetchPBytes = Fetcher.PartialPresent(); +diff -uarN apt-0.9.9.4-org/test/integration/framework apt-0.9.9.4/test/integration/framework +--- apt-0.9.9.4-org/test/integration/framework 2014-08-29 15:37:42.623156154 +0800 ++++ apt-0.9.9.4/test/integration/framework 2014-08-29 15:55:23.592197940 +0800 +@@ -151,7 +151,7 @@ + mkdir rootdir aptarchive keys + cd rootdir + mkdir -p etc/apt/apt.conf.d etc/apt/sources.list.d etc/apt/trusted.gpg.d etc/apt/preferences.d +- mkdir -p var/cache var/lib var/log ++ mkdir -p var/cache var/lib var/log tmp + mkdir -p var/lib/dpkg/info var/lib/dpkg/updates var/lib/dpkg/triggers + touch var/lib/dpkg/available + mkdir -p usr/lib/apt +@@ -910,3 +910,35 @@ + local IGNORE + read IGNORE + } ++ ++testsuccess() { ++ if [ "$1" = '--nomsg' ]; then ++ shift ++ else ++ msgtest 'Test for successful execution of' "$*" ++ fi ++ local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output" ++ if $@ >${OUTPUT} 2>&1; then ++ msgpass ++ else ++ echo >&2 ++ cat >&2 $OUTPUT ++ msgfail ++ fi ++} ++ ++testfailure() { ++ if [ "$1" = '--nomsg' ]; then ++ shift ++ else ++ msgtest 'Test for failure in execution of' "$*" ++ fi ++ local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testfailure.output" ++ if $@ >${OUTPUT} 2>&1; then ++ echo >&2 ++ cat >&2 $OUTPUT ++ msgfail ++ else ++ msgpass ++ fi ++} +diff -uarN apt-0.9.9.4-org/test/integration/test-apt-get-source-authenticated apt-0.9.9.4/test/integration/test-apt-get-source-authenticated +--- apt-0.9.9.4-org/test/integration/test-apt-get-source-authenticated 1970-01-01 08:00:00.000000000 +0800 ++++ apt-0.9.9.4/test/integration/test-apt-get-source-authenticated 2014-08-29 15:58:06.137156796 +0800 +@@ -0,0 +1,31 @@ ++#!/bin/sh ++# ++# Regression test for debian bug #749795. Ensure that we fail with ++# a error if apt-get source foo will download a source that comes ++# from a unauthenticated repository ++# ++set -e ++ ++TESTDIR=$(readlink -f $(dirname $0)) ++. $TESTDIR/framework ++ ++setupenvironment ++configarchitecture "i386" ++ ++# a "normal" package with source and binary ++buildsimplenativepackage 'foo' 'all' '2.0' ++ ++setupaptarchive --no-update ++ ++APTARCHIVE=$(readlink -f ./aptarchive) ++rm -f $APTARCHIVE/dists/unstable/*Release* ++ ++# update without authenticated InRelease file ++testsuccess aptget update ++ ++# this all should fail ++testfailure aptget install -y foo ++testfailure aptget source foo ++ ++# allow overriding the warning ++testsuccess aptget source --allow-unauthenticated foo diff --git a/meta/recipes-devtools/apt/apt.inc b/meta/recipes-devtools/apt/apt.inc index b528c00fd8..378021a327 100644 --- a/meta/recipes-devtools/apt/apt.inc +++ b/meta/recipes-devtools/apt/apt.inc @@ -11,6 +11,7 @@ SRC_URI = "${DEBIAN_MIRROR}/main/a/apt/apt_${PV}.tar.gz \ file://truncate-filename.patch \ file://nodoc.patch \ file://disable-configure-in-makefile.patch \ + file://apt-0.9.9.4-CVE-2014-0478.patch \ " inherit autotools gettext |