mirror of
https://github.com/php/php-src.git
synced 2024-11-28 12:26:37 +08:00
Fix bug #72928 - Out of bound when verify signature of zip phar in phar_parse_zipfile
(cherry picked from commit 19484ab77466f99c78fc0e677f7e03da0584d6a2)
This commit is contained in:
parent
1b2007dada
commit
0bfb970f43
18
ext/phar/tests/bug72928.phpt
Normal file
18
ext/phar/tests/bug72928.phpt
Normal file
@ -0,0 +1,18 @@
|
||||
--TEST--
|
||||
Phar: #72928 (Out of bound when verify signature of zip phar in phar_parse_zipfile)
|
||||
--SKIPIF--
|
||||
<?php if (!extension_loaded("phar")) die("skip"); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
chdir(__DIR__);
|
||||
try {
|
||||
$phar = new PharData('bug72928.zip');
|
||||
var_dump($phar);
|
||||
} catch(UnexpectedValueException $e) {
|
||||
print $e->getMessage()."\n";
|
||||
}
|
||||
?>
|
||||
DONE
|
||||
--EXPECTF--
|
||||
phar error: signature cannot be read in zip-based phar "%sbug72928.zip"
|
||||
DONE
|
BIN
ext/phar/tests/bug72928.zip
Normal file
BIN
ext/phar/tests/bug72928.zip
Normal file
Binary file not shown.
@ -1609,6 +1609,13 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
|
||||
unsigned char digest[64];
|
||||
PHP_SHA512_CTX context;
|
||||
|
||||
if (sig_len < sizeof(digest)) {
|
||||
if (error) {
|
||||
spprintf(error, 0, "broken signature");
|
||||
}
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
PHP_SHA512Init(&context);
|
||||
read_len = end_of_phar;
|
||||
|
||||
@ -1642,6 +1649,13 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
|
||||
unsigned char digest[32];
|
||||
PHP_SHA256_CTX context;
|
||||
|
||||
if (sig_len < sizeof(digest)) {
|
||||
if (error) {
|
||||
spprintf(error, 0, "broken signature");
|
||||
}
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
PHP_SHA256Init(&context);
|
||||
read_len = end_of_phar;
|
||||
|
||||
@ -1683,6 +1697,13 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
|
||||
unsigned char digest[20];
|
||||
PHP_SHA1_CTX context;
|
||||
|
||||
if (sig_len < sizeof(digest)) {
|
||||
if (error) {
|
||||
spprintf(error, 0, "broken signature");
|
||||
}
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
PHP_SHA1Init(&context);
|
||||
read_len = end_of_phar;
|
||||
|
||||
@ -1716,6 +1737,13 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
|
||||
unsigned char digest[16];
|
||||
PHP_MD5_CTX context;
|
||||
|
||||
if (sig_len < sizeof(digest)) {
|
||||
if (error) {
|
||||
spprintf(error, 0, "broken signature");
|
||||
}
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
PHP_MD5Init(&context);
|
||||
read_len = end_of_phar;
|
||||
|
||||
|
@ -418,7 +418,7 @@ foundit:
|
||||
php_stream_seek(fp, sizeof(phar_zip_file_header) + entry.header_offset + entry.filename_len + PHAR_GET_16(zipentry.extra_len), SEEK_SET);
|
||||
sig = (char *) emalloc(entry.uncompressed_filesize);
|
||||
read = php_stream_read(fp, sig, entry.uncompressed_filesize);
|
||||
if (read != entry.uncompressed_filesize) {
|
||||
if (read != entry.uncompressed_filesize || read <= 8) {
|
||||
php_stream_close(sigfile);
|
||||
efree(sig);
|
||||
PHAR_ZIP_FAIL("signature cannot be read");
|
||||
|
Loading…
Reference in New Issue
Block a user