Baike.dev
All toolsAI codingTrendingOpen sourceNewsSubmit
Log in
Back to tool/Back to issues
#23730·php-src

oob read possible in dom

Author: djarflukaCreated Sep 17, 2026Updated Sep 17, 2026
LabelsBugStatus: Needs Triage

Description

The following code:

php
<?php
$xml = new DOMDocument();
$xml->loadXML('<root><item>a</item><item>b</item><item>c</item></root>');

$xsl = new DOMDocument();
$xsl->loadXML('<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
  <xsl:template match="/">
    <xsl:for-each select="//item">
      <xsl:value-of select="php:function(\'evil\')"/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>');

$proc = new XSLTProcessor();
$proc->registerPHPFunctions();
$proc->importStylesheet($xsl);
$GLOBALS['proc'] = $proc;

$xsl2 = new DOMDocument();
$xsl2->loadXML('<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/">x</xsl:template></xsl:stylesheet>');
$GLOBALS['xsl2'] = $xsl2;

function evil() {
    $GLOBALS['proc']->importStylesheet($GLOBALS['xsl2']);  // frees the running stylesheet
    return 'z';
}

echo $proc->transformToXml($xml);

Resulted in this output:

=================================================================
==10==ERROR: AddressSanitizer: heap-use-after-free on address 0xffff82e1c230 at pc 0x00000049e96c bp 0xffffc6446340 sp 0xffffc6445b28
READ of size 2 at 0xffff82e1c230 thread T0

Warning: XSLTProcessor::transformToXml(): XPath: unknown precompiled operation 1493172283 in /audit/repro/battery6/e6_20_xsl_reimport_in_callback.php on line 32
    #0 0x49e968 in strlen (/src/php-src/sapi/cli/php+0x49e968)
    #1 0x4f25d44 in xbuf_format_converter /src/php-src/main/spprintf.c:526:16
    #2 0x4f1ec00 in php_printf_to_smart_string /src/php-src/main/spprintf.c:767:2
    #3 0x6544a5c in zend_vspprintf /src/php-src/Zend/zend.c:298:2
    #4 0x76c0b4 in php_libxml_internal_error_handler_ex /src/php-src/ext/libxml/libxml.c:693:15
    #5 0x76bee4 in php_libxml_error_handler_va /src/php-src/ext/libxml/libxml.c:736:2
    #6 0x460a3d0 in xsl_libxslt_error_handler /src/php-src/ext/xsl/php_xsl.c:259:3
    #7 0xffff8a2cb140 in xsltTransformError (/lib/aarch64-linux-gnu/libxslt.so.1+0xb140)
    #8 0xffff8a2e3c60 in xsltValueOf (/lib/aarch64-linux-gnu/libxslt.so.1+0x23c60)
    #9 0xffff8a2e8228  (/lib/aarch64-linux-gnu/libxslt.so.1+0x28228)
    #10 0xffff8a2ec0e0 in xsltForEach (/lib/aarch64-linux-gnu/libxslt.so.1+0x2c0e0)
    #11 0xffff8a2e8490  (/lib/aarch64-linux-gnu/libxslt.so.1+0x28490)
    #12 0xffff8a2ea810  (/lib/aarch64-linux-gnu/libxslt.so.1+0x2a810)
    #13 0xffff8a2eb050 in xsltProcessOneNode (/lib/aarch64-linux-gnu/libxslt.so.1+0x2b050)
    #14 0xffff8a2ec708  (/lib/aarch64-linux-gnu/libxslt.so.1+0x2c708)
    #15 0x4613508 in php_xsl_apply_stylesheet /src/php-src/ext/xsl/xsltprocessor.c:406:13
    #16 0x46149a8 in zim_XSLTProcessor_transformToXml /src/php-src/ext/xsl/xsltprocessor.c:533:12
    #17 0x5b48d50 in ZEND_DO_FCALL_SPEC_RETVAL_USED_HANDLER /src/php-src/Zend/zend_vm_execute.h:2152:4
    #18 0x5916d98 in execute_ex /src/php-src/Zend/zend_vm_execute.h:110551:12
    #19 0x5919010 in zend_execute /src/php-src/Zend/zend_vm_execute.h:115989:2
    #20 0x656733c in zend_execute_script /src/php-src/Zend/zend.c:1977:3
    #21 0x4e4e2e0 in php_execute_script_ex /src/php-src/main/main.c:2589:13
    #22 0x4e4f358 in php_execute_script /src/php-src/main/main.c:2629:9
    #23 0x657a078 in do_cli /src/php-src/sapi/cli/php_cli.c:933:5
    #24 0x6574b2c in do_php_cli /src/php-src/sapi/cli/php_cli.c:1346:18
    #25 0x6573020 in main /src/php-src/sapi/cli/php_cli_main.c:18:9
    #26 0xffff8a0a73fc  (/lib/aarch64-linux-gnu/libc.so.6+0x273fc)
    #27 0xffff8a0a74d4 in __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x274d4)
    #28 0x48e06c in _start (/src/php-src/sapi/cli/php+0x48e06c)

0xffff82e1c230 is located 0 bytes inside of 14-byte region [0xffff82e1c230,0xffff82e1c23e)
freed by thread T0 here:
    #0 0x4fdc2c in free (/src/php-src/sapi/cli/php+0x4fdc2c)
    #1 0xffff8abc271c in xmlFreeDoc (/lib/aarch64-linux-gnu/libxml2.so.2+0x6271c)
    #2 0xffff8a2d0e00 in xsltFreeStylesheet (/lib/aarch64-linux-gnu/libxslt.so.1+0x10e00)
    #3 0x4606b10 in xsl_free_sheet /src/php-src/ext/xsl/php_xsl.c:69:3
    #4 0x461004c in zim_XSLTProcessor_importStylesheet /src/php-src/ext/xsl/xsltprocessor.c:278:2
    #5 0x5b44c58 in ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_HANDLER /src/php-src/Zend/zend_vm_execute.h:2017:4
    #6 0x5916d98 in execute_ex /src/php-src/Zend/zend_vm_execute.h:110551:12
    #7 0x58b0d6c in zend_call_function /src/php-src/Zend/zend_execute_API.c:1038:3
    #8 0x10b2f38 in php_dom_xpath_callback_dispatch /src/php-src/ext/dom/xpath_callbacks.c:431:3
    #9 0x10b08f8 in php_dom_xpath_callbacks_call_php_ns /src/php-src/ext/dom/xpath_callbacks.c:496:11
    #10 0x460c508 in xsl_ext_function_php /src/php-src/ext/xsl/xsltprocessor.c:97:3
    #11 0x460c538 in xsl_ext_function_object_php /src/php-src/ext/xsl/xsltprocessor.c:110:2
    #12 0xffff8ac1ab20  (/lib/aarch64-linux-gnu/libxml2.so.2+0xbab20)
    #13 0xffff8ac1a9e8  (/lib/aarch64-linux-gnu/libxml2.so.2+0xba9e8)
    #14 0xffff8ac1e108  (/lib/aarch64-linux-gnu/libxml2.so.2+0xbe108)
    #15 0xffff8ac1e5f0 in xmlXPathCompiledEval (/lib/aarch64-linux-gnu/libxml2.so.2+0xbe5f0)
    #16 0xffff8a2e3b48 in xsltValueOf (/lib/aarch64-linux-gnu/libxslt.so.1+0x23b48)
    #17 0xffff8a2e8490  (/lib/aarch64-linux-gnu/libxslt.so.1+0x28490)
    #18 0xffff8a2ec0e0 in xsltForEach (/lib/aarch64-linux-gnu/libxslt.so.1+0x2c0e0)
    #19 0xffff8a2e8490  (/lib/aarch64-linux-gnu/libxslt.so.1+0x28490)
    #20 0xffff8a2ea810  (/lib/aarch64-linux-gnu/libxslt.so.1+0x2a810)
    #21 0xffff8a2eb050 in xsltProcessOneNode (/lib/aarch64-linux-gnu/libxslt.so.1+0x2b050)
    #22 0xffff8a2ec708  (/lib/aarch64-linux-gnu/libxslt.so.1+0x2c708)
    #23 0x4613508 in php_xsl_apply_stylesheet /src/php-src/ext/xsl/xsltprocessor.c:406:13
    #24 0x46149a8 in zim_XSLTProcessor_transformToXml /src/php-src/ext/xsl/xsltprocessor.c:533:12
    #25 0x5b48d50 in ZEND_DO_FCALL_SPEC_RETVAL_USED_HANDLER /src/php-src/Zend/zend_vm_execute.h:2152:4
    #26 0x5916d98 in execute_ex /src/php-src/Zend/zend_vm_execute.h:110551:12
    #27 0x5919010 in zend_execute /src/php-src/Zend/zend_vm_execute.h:115989:2
    #28 0x656733c in zend_execute_script /src/php-src/Zend/zend.c:1977:3
    #29 0x4e4e2e0 in php_execute_script_ex /src/php-src/main/main.c:2589:13

previously allocated by thread T0 here:
    #0 0x4fde8c in malloc (/src/php-src/sapi/cli/php+0x4fde8c)
    #1 0xffff8ac4201c in xmlStrdup (/lib/aarch64-linux-gnu/libxml2.so.2+0xe201c)
    #2 0xffff8abcf6bc in xmlCopyDoc (/lib/aarch64-linux-gnu/libxml2.so.2+0x6f6bc)
    #3 0x10703e4 in dom_clone_node /src/php-src/ext/dom/php_dom.c:2653:10
    #4 0x102d50c in dom_objects_store_clone_obj /src/php-src/ext/dom/php_dom.c:660:29
    #5 0x460de30 in zim_XSLTProcessor_importStylesheet /src/php-src/ext/xsl/xsltprocessor.c:207:23
    #6 0x5b44c58 in ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_HANDLER /src/php-src/Zend/zend_vm_execute.h:2017:4
    #7 0x5916d98 in execute_ex /src/php-src/Zend/zend_vm_execute.h:110551:12
    #8 0x5919010 in zend_execute /src/php-src/Zend/zend_vm_execute.h:115989:2
    #9 0x656733c in zend_execute_script /src/php-src/Zend/zend.c:1977:3
    #10 0x4e4e2e0 in php_execute_script_ex /src/php-src/main/main.c:2589:13
    #11 0x4e4f358 in php_execute_script /src/php-src/main/main.c:2629:9
    #12 0x657a078 in do_cli /src/php-src/sapi/cli/php_cli.c:933:5
    #13 0x6574b2c in do_php_cli /src/php-src/sapi/cli/php_cli.c:1346:18
    #14 0x6573020 in main /src/php-src/sapi/cli/php_cli_main.c:18:9
    #15 0xffff8a0a73fc  (/lib/aarch64-linux-gnu/libc.so.6+0x273fc)
    #16 0xffff8a0a74d4 in __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x274d4)
    #17 0x48e06c in _start (/src/php-src/sapi/cli/php+0x48e06c)

SUMMARY: AddressSanitizer: heap-use-after-free (/src/php-src/sapi/cli/php+0x49e968) in strlen
Shadow bytes around the buggy address:
  0x200ff05c37f0: fa fa fd fa fa fa fd fd fa fa 00 00 fa fa fd fa
  0x200ff05c3800: fa fa 00 00 fa fa fd fa fa fa fd fd fa fa 00 fa
  0x200ff05c3810: fa fa 00 fa fa fa 00 00 fa fa fd fd fa fa fd fa
  0x200ff05c3820: fa fa fd fd fa fa 00 fa fa fa 00 00 fa fa 00 fa
  0x200ff05c3830: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa
=>0x200ff05c3840: fa fa fd fd fa fa[fd]fd fa fa fd fa fa fa 00 06
  0x200ff05c3850: fa fa 07 fa fa fa 04 fa fa fa 04 fa fa fa fd fa
  0x200ff05c3860: fa fa fd fa fa fa fd fa fa fa fd fd fa fa fd fa
  0x200ff05c3870: fa fa 04 fa fa fa fd fd fa fa fd fd fa fa fd fd
  0x200ff05c3880: fa fa fd fd fa fa fd fa fa fa 00 06 fa fa 04 fa
  0x200ff05c3890: fa fa fd fa fa fa fd fd fa fa fd fd fa fa fd fd
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==10==ABORTING
bash: line 3:     9 Aborted                 timeout 60 /src/php-src/sapi/cli/php /audit/repro/battery6/e6_20_xsl_reimport_in_callback.php
EXIT=134

PHP Version

plain
8.6.0-dev

Operating System

ubuntu 22.04

Source: php/php-src

View original on GitHubView discussion on GitHub