Wykrywanie chroot jail od wewnątrz

Jak można wykryć bycie w więzieniu chroot bez uprawnień roota? Założyć standardowy system BSD lub Linux. Najlepsze, co wymyśliłem, to przyjrzeć się wartości i-węzła dla " / " I rozważyć, czy jest ona dość niska, ale chciałbym dokładniejszej metody wykrywania.

[edit 20080916 142430 EST] samo rozglądanie się po systemie plików nie jest wystarczające, ponieważ nie jest trudno powielić rzeczy takie jak /boot i /dev, aby oszukać uwięzionego użytkownika.

[edit 20080916 142950 EST] dla Systemów Linux, sprawdzanie nieoczekiwane wartości w /proc są rozsądne, ale co z systemami, które w ogóle nie wspierają / proc?

Author: Topaz, 2008-09-16

8 answers

I-węzeł dla / będzie zawsze równy 2, jeśli jest katalogiem głównym systemu plików, ale możesz zostać zablokowany wewnątrz kompletnego systemu plików. Jeśli to tylko chroot (a nie jakaś inna wirtualizacja), możesz uruchomić mount i porównać zamontowane systemy plików z tym, co widzisz. Sprawdź, czy każdy punkt montowania ma i-węzeł 2.

 14
Author: user10392,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 23:36:39

Jeśli nie jesteś w chroot, i-węzeł dla / będzie zawsze równy 2. Możesz to sprawdzić używając

stat -c %i /

Lub

ls -id /

Interesujące, ale spróbujmy znaleźć ścieżkę do katalogu chroot. Pytanie stat na którym urządzeniu / znajduje się:

stat -c %04D /

Pierwszy bajt jest większy od urządzenia, a najmniejszy. Na przykład 0802 oznacza dur 8, moll 1. Jeśli zaznaczysz /dev, zobaczysz, że to urządzenie to / dev / sda2. Jeśli jesteś root możesz bezpośrednio utworzyć urządzenie correspondong w swoim chroot:

mknode /tmp/root_dev b 8 1

Teraz znajdźmy ikod powiązany z naszym chroot. debugfs pozwala na wyświetlanie zawartości plików za pomocą numerów i-węzłów. Dla exemple, ls -id / zwrócono 923960:

sudo debugfs /tmp/root_dev -R 'ls <923960>'
 923960  (12) .       915821  (32) ..     5636100  (12) var   
5636319  (12) lib    5636322  (12) usr    5636345  (12) tmp   
5636346  (12) sys    5636347  (12) sbin   5636348  (12) run   
5636349  (12) root   5636350  (12) proc   5636351  (12) mnt   
5636352  (12) home   5636353  (12) dev    5636354  (12) boot   
5636355  (12) bin    5636356  (12) etc    5638152  (16) selinux   
5769366  (12) srv    5769367  (12) opt    5769375  (3832) media 

Interesująca informacja znajduje się w bazie .. wpisu: 915821 Mogę zapytać o jego treść:

sudo debugfs /tmp/root_dev -R 'ls <915821>'
915821  (12) .              2  (12) ..    923960  (20) debian-jail   
923961  (4052) other-jail  

Katalog o nazwie debian-jail mA inode 923960. Ostatnim składnikiem katalogu chroot jest debian-jail. Zobaczmy teraz Katalog nadrzędny (inode 2):

sudo debugfs /tmp/root_dev -R 'ls <2>'
      2  (12) .           2  (12) ..          11  (20) lost+found    1046529  (12) home   
 130817  (12) etc    784897  (16) media     3603  (20) initrd.img   
 261633  (12) var    654081  (12) usr     392449  (12) sys            392450  (12) lib   
 784898  (12) root   915715  (12) sbin   1046530  (12) tmp   
1046531  (12) bin    784899  (12) dev     392451  (12) mnt   
 915716  (12) run        12  (12) proc   1046532  (12) boot               13  (16) lib64   
 784945  (12) srv    915821  (12) opt       3604  (3796) vmlinuz 

Katalog o nazwie opt mA i-węzeł 915821, a i-węzeł 2 jest korzeń systemu plików. Więc mój katalog chroot to /opt/debian-jail. Oczywiście, /dev/sda1 Może być montowany na innym systemie plików. Musisz to sprawdzić (użyj lsof lub bezpośrednio wybierz informacje /proc).

 5
Author: Jezz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-12 09:40:50

W Linuksie z uprawnieniami root, sprawdź, czy katalog główny procesu init jest Twoim katalogiem głównym. Chociaż {[2] } jest zawsze dowiązaniem symbolicznym do /, podążając za nim, prowadzi do katalogu głównego "master"(zakładając, że proces init nie jest zablokowany, ale prawie nigdy tego nie robi). Jeśli {[4] }nie jest zamontowany, możesz się założyć, że jesteś w chroot.

[ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]
# With ash/bash/ksh/zsh
! [ -x /proc/1/root/. ] || [ /proc/1/root/. -ef / ]

To jest bardziej precyzyjne niż patrząc na /proc/1/exe ponieważ to może być inne poza chroot, Jeśli init został zaktualizowany od ostatniego rozruchu lub jeśli chroot znajduje się na głównym głównym systemie plików i init jest z nim ciężko połączony.

Jeśli nie masz uprawnień roota, możesz spojrzeć na /proc/1/mountinfo i /proc/$$/mountinfo (krótko udokumentowane w filesystems/proc.txt w dokumentacji jądra Linuksa ). Ten plik jest czytelny dla świata i zawiera wiele informacji o każdym punkcie montowania w widoku systemu plików procesu. Ścieżki w tym pliku są ograniczone przez chroot wpływający na proces reader, jeśli taki istnieje. Jeśli odczyt procesu {[8] } jest zaszeregowane do systemu plików, który różni się od globalnego roota (zakładając, że root pid 1 jest globalnym rootem), wtedy w /proc/1/mountinfo nie pojawia się żaden wpis dla /. Jeśli proces odczytujący /proc/1/mountinfo jest zaszeregowany do katalogu na globalnym głównym systemie plików, to w /proc/1/mountinfo pojawia się wpis dla /, ale z innym identyfikatorem mount. Nawiasem mówiąc, pole root ($4) wskazuje, gdzie chroot znajduje się w głównym systemie plików. Ponownie, jest to specyficzne dla Linuksa.

[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
 4
Author: Gilles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:16

Zapobieganie takim rzeczom jest o to chodzi. Jeśli twój kod ma działać w chroot, Ustaw flagę przy starcie. Jeśli hakujesz, hack: sprawdź kilka typowych rzeczy w znanych lokalizacjach, policz pliki w /etc, coś w / dev.

 3
Author: sammyo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 18:14:46

W systemach BSD (sprawdź uname-a), proc powinien być zawsze obecny. Sprawdź, czy para dev /i-węzeł/proc/1 /exe (użyj stat na tej ścieżce, nie będzie podążać za dowiązaniem symbolicznym przez tekst, ale za Hookiem) pasuje do/sbin / init.

Sprawdzanie katalogu głównego dla i-węzła # 2 jest również dobre.

Na większości innych systemów, użytkownik root może dowiedzieć się znacznie szybciej, próbując sztuczki fchdir root-breaking trick. Jeśli to pójdzie gdziekolwiek jesteś w więzieniu chroot.

 3
Author: Joshua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 18:25:29

Myślę, że to zależy, dlaczego możesz być w chroot, i czy jakiś wysiłek poszedł w maskowanie go.

Sprawdziłbym / proc, te pliki są automatycznie generowanymi plikami informacji systemowych. Jądro zapełni je w głównym systemie plików, ale możliwe, że nie istnieją w systemie plików chroot.

Jeśli główny system plików /proc został powiązany z / proc w chroot, to jest prawdopodobne, że istnieją pewne rozbieżności między tą informacją a chroot środowisko. Na przykład Check /proc/mounts.

Similarly, check / sys.

 1
Author: SpoonMeiser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 18:22:21

Jeśli wprowadziłeś chroot za pomocą schroot, możesz sprawdzić wartość $debian_chroot.

 0
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-25 07:22:59

Chciałem tych samych informacji dla więzienia działającego na FreeBSD (ponieważ Ansible nie wydaje się wykrywać tego scenariusza).

Na dystrybucji FreeNAS FreeBSD 11, /proc nie jest zamontowany na serwerze, ale znajduje się w więzieniu. Czy tak jest również na zwykłym FreeBSD Nie wiem na pewno, aleprocfs: Gone But Not Forgotten wydaje się sugerować, że tak. Tak czy inaczej, prawdopodobnie nie chciałbyś spróbować zamontować go tylko po to, aby wykryć status więzienia i dlatego nie jestem pewien, czy może to być używany jako niezawodny prognostyk bycia w więzieniu.

Wykluczyłem również używanie stat na /, ponieważ na FreeNAS wszystkie więzienia mają swój własny system plików (np. zbiór danych ZFS) i dlatego / węzeł na hoście i w więzieniu mają inode 4. Spodziewam się, że jest to powszechne na FreeBSD 11 w ogóle.

Więc podejście, które ustaliłem było za pomocą procstat na pid 0.

[root@host ~]# procstat 0
  PID  PPID  PGID   SID  TSID THR LOGIN    WCHAN     EMUL          COMM        
    0     0     0     0     0 1234 -        swapin    -             kernel      
[root@host ~]# echo $?
0
[root@host ~]# jexec guest tcsh
root@guest:/ # procstat 0
procstat: sysctl(kern.proc): No such process
procstat: procstat_getprocs()
root@guest:/ # echo $?
1

Zakładam tutaj, że PID 0 będzie zawsze jądrem na gospodarz, a w więzieniu nie będzie pid 0.

 0
Author: Samuel Harmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-17 18:49:01