Skip to content

Commit 248f647

Browse files
committed
Fix bug #81738 (buffer overflow in hash_update() on long parameter)
1 parent ad8d00b commit 248f647

File tree

4 files changed

+25
-17
lines changed

4 files changed

+25
-17
lines changed

Diff for: NEWS

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ PHP NEWS
22
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
33
?? ??? ????, PHP 7.4.33
44

5+
- Hash:
6+
. Fixed bug #81738: buffer overflow in hash_update() on long parameter.
7+
(CVE-2022-37454) (nicky at mouha dot be)
8+
59
29 Sep 2022, PHP 7.4.32
610

711
- Core:

Diff for: ext/hash/sha3/generic32lc/KeccakSponge.inc

+8-6
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ int SpongeAbsorb(SpongeInstance *instance, const unsigned char *data, size_t dat
160160
i = 0;
161161
curData = data;
162162
while(i < dataByteLen) {
163-
if ((instance->byteIOIndex == 0) && (dataByteLen >= (i + rateInBytes))) {
163+
if ((instance->byteIOIndex == 0) && (dataByteLen-i >= rateInBytes)) {
164164
#ifdef SnP_FastLoop_Absorb
165165
/* processing full blocks first */
166166
if ((rateInBytes % (SnP_width/200)) == 0) {
@@ -186,9 +186,10 @@ int SpongeAbsorb(SpongeInstance *instance, const unsigned char *data, size_t dat
186186
}
187187
else {
188188
/* normal lane: using the message queue */
189-
partialBlock = (unsigned int)(dataByteLen - i);
190-
if (partialBlock+instance->byteIOIndex > rateInBytes)
189+
if (dataByteLen-i > rateInBytes-instance->byteIOIndex)
191190
partialBlock = rateInBytes-instance->byteIOIndex;
191+
else
192+
partialBlock = (unsigned int)(dataByteLen - i);
192193
#ifdef KeccakReference
193194
displayBytes(1, "Block to be absorbed (part)", curData, partialBlock);
194195
#endif
@@ -263,7 +264,7 @@ int SpongeSqueeze(SpongeInstance *instance, unsigned char *data, size_t dataByte
263264
i = 0;
264265
curData = data;
265266
while(i < dataByteLen) {
266-
if ((instance->byteIOIndex == rateInBytes) && (dataByteLen >= (i + rateInBytes))) {
267+
if ((instance->byteIOIndex == rateInBytes) && (dataByteLen-i >= rateInBytes)) {
267268
for(j=dataByteLen-i; j>=rateInBytes; j-=rateInBytes) {
268269
SnP_Permute(instance->state);
269270
SnP_ExtractBytes(instance->state, curData, 0, rateInBytes);
@@ -280,9 +281,10 @@ int SpongeSqueeze(SpongeInstance *instance, unsigned char *data, size_t dataByte
280281
SnP_Permute(instance->state);
281282
instance->byteIOIndex = 0;
282283
}
283-
partialBlock = (unsigned int)(dataByteLen - i);
284-
if (partialBlock+instance->byteIOIndex > rateInBytes)
284+
if (dataByteLen-i > rateInBytes-instance->byteIOIndex)
285285
partialBlock = rateInBytes-instance->byteIOIndex;
286+
else
287+
partialBlock = (unsigned int)(dataByteLen - i);
286288
i += partialBlock;
287289

288290
SnP_ExtractBytes(instance->state, curData, instance->byteIOIndex, partialBlock);

Diff for: ext/hash/sha3/generic64lc/KeccakSponge.inc

+8-6
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ int SpongeAbsorb(SpongeInstance *instance, const unsigned char *data, size_t dat
160160
i = 0;
161161
curData = data;
162162
while(i < dataByteLen) {
163-
if ((instance->byteIOIndex == 0) && (dataByteLen >= (i + rateInBytes))) {
163+
if ((instance->byteIOIndex == 0) && (dataByteLen-i >= rateInBytes)) {
164164
#ifdef SnP_FastLoop_Absorb
165165
/* processing full blocks first */
166166
if ((rateInBytes % (SnP_width/200)) == 0) {
@@ -186,9 +186,10 @@ int SpongeAbsorb(SpongeInstance *instance, const unsigned char *data, size_t dat
186186
}
187187
else {
188188
/* normal lane: using the message queue */
189-
partialBlock = (unsigned int)(dataByteLen - i);
190-
if (partialBlock+instance->byteIOIndex > rateInBytes)
189+
if (dataByteLen-i > rateInBytes-instance->byteIOIndex)
191190
partialBlock = rateInBytes-instance->byteIOIndex;
191+
else
192+
partialBlock = (unsigned int)(dataByteLen - i);
192193
#ifdef KeccakReference
193194
displayBytes(1, "Block to be absorbed (part)", curData, partialBlock);
194195
#endif
@@ -263,7 +264,7 @@ int SpongeSqueeze(SpongeInstance *instance, unsigned char *data, size_t dataByte
263264
i = 0;
264265
curData = data;
265266
while(i < dataByteLen) {
266-
if ((instance->byteIOIndex == rateInBytes) && (dataByteLen >= (i + rateInBytes))) {
267+
if ((instance->byteIOIndex == rateInBytes) && (dataByteLen-i >= rateInBytes)) {
267268
for(j=dataByteLen-i; j>=rateInBytes; j-=rateInBytes) {
268269
SnP_Permute(instance->state);
269270
SnP_ExtractBytes(instance->state, curData, 0, rateInBytes);
@@ -280,9 +281,10 @@ int SpongeSqueeze(SpongeInstance *instance, unsigned char *data, size_t dataByte
280281
SnP_Permute(instance->state);
281282
instance->byteIOIndex = 0;
282283
}
283-
partialBlock = (unsigned int)(dataByteLen - i);
284-
if (partialBlock+instance->byteIOIndex > rateInBytes)
284+
if (dataByteLen-i > rateInBytes-instance->byteIOIndex)
285285
partialBlock = rateInBytes-instance->byteIOIndex;
286+
else
287+
partialBlock = (unsigned int)(dataByteLen - i);
286288
i += partialBlock;
287289

288290
SnP_ExtractBytes(instance->state, curData, instance->byteIOIndex, partialBlock);

Diff for: main/php_version.h

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
/* automatically generated by configure */
22
/* edit configure.ac to change version number */
3-
#define PHP_MAJOR_VERSION 7
4-
#define PHP_MINOR_VERSION 4
5-
#define PHP_RELEASE_VERSION 31
3+
#define PHP_MAJOR_VERSION 8
4+
#define PHP_MINOR_VERSION 2
5+
#define PHP_RELEASE_VERSION 0
66
#define PHP_EXTRA_VERSION "-dev"
7-
#define PHP_VERSION "7.4.31-dev"
8-
#define PHP_VERSION_ID 70431
7+
#define PHP_VERSION "8.2.0-dev"
8+
#define PHP_VERSION_ID 80200

0 commit comments

Comments
 (0)