3 # ensure we never fallback from a signed to a unsigned repo 
   5 # hash checks are done in  
   9 simulate_mitm_and_inject_evil_package
() 
  11     redatereleasefiles 
'+1 hour' 
  12     rm -f "$APTARCHIVE/dists/unstable/InRelease" 
  13     rm -f "$APTARCHIVE/dists/unstable/Release.gpg" 
  19     cat > "$APTARCHIVE/dists/unstable/main/binary-i386/Packages" <<EOF 
  22 Maintainer: Joe Sixpack <joe@example.org> 
  25 Filename: pool/evil_1.0_all.deb 
  27 Description: an autogenerated evil package 
  30     touch -d '+1hour' aptarchive
/dists
/unstable
/main
/binary
-i386/Packages
 
  31     compressfile aptarchive
/dists
/unstable
/main
/binary
-i386/Packages
 
  34 assert_update_is_refused_and_last_good_state_used
() 
  36     testfailuremsg 
"E: The repository 'file:${APTARCHIVE} unstable Release' is no longer signed. 
  37 N: Updating such a repository securily is impossible and therefore disabled by default. 
  38 N: See apt-secure(8) manpage for repository creation and user configuration details." aptget update
 
  43 assert_repo_is_intact
() 
  45     testsuccessequal 
"foo/unstable 2.0 all" apt list 
-qq 
  46     testsuccess aptget 
install -y -s foo
 
  47     testfailure aptget 
install -y evil
 
  48     testsuccess aptget 
source foo 
--print-uris 
  50     LISTDIR
=rootdir
/var
/lib
/apt
/lists
 
  51     testempty 
find "$LISTDIR" -name 'InRelease' -o -name 'Release.gpg' 
  54 setupaptarchive_with_lists_clean
() 
  56     setupaptarchive 
--no-update 
  57     rm -rf rootdir
/var
/lib
/apt
/lists
 
  60 test_from_inrelease_to_unsigned
() 
  62     # setup archive with InRelease file 
  63     setupaptarchive_with_lists_clean
 
  64     testsuccess aptget update
 
  65     listcurrentlistsdirectory 
> lists.before
 
  67     simulate_mitm_and_inject_evil_package
 
  68     assert_update_is_refused_and_last_good_state_used
 
  69     testfileequal lists.before 
"$(listcurrentlistsdirectory)" 
  72 test_from_release_gpg_to_unsigned
() 
  74     # setup archive with Release/Release.gpg (but no InRelease) 
  75     setupaptarchive_with_lists_clean
 
  76     rm "$APTARCHIVE/dists/unstable/InRelease" 
  77     testsuccess aptget update
 
  78     listcurrentlistsdirectory 
> lists.before
 
  80     simulate_mitm_and_inject_evil_package
 
  81     assert_update_is_refused_and_last_good_state_used
 
  82     testfileequal lists.before 
"$(listcurrentlistsdirectory)" 
  85 test_from_inrelease_to_unsigned_with_override
() 
  87     # setup archive with InRelease file 
  88     setupaptarchive_with_lists_clean
 
  89     testsuccess aptget update
 
  91     # simulate moving to a unsigned but otherwise valid repo 
  92     simulate_mitm_and_inject_evil_package
 
  93     generatereleasefiles 
'+2 hours' 
  94     find "$APTARCHIVE" -name '*Packages*' -exec touch -d '+2 hours' {} \
; 
  96     # and ensure we can update to it (with enough force)  
  97     testwarning aptget update 
--allow-insecure-repositories \
 
  98         -o Acquire
::AllowDowngradeToInsecureRepositories
=1 -o Debug
::pkgAcquire
::Worker
=1 -o Debug
::pkgAcquire
::Auth
=1 
  99     # but that the individual packages are still considered untrusted 
 100     testfailureequal 
"WARNING: The following packages cannot be authenticated! 
 102 E: There were unauthenticated packages and -y was used without --allow-unauthenticated" aptget 
install -qq -y evil
 
 107     # see https://bugs.launchpad.net/ubuntu/+source/apt/+bug/947108 
 109     # it was possible to MITM the download so that InRelease/Release.gpg 
 110     # are not delivered (404) and a altered Release file was send 
 112     # apt left the old InRelease file in /var/lib/apt/lists and downloaded 
 113     # the unauthenticated Release file too giving the false impression that 
 114     # Release was authenticated 
 116     # Note that this is pretty much impossible nowadays because: 
 117     # a) InRelease is left as is, not split to InRelease/Release as it was  
 119     # b) we refuse to go from signed->unsigned 
 121     # Still worth having a regression test the simulates the condition 
 123     # setup archive with InRelease 
 124     setupaptarchive_with_lists_clean
 
 125     testsuccess aptget update
 
 126     listcurrentlistsdirectory 
> lists.before
 
 128     # do what CVE-2012-0214 did 
 129     rm "$APTARCHIVE/dists/unstable/InRelease" 
 130     rm "$APTARCHIVE/dists/unstable/Release.gpg" 
 132     # build valid Release file 
 133     aptftparchive 
-qq release .
/aptarchive 
> aptarchive
/dists
/unstable
/Release 
 
 135     assert_update_is_refused_and_last_good_state_used
 
 136     testfileequal lists.before 
"$(listcurrentlistsdirectory)" 
 138     # ensure there is no _Release file downloaded 
 139     testfailure 
ls rootdir
/var
/lib
/apt
/lists
/*_Release
 
 142 test_subvert_inrelease
() 
 144     # setup archive with InRelease 
 145     setupaptarchive_with_lists_clean
 
 146     testsuccess aptget update
 
 147     listcurrentlistsdirectory 
> lists.before
 
 149     # replace InRelease with something else 
 150     mv "$APTARCHIVE/dists/unstable/Release" "$APTARCHIVE/dists/unstable/InRelease" 
 152     testfailuremsg 
"W: Failed to fetch file:${APTARCHIVE}/dists/unstable/InRelease  Clearsigned file isn't valid, got 'NOSPLIT' (does the network require authentication?) 
 153 E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update
 
 155     # ensure we keep the repo 
 156     testfileequal lists.before 
"$(listcurrentlistsdirectory)" 
 157     assert_repo_is_intact
 
 160 test_inrelease_to_invalid_inrelease
() 
 162     # setup archive with InRelease 
 163     setupaptarchive_with_lists_clean
 
 164     testsuccess aptget update
 
 165     listcurrentlistsdirectory 
> lists.before
 
 167     # now remove InRelease and subvert Release do no longer verify 
 168     sed -i 's/^Codename:.*/Codename: evil!/' "$APTARCHIVE/dists/unstable/InRelease" 
 171     testwarningequal 
"W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: file:${APTARCHIVE} unstable InRelease: The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> 
 172 W: Failed to fetch file:${APTARCHIVE}/dists/unstable/InRelease  The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> 
 173 W: Some index files failed to download. They have been ignored, or old ones used instead." aptget update 
-qq 
 175     # ensure we keep the repo 
 176     testfailure 
grep 'evil' rootdir
/var
/lib
/apt
/lists
/*InRelease
 
 177     testfileequal lists.before 
"$(listcurrentlistsdirectory)" 
 178     assert_repo_is_intact
 
 181 test_release_gpg_to_invalid_release_release_gpg
() 
 183     # setup archive with InRelease 
 184     setupaptarchive_with_lists_clean
 
 185     rm "$APTARCHIVE/dists/unstable/InRelease" 
 186     testsuccess aptget update
 
 187     listcurrentlistsdirectory 
> lists.before
 
 189     # now subvert Release do no longer verify 
 190     echo "Some evil data" >> "$APTARCHIVE/dists/unstable/Release" 
 193     testwarningequal 
"W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: file:${APTARCHIVE} unstable Release: The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> 
 194 W: Failed to fetch file:${APTARCHIVE}/dists/unstable/Release.gpg  The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org> 
 195 W: Some index files failed to download. They have been ignored, or old ones used instead." aptget update 
-qq 
 197     testfailure 
grep 'evil' rootdir
/var
/lib
/apt
/lists
/*Release
 
 198     testfileequal lists.before 
"$(listcurrentlistsdirectory)" 
 199     assert_repo_is_intact
 
 203 TESTDIR
=$(readlink -f $(dirname $0)) 
 207 configarchitecture 
"i386" 
 209 # a "normal" package with source and binary 
 210 buildsimplenativepackage 
'foo' 'all' '2.0' 
 212 # setup the archive and ensure we have a single package that installs fine 
 214 APTARCHIVE
="$(readlink -f ./aptarchive)" 
 215 assert_repo_is_intact
 
 217 # test the various cases where a repo may go from signed->unsigned 
 218 msgmsg 
"test_from_inrelease_to_unsigned" 
 219 test_from_inrelease_to_unsigned
 
 221 msgmsg 
"test_from_release_gpg_to_unsigned" 
 222 test_from_release_gpg_to_unsigned
 
 224 # ensure we do not regress on CVE-2012-0214 
 225 msgmsg 
"test_cve_2012_0214" 
 228 # ensure InRelase can not be subverted 
 229 msgmsg 
"test_subvert_inrelease" 
 230 test_subvert_inrelease
 
 232 # ensure we revert to last good state if InRelease does not verify 
 233 msgmsg 
"test_inrelease_to_invalid_inrelease" 
 234 test_inrelease_to_invalid_inrelease
 
 236 # ensure we revert to last good state if Release/Release.gpg does not verify 
 237 msgmsg 
"test_release_gpg_to_invalid_release_release_gpg" 
 238 test_release_gpg_to_invalid_release_release_gpg
 
 240 # ensure we can override the downgrade error 
 241 msgmsg 
"test_from_inrelease_to_unsigned_with_override" 
 242 test_from_inrelease_to_unsigned_with_override