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 rm -f $APTARCHIVE/dists
/unstable
/InRelease
12 rm -f $APTARCHIVE/dists
/unstable
/Release.gpg
18 cat > $APTARCHIVE/dists
/unstable
/main
/binary
-i386/Packages
<<EOF
21 Maintainer: Joe Sixpack <joe@example.org>
24 Filename: pool/evil_1.0_all.deb
26 Description: an autogenerated evil package
29 touch -d '+1hour' aptarchive
/dists
/unstable
/main
/binary
-i386/Packages
32 assert_update_is_refused_and_last_good_state_used
()
34 testequal
"E: The repository 'file: unstable Release.gpg' is no longer signed." aptget update
-qq
39 assert_repo_is_intact
()
41 testequal
"foo/unstable 2.0 all" apt list
-q
42 testsuccess aptget
install -y -s foo
43 testfailure aptget
install -y evil
44 testsuccess aptget
source foo
--print-uris
46 LISTDIR
=rootdir
/var
/lib
/apt
/lists
47 if ! ( ls $LISTDIR/*InRelease
>/dev
/null
2>&1 ||
48 ls $LISTDIR/*Release.gpg
>/dev
/null
2>&1 ); then
49 echo "Can not find InRelease/Release.gpg in $(ls $LISTDIR)"
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 # FIXME: is not what the server reported 4104 4106
90 testsuccess aptget update
#-o Debug::pkgAcquire::Worker=1
92 # simulate moving to a unsigned but otherwise valid repo
93 simulate_mitm_and_inject_evil_package
96 # and ensure we can update to it (with enough force)
97 testwarning aptget update
--allow-insecure-repositories \
98 -o Acquire
::AllowDowngradeToInsecureRepositories
=1
99 # but that the individual packages are still considered untrusted
100 testequal
"WARNING: The following packages cannot be authenticated!
102 E: There are problems and -y was used without --force-yes" 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 nowdays 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 testequal
"W: Failed to fetch file:${APTARCHIVE}/dists/unstable/InRelease Does not start with a cleartext signature
154 E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update
-qq
156 # ensure we keep the repo
157 testfileequal lists.before
"$(listcurrentlistsdirectory)"
158 assert_repo_is_intact
161 test_inrelease_to_invalid_inrelease
()
163 # setup archive with InRelease
164 setupaptarchive_with_lists_clean
165 testsuccess aptget update
166 listcurrentlistsdirectory
> lists.before
168 # now remove InRelease and subvert Release do no longer verify
169 sed -i 's/Codename.*/Codename: evil!'/ $APTARCHIVE/dists
/unstable
/InRelease
172 testequal
"W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: file: unstable InRelease: The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org>
174 W: Failed to fetch file:${APTARCHIVE}/dists/unstable/InRelease The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org>
176 W: Some index files failed to download. They have been ignored, or old ones used instead." aptget update
-qq
178 # ensure we keep the repo
179 testfailure
grep 'evil' rootdir
/var
/lib
/apt
/lists
/*InRelease
180 testfileequal lists.before
"$(listcurrentlistsdirectory)"
181 assert_repo_is_intact
184 test_release_gpg_to_invalid_release_release_gpg
()
186 # setup archive with InRelease
187 setupaptarchive_with_lists_clean
188 rm $APTARCHIVE/dists
/unstable
/InRelease
189 testsuccess aptget update
190 listcurrentlistsdirectory
> lists.before
192 # now subvert Release do no longer verify
193 echo "Some evil data" >> $APTARCHIVE/dists
/unstable
/Release
196 testequal
"W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: file: unstable Release.gpg: The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org>
198 W: Failed to fetch file:${APTARCHIVE}/dists/unstable/Release.gpg
200 W: Some index files failed to download. They have been ignored, or old ones used instead." aptget update
-qq
202 testfailure
grep 'evil' rootdir
/var
/lib
/apt
/lists
/*Release
203 testfileequal lists.before
"$(listcurrentlistsdirectory)"
204 assert_repo_is_intact
208 TESTDIR
=$(readlink -f $(dirname $0))
212 configarchitecture
"i386"
214 # a "normal" package with source and binary
215 buildsimplenativepackage
'foo' 'all' '2.0'
217 # setup the archive and ensure we have a single package that installs fine
219 APTARCHIVE
=$(readlink -f ./aptarchive)
220 assert_repo_is_intact
222 # test the various cases where a repo may go from signed->unsigned
223 msgmsg
"test_from_inrelease_to_unsigned"
224 test_from_inrelease_to_unsigned
226 msgmsg
"test_from_release_gpg_to_unsigned"
227 test_from_release_gpg_to_unsigned
229 # ensure we do not regress on CVE-2012-0214
230 msgmsg
"test_cve_2012_0214"
233 # ensure InRelase can not be subverted
234 msgmsg
"test_subvert_inrelease"
235 test_subvert_inrelease
237 # ensure we revert to last good state if InRelease does not verify
238 msgmsg
"test_inrelease_to_invalid_inrelease"
239 test_inrelease_to_invalid_inrelease
241 # ensure we revert to last good state if Release/Release.gpg does not verify
242 msgmsg
"test_release_gpg_to_invalid_release_release_gpg"
243 test_release_gpg_to_invalid_release_release_gpg
245 # ensure we can override the downgrade error
246 msgmsg
"test_from_inrelease_to_unsigned_with_override"
247 test_from_inrelease_to_unsigned_with_override