Bug #52312 [Com]: PHP safe_mode/open_basedir - lstat performance problem

From: Date: Wed, 14 Jul 2010 14:25:33 +0000
Subject: Bug #52312 [Com]: PHP safe_mode/open_basedir - lstat performance problem
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-152402@lists.php.net to get a copy of this message
Edit report at http://bugs.php.net/bug.php?id=52312&edit=1

 ID:               52312
 Comment by:       v dot damore at gmail dot com
 Reported by:      v dot damore at gmail dot com
 Summary:          PHP safe_mode/open_basedir - lstat performance problem
 Status:           Analyzed
 Type:             Bug
 Package:          Safe Mode/open_basedir
 Operating System: Linux
 PHP Version:      5.2.13

 New Comment:

I want make it clear first that: in submitted test we can see only 4
directory scan, I my production environment I have seen up to 8
directory scan for php file. 

If we disable PHAR I suppose only first full scan path will be removed.

So other 3 full scan path remain there, probably we need to change
php_check_specific_open_basedir in order to really try to remove
inefficiencies.


Previous Comments:
------------------------------------------------------------------------
[2010-07-14 15:58:22] rasmus@php.net

Yup, there are clearly some inefficiencies here.  We are relying too
much on the 
realpath_cache being enabled.  You can eliminate the phar one by
eliminating phar 
for now.  Recompile with --disable-phar until we get this cleaned up.

------------------------------------------------------------------------
[2010-07-14 15:43:52] v dot damore at gmail dot com

changed summery in order to provide a better description

------------------------------------------------------------------------
[2010-07-13 21:49:55] v dot damore at gmail dot com

Please pay attention correct URL for debugging info is 
http://damore.xoom.it/apache-2.2_php-5.3.2_break-lstat.txt

------------------------------------------------------------------------
[2010-07-13 21:04:24] v dot damore at gmail dot com

If you take a look at debugging done in
http://damore.xoom.it/apache-2.2_php-5.3.2_break-lstat.txt,
you can see
that tsrm_realpath_r is called in 2 different place:

- First during phar_find_in_include_path function 
- Second during php_check_specific_open_basedir function.

* During php_check_specific_open_basedir, traverse entire path at least
three times, so i means 3 call to tsrm_realpath_r.

I don't discuss the need to traverse entire path, but only one time.

There should be a better way to implement such code, I'll try to write a
patch if there is someone that want help me looking what I'm writing.

------------------------------------------------------------------------
[2010-07-13 15:23:33] pajoye@php.net

The reason was due to a security flaw involving symbolic links and
realpath cache. It allowed to bypass open_basedir when a path was
cached. The cleanest way to fix it was to disable the realpath cache
when open_basedir/safemode are set.

Thanks Johannes to remind us about this change.

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    http://bugs.php.net/bug.php?id=52312


-- 
Edit this bug report at http://bugs.php.net/bug.php?id=52312&edit=1


Thread (64 messages)

« previous php.bugs (#152402) next »