ID:               46888
 Comment by:       fuxa_kos at unihost dot cz
 Reported By:      php at degoulet dot net
 Status:           Open
 Bug Type:         Safe Mode/open_basedir
 Operating System: Fedora Core
 PHP Version:      5.2.8
 New Comment:

problem still in 5.2.9


Previous Comments:
------------------------------------------------------------------------

[2008-12-17 15:22:50] php at degoulet dot net

thanks : this workaround works fine !

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

[2008-12-17 14:58:32] christian at elmerot dot se

The following patch restores part of behaviour from 5.2.6 yet has an
extra check to see if the URL contains "../" which is where the removal
came from. It is not a 100% correct "fix" in that it still allows for
unknown URL vectors to bypass safe_mode, however, it is less broken this
way for us. Perhaps the patch will help someone else.

Remember, this is a safe_mode bypass issue that was fixed and the
underlying cause (URLs: http: mapping to a local file incorrectly) looks
to me unfixed. To me it looks as if safe_mode fails in this case but it
also do no "extra" harm that won't be allowed with safe_mode disabled.
Have I missed something?

diff -Nur php-5.2.8/main/safe_mode.c php-5.2.8_1/main/safe_mode.c
--- php-5.2.8/main/safe_mode.c  2008-07-24 18:01:59.000000000 +0200
+++ php-5.2.8_1/main/safe_mode.c        2008-12-17 15:01:07.502862702 +0100
@@ -52,6 +52,7 @@
        long uid=0L, gid=0L, duid=0L, dgid=0L;
        char path[MAXPATHLEN];
        char *s, filenamecopy[MAXPATHLEN];
+       php_stream_wrapper *wrapper = NULL;
        TSRMLS_FETCH();
 
        path[0] = '\0';
@@ -72,6 +73,15 @@
                        mode = CHECKUID_CHECK_FILE_AND_DIR;
                }
        }
+
+       /* 
+        * If given filepath is a URL, allow - safe mode stuff
+        * related to URL's is checked in individual functions
+        * Possibly/likely allows for safe_mode bypass!!!
+        */
+       wrapper = php_stream_locate_url_wrapper(filename, NULL,
STREAM_LOCATE_WRAPPERS_ONLY TSRMLS_CC);
+       if ((wrapper != NULL) && (strstr(filename, "..\/") == NULL))
+               return 1;
                
        /* First we see if the file is owned by the same user...
         * If that fails, passthrough and check directory...

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

[2008-12-17 14:44:14] php at degoulet dot net

error msg :

Warning: copy(): Unable to access http://www.xxxxx.com/testcopy/nok.jpg
in /............/test.php

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

[2008-12-17 14:17:58] php at degoulet dot net

Description:
------------
copy() does not use the allow_url_fopen status ?

Reproduce code:
---------------
<?php
// Fonction copie distante ne fonctionnant plus
copy("http://www.xxxxxx.com/testcopy/nok.jpg";, "nok_copy.jpg");
?>

Expected result:
----------------
works fine in php 5.2.6 : with allow_url_fopen = On & safe_mode = On
doesn't work with the same config php 5.2.8

now, it works only if safe_mode off ?




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


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

Reply via email to