2013-10-09 19 views
5

Sto cercando di far funzionare chroot sul mio MacBook. I ha installato il dir carcere per contenere tutti i requisiti per/bin/sh e/bin/bash (ricorsivamente chiamato/usr/bin/otool)OSX e chroot non sono in grado di trovare/bin/bash

# ls /var/chroot/*/* 
/var/chroot/bin/bash /var/chroot/bin/sh 

/var/chroot/usr/lib: 
libDiagnosticMessagesClient.dylib  libauto.dylib 
libc++abi.dylib       libobjc.A.dylib 
libSystem.B.dylib      libc++.1.dylib 
libncurses.5.4.dylib     system 

quando cerco di usare chroot su/var/chroot, è continua a dire che non riesce a trovare/bin/bash

# chroot /var/chroot/ 
chroot: /bin/sh: No such file or directory 
$ sudo chroot /var/chroot/ 
chroot: /bin/bash: No such file or directory 

Qualsiasi idea di che cosa è causando chroot di non lavorare sul mio Mac?

versione OSX 10.8.4

Edit: su CentOS, quando corro ldd/bin/bash, ho tutti le librerie necessarie. Se non li copio interamente, si dice/bin/bash: nessun file o directory di questo tipo. Quindi presumo che questo significhi che su mac mi mancano le libs; non sono sicuro di quale.

+0

Prova 'strace'ing il comando per vedere cosa sta cercando di' open (1) ' – kojiro

+0

Mac non ha strace, quindi ho usato dtruss. Non vederlo caricare libs diverse da roba dtruss: sudo dtruss -fa -t open/bin/bash open ("/ usr/lib/dtrace/libdtrace_dyld.dylib \ 0", 0x0, 0x0) = 3 0 open ("/ dev/tty \ 0", 0x6, 0x7FFF737E7788) = 3 0 aperto ("/ dev/dtracehelper \ 0", 0x2, 0x7FFF5DA4E460) = 3 0 aperto ("/ usr/share/terminfo/73/screen \ 0 ", 0x0, 0x0) = 3 0 open ("/dev/dtracehelper \ 0 ", 0x2, 0x7FFF5A9FA4C0) = 3 0 – ekaqu

+0

sudo dtruss/bin/bash -c" echo hi "sembra darmi molto maggiori dettagli su quali librerie sono aperte. – ekaqu

risposta

5

Quando hai detto che hai fatto un ricorsivo otool -L cosa intendi? Ci sono un sacco di librerie condivise necessarie per fare questo lavoro, ad esempio:

otool -L /bin/bash 
/bin/bash: 
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 

Poi si deve eseguire otool -L su quelli (poi otool -L su quelli):

otool -L /usr/lib/libSystem.B.dylib 
/usr/lib/libSystem.B.dylib: 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 
    /usr/lib/system/libcache.dylib (compatibility version 1.0.0, current version 62.0.0) 
    /usr/lib/system/libcommonCrypto.dylib (compatibility version 1.0.0, current version 60049.0.0) 
    /usr/lib/system/libcompiler_rt.dylib (compatibility version 1.0.0, current version 35.0.0) 
    /usr/lib/system/libcopyfile.dylib (compatibility version 1.0.0, current version 103.0.0) 
    /usr/lib/system/libcorecrypto.dylib (compatibility version 1.0.0, current version 1.0.0) 
    /usr/lib/system/libdispatch.dylib (compatibility version 1.0.0, current version 339.1.9) 
    /usr/lib/system/libdyld.dylib (compatibility version 1.0.0, current version 239.3.0) 
    /usr/lib/system/libkeymgr.dylib (compatibility version 1.0.0, current version 28.0.0) 
    /usr/lib/system/liblaunch.dylib (compatibility version 1.0.0, current version 842.1.4) 
    /usr/lib/system/libmacho.dylib (compatibility version 1.0.0, current version 845.0.0) 
    /usr/lib/system/libquarantine.dylib (compatibility version 1.0.0, current version 71.0.0) 
    /usr/lib/system/libremovefile.dylib (compatibility version 1.0.0, current version 33.0.0) 
    /usr/lib/system/libsystem_asl.dylib (compatibility version 1.0.0, current version 217.1.4) 
    /usr/lib/system/libsystem_blocks.dylib (compatibility version 1.0.0, current version 63.0.0) 
    /usr/lib/system/libsystem_c.dylib (compatibility version 1.0.0, current version 997.1.1) 
    /usr/lib/system/libsystem_configuration.dylib (compatibility version 1.0.0, current version 596.12.0) 
    /usr/lib/system/libsystem_dnssd.dylib (compatibility version 1.0.0, current version 522.1.11) 
    /usr/lib/system/libsystem_info.dylib (compatibility version 1.0.0, current version 449.1.3) 
    /usr/lib/system/libsystem_kernel.dylib (compatibility version 1.0.0, current version 2422.1.72) 
    /usr/lib/system/libsystem_m.dylib (compatibility version 1.0.0, current version 3047.16.0) 
    /usr/lib/system/libsystem_malloc.dylib (compatibility version 1.0.0, current version 23.1.10) 
    /usr/lib/system/libsystem_network.dylib (compatibility version 1.0.0, current version 241.3.0) 
    /usr/lib/system/libsystem_notify.dylib (compatibility version 1.0.0, current version 121.0.0) 
    /usr/lib/system/libsystem_platform.dylib (compatibility version 1.0.0, current version 24.1.4) 
    /usr/lib/system/libsystem_pthread.dylib (compatibility version 1.0.0, current version 53.1.4) 
    /usr/lib/system/libsystem_sandbox.dylib (compatibility version 1.0.0, current version 278.10.0) 
    /usr/lib/system/libsystem_stats.dylib (compatibility version 1.0.0, current version 93.1.26) 
    /usr/lib/system/libunc.dylib (compatibility version 1.0.0, current version 28.0.0) 
    /usr/lib/system/libunwind.dylib (compatibility version 1.0.0, current version 35.3.0) 
    /usr/lib/system/libxpc.dylib (compatibility version 1.0.0, current version 300.1.17) 

ho fatto un test rapido con:

mkdir -p /Users/chroot/bin /Users/chroot/usr/lib/system 
cp /bin/bash /Users/chroot/bin 
cp /usr/lib/* /Users/chroot/usr/lib 
cp /usr/lib/system/* /Users/chroot/usr/lib/system 

chroot /Users/chroot /bin/bash 

Questo ha funzionato, quindi presumo che manchi una libreria condivisa di cui avevi bisogno. Probabilmente potresti scrivere uno script per fare un ricorsivo otool -L e ottenere semplicemente le librerie condivise esatte di cui hai bisogno, ma probabilmente è più facile fare una copia di massa.

3

È necessario copiare /usr/lib/dyld nella propria prigione chroot per ottenere il linker dinamico. Se questo non è presente, il tentativo di eseguire qualsiasi cosa nella prigione chroot fallirà senza errori diversi da Killed: 9. Una volta arrivati ​​/usr/lib/dyld copiato, quindi se vi manca qualsiasi ulteriore librerie si otterrà un errore, ad esempio:

dyld: Library not loaded: /usr/lib/libncurses.5.4.dylib 
    Referenced from: /bin/bash 
    Reason: image not found 

Dal tuo elenco di file Vedo che non si dispone di /usr/lib/dyld, quindi penso che è molto probabilmente questo è il tuo problema. Non sono sicuro del motivo per cui stai ricevendo No such file or directory invece di Killed: 9 per questo problema; forse questa è una differenza di versione del sistema operativo - sto testando su Mac OS X 10.10.5, sei (o stavi testando) con Mac OS X 10.8.4.

La risposta di hwatkins ovviamente funziona poiché copia sia /usr/lib/dyld che ogni dylib richiesto per eseguire /bin/bash nella prigione. Tuttavia, quando si installa una prigione, preferisco copiare solo il minimo indispensabile per farlo funzionare. Dopo aver copiato dyld e bash, puoi seguire i messaggi di errore per ottenere i percorsi di tutte le altre librerie necessarie. (Un po 'laborioso, ma è un minimo garantito.)

Il metodo di chiamata ricorsiva otool -L funziona anche per i file * .dylib, ma non ti dirà su /usr/lib/dyld. Questo perché -L stampa le librerie condivise utilizzate, ma /usr/lib/dyld non è esattamente una libreria condivisa.Se esegui otool -l in una libreria eseguibile, vedrai l'output -L corrispondente al comando di caricamento LC_LOAD_DYLIB (e alcune varianti come LC_REEXPORT_DYLIB), mentre il riferimento a dyld è in LC_LOAD_DYLINKER, che non viene emesso da -L.