FastNetMon

пятница, 2 мая 2014 г.

Тест: Насколько Вы крутой Linux инженер?

Задачка!

Задача является хитрым продолжением таски вида:

У вас есть запущенное приложение, исполняемый файл которого удален - как его восстановить?

Ее решение весьма тривиальное и даже могу его озвучить:
cp /proc/$pid/exe /root/rescued_file
Либо если речь идет о файле, открытом приложением на запись:
cp /proc/$pid/fd/X /root/rescued_file

Моя задача на порядки сложнее.

Итак, есть некое приложение, пусть это будет /usr/bin/host, которое было запущено с библиотекой libworker.so через LD_PRELOAD следующим образом:
LD_PRELOAD=/somepath/libworker.so /usr/bin/host.

Договоримся о том, что в библиотеке libworker крутится внешний цикл и пока приложение с этой библиотекой (/usr/bin/host) не будет убито - оно будет висеть в памяти.

А теперь самое интересное - удаляем библиотеку libworker с диска.

Теперь псевдофайл /proc/$pid/smaps примет вот такой вид (привожу лишь выдержку):
7fc51b53f000-7fc51b540000 rw-p 00006000 b6:ff161 30664                    (deleted)/somepath/libworker.so
Size:                  4 kB
Rss:                   4 kB
Pss:                   4 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         4 kB
Referenced:            4 kB
Anonymous:             4 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Как видите, мы видим номер inode, принадлежащий данной библиотеке, видим ее имя, но с диска она удалена и возможности ее прочесть нету. В открытых файловых дескрипторах (/proc/$pid/fd) она также не значится.

Есть путь в лоб - использование debugfs и посмотреть содержимое файла из внутренностей ext3/ext4. Но в случае высокой нагрузки и отсутствия настолько высокого уровня доступа - это решение неосуществимо.

Итак, как извлечь удаленную библиотеку из памяти? :)

4 комментария :

  1. Анонимный2 мая 2014 г., 18:29

    через /proc/PID/mem прочитать указанный диапазон адресов с помощью dd например или gdb. Только тут дата-секция, надо читать .text, где права r-xp

    ОтветитьУдалить
    Ответы
    1. Вопрос в реализации :) Что примерно делать - понятно. А вот работающий PoC по извлечению библиотеки из памяти - отдельный вопрос.

      Удалить

Примечание. Отправлять комментарии могут только участники этого блога.