Package: release.debian.org
Severity: normal
Tags: wheezy
User: release.debian....@packages.debian.org
Usertags: pu

Hi,

As agreed with the security team, I’d like to fix another potential
entropy vulnerability that has been fixed in zendframework.

The fix also gets rid of openssl_random_pseudo_bytes() introduced in the
previous ZF2015-09 fix, and I also added a regression fix from the
CVE-2015-7695 (ZF2015-08) patch (this one was introduced in DSA-3369-1).

Please find attached the proposed debdiff for Wheezy, it’s pretty
similar to the one from #821042.

zendframework (1.11.13-1.1+deb7u6) wheezy; urgency=medium

  * Fix regression from ZF2015-08: binary data corruption
  * Backport security fix from 1.12.18:
    - ZF2016-01: Potential Insufficient Entropy Vulnerability in ZF1
      http://framework.zend.com/security/advisory/ZF2016-01

Regards

David
diff -u zendframework-1.11.13/debian/changelog zendframework-1.11.13/debian/changelog
--- zendframework-1.11.13/debian/changelog
+++ zendframework-1.11.13/debian/changelog
@@ -1,6 +1,15 @@
+zendframework (1.11.13-1.1+deb7u6) wheezy; urgency=medium
+
+  * Fix regression from ZF2015-08: binary data corruption
+  * Backport security fix from 1.12.18:
+    - ZF2016-01: Potential Insufficient Entropy Vulnerability in ZF1
+      http://framework.zend.com/security/advisory/ZF2016-01
+
+ -- David Prévot <taf...@debian.org>  Wed, 13 Apr 2016 16:34:02 -0400
+
 zendframework (1.11.13-1.1+deb7u5) wheezy; urgency=medium
 
-  * Backport security fix from 1.12.17
+  * Backport security fix from 1.12.17:
     - ZF2015-09: Fixed entropy issue in word CAPTCHA
       http://framework.zend.com/security/advisory/ZF2015-09
 
@@ -8,7 +17,7 @@
 
 zendframework (1.11.13-1.1+deb7u4) wheezy-security; urgency=high
 
-  * Backport security fixes from 1.12.16
+  * Backport security fixes from 1.12.16:
     - ZF2015-07: Filesystem Permissions Issues in Multiple Components
       http://framework.zend.com/security/advisory/ZF2015-07
       [CVE-2015-5723]
diff -u zendframework-1.11.13/debian/patches/series zendframework-1.11.13/debian/patches/series
--- zendframework-1.11.13/debian/patches/series
+++ zendframework-1.11.13/debian/patches/series
@@ -15,0 +16 @@
+0016-Fixed-the-rand-usage.patch
diff -u zendframework-1.11.13/debian/patches/0014-ZF2015-08-Fix-null-byte-injection-for-PDO-MsSql.patch zendframework-1.11.13/debian/patches/0014-ZF2015-08-Fix-null-byte-injection-for-PDO-MsSql.patch
--- zendframework-1.11.13/debian/patches/0014-ZF2015-08-Fix-null-byte-injection-for-PDO-MsSql.patch
+++ zendframework-1.11.13/debian/patches/0014-ZF2015-08-Fix-null-byte-injection-for-PDO-MsSql.patch
@@ -5,37 +5,31 @@
 This addresses the same issue as found in ZF2014-06, but within the PDO MsSql
 adapter. Additionally, it fixes transaction tests for that adapter.
 
-Origin: upstream, https://github.com/zendframework/zf1/commit/2ac9c30f73ec2e6235c602bed745749a551b4fe2
+Origin: upstream, https://github.com/zendframework/zf1/commit/2ac9c30f73ec2e6235c602bed745749a551b4fe2 https://github.com/zendframework/zf1/commit/70d8aba8c525190e906c663dfdc55355f6e74416
 ---
- library/Zend/Db/Adapter/Pdo/Abstract.php |  3 +-
- library/Zend/Db/Adapter/Pdo/Mssql.php    |  2 +-
- tests/TestConfiguration.php.dist         |  5 ++--
- tests/Zend/Db/Adapter/Pdo/MssqlTest.php  | 47 +++++++-------------------------
- tests/Zend/Db/Adapter/Pdo/TestCommon.php | 10 +++++++
- tests/Zend/Db/Adapter/TestCommon.php     |  5 ++--
+ library/Zend/Db/Adapter/Pdo/Abstract.php |  1 -
+ library/Zend/Db/Adapter/Pdo/Mssql.php    | 19 +++++++++--
+ library/Zend/Db/Adapter/Pdo/Sqlite.php   | 14 ++++++++
+ tests/TestConfiguration.php.dist         |  5 +--
+ tests/Zend/Db/Adapter/Pdo/MssqlTest.php  | 58 ++++++++++++--------------------
+ tests/Zend/Db/Adapter/Pdo/MysqlTest.php  | 13 +++++--
+ tests/Zend/Db/Adapter/Pdo/SqliteTest.php | 10 ++++++
+ tests/Zend/Db/Adapter/Pdo/TestCommon.php | 10 ++++++
+ tests/Zend/Db/Adapter/TestCommon.php     |  5 ++-
  tests/Zend/Db/TestUtil/Pdo/Mssql.php     |  4 ++-
- 7 files changed, 31 insertions(+), 45 deletions(-)
+ 10 files changed, 91 insertions(+), 48 deletions(-)
 
 diff --git a/library/Zend/Db/Adapter/Pdo/Abstract.php b/library/Zend/Db/Adapter/Pdo/Abstract.php
-index 95f3734..8fde066 100644
+index 95f3734..d718255 100644
 --- a/library/Zend/Db/Adapter/Pdo/Abstract.php
 +++ b/library/Zend/Db/Adapter/Pdo/Abstract.php
-@@ -292,6 +292,8 @@ abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract
-         if (is_int($value) || is_float($value)) {
-             return $value;
-         }
-+        // Fix for null-byte injection
-+        $value = addcslashes($value, "\000\032");
-         $this->_connect();
-         return $this->_connection->quote($value);
-     }
-@@ -398,4 +400,3 @@ abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract
+@@ -398,4 +398,3 @@ abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract
          }
      }
  }
 -
 diff --git a/library/Zend/Db/Adapter/Pdo/Mssql.php b/library/Zend/Db/Adapter/Pdo/Mssql.php
-index 3faf82c..175360f 100644
+index 3faf82c..8665da7 100644
 --- a/library/Zend/Db/Adapter/Pdo/Mssql.php
 +++ b/library/Zend/Db/Adapter/Pdo/Mssql.php
 @@ -410,7 +410,7 @@ class Zend_Db_Adapter_Pdo_Mssql extends Zend_Db_Adapter_Pdo_Abstract
@@ -47,6 +41,51 @@
              $result = $stmt->fetchAll(Zend_Db::FETCH_NUM);
              if (count($result)) {
                  return $result[0][0];
+@@ -420,4 +420,19 @@ class Zend_Db_Adapter_Pdo_Mssql extends Zend_Db_Adapter_Pdo_Abstract
+             return null;
+         }
+     }
+-}
+\ No newline at end of file
++
++    /**
++     * Quote a raw string.
++     *
++     * @param string $value     Raw string
++     * @return string           Quoted string
++     */
++    protected function _quote($value)
++    {
++        if (!is_int($value) && !is_float($value)) {
++            // Fix for null-byte injection
++            $value = addcslashes($value, "\000\032");
++        }
++        return parent::_quote($value);
++    }
++}
+diff --git a/library/Zend/Db/Adapter/Pdo/Sqlite.php b/library/Zend/Db/Adapter/Pdo/Sqlite.php
+index 02b3e40..3320b1f 100644
+--- a/library/Zend/Db/Adapter/Pdo/Sqlite.php
++++ b/library/Zend/Db/Adapter/Pdo/Sqlite.php
+@@ -294,4 +294,18 @@ class Zend_Db_Adapter_Pdo_Sqlite extends Zend_Db_Adapter_Pdo_Abstract
+         return $sql;
+     }
+ 
++    /**
++     * Quote a raw string.
++     *
++     * @param string $value     Raw string
++     * @return string           Quoted string
++     */
++    protected function _quote($value)
++    {
++        if (!is_int($value) && !is_float($value)) {
++            // Fix for null-byte injection
++            $value = addcslashes($value, "\000\032");
++        }
++        return parent::_quote($value);
++    }
+ }
 diff --git a/tests/TestConfiguration.php.dist b/tests/TestConfiguration.php.dist
 index be8ad15..c534ba2 100644
 --- a/tests/TestConfiguration.php.dist
@@ -78,7 +117,7 @@
   */
  defined('TESTS_ZEND_HTTP_USERAGENT_WURFL_LIB_DIR') || define('TESTS_ZEND_HTTP_USERAGENT_WURFL_LIB_DIR', false);
 diff --git a/tests/Zend/Db/Adapter/Pdo/MssqlTest.php b/tests/Zend/Db/Adapter/Pdo/MssqlTest.php
-index 60ea18a..17cd37a 100644
+index 60ea18a..db80f28 100644
 --- a/tests/Zend/Db/Adapter/Pdo/MssqlTest.php
 +++ b/tests/Zend/Db/Adapter/Pdo/MssqlTest.php
 @@ -211,11 +211,13 @@ class Zend_Db_Adapter_Pdo_MssqlTest extends Zend_Db_Adapter_Pdo_TestCommon
@@ -172,6 +211,71 @@
      }
  
      /**
+@@ -388,6 +361,17 @@ class Zend_Db_Adapter_Pdo_MssqlTest extends Zend_Db_Adapter_Pdo_TestCommon
+         $this->assertArrayHasKey('product_name', $productsTableInfo);
+     }
+ 
++    /**
++     * test that quote() escapes null byte character
++     * in a string.
++     */
++    public function testAdapterQuoteNullByteCharacter()
++    {
++        $string = "1\0";
++        $value  = $this->_db->quote($string);
++        $this->assertEquals("'1\\000'", $value);
++    }
++
+     public function getDriver()
+     {
+         return 'Pdo_Mssql';
+diff --git a/tests/Zend/Db/Adapter/Pdo/MysqlTest.php b/tests/Zend/Db/Adapter/Pdo/MysqlTest.php
+index beb3842..f87244c 100644
+--- a/tests/Zend/Db/Adapter/Pdo/MysqlTest.php
++++ b/tests/Zend/Db/Adapter/Pdo/MysqlTest.php
+@@ -315,7 +315,17 @@ class Zend_Db_Adapter_Pdo_MysqlTest extends Zend_Db_Adapter_Pdo_TestCommon
+         $adapter = new ZendTest_Db_Adapter_Pdo_Mysql(array('dbname' => 'foo', 'charset' => 'XYZ', 'username' => 'bar', 'password' => 'foo'));
+         $this->assertEquals('mysql:dbname=foo;charset=XYZ', $adapter->_dsn());
+     }
+-    
++
++    /**
++     * Test that quote() does not alter binary data
++     */
++    public function testBinaryQuoteWithNulls()
++    {
++        $binary = pack("xxx");
++        $value  = $this->_db->quote($binary);
++        $this->assertEquals('\'\0\0\0\'', $value);
++    }
++
+     public function getDriver()
+     {
+         return 'Pdo_Mysql';
+@@ -330,4 +340,3 @@ class ZendTest_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Mysql
+         return parent::_dsn();
+     }
+ }
+-
+diff --git a/tests/Zend/Db/Adapter/Pdo/SqliteTest.php b/tests/Zend/Db/Adapter/Pdo/SqliteTest.php
+index 6e28f2c..5dc29c7 100644
+--- a/tests/Zend/Db/Adapter/Pdo/SqliteTest.php
++++ b/tests/Zend/Db/Adapter/Pdo/SqliteTest.php
+@@ -200,4 +200,14 @@ class Zend_Db_Adapter_Pdo_SqliteTest extends Zend_Db_Adapter_Pdo_TestCommon
+         return 'Pdo_Sqlite';
+     }
+ 
++    /**
++     * test that quote() escapes null byte character
++     * in a string.
++     */
++    public function testAdapterQuoteNullByteCharacter()
++    {
++        $string = "1\0";
++        $value  = $this->_db->quote($string);
++        $this->assertEquals("'1\\000'", $value);
++    }
+ }
 diff --git a/tests/Zend/Db/Adapter/Pdo/TestCommon.php b/tests/Zend/Db/Adapter/Pdo/TestCommon.php
 index c6f50b5..1467e8e 100644
 --- a/tests/Zend/Db/Adapter/Pdo/TestCommon.php
only in patch2:
unchanged:
--- zendframework-1.11.13.orig/debian/patches/0016-Fixed-the-rand-usage.patch
+++ zendframework-1.11.13/debian/patches/0016-Fixed-the-rand-usage.patch
@@ -0,0 +1,175 @@
+From: Enrico Zimuel <e.zim...@gmail.com>
+Date: Mon, 11 Apr 2016 19:16:32 +0200
+Subject: Fixed the rand usage
+
+Origin: upstream, https://github.com/zendframework/zf1/commit/dbb9c8e1cf9f8ac8dcee89591f73d5a902d50b10
+---
+ library/Zend/Crypt/Math.php            | 10 +++++-----
+ library/Zend/Filter/Encrypt/Mcrypt.php |  6 ++++--
+ library/Zend/Form/Element/Hash.php     |  8 ++++----
+ library/Zend/Gdata/HttpClient.php      |  5 ++++-
+ library/Zend/Ldap/Attribute.php        |  7 +++++--
+ library/Zend/OpenId.php                |  9 ++++-----
+ 6 files changed, 26 insertions(+), 19 deletions(-)
+
+diff --git a/library/Zend/Crypt/Math.php b/library/Zend/Crypt/Math.php
+index 43f9167..37ff854 100644
+--- a/library/Zend/Crypt/Math.php
++++ b/library/Zend/Crypt/Math.php
+@@ -77,11 +77,8 @@ class Zend_Crypt_Math extends Zend_Crypt_Math_BigInteger
+         if ($length <= 0) {
+             return false;
+         }
+-        if (function_exists('openssl_random_pseudo_bytes')) {
+-            $bytes = openssl_random_pseudo_bytes($length, $usable);
+-            if ($strong === $usable) {
+-                return $bytes;
+-            }
++        if (function_exists('random_bytes')) { // available in PHP 7
++            return random_bytes($length);
+         }
+         if (function_exists('mcrypt_create_iv')) {
+             $bytes = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
+@@ -134,6 +131,9 @@ class Zend_Crypt_Math extends Zend_Crypt_Math_BigInteger
+                 'The supplied range is too great to generate'
+             );
+         }
++        if (function_exists('random_int')) { // available in PHP 7
++            return random_int($min, $max);
++        }
+         // calculate number of bits required to store range on this machine
+         $r = $range;
+         $bits = 0;
+diff --git a/library/Zend/Filter/Encrypt/Mcrypt.php b/library/Zend/Filter/Encrypt/Mcrypt.php
+index 01d919c..cb32839 100644
+--- a/library/Zend/Filter/Encrypt/Mcrypt.php
++++ b/library/Zend/Filter/Encrypt/Mcrypt.php
+@@ -24,6 +24,9 @@
+  */
+ require_once 'Zend/Filter/Encrypt/Interface.php';
+ 
++/** @see Zend_Crypt_Math */
++require_once 'Zend/Crypt/Math.php';
++
+ /**
+  * Encryption adapter for mcrypt
+  *
+@@ -355,9 +358,8 @@ class Zend_Filter_Encrypt_Mcrypt implements Zend_Filter_Encrypt_Interface
+         if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
+             return;
+         }
+-
+         if (!self::$_srandCalled) {
+-            srand((double) microtime() * 1000000);
++            srand(Zend_Crypt_Math::randInteger(0, PHP_INT_MAX));
+             self::$_srandCalled = true;
+         }
+     }
+diff --git a/library/Zend/Form/Element/Hash.php b/library/Zend/Form/Element/Hash.php
+index 6e11239..aff129e 100644
+--- a/library/Zend/Form/Element/Hash.php
++++ b/library/Zend/Form/Element/Hash.php
+@@ -22,6 +22,9 @@
+ /** Zend_Form_Element_Xhtml */
+ require_once 'Zend/Form/Element/Xhtml.php';
+ 
++/** @see Zend_Crypt_Math */
++require_once 'Zend/Crypt/Math.php';
++
+ /**
+  * CSRF form protection
+  *
+@@ -249,10 +252,7 @@ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml
+     protected function _generateHash()
+     {
+         $this->_hash = md5(
+-            mt_rand(1,1000000)
+-            .  $this->getSalt()
+-            .  $this->getName()
+-            .  mt_rand(1,1000000)
++            Zend_Crypt_Math::randBytes(32)
+         );
+         $this->setValue($this->_hash);
+     }
+diff --git a/library/Zend/Gdata/HttpClient.php b/library/Zend/Gdata/HttpClient.php
+index cc5cc78..23ecda3 100644
+--- a/library/Zend/Gdata/HttpClient.php
++++ b/library/Zend/Gdata/HttpClient.php
+@@ -25,6 +25,9 @@
+  */
+ require_once 'Zend/Http/Client.php';
+ 
++/** @see Zend_Crypt_Math */
++require_once 'Zend/Crypt/Math.php';
++
+ /**
+  * Gdata Http Client object.
+  *
+@@ -210,7 +213,7 @@ class Zend_Gdata_HttpClient extends Zend_Http_Client
+             if ($this->getAuthSubPrivateKeyId() != null) {
+                 // secure AuthSub
+                 $time = time();
+-                $nonce = mt_rand(0, 999999999);
++                $nonce = Zend_Crypt_Math::randInteger(0, 999999999);
+                 $dataToSign = $method . ' ' . $url . ' ' . $time . ' ' . $nonce;
+ 
+                 // compute signature
+diff --git a/library/Zend/Ldap/Attribute.php b/library/Zend/Ldap/Attribute.php
+index 81080e8..d9984ad 100644
+--- a/library/Zend/Ldap/Attribute.php
++++ b/library/Zend/Ldap/Attribute.php
+@@ -24,6 +24,9 @@
+  */
+ require_once 'Zend/Ldap/Converter.php';
+ 
++/** @see Zend_Crypt_Math */
++require_once 'Zend/Crypt/Math.php';
++
+ /**
+  * Zend_Ldap_Attribute is a collection of LDAP attribute related functions.
+  *
+@@ -311,7 +314,7 @@ class Zend_Ldap_Attribute
+                 }
+                 return $password;
+             case self::PASSWORD_HASH_SSHA:
+-                $salt    = substr(sha1(uniqid(mt_rand(), true), true), 0, 4);
++                $salt    = Zend_Crypt_Math::randBytes(4);
+                 $rawHash = sha1($password . $salt, true) . $salt;
+                 $method  = '{SSHA}';
+                 break;
+@@ -320,7 +323,7 @@ class Zend_Ldap_Attribute
+                 $method  = '{SHA}';
+                 break;
+             case self::PASSWORD_HASH_SMD5:
+-                $salt    = substr(sha1(uniqid(mt_rand(), true), true), 0, 4);
++                $salt    = Zend_Crypt_Math::randBytes(4);
+                 $rawHash = md5($password . $salt, true) . $salt;
+                 $method  = '{SMD5}';
+                 break;
+diff --git a/library/Zend/OpenId.php b/library/Zend/OpenId.php
+index 887668d..5efc7ad 100644
+--- a/library/Zend/OpenId.php
++++ b/library/Zend/OpenId.php
+@@ -25,6 +25,9 @@
+  */
+ require_once "Zend/Controller/Response/Abstract.php";
+ 
++/** @see Zend_Crypt_Math */
++require_once 'Zend/Crypt/Math.php';
++
+ /**
+  * Static class that contains common utility functions for
+  * {@link Zend_OpenId_Consumer} and {@link Zend_OpenId_Provider}.
+@@ -470,11 +473,7 @@ class Zend_OpenId
+      */
+     static public function randomBytes($len)
+     {
+-        $key = '';
+-        for($i=0; $i < $len; $i++) {
+-            $key .= chr(mt_rand(0, 255));
+-        }
+-        return $key;
++        return (string) Zend_Crypt_Math::randBytes($len);
+     }
+ 
+     /**

Attachment: signature.asc
Description: PGP signature

Reply via email to