Bug 23058 - Создаётся нерабочий initrd если $TMPDIR смонтирован c noexec
Summary: Создаётся нерабочий initrd если $TMPDIR смонтирован c noexec
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: make-initrd (show other bugs)
Version: unstable
Hardware: all Linux
: P3 minor
Assignee: Alexey Gladkov
QA Contact: qa-sisyphus
URL:
Keywords:
: 24641 (view as bug list)
Depends on:
Blocks: 24406
  Show dependency tree
 
Reported: 2010-03-03 11:40 MSK by serpiph
Modified: 2013-04-27 17:32 MSK (History)
7 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description serpiph 2010-03-03 11:40:51 MSK
Второй раз натыкаюсь на грабли от make-initrd (при работе installkernel): создаётся нерабочий initrd для устанавливаемого ядра. Ядро выпадает в kernel panic с сообщением о невозможности найти init. Поиск проблемы показал, что в initrd файл /init лежит, но это скрипт и в нём указана программа /bin/sh, которой почему-то не оказалось в initrd. Полученный нерабочий initrd (2Мб) и рабочий от программы mkinitrd (1Мб) могу выслать лично по почте. Здесь прикреплять не буду. Ошибка повторяется, если удалить initrd и создать его через installkernel при установленном make-initrd.
$ rpm -qa|grep initrd
make-initrd-devmapper-0.2.2-alt1
mkinitrd-busybox-1.3.2-alt1
make-initrd-0.2.2-alt1
mkinitrd-initramfs-3.0.10-alt1
mkinitrd-3.0.10-alt1
make-initrd-lvm-0.2.2-alt1
$
Файловая система:
/dev/sda2 on / type xfs (rw)
proc on /proc type proc (rw,noexec,nosuid,gid=19)
sysfs on /sys type sysfs (rw)
udevfs on /dev type tmpfs (rw)
devpts on /dev/pts type devpts (rw)
shmfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext3 (ro,nosuid,nodev)
/dev/sda5 on /usr type xfs (rw)
/dev/sda6 on /var type xfs (rw)
/dev/sda9 on /home type xfs (rw)
jacktmp on /var/lib/jack/tmp type ramfs (rw)
tmpfs on /tmp type tmpfs (rw,noexec,nosuid,size=10%)
usbfs on /proc/bus/usb type usbfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
Comment 1 Alexey Gladkov 2010-03-03 13:41:47 MSK
(В ответ на комментарий №0)
> tmpfs on /tmp type tmpfs (rw,noexec,nosuid,size=10%)
                               ^^^^^^
Я думаю, что это может быть из-за noexec.
Comment 2 serpiph 2010-03-03 14:06:30 MSK
(В ответ на комментарий №1)
> (В ответ на комментарий №0)
> > tmpfs on /tmp type tmpfs (rw,noexec,nosuid,size=10%)
>                                ^^^^^^
> Я думаю, что это может быть из-за noexec.

Точно, перемонтировал /tmp с exec и в initrd появилась ссылка /bin/sh->/bin/ash. А ведь никакой ошибки на экран не выдавалось с noexec. Теперь непонятно, считать ли это всё равно ошибкой или закрыть по причине local misconfiguration?
Comment 3 Alexey Gladkov 2010-03-03 14:22:15 MSK
(В ответ на комментарий №2)
> Точно, перемонтировал /tmp с exec и в initrd появилась ссылка
> /bin/sh->/bin/ash. А ведь никакой ошибки на экран не выдавалось с noexec.
> Теперь непонятно, считать ли это всё равно ошибкой или закрыть по причине local
> misconfiguration?

Давайте понизим Важность и оставим открытой ... я попробую придумать что тут можно сделать.
Comment 4 Sir Raorn 2010-03-03 14:34:22 MSK
fakeroot может помочь?
Comment 5 Alexey Gladkov 2010-03-03 14:50:45 MSK
(В ответ на комментарий №4)
> fakeroot может помочь?

Лёх, ты не понял. make-initrd и так уже рут (причём настоящий). В /tmp нельзя ничего исполнить.
Comment 6 serpiph 2010-03-03 14:57:33 MSK
(В ответ на комментарий №3)

> Давайте понизим Важность и оставим открытой ... я попробую придумать что тут
> можно сделать.

Хорошо. Пусть хотя бы ошибку или предупреждение выдаёт, если где-то сборка initrd затыкается, а то сейчас в заблуждение вводит.
Comment 7 Alexey Gladkov 2010-03-04 01:29:22 MSK
Собственно понятно: код "[ -x ./bin/$n ] || continue" не отработал из-за noexec и продиагностировать это не представляется возможным без анализа опций монтирования раздела, на котором мы создаём временный каталог.

В качестве одного из путей решения это замена -x на -f, но это не правильно.

Думаю перенести сборку в ${TMPDIR:-/tmp} и склоняюсь, что подобные случаи это local misconfiguration т.к. программы имеют право создавать и исполнять скрипты во временном каталоге (где же им ещё это делать?).
Comment 8 Sir Raorn 2010-03-04 11:36:01 MSK
Сергей, вы таки попробуйте запустить make-initrd через fakeroot.  Оно же ещё и за правами на файлы следит, а не только "кагбе рута" даёт.
Comment 9 serpiph 2010-03-04 14:10:59 MSK
Интересно, а почему mkinitrd не затыкается? Ведь задача этих программ - это сделать загрузочный образ для адра. Сам образ правильный создаётся (в том числе и права есть 755 на /bin/ash сотоварищи), а значит noexec в создании образа не помеха, единственно нет только симлинка /bin/sh -> /bin/ash.

Хотя да, с noexec я переборщил. :-) У себя уже убрал.
Comment 10 Sir Raorn 2010-03-04 14:22:48 MSK
Инсталлер, кстати, прописывает только nosuid для /tmp.
Comment 11 serpiph 2010-03-04 15:02:22 MSK
(В ответ на комментарий №10)
> Инсталлер, кстати, прописывает только nosuid для /tmp.

У меня система стоит с тех пор, когда ещё это не прописывалось. :-) И я сам строчку на основе /dev смастерил, не подумав про noexec.
Comment 12 Alexey Gladkov 2010-03-04 15:31:47 MSK
(В ответ на комментарий №9)
> Интересно, а почему mkinitrd не затыкается? Ведь задача этих программ - это
> сделать загрузочный образ для адра. Сам образ правильный создаётся (в том числе
> и права есть 755 на /bin/ash сотоварищи), а значит noexec в создании образа не
> помеха, единственно нет только симлинка /bin/sh -> /bin/ash.

Вы ошибаетесь. Вы не знаете как действует noexec. Вы можете скопировать выполняемый файл на такой раздел, но execute permission не будет действовать.
Вы не сможете выполнить такой файл и не сможете проверить файл на _исполняемость_.

mkinitrd только копировал файлы в директорию, не выполняя над ними других действий.

make-initrd после копирования файлов ищет шелл (т.к. он допускает копирования любого шелла) и если нужно делает симлинк /bin/sh. Он выполняет "[ -x /somefile ]" который всегда false с noexec. Поэтому симлинк не создаётся.
Comment 13 Michael Shigorin 2010-03-04 22:28:13 MSK
(In reply to comment #7)
> В качестве одного из путей решения это замена -x на -f, но это не правильно.
Думаю, хотеть исполняемый /tmp более неправильно.  А чуть ли не основной повод не делать его noexec из коробки -- mc. :-/

(In reply to comment #12)
> make-initrd после копирования файлов ищет шелл (т.к. он допускает копирования
> любого шелла) и если нужно делает симлинк /bin/sh. Он выполняет "[ -x /somefile
> ]" который всегда false с noexec. Поэтому симлинк не создаётся.
Может, find /tmp/sh -perm +0111?
Comment 14 Alexey Gladkov 2010-03-05 00:34:32 MSK
(В ответ на комментарий №13)
> Думаю, хотеть исполняемый /tmp более неправильно.  А чуть ли не основной повод
> не делать его noexec из коробки -- mc. :-/

С первым утверждением в корне не согласен. И аргумент я уже называл: программы имеют право генерировать скрипты и исполнять их. Твоё решение ведёт к тому, что они будут это делать в неожиданных местах вместо законного TMPDIR.

Я не могу гарантировать, что в этом проекте не появятся скрипты выполняемые из workdir.

> Может, find /tmp/sh -perm +0111?

Вот только не нужно придумывать хаки для замены стандартной проверки. "test -x" это совершенно легальная и правильная проверка.
Comment 15 Dmitry V. Levin 2010-03-05 01:47:40 MSK
(In reply to comment #14)
> (В ответ на комментарий №13)
> > Думаю, хотеть исполняемый /tmp более неправильно.  А чуть ли не основной повод
> > не делать его noexec из коробки -- mc. :-/
> 
> С первым утверждением в корне не согласен. И аргумент я уже называл: программы
> имеют право генерировать скрипты и исполнять их.

Не все программы имеют такое право.  И, обрати внимание, именно твоя программа оказалась в той системе первой, кому это право понадобилось.  Зачем открывать этот ящик раньше времени?

> Твоё решение ведёт к тому, что
> они будут это делать в неожиданных местах вместо законного TMPDIR.

В неожиданных местах они будут неожиданно получать EROFS или EACCES.
Имей в виду наличие всяких ручек вроде selinux.

> Я не могу гарантировать, что в этом проекте не появятся скрипты выполняемые из
> workdir.

Почему ты не можешь этого гарантировать?

> > Может, find /tmp/sh -perm +0111?
> 
> Вот только не нужно придумывать хаки для замены стандартной проверки. "test -x"
> это совершенно легальная и правильная проверка.

Это не хак, это возможный фикс, хотя мне больше нравится test -f.
Проверка test -x нужна для выявления исполняемости, а в данном случае исполняемость никого не интересует, ибо никто не собирается исполнять тестируемые файлы в том контексте, в котором проводится тестирование.

Да, и заодно пара пожеланий:
- ссылка там пусть лучше будет относительной, а не абсолютной;
- если в результате указанного в шебанге шелла не оказалось, хорошо бы вывести как минимум предупреждение.
Comment 16 Alexey Gladkov 2010-03-05 02:16:51 MSK
(В ответ на комментарий №15)
> Не все программы имеют такое право.  И, обрати внимание, именно твоя программа
> оказалась в той системе первой, кому это право понадобилось.  Зачем открывать
> этот ящик раньше времени?

В каких каталогах можно создавать временные директории и гарантированно будет работать проверка на -x ?

> > Твоё решение ведёт к тому, что
> > они будут это делать в неожиданных местах вместо законного TMPDIR.
> 
> В неожиданных местах они будут неожиданно получать EROFS или EACCES.

От рута этих мест будет меньше чем у обычного пользователя.

> Имей в виду наличие всяких ручек вроде selinux.

У нас его нет, а в дистрибутивах там где он есть (fedora) initrd создаётся в TMPDIR (dracut). И, не поверите, они тоже там проверяют наличие шелла и тоже через -x.

> Почему ты не можешь этого гарантировать?

Потому что система модульная.

> Это не хак, это возможный фикс, хотя мне больше нравится test -f.

Дим, тебе не нужно объяснять разницу между -x и -f.

> Проверка test -x нужна для выявления исполняемости, а в данном случае
> исполняемость никого не интересует, ибо никто не собирается исполнять
> тестируемые файлы в том контексте, в котором проводится тестирование.

Разумеется это проверка важна. Я хочу быть уверенным, что в initrd я сделал симлинк на исполняемый файл, а не на обычный, потому что это ведёт к краху процесса загрузки.
Comment 17 Dmitry V. Levin 2010-03-05 02:54:42 MSK
(In reply to comment #16)
> В каких каталогах можно создавать временные директории и гарантированно будет
> работать проверка на -x ?

Такую гарантию никто не даст.

> > > Твоё решение ведёт к тому, что
> > > они будут это делать в неожиданных местах вместо законного TMPDIR.
> > 
> > В неожиданных местах они будут неожиданно получать EROFS или EACCES.
> 
> От рута этих мест будет меньше чем у обычного пользователя.

А почему только рут?  Я хочу использовать make-initrd для создания рамдисков для контейнеров.  Это ведь совершенно непривилегированная операция.

> > Имей в виду наличие всяких ручек вроде selinux.
> 
> У нас его нет,

Это дело недолгого времени.

> а в дистрибутивах там где он есть (fedora) initrd создаётся в
> TMPDIR (dracut). И, не поверите, они тоже там проверяют наличие шелла и тоже
> через -x.

Ну и зря.  В других дистрибутивах тоже делают ошибки и необоснованные допущения.

> > Почему ты не можешь этого гарантировать?
> 
> Потому что система модульная.

На модули можно накладывать ограничения.

> > Проверка test -x нужна для выявления исполняемости, а в данном случае
> > исполняемость никого не интересует, ибо никто не собирается исполнять
> > тестируемые файлы в том контексте, в котором проводится тестирование.
> 
> Разумеется это проверка важна. Я хочу быть уверенным, что в initrd я сделал
> симлинк на исполняемый файл, а не на обычный, потому что это ведёт к краху
> процесса загрузки.

Ты всё равно не можешь достверно установить будущую исполнимость файла в контексте рамдиска.
Наличие атрибута u+x -- это необходимое, но не достаточное условие исполнимости.
Проверка test -x не даёт гарантии исполнимости даже в нативном контексте, не говоря уже о чужом контексте.
Вот простой пример:
$ echo '#!/missing' > sample && chmod 700 sample && test -x sample && ./sample
-bash: ./sample: /missing: bad interpreter: No such file or directory
$ env -i strace -eexecve ./sample
execve("./sample", ["./sample"], [/* 0 vars */]) = -1 ENOENT (No such file or directory)
strace: exec: No such file or directory

Ты ведь знаешь, чем отличается проверка access(X_OK) от stat() с последующим тестом на S_IXUSR|S_IXGRP|S_IXOTH.  Какая тебе польза от этой разницы?

Вот код, о котором идёт речь:
for n in bash dash mksh ash; do
  [ -x ./bin/$n ] || continue
  ln -s /bin/$n ./bin/sh
  break
done

Возникают дополнительные вопросы:
- если ./bin/sh уже существует, то будет exit 1;
- если любой из вышеперечисленных файлов существует и является абсолютной ссылкой, то проверка test -x может пройти, в то время как файл, на который указывает ссылка, в образ не попадёт;
- как был получен этот список шеллов?
- зачем вообще нужен этот ./bin/sh?
Comment 18 Alexey Gladkov 2010-03-05 03:41:24 MSK
(В ответ на комментарий №17)
> Такую гарантию никто не даст.

Значит использование TMPDIR правомерно т.к. оно предназначено для хранения временных файлов. Дополнительные ограничения на совести администратора.

> А почему только рут?  Я хочу использовать make-initrd для создания рамдисков
> для контейнеров.  Это ведь совершенно непривилегированная операция.

mkinitrd требовал его для создания устройств.
make-initrd требует его (как минимум) для доступа к /lib/modules.

> Ну и зря.  В других дистрибутивах тоже делают ошибки и необоснованные
> допущения.

На мой взгляд это правильное допущение, иначе можно дойти до того, что предётся монтировать tmpfs в рабочую директорию (и то не поможет), потому что любым файловым операциям нельзя доверять.

> На модули можно накладывать ограничения.

Обоснуйте более веско необходимость накладывать ограничение в создании и выполнении временных скриптов и выполнении проверки на исполнимость. Это очень сильное ограничение и мне нужны очень веские доказательства того, что они необходимы.

> Наличие атрибута u+x -- это необходимое, но не достаточное условие
> исполнимости.

а find -perm +0111 даёт достаточную гарантию исполнимости ?

> Ты ведь знаешь, чем отличается проверка access(X_OK) от stat() с последующим
> тестом на S_IXUSR|S_IXGRP|S_IXOTH.  Какая тебе польза от этой разницы?

Мы не знаем под каким пользователем и в каком контексте будет выполняться создаваемый образ. Так как я не имею достаточной информации я использую более простую и нативную проверку (необходимую, но не достаточную).

> Вот код, о котором идёт речь:
> for n in bash dash mksh ash; do
>   [ -x ./bin/$n ] || continue
>   ln -s /bin/$n ./bin/sh
>   break
> done
> 
> Возникают дополнительные вопросы:
> - если ./bin/sh уже существует, то будет exit 1;

Это ошибка. В следующей версии исправлю.

> - если любой из вышеперечисленных файлов существует и является абсолютной
> ссылкой, то проверка test -x может пройти, в то время как файл, на который
> указывает ссылка, в образ не попадёт;

put-file копирует не только симлинк, но и то на что он указывает (copy_file()).

> - как был получен этот список шеллов?

Это список шеллов, которые я смог вспомнить и которые поддерживают posix в достаточной мере чтобы выполнить скрипты initrd.

> - зачем вообще нужен этот ./bin/sh?

Чтобы иметь возможность писать #!/bin/sh в initrd.
Comment 19 Alexey Gladkov 2010-03-05 03:51:29 MSK
К чему бы не привело это обсуждение, вы же все понимаете, что при поддержке модульности и при наличии хуков (сейчас они только внешние, но как знать что будет) гарантировать работоспособность initrd после сборки с noexec невозможно.
Comment 20 Dmitry V. Levin 2010-03-05 04:04:20 MSK
(In reply to comment #18)
> (В ответ на комментарий №17)
> > Такую гарантию никто не даст.
> 
> Значит использование TMPDIR правомерно т.к. оно предназначено для хранения
> временных файлов. Дополнительные ограничения на совести администратора.

Да, но хранение и исполнение временных файлов -- это совершенно разные операции.

> > А почему только рут?  Я хочу использовать make-initrd для создания рамдисков
> > для контейнеров.  Это ведь совершенно непривилегированная операция.
> 
> mkinitrd требовал его для создания устройств.
> make-initrd требует его (как минимум) для доступа к /lib/modules.

На тему этого доступа у нас, кстати, всё ещё висит баг #5969.
Ладно, тут мы отвлеклись от темы.

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

Мы ведь говорим про совершенно реальную (и довольно распространённую в узких кругах) ситуацию.

> > На модули можно накладывать ограничения.
> 
> Обоснуйте более веско необходимость накладывать ограничение в создании и
> выполнении временных скриптов и выполнении проверки на исполнимость. Это очень
> сильное ограничение и мне нужны очень веские доказательства того, что они
> необходимы.

У нас ещё никто никогда в базовой системе не исполнял временные файлы.

> > Наличие атрибута u+x -- это необходимое, но не достаточное условие
> > исполнимости.
> 
> а find -perm +0111 даёт достаточную гарантию исполнимости ?
> 
> > Ты ведь знаешь, чем отличается проверка access(X_OK) от stat() с последующим
> > тестом на S_IXUSR|S_IXGRP|S_IXOTH.  Какая тебе польза от этой разницы?
> 
> Мы не знаем под каким пользователем и в каком контексте будет выполняться
> создаваемый образ. Так как я не имею достаточной информации я использую более
> простую и нативную проверку (необходимую, но не достаточную).

Проверка простая, с этим никто не спорит.  И с тем, что она не является панацеей, тоже все согласны.  Весь разговор о том, что эта проверка является не необходимой, а немного избыточной.  Накладываются ограничения, без следования которым всё работало бы правильно.

> > Вот код, о котором идёт речь:
> > for n in bash dash mksh ash; do
> >   [ -x ./bin/$n ] || continue
> >   ln -s /bin/$n ./bin/sh
> >   break
> > done
> > 
> > Возникают дополнительные вопросы:
> 
> > - если любой из вышеперечисленных файлов существует и является абсолютной
> > ссылкой, то проверка test -x может пройти, в то время как файл, на который
> > указывает ссылка, в образ не попадёт;
> 
> put-file копирует не только симлинк, но и то на что он указывает (copy_file()).

А если и то, на что он указывает, тоже ссылка?  Например, /bin/bash, указывающий на bash3?
Comment 21 Dmitry V. Levin 2010-03-05 04:15:57 MSK
(In reply to comment #19)
> К чему бы не привело это обсуждение, вы же все понимаете, что при поддержке
> модульности и при наличии хуков (сейчас они только внешние, но как знать что
> будет) гарантировать работоспособность initrd после сборки с noexec невозможно.

Я не уверен, что можно гарантировать работоспособность initrd в принципе.
Хорошо бы гарантировать, что initrd не получится неработоспособным именно из-за noexec на $TMPDIR, а ещё лучше -- сделать так, чтобы noexec на $TMPDIR вообще не влиял на make-initrd.
Comment 22 Alexey Gladkov 2010-03-05 04:49:03 MSK
(В ответ на комментарий №20)
> Да, но хранение и исполнение временных файлов -- это совершенно разные
> операции.

Да. Но и выполнение временных скриптов тоже правомерная операция в которой нельзя отказать. Несколько примеров касающиеся исполнения чего-либо в рабочем каталоге: mkimage исполняет сгенерированные скрипты для модификации образа; hasher исполняет сгенерированные скрипты для выполнения команд внутри образа.

> На тему этого доступа у нас, кстати, всё ещё висит баг #5969.
> Ладно, тут мы отвлеклись от темы.


> Мы ведь говорим про совершенно реальную (и довольно распространённую в узких
> кругах) ситуацию.

Прощу привести доводы, почему 

> У нас ещё никто никогда в базовой системе не исполнял временные файлы.

Исполнять скрипт и делать проверку на u+x разные вещи. И это всё равно не довод. Проблема #5969 не решена, но всё бывает в первый раз.

> Проверка простая, с этим никто не спорит.  И с тем, что она не является
> панацеей, тоже все согласны.  Весь разговор о том, что эта проверка является не
> необходимой, а немного избыточной.  Накладываются ограничения, без следования
> которым всё работало бы правильно.

В общем случае (следуя паранойе) проверка на -f ослабит конструкцию и тогда будет возможно положить симлинк /bin/bash который будет указывать на простой файл.
То что ты предлагаешь не решение, а маскировка проблемы: "давайте не будем проверять на исполнимость т.к. проверка неудобна и пусть будет, что будет"

> А если и то, на что он указывает, тоже ссылка?  Например, /bin/bash,
> указывающий на bash3?

В этом случае он должен скопировать все симлинки до bash3.
Comment 23 Alexey Gladkov 2010-03-05 05:05:19 MSK
(В ответ на комментарий №21)
> Я не уверен, что можно гарантировать работоспособность initrd в принципе.

Согласен и поэтому я стараюсь не ослаблять проверки без особой нужды. Плохо само получится.

> Хорошо бы гарантировать, что initrd не получится неработоспособным именно
> из-за noexec на $TMPDIR, а ещё лучше -- сделать так, чтобы noexec на $TMPDIR
> вообще не влиял на make-initrd.

Для этого проще всего вернуться к старому mkinitrd. Он не подразумевал расширения initrd ничем кроме копирования с разыменовыванием.
Comment 24 Dmitry V. Levin 2010-03-05 05:07:34 MSK
Дублирую сюда часть приватного письма.

Есть программы, которым необходимо исполнять временные файлы, однако
такие программы либо не являются базовыми, либо у них есть ручки для
настройки.  Возьмём тот же rpm, который сохраняет и исполняет
%post-скрипты.  У него есть макрос %_tmppath, который реализует эту
настройку.  У каждого пользователя может быть определено своё значение
макроса %_tmppath.  Если ты _настаиваешь_ на том, что make-initrd нужно
уметь исполнять временные файлы, то сделай аналогичную ручку.
Например, можно зарезервировать для этих целей какую-нибудь переменную
среды, скажем, MKINITRD_TMPDIR.  Использовать $TMPDIR в безусловном
порядке плохо из-за того, что эта переменная слишком общего назначения,
и предназначена она в основном для определения места для _хранения_
временных файлов утилитами вроде sort(1), а не места для _выполнения_
временных файлов.
Comment 25 Dmitry V. Levin 2010-03-05 05:09:54 MSK
(In reply to comment #23)
> (В ответ на комментарий №21)
> 
> > Хорошо бы гарантировать, что initrd не получится неработоспособным именно
> > из-за noexec на $TMPDIR, а ещё лучше -- сделать так, чтобы noexec на $TMPDIR
> > вообще не влиял на make-initrd.
> 
> Для этого проще всего вернуться к старому mkinitrd. Он не подразумевал
> расширения initrd ничем кроме копирования с разыменовыванием.

На этой стадии развития уже проще пропатчить make-initrd.
Comment 26 Alexey Gladkov 2010-03-06 17:42:43 MSK
По результатам приватного общения:

Добавлена поддержка переменной окружения INITRD_WORKDIR, которая определяет каталог где будет создаваться образ. Логика следующая:

WORKDIR="${INITRD_WORKDIR-}"
WORKDIR="${WORKDIR:-${TMPDIR-}}"
WORKDIR="${WORKDIR:-/tmp}"

Плюс добавлена проверка на 'noexec' опцию.
Comment 27 Michael Shigorin 2010-03-07 19:31:41 MSK
(In reply to comment #26)
> Плюс добавлена проверка на 'noexec' опцию.
Спасибо!  С меня причитается за вредность :)

(In reply to comment #17)
> > Разумеется это проверка важна. Я хочу быть уверенным, что в initrd я сделал
> > симлинк на исполняемый файл, а не на обычный, потому что это ведёт к краху
> > процесса загрузки.
Так в багу вчитайся -- именно этой "уверенностью" в виде некорректного теста и привёл ко краху процесса загрузки.

> Проверка test -x не даёт гарантии исполнимости даже в нативном контексте, не
> говоря уже о чужом контексте.
Мало того, /bin/sh может оказаться вообще не командным интерпретатором -- и что с того?  Я бы если уж хочется обеспечить исполнимость в данном качестве -- то:
1) попытался бы выполнить простейший тест вида [ "$(sh -c "true && echo yes") = "yes" ] (на что могут быть архитектурные ограничения -- или нет?)
2) сделал бы chmod +x на уложенный для формирования образа экземпляр.

(In reply to comment #18)
> Значит использование TMPDIR правомерно т.к. оно предназначено для хранения
> временных файлов. Дополнительные ограничения на совести администратора.
Ну ты даёшь.  Вот уж ради собственной блажи наказывать системного администратора, предпринявшего _разумную_ меру для его собственной системы -- это непрофессионализм.

> > А почему только рут?
> make-initrd требует его (как минимум) для доступа к /lib/modules.
У меня ещё есть надежда сделать control для /boot и /lib/modules. :)

> Обоснуйте более веско необходимость накладывать ограничение в создании и
> выполнении временных скриптов и выполнении проверки на исполнимость. Это очень
> сильное ограничение и мне нужны очень веские доказательства того, что они
> необходимы.
Я как администратор веб-серверов порой предпочитаю отбирать у apache возможность записи в /tmp, и считаю возможность для хоста смонтировать его с noexec большим плюсом.
Comment 28 Alexey Gladkov 2010-03-07 19:51:24 MSK
(В ответ на комментарий №27)

Как я уже сказал, поведение make-initrd не поменяется. Появилась проверка на корректность "test -x", выполнение скриптов в workdir и если таких возможностей у workdir нет, то будет отказ что-либо создавать в таком рабочем каталоге. Плюс тем, у кого такой супер безопасный каталог /tmp, сделана переменная, где все условия будут выполняться.

Так что искать небезопасный каталог? доступный вызвавшему make-initrd, на безопасном сервере всё равно предётся, чтобы вы не говорили.
Comment 29 Alexey Gladkov 2010-03-07 19:52:41 MSK
(В ответ на комментарий №27)

Как я уже сказал, поведение make-initrd не поменяется. Появилась проверка на корректность "test -x", выполнение скриптов в workdir и если таких возможностей у workdir нет, то будет отказ что-либо создавать в таком рабочем каталоге. Плюс тем, у кого такой супер безопасный каталог /tmp, сделана переменная, где все условия будут выполняться.

Так что искать небезопасный каталог, доступный вызвавшему make-initrd, на безопасном сервере всё равно предётся, чтобы вы не говорили.
Comment 30 Alexey Gladkov 2010-03-07 20:10:29 MSK
(В ответ на комментарий №27)
> > Значит использование TMPDIR правомерно т.к. оно предназначено для хранения
> > временных файлов. Дополнительные ограничения на совести администратора.
> Ну ты даёшь.  Вот уж ради собственной блажи наказывать системного
> администратора, предпринявшего _разумную_ меру для его собственной системы --
> это непрофессионализм.

Хочу выделить это замечание, но оставлю его без комментариев дабы не усиливать обиду у обиженных и не обижать новых читателей.

> считаю возможность для хоста смонтировать его с noexec большим плюсом.

Считай. Теперь ты можешь монтировать хоть всю систему в readonly и сам придумывать где генерировать initrd.

В общем, тему считаю исчерпанной.
Ждите нового релиза.
Comment 31 Alexey Gladkov 2010-11-25 13:52:14 MSK
*** Bug 24641 has been marked as a duplicate of this bug. ***
Comment 32 Vitaly Lipatov 2013-04-27 13:12:08 MSK
Написали много, а заявленную проблему так и не решили.
1. Такое поведение make-initrd по умолчанию запрещает использование noexec для /tmp (приводя к негрузящейся системе)
2. Вовсе не надо было так упираться в проверку исполнимости через test -x, она ничего сильного не делает, можно было и объехать.

P.S.
Если make-initrd ничего не создаёт вследствие какой-либо ошибки, grub потом получает запись для загрузки ядра просто без initrd.
Comment 33 Dmitry V. Levin 2013-04-27 17:32:29 MSK
Я бы в данном конкретном случае все равно заменил бы проверки

[ ! -x ./bin/sh ]
и
[ -x ./bin/$n ]

на

[ -z "$(find -L ./bin/sh -maxdepth 0 -type f -perm -u=x 2>/dev/null)" ]
и
[ -n "$(find -L ./bin/$n -maxdepth 0 -type f -perm -u=x 2>/dev/null)" ]

соответственно.

Но сейчас там уже check_noexec, что обессмысливает эту замену, и я уже везде, где надо, давно использую INITRD_WORKDIR.
Поскольку make-initrd непременно хочет иметь возможность исполнять временные файлы, это CLOSED FIXED.