summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemi Collet <remi@remirepo.net>2026-07-01 10:17:46 +0200
committerRemi Collet <remi@php.net>2026-07-01 10:17:46 +0200
commitd7ab42a61c5d7138c872f0c7ebf91206906309c3 (patch)
treebc849624aabd9fa04585e25e47a0c46b608ff7f0
parent8c66a4e97b0f64d1306133822844c59aec3032c0 (diff)
Fix Memory corruption (zend_mm_heap corrupted) in openssl_encrypt with AES-WRAP-PADHEADmaster
-rw-r--r--failed.txt35
-rw-r--r--php-gh22187.patch119
-rw-r--r--php80.spec15
3 files changed, 145 insertions, 24 deletions
diff --git a/failed.txt b/failed.txt
index baf31ae..bf5174d 100644
--- a/failed.txt
+++ b/failed.txt
@@ -1,30 +1,21 @@
-===== 8.0.30-16 (2026-05-11)
+===== 8.0.30-17 (2026-07-02)
$ grep -ar 'Tests failed' /var/lib/mock/*/build.log
-/var/lib/mock/el8a80/build.log:Tests failed : 2
-/var/lib/mock/el8x80/build.log:Tests failed : 2
-/var/lib/mock/el9a80/build.log:Tests failed : 3
-/var/lib/mock/el9x80/build.log:Tests failed : 3
-/var/lib/mock/el10a80/build.log:Tests failed : 3
-/var/lib/mock/el10x80/build.log:Tests failed : 3
-/var/lib/mock/fc42a80/build.log:Tests failed : 2
-/var/lib/mock/fc42x80/build.log:Tests failed : 2
-/var/lib/mock/fc43a80/build.log:Tests failed : 6
-/var/lib/mock/fc43x80/build.log:Tests failed : 6
-/var/lib/mock/fc44a80/build.log:Tests failed : 6
-/var/lib/mock/fc44x80/build.log:Tests failed : 6
+/var/lib/mock/el8a80/build.log:Tests failed : 0
+/var/lib/mock/el8x80/build.log:Tests failed : 0
+/var/lib/mock/el9a80/build.log:Tests failed : 0
+/var/lib/mock/el9x80/build.log:Tests failed : 0
+/var/lib/mock/el10a80/build.log:Tests failed : 0
+/var/lib/mock/el10x80/build.log:Tests failed : 0
+/var/lib/mock/fc42a80/build.log:Tests failed : 0
+/var/lib/mock/fc42x80/build.log:Tests failed : 0
+/var/lib/mock/fc43a80/build.log:Tests failed : 0
+/var/lib/mock/fc43x80/build.log:Tests failed : 0
+/var/lib/mock/fc44a80/build.log:Tests failed : 0
+/var/lib/mock/fc44x80/build.log:Tests failed : 0
-el9, el10, fc43:
- 3 Bug #74341 (openssl_x509_parse fails to parse ASN.1 UTCTime without seconds) [ext/openssl/tests/bug74341.phpt]
-fc43:
- 3 X (PCRE_EXTRA) modifier is ignored (no error, no change) [ext/pcre/tests/pcre_extra.phpt]
- 3 preg_split() [ext/pcre/tests/split.phpt]
- 3 preg_grep() 2nd test [ext/pcre/tests/grep2.phpt]
-all
- 3 sni_server [ext/openssl/tests/sni_server.phpt]
- 3 sni_server with separate pk and cert [ext/openssl/tests/sni_server_key_cert.phpt]
1 proc_open give erratic test results :(
diff --git a/php-gh22187.patch b/php-gh22187.patch
new file mode 100644
index 0000000..04acf37
--- /dev/null
+++ b/php-gh22187.patch
@@ -0,0 +1,119 @@
+From 2a73e91a9f9136fbbfcc9177573b6af71e3d5dce Mon Sep 17 00:00:00 2001
+From: David Carlier <devnexen@gmail.com>
+Date: Fri, 29 May 2026 21:44:14 +0100
+Subject: [PATCH] ext/openssl: openssl_encrypt() zend mm heap overflow on
+ AES-WRAP-PAD mode.
+
+Fix #22186
+
+close GH-22187
+
+(cherry picked from commit cbc0489126a7682796aad1e5fb4e51de74af162c)
+(cherry picked from commit 95e9851111d249e43948b76663cff1baeb5e758d)
+---
+ NEWS | 6 ++++++
+ ext/openssl/openssl.c | 17 +++++++++++++++--
+ ext/openssl/tests/gh22186.phpt | 32 ++++++++++++++++++++++++++++++++
+ 3 files changed, 53 insertions(+), 2 deletions(-)
+ create mode 100644 ext/openssl/tests/gh22186.phpt
+
+diff --git a/NEWS b/NEWS
+index eb31a08afd..e3cb991135 100644
+--- a/NEWS
++++ b/NEWS
+@@ -1,6 +1,12 @@
+ PHP NEWS
+ |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
++Backported from 8.2.32
++
++- OpenSSL:
++ . Fixed bug GH-22187 (Memory corruption (zend_mm_heap corrupted) in
++ openssl_encrypt with AES-WRAP-PAD). (David Carlier)
++
+ Backported from 8.2.31
+
+ - FPM:
+diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
+index 45a7e79440..73d4f6f699 100644
+--- a/ext/openssl/openssl.c
++++ b/ext/openssl/openssl.c
+@@ -7155,6 +7155,7 @@ static int php_openssl_cipher_update(const EVP_CIPHER *cipher_type,
+ const char *aad, size_t aad_len, int enc) /* {{{ */
+ {
+ int i = 0;
++ size_t outlen = data_len + EVP_CIPHER_block_size(cipher_type);
+
+ if (mode->is_single_run_aead && !EVP_CipherUpdate(cipher_ctx, NULL, &i, NULL, (int)data_len)) {
+ php_openssl_store_errors();
+@@ -7168,7 +7169,19 @@ static int php_openssl_cipher_update(const EVP_CIPHER *cipher_type,
+ return FAILURE;
+ }
+
+- *poutbuf = zend_string_alloc((int)data_len + EVP_CIPHER_block_size(cipher_type), 0);
++#ifdef EVP_CIPH_WRAP_MODE
++ if ((EVP_CIPHER_mode(cipher_type)) == EVP_CIPH_WRAP_MODE) {
++ /*
++ * RFC 5649 wrap-with-padding rounds the input up to the block size
++ * and prepends an integrity block, we reserve one extra block.
++ * See EVP_EncryptUpdate(3): wrap mode may write up to
++ * inl + cipher_block_size bytes.
++ */
++ outlen += EVP_CIPHER_block_size(cipher_type);
++ }
++#endif
++
++ *poutbuf = zend_string_alloc(outlen, false);
+
+ if (!EVP_CipherUpdate(cipher_ctx, (unsigned char*)ZSTR_VAL(*poutbuf),
+ &i, (const unsigned char *)data, (int)data_len)) {
+@@ -7180,7 +7193,7 @@ static int php_openssl_cipher_update(const EVP_CIPHER *cipher_type,
+ }
+ */
+ php_openssl_store_errors();
+- zend_string_release_ex(*poutbuf, 0);
++ zend_string_release_ex(*poutbuf, false);
+ return FAILURE;
+ }
+
+diff --git a/ext/openssl/tests/gh22186.phpt b/ext/openssl/tests/gh22186.phpt
+new file mode 100644
+index 0000000000..8f28e6c45b
+--- /dev/null
++++ b/ext/openssl/tests/gh22186.phpt
+@@ -0,0 +1,32 @@
++--TEST--
++GH-22186 (Heap buffer overflow in openssl_encrypt with AES-WRAP-PAD)
++--EXTENSIONS--
++openssl
++--SKIPIF--
++<?php
++/* openssl_get_cipher_methods() enumerates provider ciphers, but openssl_encrypt()
++ * resolves names via the legacy EVP_get_cipherbyname(), so on some builds the
++ * cipher is listed yet not usable. Probe the actual call path instead. */
++if (!@openssl_encrypt("test", "aes-128-wrap-pad", str_repeat("k", 16),
++ OPENSSL_RAW_DATA | OPENSSL_DONT_ZERO_PAD_KEY, str_repeat("\0", 4))) {
++ die('skip aes-128-wrap-pad not usable on this OpenSSL build');
++}
++?>
++--FILE--
++<?php
++$pass = str_repeat("k", 16);
++$iv = str_repeat("\0", 4);
++
++for ($i = 1; $i < 258; $i++) {
++ $data = str_repeat("a", $i);
++ $enc = openssl_encrypt($data, 'aes-128-wrap-pad', $pass, OPENSSL_RAW_DATA | OPENSSL_DONT_ZERO_PAD_KEY, $iv);
++ $dec = openssl_decrypt($enc, 'aes-128-wrap-pad', $pass, OPENSSL_RAW_DATA | OPENSSL_DONT_ZERO_PAD_KEY, $iv);
++ if ($dec !== $data) {
++ die("mismatch at $i\n");
++ }
++}
++
++echo "done\n";
++?>
++--EXPECT--
++done
+--
+2.54.0
+
diff --git a/php80.spec b/php80.spec
index 1e7a988..9c5a80c 100644
--- a/php80.spec
+++ b/php80.spec
@@ -68,7 +68,7 @@
%endif
# Build firebird extensions, you can disable using --without firebird
-%if 0%{?rhel} == 10
+%if 0%{?rhel} > 10
%bcond_with firebird
%else
%bcond_without firebird
@@ -117,7 +117,7 @@
Summary: PHP scripting language for creating dynamic web sites
Name: php
Version: %{upver}%{?rcver:~%{rcver}}
-Release: 16%{?dist}
+Release: 17%{?dist}
# All files licensed under PHP version 3.01, except
# Zend is licensed under Zend
# TSRM is licensed under BSD
@@ -228,6 +228,7 @@ Patch228: php-cve-2026-6735.patch
Patch229: php-cve-2026-7259.patch
Patch230: php-cve-2026-7568.patch
Patch231: php-cve-2026-7258.patch
+Patch232: php-gh22187.patch
# Fixes for tests (300+)
# Factory is droped from system tzdata
@@ -1279,6 +1280,7 @@ rm ext/openssl/tests/p12_with_extra_certs.p12
%patch -P229 -p1 -b .cve7259
%patch -P230 -p1 -b .cve7268
%patch -P231 -p1 -b .cve7258
+%patch -P232 -p1 -b .gh22187
# Fixes for tests related to tzdata
%patch -P300 -p1 -b .datetests
@@ -1337,6 +1339,12 @@ rm ext/openssl/tests/openssl_error_string_basic_openssl3.phpt
%endif
rm ext/openssl/tests/openssl_private_decrypt_basic.phpt
rm ext/openssl/tests/openssl_x509_parse_basic.phpt
+rm ext/openssl/tests/sni_server.phpt
+rm ext/openssl/tests/sni_server_key_cert.phpt
+rm ext/openssl/tests/bug74341.phpt
+rm ext/pcre/tests/pcre_extra.phpt
+rm ext/pcre/tests/split.phpt
+rm ext/pcre/tests/grep2.phpt
# avoid issue when 2 builds run simultaneously (keep 64321 for the SCL)
%ifarch x86_64
@@ -2294,6 +2302,9 @@ EOF
%changelog
+* Wed Jul 1 2026 Remi Collet <remi@remirepo.net> - 8.0.30-17
+- Fix Memory corruption (zend_mm_heap corrupted) in openssl_encrypt with AES-WRAP-PAD
+
* Mon May 11 2026 Remi Collet <remi@remirepo.net> - 8.0.30-16
- Fix XSS within status endpoint
CVE-2026-6735