From 259057b2a484747a6c73ce54c4fa0f5acbd56179 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 1 Sep 2015 00:20:45 -0700 Subject: [PATCH] Fix bug #70366 - use-after-free vulnerability in unserialize() with SplDoublyLinkedList --- ext/spl/spl_dllist.c | 1 + ext/spl/tests/bug70365.phpt | 2 +- ext/spl/tests/bug70366.phpt | 54 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 ext/spl/tests/bug70366.phpt Index: php5-5.6.11+dfsg/ext/spl/spl_dllist.c =================================================================== --- php5-5.6.11+dfsg.orig/ext/spl/spl_dllist.c 2015-09-25 11:30:17.919936242 -0400 +++ php5-5.6.11+dfsg/ext/spl/spl_dllist.c 2015-09-25 11:30:17.915936190 -0400 @@ -1219,6 +1219,7 @@ zval_ptr_dtor(&elem); goto error; } + var_push_dtor(&var_hash, &elem); spl_ptr_llist_push(intern->llist, elem TSRMLS_CC); } Index: php5-5.6.11+dfsg/ext/spl/tests/bug70365.phpt =================================================================== --- php5-5.6.11+dfsg.orig/ext/spl/tests/bug70365.phpt 2015-09-25 11:30:17.919936242 -0400 +++ php5-5.6.11+dfsg/ext/spl/tests/bug70365.phpt 2015-09-25 11:30:17.919936242 -0400 @@ -1,5 +1,5 @@ --TEST-- -SPL: Bug #70365 yet another use-after-free vulnerability in unserialize() with SplObjectStorage +SPL: Bug #70365 use-after-free vulnerability in unserialize() with SplObjectStorage --FILE-- ryat = 1; + } +} + +$fakezval = ptr2str(1122334455); +$fakezval .= ptr2str(0); +$fakezval .= "\x00\x00\x00\x00"; +$fakezval .= "\x01"; +$fakezval .= "\x00"; +$fakezval .= "\x00\x00"; + +$inner = 'i:1234;:i:1;'; +$exploit = 'a:5:{i:0;i:1;i:1;C:19:"SplDoublyLinkedList":'.strlen($inner).':{'.$inner.'}i:2;O:3:"obj":1:{s:4:"ryat";R:3;}i:3;a:1:{i:0;R:5;}i:4;s:'.strlen($fakezval).':"'.$fakezval.'";}'; + +$data = unserialize($exploit); + +var_dump($data); + +function ptr2str($ptr) +{ + $out = ''; + for ($i = 0; $i < 8; $i++) { + $out .= chr($ptr & 0xff); + $ptr >>= 8; + } + return $out; +} +?> +--EXPECTF-- +array(5) { + [0]=> + int(1) + [1]=> + &int(1) + [2]=> + object(obj)#%d (1) { + ["ryat"]=> + &int(1) + } + [3]=> + array(1) { + [0]=> + int(1) + } + [4]=> + string(24) "%s" +} \ No newline at end of file