Подъемные полномочия безопасно

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

Обстоятельства, требующие поднятых полномочий

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

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

Враждебное окружение и принцип наименьшего количества полномочия

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

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

Если атакующий может получить права администратора, они могут поднять к полномочиям пользователя root и получить доступ к любым данным по компьютеру пользователя. Поэтому это - хорошая практика безопасности для входа в систему как администратор только при выполнении редких задач, требующих административных привилегий. Поскольку настройка по умолчанию для OS X должна сделать владельца компьютера администратором, необходимо призвать пользователей создавать отдельный неадминистраторский вход в систему и использовать это для их повседневной работы. Кроме того, если это возможно, Вы не должны требовать административных привилегий установить Ваше программное обеспечение.

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

Принцип наименьшего количества состояний полномочия:

“Каждая программа и каждый пользователь системы должны управлять использованием наименьшего количества набора полномочий, необходимых для завершения задания”.

— Saltzer, J.H. AND Шредер, Доктор медицины, “Защита информации в Компьютерных системах”, Продолжения IEEE, издания 63, № 9, сентябрь 1975.

На практике принцип наименьшего количества полномочия означает, что необходимо избежать работать как корень, или — если абсолютно необходимо работать как корень для выполнения некоторой задачи — необходимо выполнить отдельное вспомогательное приложение для выполнения привилегированной задачи (см. Запись Привилегированного Помощника). Кроме того, по мере возможности Ваше программное обеспечение (или части этого) должно работать в песочнице, ограничивающей ее полномочия еще больше, как описано в Разработке Безопасных Помощников и Демонов.

Путем выполнения с наименьшим количеством возможного полномочия, Вы:

Следует иметь в виду, что, даже если Ваш код свободен от ошибок, уязвимостей в каких-либо библиотеках, Ваши ссылки кода в могут использоваться для атаки программы. Например, никакая программа с графическим интерфейсом пользователя не должна работать с полномочиями, потому что большое количество библиотек, пользовавшихся в любом приложении GUI, делает фактически невозможным гарантировать, что приложение не имеет никаких уязвимостей системы обеспечения безопасности.

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

Запуск нового процесса

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

Работа с параметрами командной строки

Поскольку все параметры командной строки, включая название программы (argv[0]), находятся под контролем пользователя, Вы не должны доверять argv[0] указать на Вашу программу. Если Вы используете командную строку, чтобы повторно выполнить Ваше собственное приложение или инструмент, например, злонамеренный пользователь, возможно, заменил различным приложением argv[0]. Если Вы тогда передаете это функции, использующей первый параметр в качестве имени программы для выполнения, Вы теперь выполняете код атакующего со своими полномочиями.

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

Наследование дескрипторов файлов

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

Например, если Вы открываете файл паролей и не закрываете его прежде, чем разветвить процесс, новый подпроцесс имеет доступ к файлу паролей.

Установить дескриптор файла так, чтобы это закрылось автоматически при выполнении нового процесса (такой как при помощи execve системный вызов), используйте fcntl системный вызов для установки флага замыкаться-руководителя. Необходимо установить этот флаг индивидуально для каждого дескриптора файла; нет никакого способа установить его для всех.

Злоупотребление переменными окружения

Большинство библиотек и утилит используют переменные окружения. Иногда переменные окружения могут подвергнуться нападению с переполнением буфера или путем вставки несоответствующих значений. Если Ваши ссылки программы в каких-либо библиотеках или вызывают какие-либо утилиты, Ваша программа уязвима для атак через любые такие проблематичные переменные окружения. Если Ваша программа работает как корень, атакующий мог бы быть в состоянии перевести в нерабочее состояние или получить контроль над целой системой таким образом. Примеры переменных окружения в утилитах и библиотеках, подвергшихся нападению в прошлом, включают:

  1. Динамический загрузчик: LD_LIBRARY_PATH, DYLD_LIBRARY_PATH часто неправильно используются, вызывая нежелательные побочные эффекты.

  2. libc: MallocLogFile

  3. Базовая основа: CF_CHARSET_PATH

  4. perl: PERLLIB, PERL5LIB, PERL5OPT

    [2CVE-2005-2748 (исправленный в обновлении системы защиты 2005-008 Apple) 3CVE-2005-0716 (исправленный в обновлении системы защиты 2005-003 Apple) 4CVE-2005-4158]

Переменные окружения также наследованы дочерними процессами. Если Вы разветвляетесь от дочернего процесса, Ваш родительский процесс должен проверить значения всех переменных окружения, прежде чем он будет использовать их в случае, если они были изменены дочерним процессом (или непреднамеренно или посредством атаки злонамеренным пользователем).

Изменение пределов процесса

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

Если атакующий использует setrlimit для изменения этих пределов это может заставить операции перестать работать, когда они обычно не перестали бы работать. Например, об уязвимости сообщили для версии Linux, позволившего атакующему, путем уменьшения максимального размера файла, для ограничения размера /etc/passwd и /etc/shadow файлы. Затем в следующий раз утилита получила доступ к одному из этих файлов, это усеченный файл, приводящий к потере данных и отказа в обслуживании. [CVE-2002-0762]

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

Интерференция работы файла

Если Вы работаете с поднятыми полномочиями, чтобы записать или считать файлы в мировом перезаписываемом каталоге или каталоге пользователя, необходимо знать о времени времени проверки проблем использования; посмотрите Время Проверки По сравнению со Временем Использования.

Предотвращение поднятых полномочий

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

Пример использования альтернативного проекта во избежание выполнения с поднятыми полномочиями дан BSD ps команда, выводящая на экран информацию о процессах, имеющих терминалы управления. Первоначально, BSD использовал setgid бит для выполнения ps команда с группой ID kmem, который дал ему полномочия считать память ядра. Более свежие реализации ps использование команды sysctl утилита для чтения информаций этому нужно, удаляя требование это ps выполненный с любыми специальными полномочиями.

Выполнение с поднятыми полномочиями

Если действительно необходимо выполнить код с поднятыми полномочиями, существует несколько подходов, которые можно проявить:

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

Вызовы для изменения уровня полномочий

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

Вот некоторые примечания по обычно используемым системным вызовам изменения уровня полномочий:

Для получения дополнительной информации о полномочиях см. главу Полномочий Понимания в Аутентификации, Авторизацию и Руководство по Полномочиям. Для получения информации о setuid и связанные команды, см. Setuid, Демистифицированный Ченом, Вагнером и Дином (Продолжения 11-го Симпозиума Безопасности USENIX, 2002), доступный в http://www .usenix.org/publications/library/proceedings/sec02/full_papers/chen/chen.pdf и страницы руководства для setuid, setreuid, setregid, и setgroups. setuid(2) страница руководства включает информацию о seteuid, setgid, и setegid также.

Предотвращение разветвляющийся от привилегированного процесса

Существует несколько функций, которые Вы могли бы быть в состоянии использовать, чтобы избежать разветвляться от привилегированного вспомогательного приложения. authopen команда позволяет Вам получить временные права создать, считать или обновить файл. Можно использовать launchd демон для запуска процесса с указанных полномочий и известной среды.

authopen

Когда Вы работаете authopen команда, Вы обеспечиваете путь файла, к которому Вы хотите получить доступ. Существуют опции для чтения файла, записи в файл и создания нового файла. Перед выполнением любой из этих операций, authopen команда запрашивает авторизацию от демона безопасности системы, аутентифицирующего пользователя (через диалоговое окно пароля или другие средние значения) и определяющего, имеет ли пользователь достаточные права выполнить работу. См. страницу руководства для authopen(1) для синтаксиса этой команды.

launchd

Начиная с OS X v10.4, launchd демон используется для запуска демонов и других программ автоматически без вмешательства пользователя. (Если Вам нужно к рабочим версиям систем поддержки OS ранее, чем OS X v10.4, можно использовать элементы запуска.)

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

Можно также использовать launchd запустить привилегированного помощника. Факторингом Ваше приложение в привилегированные и непривилегированные процессы можно ограничить объем кода, работающий как пользователь root (и таким образом поверхность потенциальной атаки). Убедитесь, что Вы не запрашиваете более высокого полномочия, чем Вы фактически нуждаетесь, и всегда отбрасываете полномочие или выходите из выполнения как можно скорее.

Существует несколько причин использовать launchd в предпочтении к записи демона, работающего как пользователь root или factored приложение, что ветвления от привилегированного процесса:

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

  • Поскольку launchd самостоятельно выполнения как пользователь root, если Ваша единственная причина использования привилегированного процесса состоит в том, чтобы выполнить демона на порту с низким номером, можно позволить launchd открытый, что порт от имени и передачи Вашего демона открытый сокет Вашему демону, таким образом избавляя от необходимости Ваш код работать как пользователь root.

  • Поскольку launchd может запустить подпрограмму с поднятыми полномочиями, Вы не должны устанавливать setuid или setgid биты для инструмента помощника. Любая подпрограмма, имеющая setuid или setgid набор битов, вероятно, будет целью для атаки злонамеренными пользователями.

  • Привилегированная подпрограмма, запущенная launchd выполнения в управляемой среде, в которую нельзя вмешаться. Если Вы запускаете инструмент помощника, имеющий setuid набор битов, это наследовало большую часть среды запускающегося приложения, включая:

    • Открытые дескрипторы файлов (если их флаг замыкаться-руководителя не установлен).

    • Переменные окружения (если Вы не используете posix_spawn, posix_spawnp, или exec вариант, берущий явный параметр среды, такой как execve).

    • Пределы ресурса.

    • Параметры командной строки передали ему обработкой вызовов.

    • Анонимные области общей памяти (одинокий, но доступный повторному прикреплению, при желании).

    • Права порта Маха.

    Существуют, вероятно, другие. Намного более безопасно использовать launchd, который полностью управляет средой запуска.

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

  • Проще записать демону и запустить его с launchd чем записать код factored и ветвление от отдельного процесса.

  • Поскольку launchd критический системный компонент, он получает много экспертной оценки внутренних разработчиков в Apple. Это, менее вероятно, будет содержать уязвимости системы обеспечения безопасности, чем большая часть производственного кода.

  • launchd.plist файл включает пары ключ/значение, которые можно использовать для ограничения системных служб — таких как память, число файлов и процессорное время — который может использовать демон.

Для получения дополнительной информации о launchd, см. страницы руководства для launchd, launchctl, и launchd.plist, и Руководство по программированию Демонов и Служб. Для получения дополнительной информации об элементах запуска, см. Руководство по программированию Демонов и Служб.

Ограничения и риски других механизмов

В дополнение к launchd, следующие меньшие методы могут использоваться для получения поднятых полномочий. В каждом случае необходимо понять ограничения и угрозы, представляемые методом, который Вы выбираете.

Запись привилегированного помощника

Если Вы читали настолько далеко, и Вы все еще убеждены, что часть Ваших потребностей приложения подняла полномочия, этот раздел обеспечивает некоторые подсказки и пример кода. Кроме того, см. Руководство по программированию Authorization Services для большего уведомления относительно использования Authorization Services и надлежащего пути к фактору приложение.

Как объяснено в документации Authorization Services, очень важно, чтобы Вы проверили права пользователя выполнить привилегированную работу, и прежде и после запуска Вашего привилегированного инструмента помощника. Ваш инструмент помощника, принадлежавший корню и с setuid набор битов, имеет необходимые полномочия для выполнения безотносительно задачи, которую он должен сделать. Однако, если пользователь не имеет прав выполнить эту задачу, Вы не должны запускать инструмент и — если инструмент запускается так или иначе — инструмент должен выйти, не выполняя задачу. Ваш непривилегированный процесс должен сначала использовать Authorization Services, чтобы определить, авторизовывается ли пользователь и аутентифицировать пользователя, если необходимый (это вызывают, предварительно авторизовывая; см. Перечисление 5-1). Тогда запустите свой привилегированный процесс. Привилегированный процесс тогда должен авторизовать пользователя снова, прежде, чем выполнить задачу, требующую поднятых полномочий; см. Перечисление 5-2. Как только задача завершена, привилегированный процесс должен завершиться.

В определении, есть ли у пользователя необходимые полномочия для выполнения задачи, необходимо использовать права, которые Вы определили и поместили в базу данных правил управления сами. Если Вы используете право, предоставленное системой или некоторым другим разработчиком, пользователю мог бы предоставить авторизацию для того права некоторый другой процесс, таким образом получив полномочия к Вашему приложению или доступ к данным, которые Вы не авторизовывали или предназначали. Для получения дополнительной информации о политиках и базе данных правил управления, (см. раздел «The Policy Database» в главе Понятий Авторизации Руководства по программированию Authorization Services).

В примерах кода, показанных здесь, задача, требующая полномочия, уничтожает процесс, которым не владеет пользователь.

Пример: предварительная авторизация

Если пользователь пытается уничтожить процесс, которым он не владеет, приложение должно удостовериться, что пользователь разрешен сделать так. Следующие пронумерованные элементы соответствуют комментариям в примере кода:

  1. Если процесс принадлежит пользователю, и процесс не является сервером окна или окном входа в систему, разрешением, и уничтожьте его.

  2. Вызовите permitWithRight:flags: метод, чтобы определить, имеет ли пользователь право уничтожить процесс. Приложение, должно быть, ранее добавило это право — в этом примере, вызванном com.apple.processkiller.kill— к базе данных правил управления. permitWithRight:flags: метод обрабатывает взаимодействие с пользователем (таким как диалог аутентификации). Если возвращается этот метод 0, это завершилось без ошибки, и пользователя считают предавторизованным.

  3. Получите ссылку авторизации.

  4. Создайте внешнюю форму ссылки авторизации.

  5. Создайте объект данных, содержащий внешнюю ссылку авторизации.

  6. Передайте эту сериализированную ссылку авторизации на setuid инструмент, который уничтожит процесс (Перечисление 5-2).

Перечисление 5-1  Непривилегированный процесс

if (ownerUID == _my_uid && ![[contextInfo processName]
    isEqualToString:@"WindowServer"] && ![[contextInfo processName]
    isEqualToString:@"loginwindow"]) {
        [self killPid:pid withSignal:signal];                                      // 1
} else {
    SFAuthorization *auth = [SFAuthorization authorization];
    if (![auth permitWithRight:"com.apple.proccesskiller.kill" flags:
          kAuthorizationFlagDefaults|kAuthorizationFlagInteractionAllowed|
          kAuthorizationFlagExtendRights|kAuthorizationFlagPreAuthorize])    // 2
    {
            AuthorizationRef authRef = [auth authorizationRef];                        // 3
            AuthorizationExternalForm authExtForm;
            OSStatus status = AuthorizationMakeExternalForm(authRef, &authExtForm);    // 4
            if (errAuthorizationSuccess == status) {
                NSData *authData = [NSData dataWithBytes: authExtForm.bytes
                                    length: kAuthorizationExternalFormLength];    // 5
                [_agent killProcess:pid signal:signal authData: authData];                 // 6
            }
    }
}

Внешний инструмент принадлежит корню и имеет setuid набор битов так, чтобы это работало с полномочиями пользователя root. Это импортирует воплощенные права авторизации и проверяет права авторизации пользователя снова. Если пользователь имеет права, инструмент уничтожает процесс и выходы. Следующие пронумерованные элементы соответствуют комментариям в примере кода:

  1. Преобразуйте внешнюю ссылку авторизации на ссылку авторизации.

  2. Создайте массив элемента авторизации.

  3. Создайте набор прав авторизации.

  4. Вызовите AuthorizationCopyRights функция, чтобы определить, имеет ли пользователь право уничтожить процесс. Вы передаете эту функцию ссылка авторизации. Если учетные данные, выпущенные Сервером безопасности, когда это аутентифицировало пользователя, еще не истекли, эта функция может определить, разрешен ли пользователь уничтожить процесс без переаутентификации. Если учетные данные истекли, Сервер безопасности обрабатывает аутентификацию (например, путем отображения диалогового окна пароля). (Вы указываете период истечения срока для учетных данных, когда Вы добавляете право авторизации на базу данных правил управления.)

  5. Если пользователь авторизовывается, для этого уничтожают процесс.

  6. Если пользователь не разрешен уничтожить процесс, зарегистрируйте неуспешную попытку.

  7. Выпустите ссылку авторизации.

Перечисление 5-2  Привилегированный процесс

AuthorizationRef authRef = NULL;
OSStatus status = AuthorizationCreateFromExternalForm(
  (AuthorizationExternalForm *)[authData bytes], &authRef);              // 1
if ((errAuthorizationSuccess == status) && (NULL != authRef)) {
AuthorizationItem right = {"com.apple.proccesskiller.kill",
                                                0L, NULL, 0L};           // 2
AuthorizationItemSet rights = {1, &right};                               // 3
status = AuthorizationCopyRights(authRef, &rights, NULL,
        kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed |
        kAuthorizationFlagExtendRights,    NULL);                        // 4
if (errAuthorizationSuccess == status)
kill(pid, signal);                                                       // 5
else
NSLog(@"Unauthorized attempt to signal process %d with %d",
            pid, signal);                                                // 6
AuthorizationFree(authRef, kAuthorizationFlagDefaults);                  // 7
}

Предостережения инструмента помощника

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

Если возможно, избегите соединяться в любых дополнительных библиотеках. Если действительно необходимо соединиться в библиотеке, необходимо не только быть уверены, что библиотека не имеет никаких уязвимостей системы обеспечения безопасности, но также и что она не соединяется ни в каких других библиотеках. Любые зависимости от другого кода потенциально открывают Ваш код для атаки.

Для создания инструмента помощника максимально безопасным, необходимо сделать его максимально коротким — имеют его, делают только очень минимальное необходимое и затем выход. Хранение его короткий делает его менее вероятно, что Вы сделали ошибки и упрощаете для других контролировать Ваш код. Обязательно получите анализ безопасности от кого-то, кто не помогал записать инструмент первоначально. Независимый рецензент, менее вероятно, совместно использует Ваши предположения и более вероятно определить уязвимости, которые Вы пропустили.

Авторизация и доверительные политики

В дополнение к основным полномочиям, предоставленным BSD, OS X Authorization Services, API позволяет Вам использовать базу данных правил управления, чтобы определить, должен ли объект иметь доступ к определенным функциям или данным в Вашем приложении. Authorization Services включает функции, чтобы считать, добавить, отредактировать и удалить элементы базы данных правил управления.

Необходимо определить собственные доверительные политики и поместить их в базу данных правил управления. Если Вы используете политику, предоставленную системой или некоторым другим разработчиком, пользователю мог бы предоставить авторизацию для права некоторый другой процесс, таким образом получив полномочия к Вашему приложению или доступ к данным, которые Вы не авторизовывали или предназначали. Определите различную политику для каждой работы, чтобы избежать иметь необходимость дать широкие полномочия пользователям, которым нужны только узкие полномочия. Для получения дополнительной информации о политиках и базе данных правил управления, посмотрите раздел «The Policy Database» в главе Понятий Авторизации Руководства по программированию Authorization Services.

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

Безопасность в KEXT

Поскольку расширения ядра не имеют никакого пользовательского интерфейса, Вы не можете вызвать Authorization Services для получения полномочий, которые Вы уже не имеете. Однако в частях Вашего кода, обрабатывающих запросы от пространства пользователя, можно определить, какие полномочия обработка вызовов имеет, и можно оценить списки управления доступом (ACLs; посмотрите раздел «ACLs» в разделе OS X File System Security в Подробной главе Файловой системы Руководства по программированию Файловой системы).

В OS X v10.4 и позже, можно также использовать Авторизацию Ядра (Kauth) подсистема для управления авторизацией. Для получения дополнительной информации о Kauth посмотрите Техническое примечание TN2127, Авторизация Ядра (http://developer .apple.com/technotes/tn2005/tn2127.html).