2 Instanzen von Apache - geht das, wenn ja - wie?

Enrico Weigelt weigelt at metux.de
Mi Mai 26 15:35:10 CEST 2010


* Hans-Dietrich Kirmse <hd.kirmse at gmx.de> schrieb:

moin,

> das es nicht sauber gelöst ist, das leuchtet mir schon ein, weil in der
> PHP-FAQ angegeben ist, dass die Lösung unsicher ist, also (irgendwie?)
> ausgehebelt werden kann. Allerdings sehe ich noch keinen Ansatz dafür.

Mit safe_mode muß _jede_ einzelne API-Routine - einschließlich
_aller_ extensions separat auf potentielle Ausbruchsmöglichkeiten
überprüft und ggf. speziell angepaßt werden.

Der klassische Unix-Ansatz hingegen ist, jeden User unter seiner
eigenen UID laufen zu lassen (dh. auch entsprechend strikt getrennte
Prozesse) und alles über die Filesystem-Permissions (und ggf. 
auch capabilities) zu lösen.

> >a) _alle_ extensions müssen ihn entsprechend berücksichtigen
> >   (sonst wird er schnell wirkungslos)
> 
> verstehe ich nicht. nehmen wir an, es kommen 5 solcher Extensions zum
> Tragen. Es ist doch letztlich völlig egal, an welcher Stelle diese
> Extension (safe-mode) zur Wirkung kommt egal ob an 1. 2. ... 5. Stelle.

Nein. Jede einzelne extension-Routine, die ggf. auf abzuschirmende
Resourcen (Filesystem, Prozesse, etc, etc) zugreift, muß entsprechend 
angepaßt werden. Außerdem lassen sich dann auch eventuelle local-
exploits innerhalb einer extension, die bei separaten UIDs/Prozessen
nur den angreifenden User selbst betreffen könnten, dann gleich auch
alle anderen User angreifen.

Im Massenhosting damit völlig unbrauchbar.

> Wenn die Datei nicht unter der UID des Nutzers ist, dann wird diese
> PHP-Datei nicht mehr ausgeführt - sprich abgebrochen. Gerade bei dieser
> Sache verstehe ich nicht, wie das berücksichtigt werden muss.

Dieses "Feature" ist ziemlich sinnlos. Es schützt allenfalls vor
dem spezifischen Fall, daß es einem angreifenden User gelingt, 
scripte in fremden User-Verzeichnissen einzuschleusen. Gegen 
Manipulation von data files (die nicht als script ausgeführt
werden) oder bereits existierenden Scripts hilft das nicht.

> >b) wichtige features, zB. exec() gehen nicht mehr.
> 
> wieso nicht? safe-mode heißt doch (so wie ich das verstanden habe), dass
> nur Dateien gelesen bzw. bearbeitet werden können, die den gleichen
> Owner haben, wie die PHP-Datei, die gerade ausgeführt wird. Wieso kann
> dann ein Script per exec() nicht ausgeführt werden, wenn es als Owner
> eben den User hat, der auch der Owner der PHP-Datei ist und das per exec
> aufzurufende Script z.B. für alle ausführbar ist.

exec() dient dazu, _beliebige_ (idR. binäre) Programme 
auszuführen, und zwar als eigenständige Prozesse - nicht
innerhalb des PHP-Interpreters. In dem Falle kann dann der
safe_mode (innerhalb des sub-Prozesses) nicht mehr greifen.
Ergo: entweder man verbietet exec() komplett, oder der safe_mode
ist wirkungslos.

Die einzig sinnvolle Lösung ist, alles über separate Prozesse
unter eigenen UIDs abzubilden und alles weitere wie gewohnt den
Kernel erledigen zu lassen (dafür ist er ja schließlich da).
An der Stelle kann man dann auch noch feiner granuliertere
Abschirmungen via Containers machen (zB. um fremde Prozesse
unsichtbar zu machen, Netzwerkverkehr regeln, etc, etc)


cu
-- 
---------------------------------------------------------------------
 Enrico Weigelt    ==   metux IT service - http://www.metux.de/
---------------------------------------------------------------------
 Please visit the OpenSource QM Taskforce:
 	http://wiki.metux.de/public/OpenSource_QM_Taskforce
 Patches / Fixes for a lot dozens of packages in dozens of versions:
	http://patches.metux.de/
---------------------------------------------------------------------