Skip to content

Commit a6c063d

Browse files
committed
Merge branch 'PHP-5.5' into PHP-5.6
* PHP-5.5: More fixes for bug #70219
2 parents 3fe5094 + 43c2dfa commit a6c063d

File tree

3 files changed

+52
-3
lines changed

3 files changed

+52
-3
lines changed

ext/pcre/php_pcre.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ static void php_do_pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) /* {{{ *
577577
}
578578

579579
pce->refcount++;
580-
php_pcre_match_impl(pce, subject, subject_len, return_value, subpats,
580+
php_pcre_match_impl(pce, subject, subject_len, return_value, subpats,
581581
global, ZEND_NUM_ARGS() >= 4, flags, start_offset TSRMLS_CC);
582582
pce->refcount--;
583583
}

ext/session/session.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -864,7 +864,10 @@ PS_SERIALIZER_DECODE_FUNC(php_serialize) /* {{{ */
864864

865865
PHP_VAR_UNSERIALIZE_INIT(var_hash);
866866
ALLOC_INIT_ZVAL(session_vars);
867-
php_var_unserialize(&session_vars, &val, endptr, &var_hash TSRMLS_CC);
867+
if (php_var_unserialize(&session_vars, &val, endptr, &var_hash TSRMLS_CC)) {
868+
var_push_dtor(&var_hash, &session_vars);
869+
}
870+
868871
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
869872
if (PS(http_session_vars)) {
870873
zval_ptr_dtor(&PS(http_session_vars));
@@ -873,7 +876,7 @@ PS_SERIALIZER_DECODE_FUNC(php_serialize) /* {{{ */
873876
array_init(session_vars);
874877
}
875878
PS(http_session_vars) = session_vars;
876-
ZEND_SET_GLOBAL_VAR_WITH_LENGTH("_SESSION", sizeof("_SESSION"), PS(http_session_vars), 2, 1);
879+
ZEND_SET_GLOBAL_VAR_WITH_LENGTH("_SESSION", sizeof("_SESSION"), PS(http_session_vars), Z_REFCOUNT_P(PS(http_session_vars)) + 1, 1);
877880
return SUCCESS;
878881
}
879882
/* }}} */
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
--TEST--
2+
Bug #70219 Use after free vulnerability in session deserializer
3+
--FILE--
4+
<?php
5+
ini_set('session.serialize_handler', 'php_serialize');
6+
session_start();
7+
8+
class obj implements Serializable {
9+
var $data;
10+
function serialize() {
11+
return serialize($this->data);
12+
}
13+
function unserialize($data) {
14+
session_decode($data);
15+
}
16+
}
17+
18+
$inner = 'r:2;';
19+
$exploit = 'a:2:{i:0;C:3:"obj":'.strlen($inner).':{'.$inner.'}i:1;C:3:"obj":'.strlen($inner).':{'.$inner.'}}';
20+
21+
$data = unserialize($exploit);
22+
23+
for ($i = 0; $i < 5; $i++) {
24+
$v[$i] = 'hi'.$i;
25+
}
26+
27+
var_dump($data);
28+
var_dump($_SESSION);
29+
?>
30+
--EXPECTF--
31+
array(2) {
32+
[0]=>
33+
&object(obj)#%d (1) {
34+
["data"]=>
35+
NULL
36+
}
37+
[1]=>
38+
object(obj)#%d (1) {
39+
["data"]=>
40+
NULL
41+
}
42+
}
43+
object(obj)#1 (1) {
44+
["data"]=>
45+
NULL
46+
}

0 commit comments

Comments
 (0)