summaryrefslogtreecommitdiff
path: root/cmdline
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2017-08-01 15:22:09 +0200
committerJulian Andres Klode <jak@debian.org>2017-10-26 13:18:36 +0200
commitf29f7ce33d6570fca5a6d0160cac215da184de89 (patch)
tree0d6da66b917e3184a145b02ee96f39c6e3b30193 /cmdline
parentfb73af35d69d998a75eefc946a8452e56c4ff99c (diff)
ignore unsupported key formats in apt-key
gpg2 generates keyboxes by default and users end up putting either those or armored files into the trusted.gpg.d directory which apt tools neither expect nor can really work with without fortifying backward compatibility (at least under the ".gpg" extension). A (short) discussion about how to deal with keyboxes happened in https://lists.debian.org/deity/2017/07/msg00083.html As the last message in that thread is this changeset lets go ahead with it and see how it turns out. The idea is here simply that we check the first octal of a gpg file to have one of three accepted values. Testing on my machines has always produced just one of these, but running into those values on invalid files is reasonabily unlikely to not worry too much. Closes: #876508 (cherry picked from commit 012932793ba0ea9398a9acd80593bed8e77cfbfc)
Diffstat (limited to 'cmdline')
-rw-r--r--cmdline/apt-key.in32
1 files changed, 30 insertions, 2 deletions
diff --git a/cmdline/apt-key.in b/cmdline/apt-key.in
index 723af06ff..5bc5462d2 100644
--- a/cmdline/apt-key.in
+++ b/cmdline/apt-key.in
@@ -249,6 +249,34 @@ accessible_file_exists() {
return 1
}
+is_supported_keyring() {
+ # empty files are always supported
+ if ! test -s "$1"; then
+ return 0
+ fi
+ local FILEEXT="${1##*.}"
+ if [ "$FILEEXT" = 'gpg' ]; then
+ # 0x98, 0x99 and 0xC6 via octal as hex isn't supported by dashs printf
+ if printf '\231' | cmp --silent --bytes=1 - "$1"; then
+ true
+ elif printf '\230' | cmp --silent --bytes=1 - "$1"; then
+ true
+ elif printf '\306' | cmp --silent --bytes=1 - "$1"; then
+ true
+ else
+ apt_warn "The key(s) in the keyring $1 are ignored as the file has an unsupported filetype."
+ return 1
+ fi
+ elif [ "$FILEEXT" = 'asc' ]; then
+ true #dearmor_filename will deal with them
+ else
+ # most callers ignore unsupported extensions silently
+ apt_warn "The key(s) in the keyring $1 are ignored as the file has an unsupported filename extension."
+ return 1
+ fi
+ return 0
+}
+
foreach_keyring_do() {
local ACTION="$1"
shift
@@ -257,7 +285,7 @@ foreach_keyring_do() {
$ACTION "$TRUSTEDFILE" "$@"
else
# otherwise all known keyrings are up for inspection
- if accessible_file_exists "$TRUSTEDFILE"; then
+ if accessible_file_exists "$TRUSTEDFILE" && is_supported_keyring "$TRUSTEDFILE"; then
$ACTION "$TRUSTEDFILE" "$@"
fi
local TRUSTEDPARTS="/etc/apt/trusted.gpg.d"
@@ -266,7 +294,7 @@ foreach_keyring_do() {
TRUSTEDPARTS="$(readlink -f "$TRUSTEDPARTS")"
local TRUSTEDPARTSLIST="$(cd /; find "$TRUSTEDPARTS" -mindepth 1 -maxdepth 1 \( -name '*.gpg' -o -name '*.asc' \))"
for trusted in $(echo "$TRUSTEDPARTSLIST" | sort); do
- if accessible_file_exists "$trusted"; then
+ if accessible_file_exists "$trusted" && is_supported_keyring "$trusted"; then
$ACTION "$trusted" "$@"
fi
done