<<
>>

Системные вызовы для защиты

В MINIX 3 для каждого файла определен используемый для его защиты 11-раз- рядный код режима, иногда также называемый модой (mode). Код режима включает 9 бит, по три (чтение, запись и выполнение) для владельца, для членов группы владельца и для других пользователей.
Системный вызов chmod предоставляет возможность изменения кода режима для файла. Например, следующий вызов предоставит всем, кроме владельца, доступ к файлу только для чтения; владелец же сможет еще и выполнять файл:

chmod("file", 0644);

Другие два бита зашиты, 02000 и 04000, называются соответственно битами SETGID (Set-Group-Id — установить идентификатор группы) и SETUID (Set- User-Id — установить идентификатор пользователя). Когда пользователь запускает программу, для которой установлен бит SETUID, то на время выполнения процесса идентификатор пользователя заменяется идентификатором владельца программы. Эта специальная возможность широко применяется для того, чтобы позволить пользователям выполнять функции, доступные только суперпользователям, такие как создание каталогов.

Именно для создания каталога требуется вызов mknod, доступный только суперпользователю. Если же владельцем программы mkdir окажется суперпользователь и для нее будут установлены права доступа 04755, обычные пользователи смогут запускать ее и тем самым делать вызов mknod, но весьма ограниченным образом.

Когда процесс исполняет файл, в разрешениях которого выставлен бит SETUID или SETGID, эффективный идентификатор пользователя или группы отличается от реального значения. Но иногда для процесса важно знать, чему равны эффективные и реальные значения идентификаторов пользователя и группы. Чтобы получить эту информацию, процесс может делать системные вызовы getuid и getgid. Оба этих вызова возвращают одновременно и эффективный, и реальный идентификаторы, а чтобы получать эти значения по отдельности, служат четыре библиотечные процедуры: getuid, getgid, geteuid, getegid.

Первые две возвращают реальные значения, вторые две — эффективные.

Для обычных пользователей единственный способ изменить свой идентификатор — запустить программу, у которой установлен бит SETUID. Но для суперпользователей существует и другая возможность, предоставляемая системным вызовом setuid, устанавливающим одновременно реальное и эффективное значения идентификатора пользователя. Вызов setgid, соответственно, устанавливает реальное и эффективное значения идентификатора группы. Кроме того, суперпользователь может менять владельца файла при помощи системного вызова chown. Другими словами, у суперпольователя есть множество возможностей нарушать все возможные правила защиты. Это объясняет, почему многие студенты посвящают столь много времени попыткам стать суперпользователем.

Два последних системных вызова из данной категории могут делаться и обычными процессами. Первый из них, umask, устанавливает системную битовую

маску, применяемую для маскирования битов прав доступа к файлу при его создании. Например:

umask(022) ;

Если сделать такой вызов, то при вызовах creât или mknod в правах доступа к создаваемому объекту будут маскироваться биты 022. Иначе говоря, следующий вызов создаст файл с правами доступа 0755, а не 0777:

creât("file", 0777);

Кроме того, битовая маска наследуется дочерними процессами, поэтому если оболочка сразу после входа сделает вызов umask, ни одной из запущенных пользователем в этом сеансе программ не удастся создать файл, в который смогут записывать данные другие пользователи.

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

Следовательно, необходимо иметь возможность узнать, разрешен ли доступ для реального (а не эффективного) идентификатора пользователя. Это можно сделать с помощью системного вызова access. Чтобы проверить возможность чтения, код режима должен быть равен 4, параметр записи — 2 и параметр исполнения — 1. Эти значения можно комбинировать. Например, если код режима равен 6, то вызов вернет 0, если разрешены и запись, и чтение. В противном случае вызов вернет -1. Если код режима равен 0, проверяется, что файл существует и возможен поиск в ведущих к нему каталогах.

Хотя механизмы защиты UNIX-подобных операционных систем, в общем, являются схожими, имеются и различия, которые приводят к ошибкам, а следовательно, к уязвимости системы безопасности. Более подробную информацию см. в [16].

1.4.6.

<< | >>
Источник: Э. ТАНЕНБАУМ, А. ВУДХАЛЛ. ОПЕРАЦИОННЫЕ СИСТЕМЫ Разработка и реализация 3-е издание. 2007

Еще по теме Системные вызовы для защиты:

  1. I. 1. СИСТЕМНЫЙ ПОДХОД КАК ИНСТРУМЕНТ ДЛЯ ПОСТРОЕНИЯ СИСТЕМНЫХ ОПИСАНИЙ
  2. I. СИСТЕМНЫЕ ОПИСАНИЯ - ГЛАВНЫЙ РЕЗУЛЬТАТ СИСТЕМНОГО ПОДХОДА В ПСИХОЛОГИИ
  3. § 45 Меры к охранению открывшегося наследства. – Опись. – Вызов наследников. – Утверждение в правах наследства. – Срок на явку наследников и вступление явившихся. – Особые правила для торгового сословия.
  4. Упражнение для выявления вашей основной защиты
  5. Глава 3. День защиты от предков Для взрослых детей
  6. Психология личности целостна, системна (принцип целостности, системности).
  7. ВЫЗОВ ВРАЧА
  8. СПТ откликается на вызов обстоятельств
  9. Быстрый вызов желаемого
  10. Бросьте себе вызов