vishalmishra434 / rpms / openssh

Forked from rpms/openssh a month ago
Clone
Petr Lautrbach 44fb3c
From 5618210618256bbf5f4f71b2887ff186fd451736 Mon Sep 17 00:00:00 2001
Petr Lautrbach 44fb3c
From: Damien Miller <djm@mindrot.org>
Petr Lautrbach 44fb3c
Date: Sun, 20 Apr 2014 13:44:47 +1000
Petr Lautrbach 44fb3c
Subject: [PATCH]  - (djm) [bufaux.c compat.c compat.h sshconnect2.c sshd.c
Petr Lautrbach 44fb3c
 version.h]    OpenSSH 6.5 and 6.6 sometimes encode a value used in the
Petr Lautrbach 44fb3c
 curve25519    key exchange incorrectly, causing connection failures about
Petr Lautrbach 44fb3c
 0.2% of    the time when this method is used against a peer that implements  
Petr Lautrbach 44fb3c
  the method properly.
Petr Lautrbach 44fb3c
Petr Lautrbach 44fb3c
   Fix the problem and disable the curve25519 KEX when speaking to
Petr Lautrbach 44fb3c
   OpenSSH 6.5 or 6.6. This version will identify itself as 6.6.1
Petr Lautrbach 44fb3c
   to enable the compatability code.
Petr Lautrbach 44fb3c
---
Petr Lautrbach 44fb3c
 ChangeLog     | 11 +++++++++++
Petr Lautrbach 44fb3c
 bufaux.c      |  5 ++++-
Petr Lautrbach 44fb3c
 compat.c      | 17 ++++++++++++++++-
Petr Lautrbach 44fb3c
 compat.h      |  2 ++
Petr Lautrbach 44fb3c
 sshconnect2.c |  2 ++
Petr Lautrbach 44fb3c
 sshd.c        |  3 +++
Petr Lautrbach 44fb3c
 version.h     |  2 +-
Petr Lautrbach 44fb3c
 7 files changed, 39 insertions(+), 3 deletions(-)
Petr Lautrbach 44fb3c
Petr Lautrbach 44fb3c
diff --git a/ChangeLog b/ChangeLog
Petr Lautrbach 44fb3c
index 1603a07..928999d 100644
Petr Lautrbach 44fb3c
--- a/ChangeLog
Petr Lautrbach 44fb3c
+++ b/ChangeLog
Petr Lautrbach 44fb3c
@@ -1,13 +1,23 @@
Petr Lautrbach 44fb3c
 20140420
Petr Lautrbach 44fb3c
-   - djm@cvs.openbsd.org 2014/04/01 03:34:10
Petr Lautrbach 44fb3c
-     [sshconnect.c]
Petr Lautrbach 44fb3c
-     When using VerifyHostKeyDNS with a DNSSEC resolver, down-convert any
Petr Lautrbach 44fb3c
-     certificate keys to plain keys and attempt SSHFP resolution.
Petr Lautrbach 44fb3c
-     
Petr Lautrbach 44fb3c
-     Prevents a server from skipping SSHFP lookup and forcing a new-hostkey
Petr Lautrbach 44fb3c
-     dialog by offering only certificate keys.
Petr Lautrbach 44fb3c
-     
Petr Lautrbach 44fb3c
-     Reported by mcv21 AT cam.ac.uk
Petr Lautrbach 44fb3c
+ - (djm) [bufaux.c compat.c compat.h sshconnect2.c sshd.c version.h]
Petr Lautrbach 44fb3c
+   OpenSSH 6.5 and 6.6 sometimes encode a value used in the curve25519
Petr Lautrbach 44fb3c
+   key exchange incorrectly, causing connection failures about 0.2% of
Petr Lautrbach 44fb3c
+   the time when this method is used against a peer that implements
Petr Lautrbach 44fb3c
+   the method properly.
Petr Lautrbach 44fb3c
+
Petr Lautrbach 44fb3c
+   Fix the problem and disable the curve25519 KEX when speaking to
Petr Lautrbach 44fb3c
+   OpenSSH 6.5 or 6.6. This version will identify itself as 6.6.1
Petr Lautrbach 44fb3c
+   to enable the compatability code.
Petr Lautrbach 44fb3c
+
Petr Lautrbach 44fb3c
+ - djm@cvs.openbsd.org 2014/04/01 03:34:10
Petr Lautrbach 44fb3c
+   [sshconnect.c]
Petr Lautrbach 44fb3c
+   When using VerifyHostKeyDNS with a DNSSEC resolver, down-convert any
Petr Lautrbach 44fb3c
+   certificate keys to plain keys and attempt SSHFP resolution.
Petr Lautrbach 44fb3c
+   
Petr Lautrbach 44fb3c
+   Prevents a server from skipping SSHFP lookup and forcing a new-hostkey
Petr Lautrbach 44fb3c
+   dialog by offering only certificate keys.
Petr Lautrbach 44fb3c
+   
Petr Lautrbach 44fb3c
+   Reported by mcv21 AT cam.ac.uk
Petr Lautrbach 44fb3c
 
Petr Lautrbach 44fb3c
 20140313
Petr Lautrbach 44fb3c
  - (djm) Release OpenSSH 6.6
Petr Lautrbach 44fb3c
diff --git a/bufaux.c b/bufaux.c
Petr Lautrbach 44fb3c
index e24b5fc..f6a6f2a 100644
Petr Lautrbach 44fb3c
--- a/bufaux.c
Petr Lautrbach 44fb3c
+++ b/bufaux.c
Petr Lautrbach 44fb3c
@@ -1,4 +1,4 @@
Petr Lautrbach 44fb3c
-/* $OpenBSD: bufaux.c,v 1.56 2014/02/02 03:44:31 djm Exp $ */
Petr Lautrbach 44fb3c
+/* $OpenBSD: bufaux.c,v 1.57 2014/04/16 23:22:45 djm Exp $ */
Petr Lautrbach 44fb3c
 /*
Petr Lautrbach 44fb3c
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
Petr Lautrbach 44fb3c
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
Petr Lautrbach 44fb3c
@@ -372,6 +372,9 @@ buffer_put_bignum2_from_string(Buffer *buffer, const u_char *s, u_int l)
Petr Lautrbach 44fb3c
 
Petr Lautrbach 44fb3c
 	if (l > 8 * 1024)
Petr Lautrbach 44fb3c
 		fatal("%s: length %u too long", __func__, l);
Petr Lautrbach 44fb3c
+	/* Skip leading zero bytes */
Petr Lautrbach 44fb3c
+	for (; l > 0 && *s == 0; l--, s++)
Petr Lautrbach 44fb3c
+		;
Petr Lautrbach 44fb3c
 	p = buf = xmalloc(l + 1);
Petr Lautrbach 44fb3c
 	/*
Petr Lautrbach 44fb3c
 	 * If most significant bit is set then prepend a zero byte to
Petr Lautrbach 44fb3c
diff --git a/compat.c b/compat.c
Petr Lautrbach 44fb3c
index 9d9fabe..2709dc5 100644
Petr Lautrbach 44fb3c
--- a/compat.c
Petr Lautrbach 44fb3c
+++ b/compat.c
Petr Lautrbach 44fb3c
@@ -95,6 +95,9 @@ compat_datafellows(const char *version)
Petr Lautrbach 44fb3c
 		{ "Sun_SSH_1.0*",	SSH_BUG_NOREKEY|SSH_BUG_EXTEOF},
Petr Lautrbach 44fb3c
 		{ "OpenSSH_4*",		0 },
Petr Lautrbach 44fb3c
 		{ "OpenSSH_5*",		SSH_NEW_OPENSSH|SSH_BUG_DYNAMIC_RPORT},
Petr Lautrbach 44fb3c
+		{ "OpenSSH_6.6.1*",	SSH_NEW_OPENSSH},
Petr Lautrbach 44fb3c
+		{ "OpenSSH_6.5*,"
Petr Lautrbach 44fb3c
+		  "OpenSSH_6.6*",	SSH_NEW_OPENSSH|SSH_BUG_CURVE25519PAD},
Petr Lautrbach 44fb3c
 		{ "OpenSSH*",		SSH_NEW_OPENSSH },
Petr Lautrbach 44fb3c
 		{ "*MindTerm*",		0 },
Petr Lautrbach 44fb3c
 		{ "2.1.0*",		SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
Petr Lautrbach 44fb3c
@@ -251,7 +254,6 @@ compat_cipher_proposal(char *cipher_prop)
Petr Lautrbach 44fb3c
 	return cipher_prop;
Petr Lautrbach 44fb3c
 }
Petr Lautrbach 44fb3c
 
Petr Lautrbach 44fb3c
-
Petr Lautrbach 44fb3c
 char *
Petr Lautrbach 44fb3c
 compat_pkalg_proposal(char *pkalg_prop)
Petr Lautrbach 44fb3c
 {
Petr Lautrbach 44fb3c
@@ -265,3 +267,16 @@ compat_pkalg_proposal(char *pkalg_prop)
Petr Lautrbach 44fb3c
 	return pkalg_prop;
Petr Lautrbach 44fb3c
 }
Petr Lautrbach 44fb3c
 
Petr Lautrbach 44fb3c
+char *
Petr Lautrbach 44fb3c
+compat_kex_proposal(char *kex_prop)
Petr Lautrbach 44fb3c
+{
Petr Lautrbach 44fb3c
+	if (!(datafellows & SSH_BUG_CURVE25519PAD))
Petr Lautrbach 44fb3c
+		return kex_prop;
Petr Lautrbach 44fb3c
+	debug2("%s: original KEX proposal: %s", __func__, kex_prop);
Petr Lautrbach 44fb3c
+	kex_prop = filter_proposal(kex_prop, "curve25519-sha256@libssh.org");
Petr Lautrbach 44fb3c
+	debug2("%s: compat KEX proposal: %s", __func__, kex_prop);
Petr Lautrbach 44fb3c
+	if (*kex_prop == '\0')
Petr Lautrbach 44fb3c
+		fatal("No supported key exchange algorithms found");
Petr Lautrbach 44fb3c
+	return kex_prop;
Petr Lautrbach 44fb3c
+}
Petr Lautrbach 44fb3c
+
Petr Lautrbach 44fb3c
diff --git a/compat.h b/compat.h
Petr Lautrbach 44fb3c
index b174fa1..a6c3f3d 100644
Petr Lautrbach 44fb3c
--- a/compat.h
Petr Lautrbach 44fb3c
+++ b/compat.h
Petr Lautrbach 44fb3c
@@ -59,6 +59,7 @@
Petr Lautrbach 44fb3c
 #define SSH_BUG_RFWD_ADDR	0x02000000
Petr Lautrbach 44fb3c
 #define SSH_NEW_OPENSSH		0x04000000
Petr Lautrbach 44fb3c
 #define SSH_BUG_DYNAMIC_RPORT	0x08000000
Petr Lautrbach 44fb3c
+#define SSH_BUG_CURVE25519PAD	0x10000000
Petr Lautrbach 44fb3c
 
Petr Lautrbach 44fb3c
 void     enable_compat13(void);
Petr Lautrbach 44fb3c
 void     enable_compat20(void);
Petr Lautrbach 44fb3c
@@ -66,6 +67,7 @@ void     compat_datafellows(const char *);
Petr Lautrbach 44fb3c
 int	 proto_spec(const char *);
Petr Lautrbach 44fb3c
 char	*compat_cipher_proposal(char *);
Petr Lautrbach 44fb3c
 char	*compat_pkalg_proposal(char *);
Petr Lautrbach 44fb3c
+char	*compat_kex_proposal(char *);
Petr Lautrbach 44fb3c
 
Petr Lautrbach 44fb3c
 extern int compat13;
Petr Lautrbach 44fb3c
 extern int compat20;
Petr Lautrbach 44fb3c
diff --git a/sshconnect2.c b/sshconnect2.c
Petr Lautrbach 44fb3c
index bb9292f..b00658b 100644
Petr Lautrbach 44fb3c
--- a/sshconnect2.c
Petr Lautrbach 44fb3c
+++ b/sshconnect2.c
Petr Lautrbach 44fb3c
@@ -220,6 +220,8 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
Petr Lautrbach 44fb3c
 	}
Petr Lautrbach 44fb3c
 	if (options.kex_algorithms != NULL)
Petr Lautrbach 44fb3c
 		myproposal[PROPOSAL_KEX_ALGS] = options.kex_algorithms;
Petr Lautrbach 44fb3c
+	myproposal[PROPOSAL_KEX_ALGS] = compat_kex_proposal(
Petr Lautrbach 44fb3c
+	    myproposal[PROPOSAL_KEX_ALGS]);
Petr Lautrbach 44fb3c
 
Petr Lautrbach 44fb3c
 #ifdef GSSAPI
Petr Lautrbach 44fb3c
 	/* If we've got GSSAPI algorithms, then we also support the
Petr Lautrbach 44fb3c
diff --git a/sshd.c b/sshd.c
Petr Lautrbach 44fb3c
index e4e406e..512c7ed 100644
Petr Lautrbach 44fb3c
--- a/sshd.c
Petr Lautrbach 44fb3c
+++ b/sshd.c
Petr Lautrbach 44fb3c
@@ -2488,6 +2488,9 @@ do_ssh2_kex(void)
Petr Lautrbach 44fb3c
 	if (options.kex_algorithms != NULL)
Petr Lautrbach 44fb3c
 		myproposal[PROPOSAL_KEX_ALGS] = options.kex_algorithms;
Petr Lautrbach 44fb3c
 
Petr Lautrbach 44fb3c
+	myproposal[PROPOSAL_KEX_ALGS] = compat_kex_proposal(
Petr Lautrbach 44fb3c
+	    myproposal[PROPOSAL_KEX_ALGS]);
Petr Lautrbach 44fb3c
+
Petr Lautrbach 44fb3c
 	if (options.rekey_limit || options.rekey_interval)
Petr Lautrbach 44fb3c
 		packet_set_rekey_limits((u_int32_t)options.rekey_limit,
Petr Lautrbach 44fb3c
 		    (time_t)options.rekey_interval);
Petr Lautrbach 44fb3c
diff --git a/version.h b/version.h
Petr Lautrbach 44fb3c
index a1579ac..a33e77c 100644
Petr Lautrbach 44fb3c
--- a/version.h
Petr Lautrbach 44fb3c
+++ b/version.h
Petr Lautrbach 44fb3c
@@ -1,6 +1,6 @@
Petr Lautrbach 44fb3c
 /* $OpenBSD: version.h,v 1.70 2014/02/27 22:57:40 djm Exp $ */
Petr Lautrbach 44fb3c
 
Petr Lautrbach 44fb3c
-#define SSH_VERSION	"OpenSSH_6.6"
Petr Lautrbach 44fb3c
+#define SSH_VERSION	"OpenSSH_6.6.1"
Petr Lautrbach 44fb3c
 
Petr Lautrbach 44fb3c
 #define SSH_PORTABLE	"p1"
Petr Lautrbach 44fb3c
 #define SSH_RELEASE	SSH_VERSION SSH_PORTABLE