Bug #72154 [Opn->Csd]: pcntl_wait/pcntl_waitpid array internal structure overwrite

From: Date: Thu, 05 May 2016 07:18:39 +0000
Subject: Bug #72154 [Opn->Csd]: pcntl_wait/pcntl_waitpid array internal structure overwrite
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-200905@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=72154&edit=1 ID: 72154 Updated by: laruence@php.net Reported by: shm@php.net Summary: pcntl_wait/pcntl_waitpid array internal structure overwrite -Status: Open +Status: Closed Type: Bug Package: PCNTL related PHP Version: 7.0.6 Block user comment: N Private report: N New Comment: Automatic comment on behalf of laruence@gmail.com Revision: http://git.php.net/?p=php-src.git;a=commit;h=c15b6134f612948af39c9889b599a8c57e6bdad6 Log: Fixed bug #72154 (pcntl_wait/pcntl_waitpid array internal structure overwrite) Previous Comments: ------------------------------------------------------------------------ [2016-05-04 13:29:42] shm@php.net Description: ------------ If status and r_usage is the same variable, then z_rusage (if not an array) is destroyed by zval_dtor() and array in that place is created. Later status variable (which is now an array) value is overwritten by 32 bits value which comes from wait/waitpid output. An attacker is able to control internal structure of array fields, which may lead to code execution. Test script: --------------- <?php $b = 666; var_dump($b); $c = &$b; $var5 = pcntl_wait($b,0,$c); unset($b); or <?php $b = 666; var_dump($b); $c = &$b; $var5 = pcntl_waitpid(0,$b,0,$c); unset($b); Expected result: ---------------- No crash Actual result: -------------- $ ./php pcntl_wait.php int(666) ASAN:SIGSEGV ================================================================= ==5772== ERROR: AddressSanitizer: SEGV on unknown address 0x0000000002a0 (pc 0x0000010d9674 sp 0x7fff2006d5a0 bp 0x7fff2006d650 T0) AddressSanitizer can not provide additional info. #0 0x10d9673 (/home/shm/src/php-7.0.6/sapi/cli/php+0x10d9673) #1 0x10003d0 (/home/shm/src/php-7.0.6/sapi/cli/php+0x10003d0) #2 0x100062b (/home/shm/src/php-7.0.6/sapi/cli/php+0x100062b) #3 0xf159b9 (/home/shm/src/php-7.0.6/sapi/cli/php+0xf159b9) #4 0xda5183 (/home/shm/src/php-7.0.6/sapi/cli/php+0xda5183) #5 0x112c592 (/home/shm/src/php-7.0.6/sapi/cli/php+0x112c592) #6 0x112eb6e (/home/shm/src/php-7.0.6/sapi/cli/php+0x112eb6e) #7 0x7ffae7ac9ec4 (/lib/x86_64-linux-gnu/libc-2.19.so+0x21ec4) #8 0x424758 (/home/shm/src/php-7.0.6/sapi/cli/php+0x424758) ==5772== ABORTING $ ./php pcntl_waitpid.php int(666) ASAN:SIGSEGV ================================================================= ==10726== ERROR: AddressSanitizer: SEGV on unknown address 0x0000000002a0 (pc 0x0000010d9674 sp 0x7fffdb64b9d0 bp 0x7fffdb64ba80 T0) AddressSanitizer can not provide additional info. #0 0x10d9673 (/home/shm/src/php-7.0.6/sapi/cli/php+0x10d9673) #1 0x10003d0 (/home/shm/src/php-7.0.6/sapi/cli/php+0x10003d0) #2 0x100062b (/home/shm/src/php-7.0.6/sapi/cli/php+0x100062b) #3 0xf159b9 (/home/shm/src/php-7.0.6/sapi/cli/php+0xf159b9) #4 0xda5183 (/home/shm/src/php-7.0.6/sapi/cli/php+0xda5183) #5 0x112c592 (/home/shm/src/php-7.0.6/sapi/cli/php+0x112c592) #6 0x112eb6e (/home/shm/src/php-7.0.6/sapi/cli/php+0x112eb6e) #7 0x7f5a76ad1ec4 (/lib/x86_64-linux-gnu/libc-2.19.so+0x21ec4) #8 0x424758 (/home/shm/src/php-7.0.6/sapi/cli/php+0x424758) ==10726== ABORTING 0x00000000010d9674 in ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER () at /home/shm/src/php-7.0.6/Zend/zend_vm_execute.h:34890 34890 if (Z_COLLECTABLE_P(z) && UNEXPECTED(!Z_GC_INFO_P(z))) { gdb-peda$ bt #0 0x00000000010d9674 in ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER () at /home/shm/src/php-7.0.6/Zend/zend_vm_execute.h:34890 #1 0x00000000010003d1 in execute_ex (ex=0x7ffff3413030) at /home/shm/src/php-7.0.6/Zend/zend_vm_execute.h:414 #2 0x000000000100062c in zend_execute (op_array=0x7ffff347f000, return_value=0x0) at /home/shm/src/php-7.0.6/Zend/zend_vm_execute.h:458 #3 0x0000000000f159ba in zend_execute_scripts (type=0x8, retval=0x0, file_count=0x3) at /home/shm/src/php-7.0.6/Zend/zend.c:1427 #4 0x0000000000da5184 in php_execute_script (primary_file=0x7fffffffcbc0) at /home/shm/src/php-7.0.6/main/main.c:2494 #5 0x000000000112c593 in do_cli (argc=0x2, argv=0x60060000edd0) at /home/shm/src/php-7.0.6/sapi/cli/php_cli.c:974 #6 0x000000000112eb6f in main (argc=0x2, argv=0x60060000edd0) at /home/shm/src/php-7.0.6/sapi/cli/php_cli.c:1344 #7 0x00007ffff401bec5 in __libc_start_main (main=0x112d647 <main>, argc=0x2, argv=0x7fffffffe0c8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe0b8) at libc-start.c:287 #8 0x0000000000424759 in _start () gdb-peda$ print z $1 = (zval *) 0x7ffff34570e8 gdb-peda$ print *z $2 = { value = { lval = 0x29a, dval = 3.290477201302702e-321, counted = 0x29a, str = 0x29a, arr = 0x29a, obj = 0x29a, res = 0x29a, ref = 0x29a, ast = 0x29a, zv = 0x29a, ptr = 0x29a, ce = 0x29a, func = 0x29a, ww = { w1 = 0x29a, w2 = 0x0 } }, u1 = { v = { type = 0x7, type_flags = 0x1c, const_flags = 0x0, reserved = 0x0 }, type_info = 0x1c07 }, u2 = { var_flags = 0x0, next = 0x0, cache_slot = 0x0, lineno = 0x0, num_args = 0x0, fe_pos = 0x0, fe_iter_idx = 0x0 } } ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=72154&edit=1

« previous php.bugs (#200905) next »