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); + } + + /**
signature.asc
Description: PGP signature