diff options
| -rw-r--r-- | php-bug81738.patch | 129 | ||||
| -rw-r--r-- | php.spec | 8 | 
2 files changed, 136 insertions, 1 deletions
| diff --git a/php-bug81738.patch b/php-bug81738.patch new file mode 100644 index 0000000..6fceeab --- /dev/null +++ b/php-bug81738.patch @@ -0,0 +1,129 @@ +From 4b1f3b84336a26db9649c5175e29984fa1b54950 Mon Sep 17 00:00:00 2001 +From: Stanislav Malyshev <smalyshev@gmail.com> +Date: Thu, 20 Oct 2022 23:57:35 -0600 +Subject: [PATCH] Fix bug #81738 (buffer overflow in hash_update() on long + parameter) + +(cherry picked from commit de4517ad607df8d4cb3735228b39e4a48f95556c) +--- + NEWS                                       |  6 ++++++ + ext/hash/sha3/generic32lc/KeccakSponge.inc | 14 ++++++++------ + ext/hash/sha3/generic64lc/KeccakSponge.inc | 14 ++++++++------ + 3 files changed, 22 insertions(+), 12 deletions(-) + +diff --git a/NEWS b/NEWS +index e31f007ad0..b6e3c4fe6c 100644 +--- a/NEWS ++++ b/NEWS +@@ -1,6 +1,12 @@ + PHP                                                                        NEWS + ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +  ++Backported from 7.4.33 ++ ++- Hash: ++  . Fixed bug #81738: buffer overflow in hash_update() on long parameter. ++    (CVE-2022-37454) (nicky at mouha dot be) ++ + Backported from 7.4.32 +  + - Core: +diff --git a/ext/hash/sha3/generic32lc/KeccakSponge.inc b/ext/hash/sha3/generic32lc/KeccakSponge.inc +index 42a15aac6d..f8c42ff788 100644 +--- a/ext/hash/sha3/generic32lc/KeccakSponge.inc ++++ b/ext/hash/sha3/generic32lc/KeccakSponge.inc +@@ -160,7 +160,7 @@ int SpongeAbsorb(SpongeInstance *instance, const unsigned char *data, size_t dat +     i = 0; +     curData = data; +     while(i < dataByteLen) { +-        if ((instance->byteIOIndex == 0) && (dataByteLen >= (i + rateInBytes))) { ++        if ((instance->byteIOIndex == 0) && (dataByteLen-i >= rateInBytes)) { + #ifdef SnP_FastLoop_Absorb +             /* processing full blocks first */ +             if ((rateInBytes % (SnP_width/200)) == 0) { +@@ -186,9 +186,10 @@ int SpongeAbsorb(SpongeInstance *instance, const unsigned char *data, size_t dat +         } +         else { +             /* normal lane: using the message queue */ +-            partialBlock = (unsigned int)(dataByteLen - i); +-            if (partialBlock+instance->byteIOIndex > rateInBytes) ++            if (dataByteLen-i > rateInBytes-instance->byteIOIndex) +                 partialBlock = rateInBytes-instance->byteIOIndex; ++            else ++                partialBlock = (unsigned int)(dataByteLen - i); +             #ifdef KeccakReference +             displayBytes(1, "Block to be absorbed (part)", curData, partialBlock); +             #endif +@@ -263,7 +264,7 @@ int SpongeSqueeze(SpongeInstance *instance, unsigned char *data, size_t dataByte +     i = 0; +     curData = data; +     while(i < dataByteLen) { +-        if ((instance->byteIOIndex == rateInBytes) && (dataByteLen >= (i + rateInBytes))) { ++        if ((instance->byteIOIndex == rateInBytes) && (dataByteLen-i >= rateInBytes)) { +             for(j=dataByteLen-i; j>=rateInBytes; j-=rateInBytes) { +                 SnP_Permute(instance->state); +                 SnP_ExtractBytes(instance->state, curData, 0, rateInBytes); +@@ -280,9 +281,10 @@ int SpongeSqueeze(SpongeInstance *instance, unsigned char *data, size_t dataByte +                 SnP_Permute(instance->state); +                 instance->byteIOIndex = 0; +             } +-            partialBlock = (unsigned int)(dataByteLen - i); +-            if (partialBlock+instance->byteIOIndex > rateInBytes) ++            if (dataByteLen-i > rateInBytes-instance->byteIOIndex) +                 partialBlock = rateInBytes-instance->byteIOIndex; ++            else ++                partialBlock = (unsigned int)(dataByteLen - i); +             i += partialBlock; +  +             SnP_ExtractBytes(instance->state, curData, instance->byteIOIndex, partialBlock); +diff --git a/ext/hash/sha3/generic64lc/KeccakSponge.inc b/ext/hash/sha3/generic64lc/KeccakSponge.inc +index 42a15aac6d..f8c42ff788 100644 +--- a/ext/hash/sha3/generic64lc/KeccakSponge.inc ++++ b/ext/hash/sha3/generic64lc/KeccakSponge.inc +@@ -160,7 +160,7 @@ int SpongeAbsorb(SpongeInstance *instance, const unsigned char *data, size_t dat +     i = 0; +     curData = data; +     while(i < dataByteLen) { +-        if ((instance->byteIOIndex == 0) && (dataByteLen >= (i + rateInBytes))) { ++        if ((instance->byteIOIndex == 0) && (dataByteLen-i >= rateInBytes)) { + #ifdef SnP_FastLoop_Absorb +             /* processing full blocks first */ +             if ((rateInBytes % (SnP_width/200)) == 0) { +@@ -186,9 +186,10 @@ int SpongeAbsorb(SpongeInstance *instance, const unsigned char *data, size_t dat +         } +         else { +             /* normal lane: using the message queue */ +-            partialBlock = (unsigned int)(dataByteLen - i); +-            if (partialBlock+instance->byteIOIndex > rateInBytes) ++            if (dataByteLen-i > rateInBytes-instance->byteIOIndex) +                 partialBlock = rateInBytes-instance->byteIOIndex; ++            else ++                partialBlock = (unsigned int)(dataByteLen - i); +             #ifdef KeccakReference +             displayBytes(1, "Block to be absorbed (part)", curData, partialBlock); +             #endif +@@ -263,7 +264,7 @@ int SpongeSqueeze(SpongeInstance *instance, unsigned char *data, size_t dataByte +     i = 0; +     curData = data; +     while(i < dataByteLen) { +-        if ((instance->byteIOIndex == rateInBytes) && (dataByteLen >= (i + rateInBytes))) { ++        if ((instance->byteIOIndex == rateInBytes) && (dataByteLen-i >= rateInBytes)) { +             for(j=dataByteLen-i; j>=rateInBytes; j-=rateInBytes) { +                 SnP_Permute(instance->state); +                 SnP_ExtractBytes(instance->state, curData, 0, rateInBytes); +@@ -280,9 +281,10 @@ int SpongeSqueeze(SpongeInstance *instance, unsigned char *data, size_t dataByte +                 SnP_Permute(instance->state); +                 instance->byteIOIndex = 0; +             } +-            partialBlock = (unsigned int)(dataByteLen - i); +-            if (partialBlock+instance->byteIOIndex > rateInBytes) ++            if (dataByteLen-i > rateInBytes-instance->byteIOIndex) +                 partialBlock = rateInBytes-instance->byteIOIndex; ++            else ++                partialBlock = (unsigned int)(dataByteLen - i); +             i += partialBlock; +  +             SnP_ExtractBytes(instance->state, curData, instance->byteIOIndex, partialBlock); +--  +2.37.3 + @@ -126,7 +126,7 @@  Summary: PHP scripting language for creating dynamic web sites  Name: %{?scl_prefix}php  Version: %{upver}%{?rcver:~%{rcver}} -Release: 13%{?dist} +Release: 14%{?dist}  # All files licensed under PHP version 3.01, except  # Zend is licensed under Zend  # TSRM is licensed under BSD @@ -204,6 +204,7 @@ Patch208: php-bug81719.patch  Patch209: php-bug81720.patch  Patch210: php-bug81727.patch  Patch211: php-bug81726.patch +Patch212: php-bug81738.patch  # Fixes for tests (300+)  # Factory is droped from system tzdata @@ -975,6 +976,7 @@ sed -e 's/php-devel/%{?scl_prefix}php-devel/' -i scripts/phpize.in  %patch209 -p1 -b .bug81720  %patch210 -p1 -b .bug81727  %patch211 -p1 -b .bug81726 +%patch212 -p1 -b .bug81738  # Fixes for tests  %patch300 -p1 -b .datetests @@ -1945,6 +1947,10 @@ EOF  %changelog +* Mon Oct 24 2022 Remi Collet <remi@remirepo.net> - 7.2.34-14 +- hash: fix #81738: buffer overflow in hash_update() on long parameter. +  CVE-2022-37454 +  * Tue Sep 27 2022 Remi Collet <remi@remirepo.net> - 7.2.34-13  - phar: fix #81726 DOS when using quine gzip file. CVE-2022-31628  - core: fix #81727 Don't mangle HTTP variable names that clash with ones | 
