unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [v3 0/2] libssh / libssh2 security updates
@ 2016-02-24 20:57 Leo Famulari
  2016-02-24 20:57 ` [v3 1/2] gnu: libssh2: Update to 1.7.0 [fixes CVE-2016-0787] Leo Famulari
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Leo Famulari @ 2016-02-24 20:57 UTC (permalink / raw)
  To: guix-devel

Here is my 3rd take on fixing CVE-2016-0739 (libssh) and CVE-2016-0787
(libssh2).

Changes:

I "backported" [0] the libssh upstream patch to the old version of libssh
that we must keep around for guile-ssh.

I cleaned up the commit messages.

I added a comment to the curl package explaining the temporary
dependency on the old, vulnerable libssh2-1.4.

[0] Debian did the same, applying the patch to libssh-0.6.3 without any
changes. We apply it to libssh-0.6.5 without any changes.


Leo Famulari (2):
  gnu: libssh2: Update to 1.7.0 [fixes CVE-2016-0787].
  gnu: libssh: Update to 0.7.3 [fixes CVE-2016-0739].

 gnu-system.am                                      |  2 +-
 gnu/packages/curl.scm                              | 11 ++-
 .../patches/libssh-0.6.5-CVE-2016-0739.patch       | 77 +++++++++++++++++++
 gnu/packages/patches/libssh-CVE-2014-0017.patch    | 89 ----------------------
 gnu/packages/ssh.scm                               | 50 ++++++++----
 5 files changed, 124 insertions(+), 105 deletions(-)
 create mode 100644 gnu/packages/patches/libssh-0.6.5-CVE-2016-0739.patch
 delete mode 100644 gnu/packages/patches/libssh-CVE-2014-0017.patch

-- 
2.7.1

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [v3 1/2] gnu: libssh2: Update to 1.7.0 [fixes CVE-2016-0787].
  2016-02-24 20:57 [v3 0/2] libssh / libssh2 security updates Leo Famulari
@ 2016-02-24 20:57 ` Leo Famulari
  2016-02-24 20:57 ` [v3 2/2] gnu: libssh: Update to 0.7.3 [fixes CVE-2016-0739] Leo Famulari
  2016-02-24 21:04 ` [v3 0/2] libssh / libssh2 security updates Andreas Enge
  2 siblings, 0 replies; 4+ messages in thread
From: Leo Famulari @ 2016-02-24 20:57 UTC (permalink / raw)
  To: guix-devel

* gnu/packages/ssh.scm (libssh2): Update to 1.7.0.
(libssh2-1.4): New variable.
* gnu/packages/curl.scm (curl)[inputs]: Temporarily specify dependency
on libssh2-1.4 while rebuilding.
---
 gnu/packages/curl.scm | 11 ++++++++++-
 gnu/packages/ssh.scm  | 28 ++++++++++++++++++++++++----
 2 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/gnu/packages/curl.scm b/gnu/packages/curl.scm
index 222910b..42fb11f 100644
--- a/gnu/packages/curl.scm
+++ b/gnu/packages/curl.scm
@@ -54,7 +54,16 @@
    (inputs `(("gnutls" ,gnutls)
              ("gss" ,gss)
              ("libidn" ,libidn)
-             ("libssh2" ,libssh2)
+
+             ;; libssh2-1.4 is for temporary use by curl, while all
+             ;; packages affected by CVE-2016-7087 are rebuilt. Once
+             ;; they are rebuilt, curl should be updated to use
+             ;; libssh2-1.7.0 (or whatever is current), and libssh2-1.4
+             ;; should be removed from the distribution.
+
+             ;; libssh2-1.4 is vulnerable to CVE-2016-0787.
+
+             ("libssh2" ,libssh2-1.4)
              ("openldap" ,openldap)
              ("zlib" ,zlib)))
    (native-inputs
diff --git a/gnu/packages/ssh.scm b/gnu/packages/ssh.scm
index d4bf29c..2b0693b 100644
--- a/gnu/packages/ssh.scm
+++ b/gnu/packages/ssh.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2013, 2014 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -85,14 +86,15 @@ remote applications.")
 (define-public libssh2
   (package
    (name "libssh2")
-   (version "1.4.3")
+   (version "1.7.0")
    (source (origin
             (method url-fetch)
             (uri (string-append
-                   "http://www.libssh2.org/download/libssh2-"
+                   "https://www.libssh2.org/download/libssh2-"
                    version ".tar.gz"))
-            (sha256 (base32
-                     "0vdr478dbhbdgnniqmirawjb7mrcxckn4slhhrijxnzrkmgziipa"))))
+            (sha256
+             (base32
+              "116mh112w48vv9k3f15ggp5kxw5sj4b88dzb5j69llsh7ba1ymp4"))))
    (build-system gnu-build-system)
    ;; The installed libssh2.pc file does not include paths to libgcrypt and
    ;; zlib libraries, so we need to propagate the inputs.
@@ -108,6 +110,24 @@ a server that supports the SSH-2 protocol.")
    (license license:bsd-3)
    (home-page "http://www.libssh2.org/")))
 
+;;; This is a temporary package for use only by curl. Once we have
+;;; rebuilt all packages affected by CVE-2016-0787, this package should
+;;; be removed.
+;;;
+;;; This package is vulnerable to CVE-2016-7087.
+;;;
+;;; https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2016-0787
+(define-public libssh2-1.4
+  (package (inherit libssh2)
+    (version "1.4.3")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append "https://www.libssh2.org/download/libssh2-"
+                                 version ".tar.gz"))
+             (sha256
+              (base32
+                "0vdr478dbhbdgnniqmirawjb7mrcxckn4slhhrijxnzrkmgziipa"))))))
+
 (define-public openssh
   (package
    (name "openssh")
-- 
2.7.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [v3 2/2] gnu: libssh: Update to 0.7.3 [fixes CVE-2016-0739].
  2016-02-24 20:57 [v3 0/2] libssh / libssh2 security updates Leo Famulari
  2016-02-24 20:57 ` [v3 1/2] gnu: libssh2: Update to 1.7.0 [fixes CVE-2016-0787] Leo Famulari
@ 2016-02-24 20:57 ` Leo Famulari
  2016-02-24 21:04 ` [v3 0/2] libssh / libssh2 security updates Andreas Enge
  2 siblings, 0 replies; 4+ messages in thread
From: Leo Famulari @ 2016-02-24 20:57 UTC (permalink / raw)
  To: guix-devel

* gnu/packages/patches/libssh-CVE-2014-0017.patch: Delete file.
* gnu/packages/patches/libssh-0.6.5-CVE-2016-0739.patch: New file.
* gnu-system.am (dist_patch_DATA): Adjust accordingly.
* gnu/packages/ssh.scm (libssh): Update to 0.7.3.
(libssh-0.5): Update to 0.6.5 and rename to libssh-0.6.
[source]: Add patch for CVE-2016-0739.
(guile-ssh): Specify dependency on libssh-0.6.
---
 gnu-system.am                                      |  2 +-
 .../patches/libssh-0.6.5-CVE-2016-0739.patch       | 77 +++++++++++++++++++
 gnu/packages/patches/libssh-CVE-2014-0017.patch    | 89 ----------------------
 gnu/packages/ssh.scm                               | 22 +++---
 4 files changed, 90 insertions(+), 100 deletions(-)
 create mode 100644 gnu/packages/patches/libssh-0.6.5-CVE-2016-0739.patch
 delete mode 100644 gnu/packages/patches/libssh-CVE-2014-0017.patch

diff --git a/gnu-system.am b/gnu-system.am
index a93b005..9788228 100644
--- a/gnu-system.am
+++ b/gnu-system.am
@@ -566,12 +566,12 @@ dist_patch_DATA =						\
   gnu/packages/patches/libmad-armv7-thumb-pt2.patch		\
   gnu/packages/patches/libmad-frame-length.patch		\
   gnu/packages/patches/libmad-mips-newgcc.patch			\
+  gnu/packages/patches/libssh-0.6.5-CVE-2016-0739.patch		\
   gnu/packages/patches/libtheora-config-guess.patch		\
   gnu/packages/patches/libtiff-CVE-2015-8665+CVE-2015-8683.patch \
   gnu/packages/patches/libtiff-oob-accesses-in-decode.patch	\
   gnu/packages/patches/libtiff-oob-write-in-nextdecode.patch	\
   gnu/packages/patches/libtool-skip-tests2.patch		\
-  gnu/packages/patches/libssh-CVE-2014-0017.patch		\
   gnu/packages/patches/libunwind-CVE-2015-3239.patch		\
   gnu/packages/patches/libwmf-CAN-2004-0941.patch		\
   gnu/packages/patches/libwmf-CVE-2006-3376.patch		\
diff --git a/gnu/packages/patches/libssh-0.6.5-CVE-2016-0739.patch b/gnu/packages/patches/libssh-0.6.5-CVE-2016-0739.patch
new file mode 100644
index 0000000..a5fdd7f
--- /dev/null
+++ b/gnu/packages/patches/libssh-0.6.5-CVE-2016-0739.patch
@@ -0,0 +1,77 @@
+Fix CVE-2016-0739 (Weak Diffie-Hellman secret generation in
+dh_generate_x() and dh_generate_y()).
+
+"Due to a byte/bit confusion, the DH secret was too short. This file was
+completely reworked and will be commited in a future version."
+Source:
+https://git.libssh.org/projects/libssh.git/commit/?id=f8d0026c65fc8a55748ae481758e2cf376c26c86
+
+This patch was created by upstream for libssh-0.7.3, but applied without
+modification to libssh-0.6.3 by Debian. In Guix, we apply it without
+modification to libssh-0.6.5.
+
+References:
+https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2016-0739
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-0739
+https://security-tracker.debian.org/tracker/CVE-2016-0739
+
+---
+ src/dh.c | 22 +++++++++++++++++-----
+ 1 file changed, 17 insertions(+), 5 deletions(-)
+
+diff --git a/src/dh.c b/src/dh.c
+index e489a1d..d27b66e 100644
+--- a/src/dh.c
++++ b/src/dh.c
+@@ -227,15 +227,21 @@ void ssh_crypto_finalize(void) {
+ }
+ 
+ int dh_generate_x(ssh_session session) {
++  int keysize;
++  if (session->next_crypto->kex_type == SSH_KEX_DH_GROUP1_SHA1) {
++    keysize = 1023;
++  } else {
++    keysize = 2047;
++  }
+   session->next_crypto->x = bignum_new();
+   if (session->next_crypto->x == NULL) {
+     return -1;
+   }
+ 
+ #ifdef HAVE_LIBGCRYPT
+-  bignum_rand(session->next_crypto->x, 128);
++  bignum_rand(session->next_crypto->x, keysize);
+ #elif defined HAVE_LIBCRYPTO
+-  bignum_rand(session->next_crypto->x, 128, 0, -1);
++  bignum_rand(session->next_crypto->x, keysize, -1, 0);
+ #endif
+ 
+   /* not harder than this */
+@@ -248,15 +254,21 @@ int dh_generate_x(ssh_session session) {
+ 
+ /* used by server */
+ int dh_generate_y(ssh_session session) {
+-    session->next_crypto->y = bignum_new();
++  int keysize;
++  if (session->next_crypto->kex_type == SSH_KEX_DH_GROUP1_SHA1) {
++    keysize = 1023;
++  } else {
++    keysize = 2047;
++  }
++  session->next_crypto->y = bignum_new();
+   if (session->next_crypto->y == NULL) {
+     return -1;
+   }
+ 
+ #ifdef HAVE_LIBGCRYPT
+-  bignum_rand(session->next_crypto->y, 128);
++  bignum_rand(session->next_crypto->y, keysize);
+ #elif defined HAVE_LIBCRYPTO
+-  bignum_rand(session->next_crypto->y, 128, 0, -1);
++  bignum_rand(session->next_crypto->y, keysize, -1, 0);
+ #endif
+ 
+   /* not harder than this */
+-- 
+cgit v0.12
+
diff --git a/gnu/packages/patches/libssh-CVE-2014-0017.patch b/gnu/packages/patches/libssh-CVE-2014-0017.patch
deleted file mode 100644
index 94d8cc3..0000000
--- a/gnu/packages/patches/libssh-CVE-2014-0017.patch
+++ /dev/null
@@ -1,89 +0,0 @@
-Patch from libssh 0.6, with bind.c hunk adjusted for 0.5.5.
-
-From e99246246b4061f7e71463f8806b9dcad65affa0 Mon Sep 17 00:00:00 2001
-From: Aris Adamantiadis <aris@0xbadc0de.be>
-Date: Wed, 05 Feb 2014 20:24:12 +0000
-Subject: security: fix for vulnerability CVE-2014-0017
-
-When accepting a new connection, a forking server based on libssh forks
-and the child process handles the request. The RAND_bytes() function of
-openssl doesn't reset its state after the fork, but simply adds the
-current process id (getpid) to the PRNG state, which is not guaranteed
-to be unique.
-This can cause several children to end up with same PRNG state which is
-a security issue.
----
-diff --git a/include/libssh/wrapper.h b/include/libssh/wrapper.h
-index 7374a88..e8ff32c 100644
---- a/include/libssh/wrapper.h
-+++ b/include/libssh/wrapper.h
-@@ -70,5 +70,6 @@ int crypt_set_algorithms_server(ssh_session session);
- struct ssh_crypto_struct *crypto_new(void);
- void crypto_free(struct ssh_crypto_struct *crypto);
- 
-+void ssh_reseed(void);
- 
- #endif /* WRAPPER_H_ */
-diff --git a/src/bind.c b/src/bind.c
-index 8d82d0d..03d3403 100644
---- a/src/bind.c
-+++ b/src/bind.c
-@@ -375,6 +375,8 @@ int ssh_bind_accept(ssh_bind sshbind, ss
-   session->dsa_key = dsa;
-   session->rsa_key = rsa;
- 
-+  /* force PRNG to change state in case we fork after ssh_bind_accept */
-+  ssh_reseed();
-   return SSH_OK;
- }
- 
-diff --git a/src/libcrypto.c b/src/libcrypto.c
-index bb1d96a..d8cc795 100644
---- a/src/libcrypto.c
-+++ b/src/libcrypto.c
-@@ -23,6 +23,7 @@
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
-+#include <sys/time.h>
- 
- #include "libssh/priv.h"
- #include "libssh/session.h"
-@@ -38,6 +39,8 @@
- #include <openssl/rsa.h>
- #include <openssl/hmac.h>
- #include <openssl/opensslv.h>
-+#include <openssl/rand.h>
-+
- #ifdef HAVE_OPENSSL_AES_H
- #define HAS_AES
- #include <openssl/aes.h>
-@@ -74,6 +77,12 @@ static int alloc_key(struct ssh_cipher_struct *cipher) {
-     return 0;
- }
- 
-+void ssh_reseed(void){
-+    struct timeval tv;
-+    gettimeofday(&tv, NULL);
-+    RAND_add(&tv, sizeof(tv), 0.0);
-+}
-+
- SHACTX sha1_init(void) {
-   SHACTX c = malloc(sizeof(*c));
-   if (c == NULL) {
-diff --git a/src/libgcrypt.c b/src/libgcrypt.c
-index 899bccd..4617901 100644
---- a/src/libgcrypt.c
-+++ b/src/libgcrypt.c
-@@ -45,6 +45,9 @@ static int alloc_key(struct ssh_cipher_struct *cipher) {
-     return 0;
- }
- 
-+void ssh_reseed(void){
-+	}
-+
- SHACTX sha1_init(void) {
-   SHACTX ctx = NULL;
-   gcry_md_open(&ctx, GCRY_MD_SHA1, 0);
---
-cgit v0.9.1
diff --git a/gnu/packages/ssh.scm b/gnu/packages/ssh.scm
index 2b0693b..a508bb9 100644
--- a/gnu/packages/ssh.scm
+++ b/gnu/packages/ssh.scm
@@ -45,15 +45,15 @@
 (define-public libssh
   (package
     (name "libssh")
-    (version "0.6.5")
+    (version "0.7.3")
     (source (origin
               (method url-fetch)
               (uri (string-append
-                    "https://red.libssh.org/attachments/download/121/libssh-"
+                    "https://red.libssh.org/attachments/download/195/libssh-"
                     version ".tar.xz"))
               (sha256
                (base32
-                "0b6wyx6bwbb8jpn8x4rhlrdiqwqrwrs0mxjmrnqykm9kw1ijgm8g"))))
+                "165g49i4kmm3bfsjm0n8hm21kadv79g9yjqyq09138jxanz4dvr6"))))
     (build-system cmake-build-system)
     (arguments
      '(#:configure-flags '("-DWITH_GCRYPT=ON")
@@ -71,17 +71,19 @@ remote applications.")
     (home-page "http://www.libssh.org")
     (license license:lgpl2.1+)))
 
-(define libssh-0.5                                ; kept private
+(define libssh-0.6 ; kept private for use in guile-ssh
   (package (inherit libssh)
-    (version "0.5.5")
+    (version "0.6.5")
     (source (origin
               (method url-fetch)
-              (uri (string-append "https://red.libssh.org/attachments/download/51/libssh-"
-                                  version ".tar.gz"))
+              (uri (string-append "https://red.libssh.org/attachments/"
+                                  "download/121/libssh-"
+                                  version ".tar.xz"))
               (sha256
                (base32
-                "17cfdff4hc0ijzrr15biq29fiabafz0bw621zlkbwbc1zh2hzpy0"))
-              (patches (list (search-patch "libssh-CVE-2014-0017.patch")))))))
+                "0b6wyx6bwbb8jpn8x4rhlrdiqwqrwrs0mxjmrnqykm9kw1ijgm8g"))
+              (patches (list
+                        (search-patch "libssh-0.6.5-CVE-2016-0739.patch")))))))
 
 (define-public libssh2
   (package
@@ -255,7 +257,7 @@ Additionally, various channel-specific options can be negotiated.")
                      ("pkg-config" ,pkg-config)
                      ("which" ,which)))
     (inputs `(("guile" ,guile-2.0)
-              ("libssh" ,libssh)
+              ("libssh" ,libssh-0.6)
               ("libgcrypt" ,libgcrypt)))
     (synopsis "Guile bindings to libssh")
     (description
-- 
2.7.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [v3 0/2] libssh / libssh2 security updates
  2016-02-24 20:57 [v3 0/2] libssh / libssh2 security updates Leo Famulari
  2016-02-24 20:57 ` [v3 1/2] gnu: libssh2: Update to 1.7.0 [fixes CVE-2016-0787] Leo Famulari
  2016-02-24 20:57 ` [v3 2/2] gnu: libssh: Update to 0.7.3 [fixes CVE-2016-0739] Leo Famulari
@ 2016-02-24 21:04 ` Andreas Enge
  2 siblings, 0 replies; 4+ messages in thread
From: Andreas Enge @ 2016-02-24 21:04 UTC (permalink / raw)
  To: Leo Famulari; +Cc: guix-devel

This is incredible:
+"Due to a byte/bit confusion, the DH secret was too short. This file was
+completely reworked and will be commited in a future version."

I quickly looked over it and think that your approach (which also has been
discussed in detail on irc) looks good, please push.

Andreas

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-02-24 21:04 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-02-24 20:57 [v3 0/2] libssh / libssh2 security updates Leo Famulari
2016-02-24 20:57 ` [v3 1/2] gnu: libssh2: Update to 1.7.0 [fixes CVE-2016-0787] Leo Famulari
2016-02-24 20:57 ` [v3 2/2] gnu: libssh: Update to 0.7.3 [fixes CVE-2016-0739] Leo Famulari
2016-02-24 21:04 ` [v3 0/2] libssh / libssh2 security updates Andreas Enge

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).