Hallo lug-dd,
hier der minimale Beispielcode, um mit Rootrechten aus einem chroot-Jail auszubrechen:
#include <unistd.h> #include <sys/stat.h>
main() { int i; mkdir("BREAK", 0755); chroot("BREAK"); for(i=0;i<1024;i++) { chdir(".."); } chroot("."); execl("/bin/sh","-i",0); }
Die Sache funktioniert, weil der Kernel den chroot()-Systemruf nicht "stapelt", d.h. ein Prozess der bereits chrooted laeuft, kann bezueglich seines Jails nicht nochmal chrooten, ohne dass das alte chroot-Jail dabei "vergessen" wird.
Der Trick im Beispielcode besteht darin, dass der Prozess auch nach chroot("BREAK") sein Arbeitsverzeichnis (working directory) noch ausserhalb des Verzeichnisses BREAK hat. Von diesem Arbeitsverzeichnis ausgehend wird nun ausreichend oft eine Verzeichnisebene nach oben gewechselt, so dass das Arbeitsverzeichnis irgendwann im echten Rootverzeichnis liegt. Ein weiterer chroot-Aufruf setzt dieses Verzeichnis als neues Jail. Danach ueberlagert sich der Prozess mit einer Shell.
bye, Chris
On Thu, Jul 15, 2004 at 10:36:25AM +0200, Christian Perle wrote:
Hallo lug-dd,
Hi Chris,
Der Trick im Beispielcode besteht darin, dass der Prozess auch nach chroot("BREAK") sein Arbeitsverzeichnis (working directory) noch ausserhalb des Verzeichnisses BREAK hat. Von diesem Arbeitsverzeichnis ausgehend wird nun ausreichend oft eine Verzeichnisebene nach oben gewechselt, so dass das Arbeitsverzeichnis irgendwann im echten Rootverzeichnis liegt.
Soll das so sein oder ist das ein Bug? Nach dem chroot() sollte das working directory doch auf das neue root Verzeichnis gesetzt werden.
Damit funktioniert ja jeder aus einem chroot jail ausbrechen wenn er irgendwie Code in den Prozess einschleusen kann der chroot() aufgerufen hat.
Ciao, Tobias
Hallo, Tobias,
On Thu, 15 Jul 2004 11:28:58 +0200 Tobias Koenig tokoe@kde.org wrote:
On Thu, Jul 15, 2004 at 10:36:25AM +0200, Christian Perle wrote:
Der Trick im Beispielcode besteht darin, dass der Prozess auch nach chroot("BREAK") sein Arbeitsverzeichnis (working directory) noch ausserhalb des Verzeichnisses BREAK hat. Von diesem Arbeitsverzeichnis ausgehend wird nun ausreichend oft eine Verzeichnisebene nach oben gewechselt, so dass das Arbeitsverzeichnis irgendwann im echten Rootverzeichnis liegt.
Soll das so sein oder ist das ein Bug? Nach dem chroot() sollte das working directory doch auf das neue root Verzeichnis gesetzt werden.
Damit funktioniert ja jeder aus einem chroot jail ausbrechen wenn er irgendwie Code in den Prozess einschleusen kann der chroot() aufgerufen hat.
Ein weiterer Punkt für Konrad, aber wenn du Code in den Prozess einschleusen kannstt, der das chroot() aufruft, warum verhinderst du dann nicht das chroot(), sondern nur das chdir() danach?
Gruß Frank Benkstein.
Hi Tobias,
On Thu, Jul 15, 2004 at 11:28:58 +0200, Tobias Koenig wrote:
Soll das so sein oder ist das ein Bug?
Ich wuerde es fuer einen Bug halten. Allerdings hatten Konrad und ich gestern schon uebereinstimmend festgestellt, dass ein chroot-Jail nur dann als sicher gelten kann, wenn keiner der Prozesse darin Rootrechte hat. Mit Rootrechten kann man schliesslich auch mknod(), mount() und andere Boese Dinge[tm] aufrufen.
bye, Chris
Christian Perle schrieb:
Ich wuerde es fuer einen Bug halten. Allerdings hatten Konrad und ich gestern schon uebereinstimmend festgestellt, dass ein chroot-Jail nur dann als sicher gelten kann, wenn keiner der Prozesse darin Rootrechte hat. Mit Rootrechten kann man schliesslich auch mknod(), mount() und andere Boese Dinge[tm] aufrufen.
Hallo Christian,
nein chroot ist tatsächlich so 'designed'. Daher darf auch nur root chroot aufrufen.
Torsten
Christian Perle wrote:
Hi Tobias,
On Thu, Jul 15, 2004 at 11:28:58 +0200, Tobias Koenig wrote:
Soll das so sein oder ist das ein Bug?
Ich wuerde es fuer einen Bug halten. Allerdings hatten Konrad und ich
Am Anfang war chroot mal dazu gedacht, neue Software in einem "Sandkasten" ausprobieren zu können, ohne sein System durcheinander- bringen zu müssen. Den Job erledigt es ja.
Eine Möglichkeit zur Abhilfe bietet GR-Security: Dort gibts eine Kernel-Option 'Direkt nach chroot($a) chdir($a) ausführen'. Damit ist _diese_ _Ausbruchsmöglichkeit_ nicht mehr da - böse Dinge kann man damit immer noch anfangen.
mfg, Fabian
lug-dd@mailman.schlittermann.de