diff options
author | Fredrik Rinnestam <fredrik@crux.nu> | 2019-03-25 20:47:19 +0100 |
---|---|---|
committer | Fredrik Rinnestam <fredrik@crux.nu> | 2019-03-25 20:47:19 +0100 |
commit | 8eedc927362c5f81678a9e2c1d0fdd9a59ba832d (patch) | |
tree | 4885fb659fa6a13966a2d073bbaf50c7a5a172cc /dropbear | |
parent | 1519d9fc1503db58dbda36e46f596701499ce6e4 (diff) | |
parent | 0ac2fe4e48e74226f6d5eb81734c256fdc7665d5 (diff) | |
download | opt-8eedc927362c5f81678a9e2c1d0fdd9a59ba832d.tar.gz opt-8eedc927362c5f81678a9e2c1d0fdd9a59ba832d.tar.xz |
Merge branch '3.4' into 3.5
Diffstat (limited to 'dropbear')
-rw-r--r-- | dropbear/.signature | 8 | ||||
-rw-r--r-- | dropbear/CVE-2018-15599.diff | 222 | ||||
-rw-r--r-- | dropbear/Pkgfile | 8 | ||||
-rw-r--r-- | dropbear/reset-tty-modes.patch | 51 |
4 files changed, 59 insertions, 230 deletions
diff --git a/dropbear/.signature b/dropbear/.signature index 6a75a82b7..d8280e9f7 100644 --- a/dropbear/.signature +++ b/dropbear/.signature @@ -1,8 +1,8 @@ untrusted comment: verify with /etc/ports/opt.pub -RWSE3ohX2g5d/ZwHjbSnatGBORtIE4uG5o+PIXXWF5S+DlHlDX+7Fz3UDD6c3rOvcXIQeoc5loAsc52uNfW5wb3CEwcWtekLdAw= -SHA256 (Pkgfile) = 0c088019d09c895614d2fe8e449a4ac61b3657ef3b53d5faacf85d6c76aa90e1 +RWSE3ohX2g5d/SiZPq2mZq0J2yOuWeXOPx+APKUMH2OL/7Cb3PcHbsVMPwH1OAE6t7c1TBCABYpMTSTWBKGM2xmDorkGsOcmRgQ= +SHA256 (Pkgfile) = 5631d02778f15631c1ebdffbc5c615631873e8133382471da75adebb2121731a SHA256 (.footprint) = 5d47799d69d21b860be70eb9e767298617679bcee2140d245cbc74f4a2a4502e -SHA256 (dropbear-2018.76.tar.bz2) = f2fb9167eca8cf93456a5fc1d4faf709902a3ab70dd44e352f3acbc3ffdaea65 +SHA256 (dropbear-2019.77.tar.bz2) = d91f78ebe633be1d071fd1b7e5535b9693794048b019e9f4bea257e1992b458d SHA256 (dropbear.rc) = def8d4ebda5759a3bc55055957235fa47f7e40216badf07830f487f05e7fbd42 +SHA256 (reset-tty-modes.patch) = 2fd8beca361dc5859fa996a28651c4748bd741c763587d828ede0ea634af0ed2 SHA256 (dropbear.pam) = 0c0aff342e586e64f2d2a814ef127a2748b223e746c3efccfccc91a5aadbce4a -SHA256 (CVE-2018-15599.diff) = 42b5720cf6c888638cfb84fdd862fc0d323b2e023cbe5f9ccdaa2e0c35b6873e diff --git a/dropbear/CVE-2018-15599.diff b/dropbear/CVE-2018-15599.diff deleted file mode 100644 index 963ed35bb..000000000 --- a/dropbear/CVE-2018-15599.diff +++ /dev/null @@ -1,222 +0,0 @@ - -# HG changeset patch -# User Matt Johnston <matt@ucc.asn.au> -# Date 1535038992 -28800 -# Node ID 5d2d1021ca0006337af58859c861f2349715b73b -# Parent cd23631dab5c653c66fe697e24f026aefbfcecb3 -Wait to fail invalid usernames - -diff -r cd23631dab5c -r 5d2d1021ca00 auth.h ---- a/auth.h Thu Aug 23 22:10:07 2018 +0800 -+++ b/auth.h Thu Aug 23 23:43:12 2018 +0800 -@@ -37,9 +37,9 @@ - void send_msg_userauth_failure(int partial, int incrfail); - void send_msg_userauth_success(void); - void send_msg_userauth_banner(const 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); - - #if DROPBEAR_SVR_PUBKEY_OPTIONS_BUILT - int svr_pubkey_allows_agentfwd(void); -diff -r cd23631dab5c -r 5d2d1021ca00 svr-auth.c ---- a/svr-auth.c Thu Aug 23 22:10:07 2018 +0800 -+++ b/svr-auth.c Thu Aug 23 23:43:12 2018 +0800 -@@ -149,10 +149,8 @@ - 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 -@@ -164,10 +162,8 @@ - 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 -@@ -177,12 +173,7 @@ - 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 -diff -r cd23631dab5c -r 5d2d1021ca00 svr-authpam.c ---- a/svr-authpam.c Thu Aug 23 22:10:07 2018 +0800 -+++ b/svr-authpam.c Thu Aug 23 23:43:12 2018 +0800 -@@ -178,13 +178,14 @@ - * 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 @@ - - 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", -@@ -242,7 +254,7 @@ - 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; -@@ -253,12 +265,18 @@ - 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, -diff -r cd23631dab5c -r 5d2d1021ca00 svr-authpasswd.c ---- a/svr-authpasswd.c Thu Aug 23 22:10:07 2018 +0800 -+++ b/svr-authpasswd.c Thu Aug 23 23:43:12 2018 +0800 -@@ -48,22 +48,14 @@ - - /* 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 @@ - } - - 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", -diff -r cd23631dab5c -r 5d2d1021ca00 svr-authpubkey.c ---- a/svr-authpubkey.c Thu Aug 23 22:10:07 2018 +0800 -+++ b/svr-authpubkey.c Thu Aug 23 23:43:12 2018 +0800 -@@ -79,7 +79,7 @@ - - /* 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 @@ - 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 --git a/dropbear/Pkgfile b/dropbear/Pkgfile index a8349d886..6b10524b1 100644 --- a/dropbear/Pkgfile +++ b/dropbear/Pkgfile @@ -4,15 +4,15 @@ # Depends on: zlib linux-pam name=dropbear -version=2018.76 -release=3 +version=2019.77 +release=2 source=(http://matt.ucc.asn.au/$name/releases/$name-$version.tar.bz2 \ - dropbear.rc dropbear.pam CVE-2018-15599.diff) + dropbear.rc reset-tty-modes.patch dropbear.pam) build () { cd $name-$version - patch -p1 -i $SRC/CVE-2018-15599.diff + patch -p1 -i $SRC/reset-tty-modes.patch sed '/pam_start/s/sshd/dropbear/' -i svr-authpam.c echo '#define SFTPSERVER_PATH "/usr/lib/ssh/sftp-server"' > localoptions.h diff --git a/dropbear/reset-tty-modes.patch b/dropbear/reset-tty-modes.patch new file mode 100644 index 000000000..cd2f086a5 --- /dev/null +++ b/dropbear/reset-tty-modes.patch @@ -0,0 +1,51 @@ + +# HG changeset patch +# User Matt Johnston <matt@ucc.asn.au> +# Date 1553431262 -28800 +# Node ID 4b01f4826a29a2837e971197d4f72b7cb376745a +# Parent 48c6e54f7281aaf89fbc8b2b99ca4a9cd62969af +Fix regression where TTY modes weren't reset for client + +diff -r 48c6e54f7281 -r 4b01f4826a29 cli-chansession.c +--- a/cli-chansession.c Sat Mar 23 21:54:23 2019 +0800 ++++ b/cli-chansession.c Sun Mar 24 20:41:02 2019 +0800 +@@ -35,7 +35,7 @@ + #include "chansession.h" + #include "agentfwd.h" + +-static void cli_cleanupchansess(const struct Channel *channel); ++static void cli_closechansess(const struct Channel *channel); + static int cli_initchansess(struct Channel *channel); + static void cli_chansessreq(struct Channel *channel); + static void send_chansess_pty_req(const struct Channel *channel); +@@ -51,8 +51,8 @@ + cli_initchansess, /* inithandler */ + NULL, /* checkclosehandler */ + cli_chansessreq, /* reqhandler */ +- NULL, /* closehandler */ +- cli_cleanupchansess, /* cleanup */ ++ cli_closechansess, /* closehandler */ ++ NULL, /* cleanup */ + }; + + static void cli_chansessreq(struct Channel *channel) { +@@ -84,7 +84,7 @@ + + + /* If the main session goes, we close it up */ +-static void cli_cleanupchansess(const struct Channel *UNUSED(channel)) { ++static void cli_closechansess(const struct Channel *UNUSED(channel)) { + cli_tty_cleanup(); /* Restore tty modes etc */ + + /* This channel hasn't gone yet, so we have > 1 */ +@@ -388,8 +388,8 @@ + cli_init_netcat, /* inithandler */ + NULL, + NULL, ++ cli_closechansess, + NULL, +- cli_cleanupchansess + }; + + void cli_send_netcat_request() { + |