EnglishРусский Map

Сброс привилегий

title
Сброс привилегий
type
concept
summary
Принцип наименьших привилегий на старте: захват ресурсов и необратимый сброс прав для локализации будущих взломов.
tags
security, sandboxing, systems-programming
created
2026-07-21
updated
2026-09-13
lang
ru
translation_of
privilege-dropping
source_updated
2026-09-13
translated
2026-09-14
translator
lllm/antigravity/gemini-3.7-flash-medium

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

Определяющее свойство любого подобного механизма - необратимость. Сброшенную привилегию нельзя получить обратно. Не существует вызова, который отменил бы chroot, вернул исходный pledge или расширил набор правил Landlock; подобные фильтры работают как храповик, допускающий движение только в сторону ужесточения. Именно это делает технику полезной: если бы атакующий при выполнении произвольного кода мог просто запросить привилегии назад, весь сброс превратился бы в бутафорию.

Необратимость навязывает программе строгую структуру. Все привилегированные операции должны выполняться заранее, на этапе инициализации, пока храповик ещё не защёлкнулся. Демон открывает привилегированный сетевой порт под пользователем root, сохраняет файловый дескриптор и только потом переключается на непривилегированного пользователя. Он по-прежнему может принимать соединения на уже открытом порту, но открыть новый порт уже никогда не сможет. oxzi в go-privdrop использует метафору перевёрнутого конуса: начать с широких прав, постепенно сбрасывать их по пути и выполнять основную работу на голом минимуме.

Сбрасываемые права и ограничения

Разные механизмы ограничивают разные аспекты работы, а эшелонированная защита комбинирует сразу несколько:

  • Идентификаторы пользователя и группы - setresuid/setresgid/setgroups переводят процесс на непривилегированного пользователя, отказываясь от root. POSIX-механизм, изначально требует прав root.
  • Корневая файловая система и видимость путей - chroot(2) переносит корень файловой системы процесса; unveil(2) в OpenBSD и Landlock в Linux формируют белый список доступных путей, защищая от обхода путей (path traversal) к файлам вроде ~/.ssh.
  • Набор системных вызовов - pledge(2) в OpenBSD (набор обещаний строкой), Linux seccomp BPF (фильтр BPF на стороне ядра по номерам и аргументам системных вызовов). Ограничивают сам список вызовов ядра, которые процессу разрешено выполнять.
  • Лимиты ресурсов - setrlimit(2) задаёт жёсткие ограничения на процессорное время и память, выступая страховкой от атак на исчерпание ресурсов, а не границей разграничения доступа.
  • Сеть - Landlock умеет ограничивать входящий и исходящий TCP-трафик по портам; capsicum(4) во FreeBSD реализует более широкую модель capabilities для этого класса задач.

Место в архитектуре безопасности

Сброс привилегий - это самоограничение изнутри процесса: программа сама заковывает себя в цепи до наступления полнолуния, если использовать метафору с оборотнем от oxzi. Это отличается от внешней изоляции (sandboxing), когда обёртка ограничивает процесс снаружи: bubblewrap-dev-env запускает программу в изолированном пространстве имён, о котором та даже не просила, а sandboxing-ai-agents даёт обзор внешних уровней защиты (пространства имён, microVM, проксирующие HTTP-серверы, перезапись системных вызовов), применяемых для изоляции кодовых AI-агентов. Эти подходы дополняют друг друга: процесс может одновременно находиться во внешней песочнице и ограничивать себя изнутри. Однако внутренний сброс требует явной поддержки от автора программы, и в этом его главное ограничение: встроить его в готовый сторонний бинарник постфактум невозможно.

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

Связанные страницы

  • go-privilege-dropping - реализация всех описанных механизмов на Go через x/sys/unix
  • sandboxing-ai-agents - внешняя изоляция снаружи; дополнение к внутреннему самоограничению
  • syscall-binary-rewriting - ещё один механизм перехвата системных вызовов, применяемый со стороны управляющего процесса
  • bubblewrap-dev-env - внешняя изоляция на базе пространств имён в Linux
  • hardening-container-images - применение Landlock и seccomp запускающим контейнеры процессом к программам, чей исходный код недоступен для правки