Saturation of ArrayObject iterator leads to UAF
@iliaal já está trabalhando nisso.
Desde 21/8/2026.
Avaliação
Esta issue ainda não foi avaliada.
Descrição
Description
The following code:
<?php
$owner = new ArrayObject(['entry' => 1337]);
$iterators = [];
for ($i = 0; $i < 255; $i++) {
$it = $owner->getIterator();
$it->rewind();
$iterators[] = $it;
}
unset($it);
$array = (array) $owner;
$pass = 0;
$retained = null;
foreach ($array as &$value) {
if (++$pass === 1) {
$retained = $array;
$array = ['replacement' => 4242];
continue;
}
for ($i = 0; $i < 254; $i++) {
unset($iterators[$i]);
}
$retained = null;
unset($iterators[254]);
}
echo "done\n";
Resulted in this output, on a debug build:
Assertion failed: ((iter->ht)->u.v.nIteratorsCount != 0),
function zend_hash_iterator_del, file zend_hash.c, line 662.
And on an ASan build run with USE_ZEND_ALLOC=0:
==2898==ERROR: AddressSanitizer: heap-use-after-free on address 0x60600001ceea at pc 0x00010503b8e8
READ of size 1 at 0x60600001ceea thread T0
#0 0x00010503b8e4 in zend_hash_iterator_del zend_hash.c:661
#1 0x00010503cdec in zend_hash_remove_iterator_copies zend_hash.c:530
#2 0x00010503c1c4 in zend_hash_iterator_del zend_hash.c:668
#3 0x000102a29830 in spl_array_object_free_storage spl_array.c:137
#4 0x00010546e1d8 in zend_objects_store_del zend_objects_API.c:193
[...]
#10 0x000104aa3710 in ZEND_UNSET_DIM_SPEC_CV_CONST_TAILCALL_HANDLER zend_vm_execute.h:97037
0x60600001ceea is located 10 bytes inside of 56-byte region [0x60600001cee0,0x60600001cf18)
freed by thread T0 here:
#0 0x00010874d258 in free+0x7c (libclang_rt.asan_osx_dynamic.dylib:arm64e+0x41258)
#1 0x000103ca11d0 in __zend_free zend_alloc.c:3571
#2 0x000103cab690 in _efree zend_alloc.c:2788
#3 0x00010505e23c in zend_array_destroy zend_hash.c:1881
#4 0x0001055a114c in rc_dtor_func zend_variables.c:56
#5 0x000104eb8630 in zend_assign_to_variable zend_execute.h:184
[...]
Because of the trace, we suspect this can happen without ArrayObject and that's just a "convenient" way to trigger this, but I wasn't able to create a reproducer that doesn't use ArrayObject.
PHP Version
master
Operating System
No response
- Linguagem predominante
- C
- Estrelas
- 40.4k
- Forks
- 8.2k
- Merge médio
- 2d 17h
- PRs com merge (30d)
- 115
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de php/php-src
-
Bug Status: Needs Triage
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
-
Bug Status: Needs Triage
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 90/100
-
Bug Status: Needs Triage
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
-
Flaky hrtime.phpt test AbertaBug Category: Tests Status: Verified
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
-
Bug SAPI: fpm Status: Needs Triage
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
Todas as issues de php/php-src
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
duckdb/duckdb-wasm#2258 ·
-
how does install.sh work Aberta
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 90/100
rofl0r/microsocks#110 ·
-
OTA is not aborted correctly Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
espressif/esp-aws-iot#261 ·
-
os:linux
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
mpv-player/mpv#18510 · 2 comentários ·
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 85/100