Skip to content

Array assignment fails when the array has been resized in error handler #13754

@m4p1e

Description

@m4p1e

Description

The simple reproduction code as follows.

<?php
$array = range(0, 7);

class helper{
  public $a1;
  public $a2;
  public $a3;
  public $a4;
  public $a5;
  public $a6;
  public $a7;
  public $a8;
  public $a9;
  public $a10;
  public $a11;
  public $a12;
  public $a13;
  public $a14;

  public function hello() {
    echo "maple";
  }
}
set_error_handler(function($err, $msg) {
  global $array;
  global $helper;
  $array[] = 1; // force resize
  $helper = new helper();
});
 
function crash() {
  global $array;
  global $helper;
  $array[0] = $var; // undefined notice
  $helper->hello();
  $helper->$a1 = 1337;
}
 
crash();

Resulted in this output:

crashed for segmentfault.

But I expected this output instead:

no crash.

This has been an issue for years (at least I learned about it 4 years ago). I wrote a paper for exploiting this as a security vulnerability.

PHP Version

PHP 8.3.3

Operating System

Ubuntu 20.04

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions