labctl
войти регистрация

Восстановить удалённый файл через /proc

имя
recover-deleted
образ
python:3.12-slim
таймаут
30с
проверка…

Задание

Восстановить удалённый файл через /proc

Демон secret-writer открыл /data/secret.txt на запись и продолжает
дописывать туда данные (лог-стиль). Кто-то случайно сделал rm /data/secret.txt.
Самого файла на диске уже нет, но процесс всё ещё держит его открытым через
файловый дескриптор — а значит, содержимое всё ещё доступно через /proc.

Задача

Восстановите текущее содержимое в файл /tmp/recovered-secret.txt. Конкретно:
там должна оказаться строка, начинающаяся с the-password-is- (маркер лабы),
за которой идёт сам пароль.

Симптомы

$ ls /data/secret.txt
ls: cannot access '/data/secret.txt': No such file or directory

$ ls -l /proc/$(pgrep -f secret-writer)/fd/ 2>/dev/null | head
total 0
lrwx------ 1 root root 64 ... 0 -> /dev/null
lrwx------ 1 root root 64 ... 1 -> /dev/null
lrwx------ 1 root root 64 ... 2 -> /dev/null
l-wx------ 1 root root 64 ... 3 -> /data/secret.txt (deleted)  ← вот оно

Видите (deleted) у FD — это и есть «удалённый, но открытый» файл.

Как восстановить

Файл доступен как /proc/<pid>/fd/<n> — это символическая ссылка на inode
(пусть и помечена deleted). Можно её просто скопировать:

$ cp /proc/<pid>/fd/3 /tmp/recovered-secret.txt
$ cat /tmp/recovered-secret.txt
the-password-is-s3cret

<pid> = PID процесса secret-writer, <n> = номер FD со ссылкой на
удалённый файл.

Почему это hard

Это классический трюк с LKSF/forensics: «думали, файл пропал, а процесс его
держит». Реальные сценарии — случайно удалённые логи nginx/mysql, которые
продолжают занимать место на диске (FD жив → inode не освобождён), или
вытащить ключ из памяти работающего сервиса. Лабра учит читать /proc/<pid>/fd
и понимать разницу между именем файла и inode.

Подсказки

  • pgrep -f secret-writer — найти PID процесса-владельца FD.
  • ls -l /proc/<pid>/fd/ — увидеть все дескрипторы; найти строку с (deleted).
  • cat /proc/<pid>/fd/<n> — прочитать содержимое, хотя имя файла удалено.
  • cp /proc/<pid>/fd/<n> /tmp/recovered-secret.txt — восстановить.
Подсказки

Hints: recover-deleted

Концепция

В Linux имя файла и его inode — разные вещи. rm удаляет имя (hard
link), но если процесс держит файл открытым через дескриптор, inode живёт до
тех пор, пока не закроется последний FD. Поэтому df показывает занятое
место, а ls уже не видит имени.

/proc/<pid>/fd/<N> — символическая ссылка на inode (с пометкой (deleted)),
и через неё можно читать/копировать содержимое, как будто файла и не удаляли.

Шаги

  1. Найти PID процесса, который держит файл:
    pgrep -f secret-writer
  2. Посмотреть его FD:
    ls -l /proc/<pid>/fd/
    Один из FD будет со ссылкой ... -> /data/secret.txt (deleted).
  3. Прочитать (чтобы убедиться, что там нужные данные):
    cat /proc/<pid>/fd/<N>
  4. Скопировать в ожидаемое место:
    cp /proc/<pid>/fd/<N> /tmp/recovered-secret.txt
  5. Проверить:
    head -1 /tmp/recovered-secret.txt
    Должна быть строка, начинающаяся с the-password-is-.

Бонус

lsof +L1 показывает все файлы с link count < 1 (открытые, но удалённые).
В slim-образе lsof обычно нет, но его можно доставить: apt-get install lsof.

Последние попытки

  • Загрузка…

Разовый запуск (smoke-тест)

Атомарный цикл up → check → down. Полезно для CI; без предварительной подготовки состояния проверка завершится с ошибкой.