• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

sips in PHP mittels exec() nutzen

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Hi,

ich möchte gerne den Terminal-Befehl 'sips' (Bildprozessor) in PHP nutzen, um z.B. Thumbnails von PDFs zu erstellen. Als Webserver ist bei mir MAMP im Einsatz.

Ich bekomme immer Fehler 5 zurück, was wohl mangelnde Rechte sind. safe_mode ist schon off, bringt aber nix. sips liegt in /usr/bin.

Weiß jemand Rat?
 

pepi

Cellini
Registriert
03.09.05
Beiträge
8.740
Wie schauts mit fopen aus?
Gruß Pepi
 

MacMark

Jakob Lebel
Registriert
01.01.05
Beiträge
4.874
PHP und PEAR haben eigene Bildbearbeitungsmöglichkeiten. Lokale Binaries per Webserver auszuführen, ist ein Sicherheitsrisiko.
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Kann ich damit PDFs und PSDs rendern? Das mit dem Sicherheitsrisiko ist mir egal, da es eh im Intranet läuft.
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
sips kann jpgs aus PDFs und PSD erzeugen, deswegen will ich ja sips verwenden. Ich möchte Thumbnails von diesen Dateien erstellen können.
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Stimmt, war missverständlich, aber meine erste Frage war so gestellt wie ich's gemeint habe. Was muss ich denn machen, damit sips erlaubt ist? Rechte setzen oder in PHP was konfigurieren?
 

MacMark

Jakob Lebel
Registriert
01.01.05
Beiträge
4.874
Ich nehme an, Du nutzt 10.5 Leopard, welcher Apache 2 hat. Dieser kann Binärdateien in "/Library/WebServer/CGI-Executables" ausführen. Das erkennt man in seiner Konfiguration in "/etc/apache2/httpd.conf". Auch erkennt man den Alias, den man angeben muß zur Adressierung.

Summa summarum: Dateien, die dort abgelegt werden sind über die URL localhost/cgi-bin/dateiname ausführbar.

Wenn ich bei mir beispielsweise dies aufrufe:
Code:
http://localhost/cgi-bin/hello

Dann sehe ich im Browser: "Hello, World.".

Weil:
Code:
KeyWest:CGI-Executables macmark$ pwd
/Library/WebServer/CGI-Executables
KeyWest:CGI-Executables macmark$ ls -al
total 8
drwxrwxr-x  3 root     admin  102 Sep 13 21:53 .
drwxrwxr-x  5 root     admin  170 Apr 26 12:20 ..
-rwx---r-x  1 macmark  admin   72 Sep 13 21:53 hello
KeyWest:CGI-Executables macmark$ cat hello
#!/bin/sh
echo "Content-type: text/html\r\n\r\n";
echo "Hello, World.";

Nachtrag: Mit PHP verhält es sich ähnlich. Auch dort können Dateien nur in bestimmten Verzeichnissen ausgeführt werden.
Übungsaufgabe: Durchstöbere die PHP-Doku dazu ;)
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Vielen Dank für die Tipps. Leider klappt das alles nicht und ich habe nun auch mittlerweile den Grund.

Irgendwie mag sips es nicht vom httpd gestartet zu werden, es stürzt dann nämlich mit folgendem Crashlog ab. Kann das jemand irgendwie deuten?

Code:
Host Name:      OSX-Server
Date/Time:      2008-09-24 15:18:13.508 +0200
OS Version:     10.4.11 (Build 8S2169)
Report Version: 4

Command: sips
Path:    /usr/bin/sips
Parent:  httpd [24553]

Version: ??? (???)

PID:    2757
Thread: Unknown

Link (dyld) error:

Symbol not found: __cg_jpeg_resync_to_restart
  Referenced from: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/ImageIO
  Expected in: /Applications/MAMP/Library/lib/libJPEG.dylib
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
So, ich habe die Lösung gefunden. Zum einen muss ich sips mittels sudo aufrufen und zum anderen muss ich mit dem tool 'visudo' die sudoers-Datei um folgendes ergänzen, damit sudo nicht nach einem Passwort fragt:

%www ALL = NOPASSWD: /usr/bin/sips
 

MacMark

Jakob Lebel
Registriert
01.01.05
Beiträge
4.874
Herzlichen Glückwunsch zum Selbstbau einer Super-GAU-Sicherheitslücke: Der normalerweise völlig unprivilegierte Webserver (und alle, die auf der Webseite Code einschleusen) kann nun Rootprozesse starten und das sogar ohne Paßwort. Dann noch ein Bufferoverflow-Bug in sips und Du bist gepwned.

Warum nicht so?
http://www.php.net/manual/en/function.system.php
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Der Webserver kann ja nur sips ohne Passwort ausführen. Des weiteren werden die Thumbnails nur einmalig generiert und dass dann auch in Intranet, danach wird sips gar nicht mehr ausgeführt. Zudem müsste ein Hacker für die Ausnutzung eines Bufferoverflow-Bugs in sips irgendwie erst mal Bilddateien auf unseren Server einschleusen, da ja keine Upload-Möglichkeit besteht.

Was meinst du jetzt genau bei system()? Ich nutze momentan exec() und die Parameter werden vorher auf Plausibilität geprüft. Wo hat system() da einen Sicherheitsvorteil?
 

MacMark

Jakob Lebel
Registriert
01.01.05
Beiträge
4.874
… Wo hat system() da einen Sicherheitsvorteil?

Der aufgerufene Befehl läuft nicht unter root. Man kann sogar dafür sorgen, daß nur Befehle aus einem bestimmten Verzeichnis aufgerufen werden können:
http://www.php.net/manual/en/features.safe-mode.php#ini.safe-mode-exec-dir

Da würde ich eine Kopie von sips reinlegen und dann mit system() oder einem anderen der dort unter "see also" genannten Funktionen aufrufen:
http://www.php.net/manual/en/function.system.php

Wenn ein Webserver root-Befehle ausführt, ist das immer ein Problem. Man läßt keine von außen erreichbaren Dienste Dinge unter root tun. Ein passender Bug darin und das System ist Toast.
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Aber wenn ich über system() nun wieder ein sudo verwende, ist die Sicherheit doch hin, oder? sips stürzt ohne sudo leider ab, wenn der User www ist.

Aber vielen Dank für deine Hinweise.
 

pepi

Cellini
Registriert
03.09.05
Beiträge
8.740
Du könntest Dir testweise noch eine Kopie von sips machen und die mit Eigentümer www im Filesystem an einem anderen Pfad ablegen.
Gruß Pepi
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Hatte ich bereits versucht. Sips scheint Libraries aufzurufen, auf die www keinen Zugriff hat und stürzt dann ab.
 

MacMark

Jakob Lebel
Registriert
01.01.05
Beiträge
4.874
Dann gibt es eine noch bessere Lösung: Der Webserver macht gar nichts. Stattdessen Ordneraktion definieren, die bei neuen Dateien Thumbnails erstellt et cetera.
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Interessante Idee. Kann ich einem Ordner eine Ordneraktion zuweisen und sie wird dann auch ausgelöst, wenn ich Dateien in Unterordner kopiere, oder muss dann jeder Ordner die Aktion bekommen? Funktieren Ordneraktionen auch, wenn jemand über eine AFP-Verbindung Dateien in solche Ordner kopiert?

Wenn das geht wäre das in unserem Fall wirklich ein coole Alternative, zumal du Thumbnails nicht erst über einen Browseraufruf erzeugt werden müssen.
 

MacMark

Jakob Lebel
Registriert
01.01.05
Beiträge
4.874
Ob Ordneraktionen auch in Unterverzeichnisse schauen, weiß ich nicht. Man könnte aber Ordneraktionen mit "Smart Folders" kombinieren.

Den Ordneraktionen ist es egal, wer den Inhalt ändert, sollte also auch per AFP gehen.