Skip to content

Commit

Permalink
- MFH: CVE-2007-1001, integer overflow with invalid wbmp images
Browse files Browse the repository at this point in the history
  • Loading branch information
pierrejoye committed Mar 10, 2007
1 parent 0edbc8d commit 3332377
Show file tree
Hide file tree
Showing 7 changed files with 109 additions and 1 deletion.
1 change: 1 addition & 0 deletions NEWS
@@ -1,6 +1,7 @@
PHP 4 NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? 2007, Version 4.4.7
- Fixed CVE-2007-1001, GD wbmp used with invalid image size (Pierre)
- Fixed bug #40747 (possible crash in session when save_path is out of
open_basedir). (Tony)

Expand Down
2 changes: 1 addition & 1 deletion ext/gd/config.m4
Expand Up @@ -273,7 +273,7 @@ if test "$PHP_GD" = "yes"; then
libgd/gdxpm.c libgd/gdfontt.c libgd/gdfonts.c libgd/gdfontmb.c libgd/gdfontl.c \
libgd/gdfontg.c libgd/gdtables.c libgd/gdft.c libgd/gdcache.c libgd/gdkanji.c \
libgd/wbmp.c libgd/gd_wbmp.c libgd/gdhelpers.c libgd/gd_topal.c libgd/gd_gif_in.c \
libgd/xbm.c libgd/gd_gif_out.c "
libgd/xbm.c libgd/gd_gif_out.c libgd/gd_security.c"

dnl check for fabsf and floorf which are available since C99
AC_CHECK_FUNCS(fabsf floorf)
Expand Down
4 changes: 4 additions & 0 deletions ext/gd/gd.dsp

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

33 changes: 33 additions & 0 deletions ext/gd/libgd/gd_security.c
@@ -0,0 +1,33 @@
/*
* gd_security.c
*
* Implements buffer overflow check routines.
*
* Written 2004, Phil Knirsch.
* Based on netpbm fixes by Alan Cox.
*
*/

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include "gd.h"

int overflow2(int a, int b)
{
if(a < 0 || b < 0) {
php_gd_error("gd warning: one parameter to a memory allocation multiplication is negative, failing operation gracefully\n");
return 1;
}
if(b == 0)
return 0;
if(a > INT_MAX / b) {
php_gd_error("gd warning: product of memory allocation multiplication would exceed INT_MAX, failing operation gracefully\n");
return 1;
}
return 0;
}
7 changes: 7 additions & 0 deletions ext/gd/libgd/gdhelpers.h
Expand Up @@ -21,6 +21,13 @@ extern char *gd_strtok_r(char *s, char *sep, char **state);
#define gdPFree(ptr) pefree(ptr, 1)
#define gdPEstrdup(ptr) pestrdup(ptr, 1)

/* Returns nonzero if multiplying the two quantities will
result in integer overflow. Also returns nonzero if
either quantity is negative. By Phil Knirsch based on
netpbm fixes by Alan Cox. */

int overflow2(int a, int b);

#ifdef ZTS
#define gdMutexDeclare(x) MUTEX_T x
#define gdMutexSetup(x) x = tsrm_mutex_alloc()
Expand Down
16 changes: 16 additions & 0 deletions ext/gd/libgd/wbmp.c
Expand Up @@ -116,6 +116,15 @@ createwbmp (int width, int height, int color)
if ((wbmp = (Wbmp *) gdMalloc (sizeof (Wbmp))) == NULL)
return (NULL);

if (overflow2(sizeof (int), width)) {
gdFree(wbmp);
return NULL;
}
if (overflow2(sizeof (int) * width, height)) {
gdFree(wbmp);
return NULL;
}

if ((wbmp->bitmap = (int *) safe_emalloc(sizeof(int), (width * height), 0)) == NULL)
{
gdFree (wbmp);
Expand Down Expand Up @@ -176,6 +185,13 @@ readwbmp (int (*getin) (void *in), void *in, Wbmp ** return_wbmp)
printf ("W: %d, H: %d\n", wbmp->width, wbmp->height);
#endif

if (overflow2(sizeof (int), wbmp->width) ||
overflow2(sizeof (int) * wbmp->width, wbmp->height))
{
gdFree(wbmp);
return (-1);
}

if ((wbmp->bitmap = (int *) safe_emalloc(sizeof(int), (wbmp->width * wbmp->height), 0)) == NULL)
{
gdFree (wbmp);
Expand Down
47 changes: 47 additions & 0 deletions ext/gd/tests/createfromwbmp2.phpt
@@ -0,0 +1,47 @@
--TEST--
imagecreatefromwbmp with invalid wbmp
--SKIPIF--
<?php
if (!function_exists('imagecreatefromwbmp')) die("skip gd extension not available\n");
?>
--FILE--
<?php
$filename = dirname(__FILE__) . '/_tmp.wbmp';
$fp = fopen($filename,"wb");
if (!$fp) {
exit("Failed to create <$filename>");
}

//write header
$c = 0;
fputs($fp, chr($c), 1);
fputs($fp, $c, 1);

//write width = 2^32 / 4 + 1
$c = 0x84;
fputs($fp, chr($c), 1);
$c = 0x80;
fputs($fp, chr($c), 1);
fputs($fp, chr($c), 1);
fputs($fp, chr($c), 1);
$c = 0x01;
fputs($fp, chr($c), 1);

/*write height = 4*/
$c = 0x04;
fputs($fp, chr($c), 1);

/*write some data to cause overflow*/
for ($i=0; $i<10000; $i++) {
fwrite($fp, chr($c), 1);
}

fclose($fp);
$im = imagecreatefromwbmp($filename);
unlink($filename);
?>
--EXPECTF--
Warning: imagecreatefromwbmp() [/phpmanual/function.imagecreatefromwbmp.html]: gd warning: product of memory allocation multiplication would exceed INT_MAX, failing operation gracefully
in %s on line %d

Warning: imagecreatefromwbmp() [/phpmanual/function.imagecreatefromwbmp.html]: '%s' is not a valid WBMP file in %s on line %d

0 comments on commit 3332377

Please sign in to comment.