Your message dated Sat, 10 Nov 2018 10:42:56 +0000
with message-id <1541846576.3542.38.ca...@adam-barratt.org.uk>
and subject line Closing bugs for updates included in 9.6
has caused the Debian Bug report #907124,
regarding stretch-pu: package dropbear/2016.74-5
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact ow...@bugs.debian.org
immediately.)


-- 
907124: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=907124
Debian Bug Tracking System
Contact ow...@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
Tags: stretch
User: release.debian....@packages.debian.org
Usertags: pu

Hi there,

CVE-2018-15599 was recently published for dropbear:

    The recv_msg_userauth_request function in svr-auth.c in Dropbear
    through 2018.76 is prone to a user enumeration vulnerability because
    username validity affects how fields in SSH_MSG_USERAUTH messages
    are handled, a similar issue to CVE-2018-15473 in an unrelated
    codebase.

However the Security Team didn't issue a DSA [0], and suggested [1] to
instead fix that via stretch-pu.  I enclosed a debdiff against
dropbear_2016.74-5.dsc.

The patch is cherry-picked from upstream changeset 1616:5d2d1021ca00:
https://secure.ucc.asn.au/hg/dropbear/rev/5d2d1021ca00 .  I did check
that pubkey and password authentication still work :-)  (We're building
without PAM support, so patching svr-authpam.c isn't needed, but I
guess it's better to stick to the upstream patch.)

-- 
Guilhem.

[0] https://security-tracker.debian.org/tracker/CVE-2018-15599
[1] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=906890
diff -Nru dropbear-2016.74/debian/changelog dropbear-2016.74/debian/changelog
--- dropbear-2016.74/debian/changelog   2017-05-19 23:41:21.000000000 +0200
+++ dropbear-2016.74/debian/changelog   2018-08-24 02:08:38.000000000 +0200
@@ -1,3 +1,13 @@
+dropbear (2016.74-5+deb9u1) stable; urgency=medium
+
+  * Backport security fix for CVE-2018-15599: The recv_msg_userauth_request
+    function in svr-auth.c in Dropbear through 2018.76 is prone to a user
+    enumeration vulnerability because username validity affects how fields in
+    SSH_MSG_USERAUTH messages are handled.  (Closes: #906890.)
+    Adapted from https://secure.ucc.asn.au/hg/dropbear/rev/5d2d1021ca00 .
+
+ -- Guilhem Moulin <guil...@debian.org>  Fri, 24 Aug 2018 02:08:38 +0200
+
 dropbear (2016.74-5) unstable; urgency=high
 
   * Backport security fixes from 2017.75 (closes: #862970):
diff -Nru dropbear-2016.74/debian/patches/CVE-2018-15599.patch 
dropbear-2016.74/debian/patches/CVE-2018-15599.patch
--- dropbear-2016.74/debian/patches/CVE-2018-15599.patch        1970-01-01 
01:00:00.000000000 +0100
+++ dropbear-2016.74/debian/patches/CVE-2018-15599.patch        2018-08-24 
02:08:38.000000000 +0200
@@ -0,0 +1,222 @@
+commit 52adbb34c32d3e2e1bcdb941e20a6f81138b8248
+Author: Matt Johnston <m...@ucc.asn.au>
+Date:   Thu Aug 23 23:43:12 2018 +0800
+
+    Wait to fail invalid usernames
+
+---
+ auth.h           |    6 +++---
+ svr-auth.c       |   19 +++++--------------
+ svr-authpam.c    |   26 ++++++++++++++++++++++----
+ svr-authpasswd.c |   27 ++++++++++++++-------------
+ svr-authpubkey.c |   11 ++++++++++-
+ 5 files changed, 54 insertions(+), 35 deletions(-)
+
+--- a/auth.h
++++ b/auth.h
+@@ -37,9 +37,9 @@ void recv_msg_userauth_request(void);
+ void send_msg_userauth_failure(int partial, int incrfail);
+ void send_msg_userauth_success(void);
+ void send_msg_userauth_banner(buffer *msg);
+-void svr_auth_password(void);
+-void svr_auth_pubkey(void);
+-void svr_auth_pam(void);
++void svr_auth_password(int valid_user);
++void svr_auth_pubkey(int valid_user);
++void svr_auth_pam(int valid_user);
+ 
+ #ifdef ENABLE_SVR_PUBKEY_OPTIONS
+ int svr_pubkey_allows_agentfwd(void);
+--- a/svr-auth.c
++++ b/svr-auth.c
+@@ -176,10 +176,8 @@ void recv_msg_userauth_request() {
+               if (methodlen == AUTH_METHOD_PASSWORD_LEN &&
+                               strncmp(methodname, AUTH_METHOD_PASSWORD,
+                                       AUTH_METHOD_PASSWORD_LEN) == 0) {
+-                      if (valid_user) {
+-                              svr_auth_password();
+-                              goto out;
+-                      }
++                      svr_auth_password(valid_user);
++                      goto out;
+               }
+       }
+ #endif
+@@ -191,10 +189,8 @@ void recv_msg_userauth_request() {
+               if (methodlen == AUTH_METHOD_PASSWORD_LEN &&
+                               strncmp(methodname, AUTH_METHOD_PASSWORD,
+                                       AUTH_METHOD_PASSWORD_LEN) == 0) {
+-                      if (valid_user) {
+-                              svr_auth_pam();
+-                              goto out;
+-                      }
++                      svr_auth_pam(valid_user);
++                      goto out;
+               }
+       }
+ #endif
+@@ -204,12 +200,7 @@ void recv_msg_userauth_request() {
+       if (methodlen == AUTH_METHOD_PUBKEY_LEN &&
+                       strncmp(methodname, AUTH_METHOD_PUBKEY,
+                               AUTH_METHOD_PUBKEY_LEN) == 0) {
+-              if (valid_user) {
+-                      svr_auth_pubkey();
+-              } else {
+-                      /* pubkey has no failure delay */
+-                      send_msg_userauth_failure(0, 0);
+-              }
++              svr_auth_pubkey(valid_user);
+               goto out;
+       }
+ #endif
+--- a/svr-authpam.c
++++ b/svr-authpam.c
+@@ -178,13 +178,14 @@ pamConvFunc(int num_msg,
+  * Keyboard interactive would be a lot nicer, but since PAM is synchronous, it
+  * gets very messy trying to send the interactive challenges, and read the
+  * interactive responses, over the network. */
+-void svr_auth_pam() {
++void svr_auth_pam(int valid_user) {
+ 
+       struct UserDataS userData = {NULL, NULL};
+       struct pam_conv pamConv = {
+               pamConvFunc,
+               &userData /* submitted to pamvConvFunc as appdata_ptr */ 
+       };
++      const char* printable_user = NULL;
+ 
+       pam_handle_t* pamHandlep = NULL;
+ 
+@@ -204,12 +205,23 @@ void svr_auth_pam() {
+ 
+       password = buf_getstring(ses.payload, &passwordlen);
+ 
++      /* We run the PAM conversation regardless of whether the username is 
valid
++      in case the conversation function has an inherent delay.
++      Use ses.authstate.username rather than ses.authstate.pw_name.
++      After PAM succeeds we then check the valid_user flag too */
++
+       /* used to pass data to the PAM conversation function - don't bother 
with
+        * strdup() etc since these are touched only by our own conversation
+        * function (above) which takes care of it */
+-      userData.user = ses.authstate.pw_name;
++      userData.user = ses.authstate.username;
+       userData.passwd = password;
+ 
++      if (ses.authstate.pw_name) {
++              printable_user = ses.authstate.pw_name;
++      } else {
++              printable_user = "<invalid username>";
++      }
++
+       /* Init pam */
+       if ((rc = pam_start("sshd", NULL, &pamConv, &pamHandlep)) != 
PAM_SUCCESS) {
+               dropbear_log(LOG_WARNING, "pam_start() failed, rc=%d, %s", 
+@@ -236,7 +248,7 @@ void svr_auth_pam() {
+                               rc, pam_strerror(pamHandlep, rc));
+               dropbear_log(LOG_WARNING,
+                               "Bad PAM password attempt for '%s' from %s",
+-                              ses.authstate.pw_name,
++                              printable_user,
+                               svr_ses.addrstring);
+               send_msg_userauth_failure(0, 1);
+               goto cleanup;
+@@ -247,12 +259,18 @@ void svr_auth_pam() {
+                               rc, pam_strerror(pamHandlep, rc));
+               dropbear_log(LOG_WARNING,
+                               "Bad PAM password attempt for '%s' from %s",
+-                              ses.authstate.pw_name,
++                              printable_user,
+                               svr_ses.addrstring);
+               send_msg_userauth_failure(0, 1);
+               goto cleanup;
+       }
+ 
++      if (!valid_user) {
++              /* PAM auth succeeded but the username isn't allowed in for 
another reason
++              (checkusername() failed) */
++              send_msg_userauth_failure(0, 1);
++      }
++
+       /* successful authentication */
+       dropbear_log(LOG_NOTICE, "PAM password auth succeeded for '%s' from %s",
+                       ses.authstate.pw_name,
+--- a/svr-authpasswd.c
++++ b/svr-authpasswd.c
+@@ -48,22 +48,14 @@ static int constant_time_strcmp(const ch
+ 
+ /* Process a password auth request, sending success or failure messages as
+  * appropriate */
+-void svr_auth_password() {
++void svr_auth_password(int valid_user) {
+       
+       char * passwdcrypt = NULL; /* the crypt from /etc/passwd or /etc/shadow 
*/
+       char * testcrypt = NULL; /* crypt generated from the user's password 
sent */
+-      char * password;
++      char * password = NULL;
+       unsigned int passwordlen;
+-
+       unsigned int changepw;
+ 
+-      passwdcrypt = ses.authstate.pw_passwd;
+-
+-#ifdef DEBUG_HACKCRYPT
+-      /* debugging crypt for non-root testing with shadows */
+-      passwdcrypt = DEBUG_HACKCRYPT;
+-#endif
+-
+       /* check if client wants to change password */
+       changepw = buf_getbool(ses.payload);
+       if (changepw) {
+@@ -73,12 +65,21 @@ void svr_auth_password() {
+       }
+ 
+       password = buf_getstring(ses.payload, &passwordlen);
+-
+-      /* the first bytes of passwdcrypt are the salt */
+-      testcrypt = crypt(password, passwdcrypt);
++      if (valid_user) {
++              /* the first bytes of passwdcrypt are the salt */
++              passwdcrypt = ses.authstate.pw_passwd;
++              testcrypt = crypt(password, passwdcrypt);
++      }
+       m_burn(password, passwordlen);
+       m_free(password);
+ 
++      /* After we have got the payload contents we can exit if the username
++      is invalid. Invalid users have already been logged. */
++      if (!valid_user) {
++              send_msg_userauth_failure(0, 1);
++              return;
++      }
++
+       if (testcrypt == NULL) {
+               /* crypt() with an invalid salt like "!!" */
+               dropbear_log(LOG_WARNING, "User account '%s' is locked",
+--- a/svr-authpubkey.c
++++ b/svr-authpubkey.c
+@@ -79,7 +79,7 @@ static int checkfileperm(char * filename
+ 
+ /* process a pubkey auth request, sending success or failure message as
+  * appropriate */
+-void svr_auth_pubkey() {
++void svr_auth_pubkey(int valid_user) {
+ 
+       unsigned char testkey; /* whether we're just checking if a key is 
usable */
+       char* algo = NULL; /* pubkey algo */
+@@ -102,6 +102,15 @@ void svr_auth_pubkey() {
+       keybloblen = buf_getint(ses.payload);
+       keyblob = buf_getptr(ses.payload, keybloblen);
+ 
++      if (!valid_user) {
++              /* Return failure once we have read the contents of the packet
++              required to validate a public key. 
++              Avoids blind user enumeration though it isn't possible to 
prevent
++              testing for user existence if the public key is known */
++              send_msg_userauth_failure(0, 0);
++              goto out;
++      }
++
+       /* check if the key is valid */
+       if (checkpubkey(algo, algolen, keyblob, keybloblen) == 
DROPBEAR_FAILURE) {
+               send_msg_userauth_failure(0, 0);
diff -Nru dropbear-2016.74/debian/patches/series 
dropbear-2016.74/debian/patches/series
--- dropbear-2016.74/debian/patches/series      2017-05-19 23:41:21.000000000 
+0200
+++ dropbear-2016.74/debian/patches/series      2018-08-24 02:08:38.000000000 
+0200
@@ -1,2 +1,3 @@
 CVE-2017-9078.patch
 CVE-2017-9079.patch
+CVE-2018-15599.patch

Attachment: signature.asc
Description: PGP signature


--- End Message ---
--- Begin Message ---
Version: 9.6

Hi,

The update referenced by each of these bugs was included in this
morning's stretch point release.

Regards,

Adam

--- End Message ---

Reply via email to