Commit cced26b6 authored by intrigeri's avatar intrigeri
Browse files

Upgrader: refresh the signing key before checking for available upgrades (refs: #15279)

parent 20ccb455
......@@ -7,7 +7,8 @@ Import_GnuPG_key ()
echo "- importing Tails' GnuPG signing key into tails-iuk's trusted keyring"
sudo -H -u tails-upgrade-frontend \
gpg --batch --import /usr/share/doc/tails/website/tails-signing.key
gpg --batch --import \
/usr/share/doc/tails/website/tails-signing-minimal.key
echo "- importing Tails help desk's GnuPG key into WhisperBack's keyring"
gpg --batch --no-default-keyring \
......
......@@ -20,6 +20,7 @@ use IPC::Run;
use Number::Format qw(:subs);
use Path::Tiny;
use String::Errf qw{errf};
use Tails::Download::HTTPS;
use Tails::RunningSystem;
use Tails::IUK::UpgradeDescriptionFile;
use Tails::IUK::Utils qw{space_available_in};
......@@ -225,6 +226,37 @@ method checked_upgrades_file () {
$self->upgrader_run_dir->child('checked_upgrades');
}
method refresh_signing_key () {
my $new_key_content = Tails::Download::HTTPS->new(
max_download_size => 128 * 2**10,
)->get_url(
$self->running_system->baseurl . '/tails-signing-minimal.key'
);
my ($stdout, $stderr, $exit_code);
my $success = 1;
IPC::Run::run ['gpg', '--import'],
'<', \$new_key_content, '>', \$stdout, '2>', \$stderr
or $success = 0;
$exit_code = $?;
$success or $self->fatal(
$self->encoding->decode(gettext(
q{<b>An error occured while updating the signing key.</b>\n\n}.
q{<b>This prevents determining whether an upgrade is available from our website.</b>\n\n}.
q{Check your network connection, and restart Tails to try upgrading again.\n\n}.
q{If the problem persists, go to file:///usr/share/doc/tails/website/doc/upgrade/error/check.en.html},
)),
title => $self->encoding->decode(gettext(
q{Error while updating the signing key}
)),
debugging_info => $self->encoding->decode(errf(
"exit code: %{exit_code}i\n\n".
"stdout:\n%{stdout}s\n\n".
"stderr:\n%{stderr}s",
{ exit_code => $exit_code, stdout => $stdout, stderr => $stderr }
)),
);
}
method get_upgrade_description () {
my @args;
for (qw{baseurl build_target os_release_file initial_install_os_release_file}) {
......@@ -299,6 +331,7 @@ method no_incremental_explanation (Str $no_incremental_reason) {
}
method run () {
$self->refresh_signing_key;
my ($upgrade_description_text) = $self->get_upgrade_description;
my $upgrade_description = Tails::IUK::UpgradeDescriptionFile->new_from_text(
$upgrade_description_text
......
......@@ -894,6 +894,29 @@ Given /^Tails is fooled to think a (.+) SquashFS delta is installed$/ do |versio
)
end
def upgrader_trusted_signing_subkeys
$vm.execute_successfully(
"sudo -u tails-upgrade-frontend gpg --batch --list-keys --with-colons '#{TAILS_SIGNING_KEY}'",
).stdout.split("\n")
.select { |line| /^sub:/.match(line) }
.map { |line| line[/^sub:.:\d+:\d+:(?<subkeyid>[A-F0-9]+):/, 'subkeyid'] }
end
Given /^the signing key used by the Upgrader is outdated$/ do
upgrader_trusted_signing_subkeys.each { |subkeyid|
$vm.execute_successfully(
"sudo -u tails-upgrade-frontend gpg --batch --yes --delete-keys '#{subkeyid}!'"
)
}
assert_equal(0, upgrader_trusted_signing_subkeys.length)
end
Given /^a current signing key is available on our website$/ do
# We already check this via features/keys.feature so let's not bother here
# ⇒ this step is only here to improve the Gherkin scenario.
true
end
Then /^(?:no|only the (.+)) SquashFS delta is installed$/ do |version|
expected_squashes = [default_squash]
expected_squashes << "#{version}.squashfs" if version
......
......@@ -154,3 +154,14 @@ Feature: Upgrading an old Tails USB installation
Then I am proposed to install an incremental upgrade to version 2.2~test
And I can successfully install the incremental upgrade to version 2.2~test
Then only the 2.2~test SquashFS delta is installed
@automatic_upgrade
Scenario: Upgrading a Tails whose signing key is outdated
Given I have started Tails without network from a USB drive with a persistent partition enabled and logged in
And Tails is fooled to think that version 2.0~test was initially installed
And the signing key used by the Upgrader is outdated
But a current signing key is available on our website
When the network is plugged
And Tor is ready
And all notifications have disappeared
Then I am proposed to install an incremental upgrade to version 2.2~test
......@@ -13,7 +13,7 @@ Requirements
To release Tails you'll need some packages installed:
* `tidy mktorrent transmission-cli`
* `hopenpgp-tools tidy mktorrent transmission-cli`
* aufs DKMS module for your running kernel.
* [[!debpts squashfs-tools]] 1:4.4-1+0.tails1
from our custom `iukbuilder-stretch` APT suite.
......@@ -408,6 +408,17 @@ matches the date of the future signature.
./build-website
git commit wiki/src/inc/ -m "Update version and date for ${VERSION:?}."
Signing key downloaded by the Upgrader
--------------------------------------
TMP_GNUPG_HOME=$(mktemp -d)
gpg --homedir "${TMP_GNUPG_HOME:?}" --import wiki/src/tails-signing.key && \
gpg --homedir "${TMP_GNUPG_HOME:?}" --export-options export-minimal \
--armor --export "${TAILS_SIGNATURE_KEY:?}" \
> wiki/src/tails-signing-minimal.key && \
git commit wiki/src/tails-signing-minimal.key \
-m "Update signing key used by the Upgrader"
Website translations
--------------------
......
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=TqDI
-----END PGP PUBLIC KEY BLOCK-----
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment