Verständnisfrage zum Verhalten von w^x

SierraX

Well-Known Member
Hi,
ich hatte heute recht lange erfolglos versucht, python virtualenv in meinem Benutzerverzeichnis aus zu führen. Er quittierte mir alle versuche dauernd mit nem 'permission denied' Hinweis.
Es hat ein Weilchen gedauert, bis ich raus gefunden habe, das es an w^x lag das python nicht im /home oder /root ausgeführt werden konnte... (was die Verwirrung gleich noch einmal steigert, wen nicht mal root in seinem eigenen Verzeichnis so etwas ausführen kann) anyway.
Warum es ein Weilchen gedauert hat lag daran, das auf einer OpenBSD 6.1 Maschine virtualenv klaglos lief obwohl ich mich nie aktiv um w^x gekümmert habe. Also ging ich davon aus, das irgendwas anderes nicht passen kann.

Nachdem ich geguckt hatte was denn auf dem neuen system in /usr/local anders gemountet wird als in /home das dafür sogen könnte, das python im erstem funktioniert im zweitem aber nicht, obwohl Owner und UNIX Permissions passen.
Fand ich raus, das /usr/local in der fstab einen Eintrag wxallowed hatte, /home aber nicht

Die fstab meiner neuen Maschine:
Code:
8694670a2a353f8e.b none swap sw
8694670a2a353f8e.a / ffs rw 1 1
8694670a2a353f8e.k /home ffs rw,nodev,nosuid 1 2
8694670a2a353f8e.d /tmp ffs rw,nodev,nosuid 1 2
8694670a2a353f8e.f /usr ffs rw,nodev 1 2
8694670a2a353f8e.g /usr/X11R6 ffs rw,nodev 1 2
8694670a2a353f8e.h /usr/local ffs rw,wxallowed,nodev 1 2
8694670a2a353f8e.j /usr/obj ffs rw,nodev,nosuid 1 2
8694670a2a353f8e.i /usr/src ffs rw,nodev,nosuid 1 2
8694670a2a353f8e.e /var ffs rw,nodev,nosuid 1 2

Aber das erklärt mir immer noch nicht warum virtualenv auf meiner alten Maschine funktioniert, wo doch dort der Eintrag wxallowed in der fstab gänzlich fehlt

Die fstab meiner alten Maschine:
Code:
/dev/wd0a / ffs rw,softdep 1 1
/dev/wd0b none swap sw 0 0
/dev/wd0d /var ffs rw,softdep,nodev,nosuid 1 2
/dev/wd0e /usr ffs rw,softdep,nodev  1 2
/dev/wd0f /home ffs rw,softdep,nodev,nosuid  1 2
/dev/wd0h /data ffs rw,softdep,nodev,nosuid  1 2

Schaut OpenBSD nach, ob ein mountpoint /usr/local existiert, und wenn nicht bleibt für alle w^x ausgeschaltet?
 
Wenn `virtualenv` kein mmap(2) und/oder mprotect(2) macht wo es sich w+x Speicher holen will ist alles okay und es passiert nichts. Das wird wohl der Grund gewesen sein wieso alles gut ging.
 
Wenn ich eine virtualenv , also ein python, als non-root ausführe, sollte es ja eh keine Probleme mit dem Gesamtsystem geben. Wenn ich in einem meiner Scripte (jaaa ich weiss das es wahrscheinlich auch hier Leute gibt, die Python als wurzel alles Bösen ansehen und am liebsten von der Welt tilgen würden, wie ich mit Java) versuchen würde mir w+x Speicher zu holen, wo mir keiner zusteht, müsste das Script doch eh an die Wand fahren.
Das Problem entstand ja durch den Umstand: Das bei virtualenv, wenn man es wie vorgesehen ausserhalb /usr/local ausführt, eine modulfreie Kopie vom installierten Python in einem Ordner seiner Wahl und Rechte erstellt. Und einen Test durchführen möchte, der mit /usr/local/bin/python2.7 erfolgreich ist, aber auf allen anderen Laufwerken nicht starten kann, weil das kopierte python2.7 ein permission denied bekommt.
Ich hab für mich eine Lösung raus gearbeitet, mit der ich nicht eine ganze Partition wie 8694670a2a353f8e.k für w^x erlauben muss, aber bei bedarf virtualenv als non_root verwenden kann. Der Aufwand erhöht sich zwar ist aber immer noch geringer als für so was ganze virtuelle Maschinen hoch ziehen zu müssen.
Ich erstelle eine container Datei (5 Gig waren es in meinem Test heute sehr früh), mache die zu einem vnd, das ich dann mit -o wxallowd an einen Ort mounte wo der User dann auch mit arbeiten kann.
 
Zurück
Oben