|
|
Fejezet 24. Safe Mode
A safe mode egy pr�b�lkoz�s a megosztott szerverek biztons�gi
probl�m�inak megold�s�ra. Architekt�r�lisan nem korrekt, hogy
ezt a probl�m�t a PHP szintj�n pr�b�ljuk megoldani, de mivel
a t�bbi alternat�va a webszerver �s oper�ci�s rendszer szinteken
nem igaz�n haszn�lhat�, sokan - k�l�n�sen az internetszolg�ltat�k -
a safe mode-ot haszn�lj�k egyel�re.
A safe mode m�k�d�s�t befoly�sol� be�ll�t�sok:
safe_mode = Off
safe_mode_gid = 0
safe_mode_include_dir =
safe_mode_exec_dir =
open_basedir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
disable_fnctions = |
Ha a safe_mode
be�ll�t�s be van kapcsolva, a PHP ellen�rzi, hogy az aktu�lisan
fut� szkript tulajdonosa megegyezik-e a kezel�sre megnyitand�
file tulajdonos�val. P�ld�ul:
-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php
-rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd |
Futtatva ezt a script.php programot:
<?php
readfile('/etc/passwd');
?> |
a k�vetkez� hib�t kapod, ha a safe mode be van kapcsolva:
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2 |
Ha a safe_mode helyett
egy open_basedir
k�nyvt�rat �ll�tasz be, akkor minden enged�lyezett file
m�velet erre a k�nyvt�rra korl�toz�dik. P�ld�ul (Apache
httpd.conf p�lda):
<Directory /docroot>
php_admin_value open_basedir /docroot
</Directory> |
Ha a fenti script.php programot futtatod, ezzel az open_basedir
be�ll�t�ssal, akkor a k�vetkez� eredm�nyt kapod:
Warning: open_basedir restriction in effect. File is in wrong directory in
/docroot/script.php on line 2 |
Le tudsz tiltani k�l�nb�z� f�ggv�nyeket ak�r egyenk�nt is.
Meg kell azonban jegyezni, hogy a disable_functions be�ll�t�s
csak a php.ini-ben haszn�lhat�. Ez azt jelenti, hogy nem
tudsz virtu�lis hosztonk�nt, vagy k�nyvt�rank�nt f�ggv�nyeket
letiltani a httpd.conf vagy .htaccess �llom�nyokban.
Ha hozz�adod ezt a php.ini �llom�nyodhoz:
disable_functions readfile,system |
A k�vetkez� hib�t kapod:
Warning: readfile() has been disabled for security reasons in
/docroot/script.php on line 2 |
A safe mode haszn�latakor tiltott/korl�tozott f�ggv�nyek
Ez m�g val�sz�n�leg nem teljes, �s nem korrekt list�ja a
f�ggv�nyeknek, amiket a
safe mode korl�toz.
T�bl�zat 24-1. Safe modeban korl�tozott f�ggv�nyek F�ggv�ny | Korl�toz�s |
---|
dbmopen() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. | dbase_open() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. | filepro() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. | filepro_rowcount() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. | filepro_retrieve() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. | ifx_*() | sql_safe_mode megk�t�sek, (!= safe mode) | ingres_*() | sql_safe_mode megk�t�sek, (!= safe mode) | mysql_*() | sql_safe_mode megk�t�sek, (!= safe mode) | pg_loimport() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. | posix_mkfifo() | Ellen�rzi, hogy a k�nyvt�r, amelyben
dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID)
rendelkezik-e, mint az �ppen fut� program. | putenv() | Alkalmazkodik a safe_mode_protected_env_vars �s
safe_mode_allowed_env_vars ini be�ll�t�sokhoz.
L�sd m�g a putenv() le�r�s�t | move_uploaded_file() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. | chdir() | Ellen�rzi, hogy a k�nyvt�r, amelyben
dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID)
rendelkezik-e, mint az �ppen fut� program. | dl() | Ez a f�ggv�ny nem haszn�lhat�, ha a safe mode be van kapcsolva. | v�grehajt� oper�tor | Ez a f�ggv�ny nem haszn�lhat�, ha a safe mode be van kapcsolva. | shell_exec() (a v�grehajt� oper�tor f�ggv�ny megfelel�je) | Ez a f�ggv�ny nem haszn�lhat�, ha a safe mode be van kapcsolva. | exec() | Futtathat� �llom�nyok v�grehajt�s�ra csak a
safe_mode_exec_dir
k�nyvt�ron bel�l van lehet�s�g. Praktikus okok miatt nem lehets�ges
.. komponenst elhelyeni a futtatand� program
el�r�si �tj�ban.
| system() | Futtathat� �llom�nyok v�grehajt�s�ra csak a
safe_mode_exec_dir
k�nyvt�ron bel�l van lehet�s�g. Praktikus okok miatt nem lehets�ges
.. komponenst elhelyeni a futtatand� program
el�r�si �tj�ban.
| passthru() | Futtathat� �llom�nyok v�grehajt�s�ra csak a
safe_mode_exec_dir
k�nyvt�ron bel�l van lehet�s�g. Praktikus okok miatt nem lehets�ges
.. komponenst elhelyeni a futtatand� program
el�r�si �tj�ban.
| popen() | Futtathat� �llom�nyok v�grehajt�s�ra csak a
safe_mode_exec_dir
k�nyvt�ron bel�l van lehet�s�g. Praktikus okok miatt nem lehets�ges
.. komponenst elhelyeni a futtatand� program
el�r�si �tj�ban.
| mkdir() | Ellen�rzi, hogy a k�nyvt�r, amelyben
dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID)
rendelkezik-e, mint az �ppen fut� program. | rmdir() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. | rename() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. Ellen�rzi, hogy a k�nyvt�r, amelyben
dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID)
rendelkezik-e, mint az �ppen fut� program. | unlink() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. Ellen�rzi, hogy a k�nyvt�r, amelyben
dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID)
rendelkezik-e, mint az �ppen fut� program. | copy() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. Ellen�rzi, hogy a k�nyvt�r, amelyben
dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID)
rendelkezik-e, mint az �ppen fut� program. (a
source �s
target param�terekre) | chgrp() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. | chown() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. | chmod() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. R�ad�sul nem �ll�thatod �t a SUID, SGID �s sticky biteket | touch() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. Ellen�rzi, hogy a k�nyvt�r, amelyben
dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID)
rendelkezik-e, mint az �ppen fut� program. | symlink() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. Ellen�rzi, hogy a k�nyvt�r, amelyben
dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID)
rendelkezik-e, mint az �ppen fut� program. (csak a c�l ellen�rz�tt) | link() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. Ellen�rzi, hogy a k�nyvt�r, amelyben
dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID)
rendelkezik-e, mint az �ppen fut� program. (csak a c�l ellen�rz�tt) | ob_gzhandler() | Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak,
amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val
(UID) rendelkeznek-e, mint az �ppen fut� program. | getallheaders() | Safe modeban, semmilyen 'authorization' (nem kisbet�/nagybet� �rz�keny)
kezdet� fejl�c sem ker�l visszaad�sra. Figyelem: ez nem m�k�dik megfelel�en
a getallheaders() AOL szerveres megval�s�t�s�ban. | Minden f�ggv�ny, ami a
php4/main/fopen_wrappers.c funkci�kat haszn�lja.
| ?? |
User Contributed Notes Safe Mode |
|
Marc Delisle
16-Jul-2001 09:49 |
|
include() and require() are also limited by safe mode.
|
|
[email protected]
08-Sep-2001 01:17 |
|
Many filesystem-related functions are not appropriately restricted when
Safe Mode is activated on an NT server it seems. I would assume that this
is due to the filesystem not making use of UID.
In all of my
scripts, no matter WHO owns the script (file Ownership-wise) or WHO owns
the directory/file in question; both UIDs display
(getmyuid() and
fileowner()) as UID = 0
This has the rather nasty side effect of
Safe Mode allowing multiple filesystem operations because it believes the
script owner and file/dir owner are one and the same.
While this
can be worked around by the judicious application of proper filesystem
privileges, it's still a "dud" that many of Safe Mode's
securities are simply not there with an NT implementation.
|
|
phobo#paradise.net.nz
03-Oct-2001 01:21 |
|
If you do virutal hosting, you can turn safe mode on and off for different
Apache Virutal Hosts using the php_admin_value directive. This also allows
you to have customised maximum execution times, disabled functions, etc.
By placeing a base_dir for each virutal host, this means PHP CANNOT access
files below this heirachy; strongly recoomended for cutsomer
hosting.
Eg:
[VirtualHost 127.0.0.1:80]
DocumentRoot /var/www/html/safephphost/
ServerName safephp
php_admin_value safe_mode 1
php_admin_value open_basedir
/var/www/html/safephphost/
php_admin_value sendmail_from
phobo#paradise.net.nz
[/VirtualHost]
|
|
[email protected]
24-Jan-2002 10:45 |
|
Just to note, I created patch which allows VirtualHost to set User under
which all (PHP too) runs. It is more secure than safe_mode. See
luxik.cdi.cz/~devik/apache/ if you are interested
|
|
zebz@ihaveenoughspam_hotmail.com
28-Apr-2002 02:42 |
|
All the filesystem-related functions (unlink, fopen, unlink, etc) seems to
be restricted the same way in safe mode, at least on PHP 4.2. If the file
UID is different *but* the directory (where the file is located) UID is
the same, it will work.
So creating a directory in safe mode is
usually a bad idea since the UID will be different from the script (it
will be the apache UID) so it won't be possible to do anything with the
files created on this directory.
|
|
[email protected]
01-Jun-2002 11:11 |
|
This is just a reply to phobo#paradise.net.nz about the virtual server.
This no longer works on apache, if you do try you will get: Syntax
error on line 1118 of /usr/www/conf/httpd.conf: php_admin_value not
allowed here
|
|
[email protected]
13-Jun-2002 09:37 |
|
You can a vhost.conf file.
<Directory
/vhosts/domain.com/httpdocs/> php_admin_value safe_mode
0 php_admin_value open_basedir "/" </Directory>
|
|
19-Jun-2002 08:44 |
|
disable_functions must use "=" operator to assign value. Please
correct exemple.
|
|
[email protected]
07-Jul-2002 06:51 |
|
[email protected] wrote in his comment of 02-Oct-2001 07:21: "By
placeing a base_dir for each virutal host, this means PHP CANNOT access
files below this heirachy"
"below" or
"above" is obviously a matter of visualization. The way I
understand open_basedir is if you add an open_basedir clause as in the
example provided, php is ONLY able to access files under the
/var/www/html/safephphost/ directory. In other words php will not be able
to access /var/www/html/anotherfile but will be able to access
/var/www/html/safephphost/somefile.
Also - if I understand
correctly you do not need "safe_mode on" when you have an
open_basedir clause. (ref:
"If instead of safe_mode, you set an open_basedir directory then all
file operations will be limited to files under the specified
directory")
|
|
iam4webwork at hotmail dot com
11-Jul-2002 04:59 |
|
Had to run ImageJPEG() and ImagePNG() out of safe mode in order to finally
get them to work. My site is on a machine that uses Linux, PHP 4.1.2, GD
1.6.2 and employs safe mode. To get out of safe mode, had to name the
script with a .cgi extension and insert #!/usr/bin/php line at top of
script.
|
|
[email protected]
19-Jul-2002 07:33 |
|
open_basedir only restricts file operations to files and directories under
a specified directory, but you can still user system ("vi
/home/somedir/somefile"), so safe_mode still has a place here as it
is much more restrictive then open_basedir.
Also, to reply to
someone who said that 'above' and 'below' was a matter of perspective,
sure it is. Of course, a file is not under another one, etc, it just
pointed by some inode. But in the common language we consider the root (/)
to be above everything else, and /home is below root, and /home/myfile is
below /home. There is no written standard, but most people (those I know
anyway) agree on that syntax.
|
|
[email protected]
28-Aug-2002 09:36 |
|
Just in reply to [email protected] and phobo#paradise.net.nz:
You
can again use php_admin_value with apache2.0.40 and
php4.2.3-dev.
There is also a bug with safe_mode which can be
patched with
|
|
|
|
| |