Secure Packaging Policy
Массовые операции над файлами и каталогами (секции: %setup, %build, %install, %pre*, %post*, %trigger*)
--
Массовые операции над файлами, имена которых начинаются на «-», могут давать неверный результат, если аргументы не отделены от команды «--», поэтому при массовой обработке файлов и каталогов (glob expansion, find и др.) необходимо отделять команду с параметрами от списка аргументов разделителем «--» везде, где это поддерживается.
-print0
Использование find при работе с каталогами, содержащими объекты с нестандартными именами (пробелами и др.), без использования -print0 приводит к неправильному результату, поэтому при использовании утилиты find для изменения файлов и каталогов необходимо использовать параметр -print0; соответствующие ему параметры других утилит:
- xargs
- -r0
- grep
- -Z
- sort
- -z
Пример 1.1. Правильное использование find
find -type f -print0 |
xargs -r0 grep -FZl 'mawk gawk' -- |
xargs -r0 perl -pi -e 's/mawk gawk/gawk mawk/g' --
Операции с временными файлами
При необходимости создания временных файлов и/или каталогов следует использовать утилиту mktemp(1) совместно с командой trap, например:
TMPFILE="`mktemp -t somename.XXXXXXXXXX`" || exit 1
exit_handler()
{
local rc=$?
trap '' EXIT
rm -f -- "$TMPFILE"
exit $rc
}
trap exit_handler EXIT HUP INT PIPE TERM QUIT
Не следует пользоваться фиксированными либо предсказуемыми именами для создания временных файлов в общедоступных каталогах, таких как /tmp. Не следует оставлять временные файлы в случае успешного окончания текущей стадии сборки пакета.
Чужие и системные каталоги и файлы (секции: %install, %files)
Пакеты не должны включать в свой состав чужие каталоги и файлы, в частности, системные объекты файловой системы, а также файлы устройств (последнее — прерогатива пакета dev).
У каждого объекта файловой системы, имеющего отношение к дистрибутиву, должен и может быть только один владелец (или группа родственных владельцев в случае, когда несколько подпакетов одного пакета совместно используют общий каталог). Это лучше обеспечивает управление атрибутами объектов файловой системы, а также решает многие проблемы определения сборочных зависимостей между пакетами.
Атрибуты файлов и каталогов (секции: %install, %files)
Права доступа на привилегированные исполняемые файлы
Привилегированные исполняемые файлы, то есть исполняемые файлы с установленными битами suid и/или sgid, не должны быть доступны по чтению (и тем более по записи) кому-либо, кроме процессов с uid == 0.
Разделы, предназначенные для использования readonly
Пакеты не должны содержать файлы и каталоги в поддереве /usr, разрешающие доступ по записи кому-либо, кроме процессов с uid == 0. Более того, программам, входящим в пакет, во время своей работы не следует полагаться на то, что файловые объекты, находящиеся в /usr, доступны по записи.
Файлы и каталоги, доступные для записи
Пакеты не должны содержать файлы и каталоги, доступные для записи всем пользователям. Должны быть предусмотрены меры по разграничению доступа, например, путём предоставления доступа по записи определённой группе(ам).
Владельцы файлов
Пакеты не должны содержать файлы, принадлежащие псевдо-пользователям, если в процессе работы к этим файлам осуществляется доступ процессов с другим uid либо с более широкими правами доступа. К таким файлам, в частности, относятся исполняемые, конфигурационные и неизменяемые файлы.
Обоснование: Псевдо-пользователь не должен иметь право изменять эти файлы; нарушение этого условия, как правило, приводит к очевидной возможности осуществления pseudouser/root compromise.
Владельцы каталогов
Пакеты не должны содержать каталоги, принадлежащие псевдо-пользователям. Вместо этого следует использовать каталоги, принадлежащие root, с установленным sticky bit и доступом группы по записи.
Обоснование: Псевдо-пользователь не должен иметь право изменять атрибуты каталогов, а также файлы и каталоги, созданные другими пользователями; нарушение этого условия, как правило, приводит к возможности осуществления pseudouser/root compromise.
Блокировки (секции: %build, %install, %files)
Разные пакеты, использующие блокировки для работы с общими файловыми объектами, такими как mbox’ы, во избежание потери данных должны придерживаться единого механизма блокировки.
Например, для блокировки mbox’ов необходимо использовать метод, за которым закрепилось имя fcntl. Не допускается использование привилегированных программ для dotlocking’а.
Обоснование: Каждая привилегированная программа — это дополнительная степень риска для системы, в которой такая программа установлена. Поэтому следует минимизировать потребность в подобных средствах. Метод блокировки fcntl опирается на системный вызов fcntl(2), удовлетворяющий стандарту POSIX, и, следовательно, более широко распространённый, чем его аналог flock(2).