Чтобы проверить правильность программы она должна быть запущена на выполнение. Если не предпринимать никаких специальных мер, программа будет выполняться с полномочиями обычного пользователя. Даже обычный пользователь на систем Unix может сделать достаточно много: он может открывать любые доступные ему файлы и каталоги, может получать информацию о системе и других процессах, может порождать другие процессы, открывать сетевые соединения и пр. Эти операции не нужны программе, которая должна считывать данные со стандартного потока ввода и выводить результат на стандартный поток вывода, но могут использоваться для попыток взлома системы или приведения её в нерабочее состояние.
Можно попытаться настроить систему, чтобы запускать программу с изменённым корнем файловой системы, с квотированием дискового пространства и лимитированием доступных ресурсов, помещая её на компьютер, из которого внешняя сеть недоступна, аккуратно настраивая права доступа к файлам. Это сложно и чревато ошибками, и при этом не может запретить выполнения некоторых операций.
Данная заплатка к ядру Linux позволяет решить эту проблему с другой стороны. Она позволяет во время выполнения процесса отнимать у него права на выполнение большинства операций с файловой системой, процессами и пр. Такой "бесправный" процесс может только читать из уже открытых файловых дескрипторов, записывать в открытие файловые дескрипторы, получать минимум информации о себе и системе, устанавливать обработчики сигналов и обрабатывать их. Процесс не может открывать файлов, каталогов, порождать другие процессы, создавать сетевые соединения.
Модифицированное ядро может использоваться на обычной системе (за месяц работы ядра на этом сервере никаких проблем замечено не было). По умолчанию на работающий процесс не накладывается никаких ограничений.
Заплатка добавляет два новых бита возможностей (capabilities) CAP_SYS_OPERATIONS, CAP_SYS_ONE_EXEC. Оба бита при нормальной работе установлены для всех процессов, таким образом все процессы по умолчанию работают как обычно.
Любой процесс может сбросить бит CAP_SYS_OPERATIONS (либо с помощью прямого системного вызова, либо посредством библиотеки libcap). После этого процесс теряет возможность выполнить какую-либо операцию с файлами и процессами, за исключением единственной возможности сделать execve. При выполнении execve ядро сбросит и бит CAP_SYS_ONE_EXEC, и после этого процесс не сможет выполнить и execve тоже.
Пример программы находится в каталоге extra системы ejudge (файл называется capexec.c).
Необходимость статического связывания. Поскольку процесс со сниженными полномочиями не может открывать никаких файлов, он не в состоянии открыть и динамические библиотеки. Поэтому процесс должен быть скомпонован статически (ключ -static компилятора gcc), иначе процесс даже не запустится.
Портирование на ядро 2.4. Поскольку "новая" серия ядра Linux (2.4) приближается к моменту, когда её действительно можно будет использовать, необходимо адаптировать эту заплатку к новой версии. Хорошим моментом начала использования новой версии, видимо, следует считать появление заплаток Secure Linux от Solar Designer.
Добавление опций периода компиляции. Нужно добавить переменную конфигурации ядра Linux.
Если Вы обнаружите ошибки, или у Вас возникнут предложения, обращайтесь по адресу внизу.
Ядро Linux распространяется на условиях лицензии GNU GPL. Поскольку данные заплатки представляют собой в терминах лицензии GNU GPL "производную работу" (derived work), они также распространяются на условиях лицензии GNU GPL.