Package: dpkg
Version: 1.13.25
Severity: wishlist
Tags: patch
This is an incomplete patch for implementing a --verify option. I'd like
to receive feedback before completing it, to make sure you're comfortable
with this approach.
The problem I find is, that there's no way to actually verify signatures
with the current scheme. Given a .deb, dpkg will only verify the signature
(and fail when it is invalid) if a signature is found. So you can defeat
this security scheme by simply feeding a .deb without any signature, and
dpkg will happily process it.
My proposal is that "--verify" forces dpkg to reject the deb unless a
signature is found (and is valid).
The only complication was making this coexist with current behaviour
(checking for signature when one is found, even if it wasn't requested,
etc). I think the attached patch archieves this. Please let me know if
it looks good so I can complete it and test it properly.
Thanks
-- System Information:
Debian Release: 4.0
APT prefers stable
APT policy: (500, 'stable')
Architecture: amd64 (x86_64)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.18-6-amd64
Locale: LANG=ca_AD.UTF-8, LC_CTYPE=ca_AD.UTF-8 (charmap=UTF-8)
Versions of packages dpkg depends on:
ii coreutils 5.97-5.3 The GNU core utilities
ii libc6 2.3.6.ds1-13etch5 GNU C Library: Shared libraries
dpkg recommends no packages.
-- no debconf information
--- ../dpkg-1.14.18.old/src/processarc.c 2008-04-09 08:35:17.000000000 +0200
+++ src/processarc.c 2008-04-27 12:38:05.000000000 +0200
@@ -136,8 +136,12 @@
}
}
+{
+ int sig_was_checked = 0, sig_is_good = 0;
+
/* Verify the package. */
if (!f_nodebsig && (stat(DEBSIGVERIFY, &stab)==0)) {
+ sig_was_checked = 1;
printf(_("Authenticating %s ...\n"), filename);
fflush(stdout);
c1 = m_fork();
@@ -148,16 +152,22 @@
int status;
waitpid(c1, &status, 0);
if (!(WIFEXITED(status) && WEXITSTATUS(status) == 0)) {
- if (! fc_badverify) {
- ohshit(_("Verification on package %s failed!"), filename);
- } else {
- fprintf(stderr, _("Verification on package %s failed,\nbut installing anyway as you request.\n"), filename);
- }
+ printf(_("failed\n"));
} else {
+ sig_is_good = 1;
printf(_("passed\n"));
}
}
}
+
+ if (! sig_is_good) {
+ if (f_verify || (sig_was_checked && ! fc_badverify)) {
+ ohshit(_("Verification on package %s failed!"), filename);
+ } else if (sig_was_checked) {
+ fprintf(stderr, _("Verification on package %s failed,\nbut installing anyway as you request.\n"), filename);
+ }
+ }
+}
if (f_noact) {