Сброс привилегий
- title
- Сброс привилегий
- type
- concept
- summary
- Принцип наименьших привилегий на старте: захват ресурсов и необратимый сброс прав для локализации будущих взломов.
- tags
- security, sandboxing, systems-programming
- sources
- go-privdrop
- 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 запускающим контейнеры процессом к программам, чей исходный код недоступен для правки