Sec Bug->Bug #76421 [Opn]: Buffer overflow in WSDL cache when switching architectures

From: Date: Wed, 06 Jun 2018 21:50:22 +0000
Subject: Sec Bug->Bug #76421 [Opn]: Buffer overflow in WSDL cache when switching architectures
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-215526@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=76421&edit=1 ID: 76421 Updated by: stas@php.net Reported by: dustin dot ward1 at gmail dot com Summary: Buffer overflow in WSDL cache when switching architectures Status: Open -Type: Security +Type: Bug Package: SOAP related Operating System: Centos 7.5 PHP Version: 5.6.36 Block user comment: N Private report: Y Previous Comments: ------------------------------------------------------------------------ [2018-06-06 20:52:52] dustin dot ward1 at gmail dot com Description: ------------ When upgrading from x86 32bit php to x86 64 bit php, we started experiencing segfaults when WSDL file cache was used. We traced down the issue to: WSDL_CACHE_GET(old_t, time_t, &in); (https://github.com/php/php-src/blob/master/ext/soap/php_sdl.c#L1565) The size of time_t changes from 4 bytes to 8 bytes under 64 bit, which causes the next fetch to overflow the in buffer. Purging all WSDL cache resolved the issue. Program terminated with signal 11, Segmentation fault. #0 0x00007fc9fca37cee in sdl_deserialize_string (in=0x7ffc51640338) at /usr/src/debug/php-5.6.36/php-5.6.36/ext/soap/php_sdl.c:1205 1205 WSDL_CACHE_GET_INT(len, in); #0 0x00007fc9fca37cee in sdl_deserialize_string (in=0x7ffc51640338) at /usr/src/debug/php-5.6.36/php-5.6.36/ext/soap/php_sdl.c:1205 s = 0x7fca0bead1e8 "H@\376\001" len = 0 #1 0x00007fc9fca399c6 in get_sdl_from_cache (fn=0x1ff3418 "/tmp/wsdl-root-80b3953c91e5c82a215e1938b88ad7f0", uri=0x20d1070 "redacted", t=1528228648, cached=0x7ffc51640618) at /usr/src/debug/php-5.6.36/php-5.6.36/ext/soap/php_sdl.c:1592 sdl = 0x1fef3b0 old_t = 319355875436 i = 1886680168 num_groups = 0 num_types = 0 num_elements = 0 num_encoders = 0 num_bindings = 0 num_func = 0 functions = 0x0 bindings = 0x0 types = 0x0 encoders = 0x0 enc = 0x0 f = 50 st = {st_dev = 2306, st_ino = 98313, st_nlink = 1, st_mode = 33152, st_uid = 99, st_gid = 100, __pad0 = 0, st_rdev = 0, st_size = 40494, st_blksize = 4096, st_blocks = 80, st_atim = {tv_sec = 1528301295, tv_nsec = 0}, st_mtim = {tv_sec = 1528295532, tv_nsec = 0}, st_ctim = {tv_sec = 1528295532, tv_nsec = 0}, __unused = {0, 0, 0}} in = 0x72841f82 <Address 0x72841f82 out of bounds> buf = 0x20fab08 "wsdl\016" #2 0x00007fc9fca4b340 in get_sdl (this_ptr=0x20eef60, uri=0x20d1070 "redacted", cache_wsdl=1) at /usr/src/debug/php-5.6.36/php-5.6.36/ext/soap/php_sdl.c:3253 context = {lo = 0, hi = 0, a = 0, b = 0, c = 0, d = 0, buffer = '\000' <repeats 63 times>, block = {0 <repeats 16 times>}} digest = "\200\263\225<\221\345\310*!^\031\070\270\212\327", <incomplete sequence \360> len = 15 cached = 319355875436 t = 1528315048 md5str = "80b3953c91e5c82a215e1938b88ad7f0" user = 0x20f5958 "root" user_len = 5 ---Type <return> to continue, or q <return> to quit--- fn = "H\adQ\374\177\000\000\330\061\377\001\000\000\000\000X\006dQ\374\177\000\000Hq\352\v\312\177\000\000\005\000\000\000\000\000\000\000\242\353s", '\000' <repeats 13 times50\017dQ\374\177\000\000\005\000\000\000\000\000\000\000\231cY\000\000\000\000\000\004\000\000\000\000\000\000\000d(v", '\000' <repeats 13 times>, "\016\273\177", '\000' <repeats 13 \000\000\000\370\017dQ\374\177\000\000W\000\000\000\000\000\000\000'VY", '\000' <repeats 20 times>, " ", '\000' <repeats 40 times>... sdl = 0x0 old_error_code = 0x7fc9fca4ee74 "Client" uri_len = 74 context = 0x0 tmp = 0x7ffc51640730 proxy_host = 0x7ffc51640738 proxy_port = 0x7ffc516406e0 orig_context = 0x0 new_context = 0x0 headers = {c = 0x0, len = 0, a = 0} key = 0x1ff3418 "/tmp/wsdl-root-80b3953c91e5c82a215e1938b88ad7f0" t = 1528315048 has_proxy_authorization = 0 '\000' has_authorization = 0 '\000' #3 0x00007fc9fc9f31c8 in zim_SoapClient_SoapClient (ht=2, return_value=0x20f5868, return_value_ptr=0x7fca0beac7f0, this_ptr=0x20eef60, return_value_used=0) at /usr/src/debug/php-5.6.36/php-5.6.36/ext/soap/soap.c:2553 old_soap_version = 1 ret = 8 __orig_bailout = 0x7ffc51642eb8 __bailout = {{__jmpbuf = {140505760059880, 114173205763238949, 33439816, 140721674001153, 140505760057320, 2, 114173205287185445, 143767856450808869}, __mask_was_saved = 0, __saved_mask = {__val = {13, 210724489866, 140505759416080, 140721674000616, 5, 1, 140721674000784, 33447920, 10, 33249760, 6095008, 210724489866, 5, 6127318, 140505560121345, 140721674000808}}}} wsdl = 0x20f5410 options = 0x20f58f8 soap_version = 1 context = 0x0 cache_wsdl = 1 sdl = 0x0 typemap_ht = 0x0 _old_handler = 0 '\000' _old_error_code = 0x0 ---Type <return> to continue, or q <return> to quit---q Quit ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=76421&edit=1

« previous php.bugs (#215526) next »