"Заплатки" для ядра Linux

  1. Введение
  2. Скачивание
  3. Установка
  4. Использование
  5. Проблемы
  6. Планы на будущее
  7. Отзывы
  8. Условия копирования

Введение

Чтобы проверить правильность программы она должна быть запущена на выполнение. Если не предпринимать никаких специальных мер, программа будет выполняться с полномочиями обычного пользователя. Даже обычный пользователь на систем Unix может сделать достаточно много: он может открывать любые доступные ему файлы и каталоги, может получать информацию о системе и других процессах, может порождать другие процессы, открывать сетевые соединения и пр. Эти операции не нужны программе, которая должна считывать данные со стандартного потока ввода и выводить результат на стандартный поток вывода, но могут использоваться для попыток взлома системы или приведения её в нерабочее состояние.

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

Данная заплатка к ядру Linux позволяет решить эту проблему с другой стороны. Она позволяет во время выполнения процесса отнимать у него права на выполнение большинства операций с файловой системой, процессами и пр. Такой "бесправный" процесс может только читать из уже открытых файловых дескрипторов, записывать в открытие файловые дескрипторы, получать минимум информации о себе и системе, устанавливать обработчики сигналов и обрабатывать их. Процесс не может открывать файлов, каталогов, порождать другие процессы, создавать сетевые соединения.


Скачивание

Вам необходимы:
  1. Последнюю версию "старого" (2.2) ядра (2.2.20): http://www.kernel.org/pub/linux/kernel/v2.2/linux-2.2.20.tar.gz (или отсюда: http://contest.cmc.msu.ru/download/linux-2.2.20.tar.gz).
  2. Заплатку "Secure-linux" от Solar Designer: http://www.openwall.com/linux/linux-2.2.20-ow1.tar.gz (или отсюда: http://contest.cmc.msu.ru/download/linux-2.2.20-ow1.tar.gz). Эта "заплатка" повышает сопротивляемость программ к различного рода атакам (переполнение стека, атака символическими ссылками и пр.).
  3. Собственно предлагаемую заплатку: http://contest.cmc.msu.ru/download/linux-2.2.20-ow1-cher1.diff.
  4. Библиотеку поддержки "возможностей" (capabilities) libcap: http://www.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.2/libcap-1.10.tar.gz (или отсюда: http://contest.cmc.msu.ru/download/libcap-1.10.tar.gz).

Установка

Выполните следующие шаги:
  1. Станьте суперпользователем (root);
  2. Разархивируйте ядро обычным способом;
  3. Разархивируйте заплатки Secure-linux;
  4. Примените заплатки Secure-linux (они будут находиться в каталоге linux-2.2.20-ow1 в файле linux-2.2.20-ow1.diff;
  5. Примените данную заплатку;
  6. Сконфигурируйте систему. Обратите внимание, Secure-Linux добавляет новый раздел в конфигурации ядра;
  7. Перекомпилируйте ядро и модули. Поскольку номер версии ядра изменился Вам потребуется перекомпилировать и сторонние модули (например, pcmcia_cs);
  8. Скомпилируйте библиотеку libcap. Проверьте, что в файле cap_names.h после компиляции библиотеки появились строки cap_sys_operations и cap_sys_one_exec.

Использование

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

Заплатка добавляет два новых бита возможностей (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.


Alexander Chernov