Friday, 21 May 2010

Соображения по генерации chroot окружения в CentOS / Debian или засовываем wget в chroot

Встала такая задачка - выдергивать из существующей системы часть файлов и из них делать chroot окружение, в котором точно будет работать ряд приложений. Методов для реализации задачи множество, я бы хотел рассмотреть и получить наиболее полный и качественный.

Экспериментировать мы будем над wget, так как на него я более всего времени потратил. Ставим его:
apt-get install -y wget



Что нужно приложению?

1) Динамические библиотеки явно указанные при линковке. Узнать, какие библиотеки требуются программе крайне легко - ldd /usr/bin/wget.

Вот пример результата работы программы:
ldd /usr/bin/wget
linux-vdso.so.1 => (0x00007fff481ff000)
libdl.so.2 => /lib/libdl.so.2 (0x00007fdea4e7c000)
librt.so.1 => /lib/librt.so.1 (0x00007fdea4c73000)
libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8 (0x00007fdea4a22000)
libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0x00007fdea4687000)
libc.so.6 => /lib/libc.so.6 (0x00007fdea4334000)
/lib64/ld-linux-x86-64.so.2 (0x00007fdea5080000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007fdea4118000)
libz.so.1 => /usr/lib/libz.so.1 (0x00007fdea3f01000)


2) Кроме явно указанных библиотек также возможно, что приложение в процессе запуска через dl_open и другие функции подгружает еще какие-то библиотеки (либо это делает даже не программа, а некая библиотека из зависимостей). Без запуска программы это выяснить нельзя. Так что заюзаем strace:


strace -e trace=open -f /usr/bin/wget ya.ru 2>&1 | grep lib
open("/lib/libdl.so.2", O_RDONLY) = 3
open("/lib/librt.so.1", O_RDONLY) = 3
open("/usr/lib/libssl.so.0.9.8", O_RDONLY) = 3
open("/usr/lib/libcrypto.so.0.9.8", O_RDONLY) = 3
open("/lib/libc.so.6", O_RDONLY) = 3
open("/lib/libpthread.so.0", O_RDONLY) = 3
open("/usr/lib/libz.so.1", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open("/lib/libnss_files.so.2", O_RDONLY) = 3
open("/lib/libnss_dns.so.2", O_RDONLY) = 3
open("/lib/libresolv.so.2", O_RDONLY) = 3


Итого, выяснили еще несколько библиотек, которые нам нужны для работы.

3) Кроме библиотек приложению часто требуются специализированные устройства, /dev/null, /dev/zero, /dev/urandom, /dev/random и ряд других.
4) Также часто приложения требуют смонтированной файловой системы /proc, но это часто игнорируется ими и они без нее работают корректно.
5) Конфигурационные файлы, например: /etc/resolv.conf. Тут также сложность в том, что конфиги могут требоваться не самой программой, а зависимыми библиотеками.
6) Файлы документации, локали и проч - их также ловить только по strace.

На основе всего выше сказанного, задача правильного помещения большого числа программ в chroot становится почти неавтиматизируемой при подходе со стороны реверс инжиниринга. А вот со стороны:

dpkg -L wget
и
apt-cache depends wget


Она вполне решаемая. Но тут также без файлов устройств не обойтись.

No comments:

Post a Comment

Note: only a member of this blog may post a comment.