Книга: Linux программирование в примерах
11.8. Пересечение минного поля безопасности: setuid root
11.8. Пересечение минного поля безопасности: setuid root
Настоящие минные поля трудно, но не невозможно перейти. Однако, это не является чем-то, что можно сделать легко, без тренировки или опыта
Точно также написание программ, которые используют setuid root
, является трудной задачей. Имеется много, очень много проблем, о которых нужно знать, и почти все может иметь неожиданные последствия в плане безопасности. Такая попытка должна предприниматься очень осторожно.
В частности, стоит специально изучить проблемы безопасности Linux/Unix и потратить время на обучение написанию программ setuid root. Если вы сразу нырнете в эту проблему, прочитав лишь эту книгу и ничего более, можно быть уверенным, что ваша система будет взломана, легко и сразу. Маловероятно, что вы или ваши клиенты будут довольны.
Вот несколько руководящих принципов:
• Как можно меньше действуйте в качестве root
. Скупо используйте свои чрезвычайные полномочия, лишь тогда, когда это абсолютно необходимо
• Соответствующим образом проектируйте свою программу. Разделите программу на составные части таким образом, чтобы все операции root
были выполнены заранее, а оставшаяся программа работала в качестве обычного пользователя.
• При изменении или сбрасывании привилегий используйте setresuid()
, если она у вас есть. В противном случае используйте setreuid(),
поскольку у этих функций самая чистая семантика. Используйте setuid()
, лишь когда вы хотите сделать постоянное изменение.
• Переходите от root
к обычному пользователю в соответствующем порядке: сначала установите набор групп и значения GID, затем значения UID. Будьте особенно осторожны с fork()
и exec()
; действительные и эффективные UID при их вызове не изменяются, если вы не измените их явным образом.
• Рассмотрите использование прав доступа setgid и особой группы для вашего приложения. Если это будет работать, это убережет вас от большой головной боли.
• Рассмотрите отказ от наследуемого окружения. Если вам нужно сохранить некоторые переменные окружения, сохраните как можно меньше. Убедитесь в предоставлении подходящих значений для переменных окружения PATH
и IFS
.
• Избегайте execlp()
и execvp()
, которые зависят от значения переменной окружения PATH
(хотя это менее проблематично, если вы сами восстанавливаете PATH
).
Это просто некоторые из множества тактик по пересечению опасной зоны, известной своими подвохами, минами-ловушками и фугасами. Ссылки на другие источники информации см. в следующем разделе.
- 11.1. Проверка прав доступа
- 11.2. Получение ID пользователя и группы
- 11.3. Проверка для действительного пользователя: access()
- 11.4. Проверка для эффективного пользователя: euidaccess() (GLIBC)
- 11.5. Установка дополнительных битов доступа для каталогов
- 11.6. Установка действительных и эффективных ID
- 11.7. Работа со всеми тремя ID: getresuid() и setresuid() (Linux)
- 11.8. Пересечение минного поля безопасности: setuid root
- 11.9. Рекомендуемая литература
- 11.10. Резюме
- Упражнения
- Система безопасности InterBase
- Общие рекомендации по безопасности
- Конфигурация безопасности для базы данных
- 2.6. Термостабилизация режима каскада на биполярном транзисторе
- Обеспечение безопасности библиотеки
- Глава 1 Стандарты и угрозы информационной безопасности
- Глава 3 Нормативные руководящие документы, назначение и задачи информационной безопасности России
- О технике безопасности
- 4.8. Получение прав root
- 4.1.3. Правила безопасности
- 7.5. Замечания по безопасности
- 7.7.1. Основы безопасности