Fragen? Antworten! Siehe auch: Alternativlos
Die Begründung, wieso chroot(2) nur als root geht, ist ja immer, dass man damit aus einem chroot-Jail wieder ausbrechen kann. Aber nur wenn man dafür einen offenen Deskriptor auf außerhalb des Jails hat, und das könnte chroot(8) ja verhindern.
Überseh ich was? Mir fällt gerade kein guter Grund ein, wieso es kein chroot(8) gibt, das auch für normale User geht.
Update: Jemand hat eine gute Idee: Man kann per Unix Domain Socket im chroot einen Deskriptor von außerhalb des chroot-Jails empfangen und so ausbrechen.
Stimmt. Die Idee ist sogar so gut, dass sie auch ohne chroot funktioniert. Der Ausbruch ist schon nach einem fchdir geschehen, da muss man gar nicht nochmal chroot aufrufen für. Das ist also kein Gegenargument, finde ich.
Update: Ein Leser meint, dass FreeBSD kürzlich ein unprivilegiertes chroot eingeführt hat, allerdings muss man das als Admin erst freischalten, und es geht auch nur chroot -n, welches ein NO_NEW_PRIVS-Flag setzt, was dann zukünftig setuid verbietet. Der Hintergrund ist, dass man sonst einen Hardlink auf ein setuid-Binary machen könnte, z.B. su, und dann aber in dem chroot-Jeil an /etc haben könnte mit "passenden" Dateien, um sich dann im chroot-Jail root zu besorgen. Da wäre der Angriff also nicht der Ausbruch aus dem chroot sondern das Nuzten von chroot zur Privilegienausweitung im Wirtssystem. Das finde ich eine smarte Lösung.
Update: Stellt sich raus: Ubuntu hat ein "schroot"-Kommando. Das kannte ich noch nicht. Interessant.
Update: Man kommt aus einem chroot auch ohne Handle von außen raus, wenn man selber chroot machen darf, weil das nicht rekursiv sondern überschreibend ist. Du machst erst open(".",O_DIRECTORY), hebst das Handle auf, dann mkdir("foo") und chroot("foo") und dann fchdir auf das Handle vom Anfang. Das chroot hat das ursprüngliche überschrieben und das Handle ist jetzt außerhalb des chroot und kann sich frei bewegen.
Update: fchdir verbieten reicht übrigens nicht. openat reicht als Hebel.