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