pivot_root из initramfs на новый root - ошибка "Неверный аргумент"

Это не работает , по крайней мере, в системах, подобных Debian (файлы crontab с символическими или жесткими ссылками для (не системных) пользователей игнорируется вообще ). Это также не удается, если вы используете crontab для изменения файла crontab.Если версия cron по-прежнему принимает файлы crontab с символическими ссылками, она создает возможные дыры в безопасности , поскольку файл crontab больше не проверяется на целостность.

В вашем решении с символической ссылкой crontab -e дает сбой, если вы (или какой-либо сценарий установки) изменяете файл crontab:

crontab: crontabs/username: rename: Operation not permitted

, поскольку он перемещает временный файл в / var / spool / cron / crontabs / username , чтобы мгновенно заменить старый файл.

В crontab встроено множество дополнительных проверок безопасности, так что систему cron нельзя использовать для взлома системы. Например, он проверяет содержимое файла cron перед его установкой или изменением. Недопустимый файл cron может привести к сбою демона cron или может (по крайней мере теоретически) неправильно использовать его для получения дополнительных привилегий в системе. В вашем решении нет проверки больше для файла crontab.

4
14.07.2018, 01:39
2 ответа

В отличие от initrd, Linux не позволяет размонтировать initramfs. Очевидно, это помогло сохранить простоту кода ядра.

Вместо pivot_rootвы можете использовать команду switch_root. Он реализует следующую процедуру. Обратите внимание, что switch_rootудаляет все файлы в старом корне, чтобы освободить память initramfs, поэтому вам нужно быть осторожным при выполнении этой команды.

initramfs is rootfs: you can neither pivot_root rootfs, nor unmount it. Instead delete everything out of rootfs to free up the space (find -xdev / -exec rm '{}' ';'), overmount rootfs with the new root (cd /newmount; mount --move. /; chroot.), attach stdin/stdout/stderr to the new /dev/console, and exec the new init.

Обратите внимание, что предлагаемые команды оболочки являются лишь грубыми эквивалентами кода C. Команды на самом деле не будут работать, если они все не встроены в вашу оболочку, потому что первая команда удаляет все программы и другие файлы из initramfs :-).


Rootfs is a special instance of ramfs (or tmpfs, if that's enabled), which is always present in 2.6 systems. You can't unmount rootfs for approximately the same reason you can't kill the init process; rather than having special code to check for and handle an empty list, it's smaller and simpler for the kernel to just make sure certain lists can't become empty.

https://github.com/torvalds/linux/blob/v4.17/Documentation/filesystems/ramfs-rootfs-initramfs.txt

10
27.01.2020, 20:49

Из комментария к системному вызову root _в файле fs/namespace.c:

Also, the current root cannot be on the 'rootfs' (initial ramfs) filesystem. See Documentation/filesystems/ramfs-rootfs-initramfs.txt for alternatives in this situation.

Я представил патч для проекта справочных -страниц об этом , так что в будущих выпусках man 2 pivot_rootэтот случай будет упоминаться.

2
27.01.2020, 20:49

Теги

Похожие вопросы