Профиль: Аноним (вход | регистрация) неRU opennet.me  
OpenNET

[ новости /+++ | форум | теги |    ]

Тео де Раадт предложил изменения для ограничения доступа к ФС через функцию openat

05.10.2026 09:18 (MSK)

Тео де Раадт предложил включить в OpenBSD новый механизм для уменьшения поверхности атаки, реализованный через расширение возможностей системного вызова openat. Патчи с реализацией дополнительных флагов для openat и open, ограничивающих возможность перехода к верхним каталогам через "/.." и обращения по абсолютным путям, подготовлены для ядра, libc, а также некоторых приложений из базовой системы. Изменения пока не включены в состав OpenBSD-current и находятся на стадии обсуждения среди разработчиков.

Семейство системных вызовов openat(2) работает как аналог open(2) за исключением того, что если в параметре "path" указан относительный путь, то открываемый файл определяется относительно каталога, связанного с файловым дескриптором "fd", а не относительно текущего рабочего каталога. Если передать в openat абсолютный путь, например:

 
   int dirfd = open("/tmp", O_RDONLY | O_DIRECTORY);                       
   int hfd = openat(dirfd, "/etc/hosts", O_RDONLY);

функция openat() проигнорирует "dirfd" и, как следствие, абсолютный путь обработается обычным образом.

Поэтому замена open() на openat() сама по себе не усиливает безопасность программы. Такой вызов может ускорить разбор пути, но не ограничивает доступ к файловой системе. Не гарантируют защиту и флаги, запрещающие абсолютные пути (например, RESOLVE_BENEATH и/или RESOLVE_IN_ROOT для openat2 в Linux): программист должен добавлять их ко всем подходящим вызовам, а при захвате управления процессом атакующий может воспользоваться другими путями открытия файлов.

В ходе работы над утилитой openrsync у Тео возникла необходимость ограничить её возможности по обходу файловой системы, но сделать это при помощи функций unveil() и pledge() не представлялось возможным. Тогда возникла идея о механизме, подобном openat(), но со свойствами безопасности, дополняющими pledge/unveil или даже работающими при их отсутствии.

Основная идея - сделать ограничения частью самого дескриптора каталога. Для этого предлагается флаг F_BELOW, который можно установить через fcntl(), либо флаг O_BELOW для open(). Ограниченный таким образом дескриптор "dirfd" будет разрешать только переходы вниз по дереву каталогов: вызовы openat() с абсолютным путём или с переходом вверх через ".." будут завершаться ошибкой ENOENT. В случае атаки, приводящей к выполнению кода, таблица файловых дескрипторов процесса будет содержать менее функциональные "dirfd", что будет ограничивать поверхность атаки.

  1. Главная ссылка к новости (https://marc.info/?l=openbsd-t...)
  2. OpenNews: OpenBSD прекратил поддержку аппаратной платформы Loongson из-за регресии в Clang
  3. OpenNews: В OpenBSD устранена локальная уязвимость, позволяющая получить права root
  4. OpenNews: Релиз OpenBSD 7.9
  5. OpenNews: В OpenBSD переименовали поле в pfsync после ложного AI-отчёта об уязвимости
  6. OpenNews: В OpenBSD реализована поддержка запуска под управлением Apple Hypervisor
Автор новости: Дон Ягон
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/66401-openbsd
Ключевые слова: openbsd
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (41) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним1234 (?), 09:42, 05/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –11 +/–
    В openbsd нет chroot() ?
     
     
  • 2.2, Вадим Жуков (?), 09:50, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +7 +/–
    chroot меняет видимую структуру каталогов и доступен только для root. Так как если его разрешить использовать обычным пользователям, это само по себе станет вектором для атак: представьте себе, что атакующий воссоздаёт /etc, /usr, /var и т.д. в своей папке, а потом делает chroot и провоцирует срабатывание чужого кода, который честно считывает параметры работы и доступа из, казалось бы, доверенных каталогов.
     
     
  • 3.14, Аноним1234 (?), 11:00, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/–
    >chroot меняет видимую структуру каталогов и доступен только для root.

    chroot запускается без прав суперпользователя в комлпекте с unshare (если речь идёт о Linix).


    >Так как если его разрешить использовать обычным пользователям, это само по себе станет вектором для атак: представьте себе, что атакующий воссоздаёт /etc, /usr, /var и т.д. в своей папке, а потом делает chroot и провоцирует срабатывание чужого кода, который честно считывает параметры работы и доступа из, казалось бы, доверенных каталогов

    Ничего не понял. Можно на кокретном примере. Допустим я пишу свой http/ftp/smb сервер. Я не хочу, чтобы кто-то получив доступ к нему не мог выбраться в систему (собственно так они и устроены). В чём проблема в том, что хакер подсуент /etc, /usr, /var в домашнюю папаку своего пользователя?

     
     
  • 4.22, Аноним (22), 11:12, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +2 +/–
    > Допустим я пишу свой ... smb сервер...

    у нас про безопасность тред или как, лол

     
  • 3.17, Аноним (17), 11:07, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/–
    Сам системный вызов не требует повышенных привилегий, нужна только капа на вызов chroot. Никаких проблем от того что пооцесс с отдельным UID сам себя посадит в отдельный рут нету (ну или не должно быть, если только в ядре не делали какие-то идиотские предположения по этому поводу).
     
  • 3.21, Аноним (22), 11:10, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    а судо, через которое мы все сидим - не так работает?
     
     
  • 4.39, Аноним (39), 14:18, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    > а судо, через которое мы все сидим - не так работает?

    Вы - это кто именно? Я вот не сижу, а в #2 вообще пользователь сабжа (т.е. опенка) отметился.
    Ну и насчет chroot - оно (как и дыр^W докер) НЕ создавалось для "безопасности".
    https://docs.oracle.com/cd/E19455-01/816-3320/6m9k15bha/index.html
    > The only use of fchroot() that is appropriate is to change back to the system root

    .


     
  • 4.46, Аноним (46), 16:39, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    > мы все

    Свидетели убунту?

     

  • 1.3, Аноним (3), 09:54, 05/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/–
    Почему изначально к системным частям фс и переменным имеют доступ все и каждый?
     
     
  • 2.4, kravich (ok), 10:00, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +9 +/–
    * история про хакера и солонки *
     
  • 2.5, Аноним (5), 10:15, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • –5 +/–
    Потому что всем было просто класть на безопасность)
    Если почитать воспоминания "отцов основателей" (они же диды бракоделы) про реакцию сообщества программистов на червь морриса, то они там офигенно обделались.
    Раньше можно было просто писать забивая на проверки, а теперь придется думать.

    Ну и второе, а чего вы хотели от базарной разработки?

     
     
  • 3.12, YetAnotherOnanym (ok), 10:53, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +6 +/–
    О, а вот ещё один обожжённый исповедями дидов.
    Хотел бы я посмотреть работу твоего кода на железе 1970-х гг.
     
     
  • 4.15, User (??), 11:05, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • –3 +/–
    Это как-то отменяет тезис?
     
  • 4.27, Аноним (27), 11:27, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • –1 +/–
    Не приписывай свои фантазии незнакомым людям)

    Древним акса-калам на которых так любят наяривать местные было реально пофигу.
    Упало? Ну и черт с ним.

    Dennis once fed a couple-of-thousand-byte line on standard input to everything in /bin. Crashes abounded, but so what? Wasn't a crash just an ungraceful way for a program to say "I can't handle this"? Not until the Morris worm (1988) did folks wake up to the real danger of overflows.

    > Хотел бы я посмотреть работу твоего кода на железе 1970-х гг.

    Думаешь tinyAVR мощнее железа на котором ваяли тот же юникс?

     
     
  • 5.32, qqq (??), 12:47, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    > Думаешь tinyAVR мощнее железа на котором ваяли тот же юникс?

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

     
     
  • 6.47, Аноним (47), 17:06, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • –1 +/–
    А вашу жену по мимо вас еще имеет сосед?
     
  • 5.42, Аноним (42), 15:24, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/–
    >Древним акса-калам на которых так любят наяривать местные было реально пофигу.

    Так ты сам же врёшь. Во те времена это было не актуально. А раз неактуально то никто на это не обращал внимания. Всё логично. Осозание пришло потом. Люди защищаются в ответ на действия хулиганов. Именно в ответ. И это называется нормальным течением событий. Если бы в те времена, кто-то бы озаботился вопросами безовасности 2026 года, то его посчитали бы сумашедшим.

    Спустя полвека, легко критиковать.

     
  • 5.44, Инопланетянин (?), 15:34, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/–
    > Древним акса-калам на которых так любят наяривать местные было реально пофигу.

    Ну современные акса-калы всем покажут как надо? Ведь правда? Ведь покажут же?

    Только постойте-ка. Почему то они пользуются наработками древних акса-калов...

     
  • 2.10, Жироватт (ok), 10:30, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +9 +/–
    Как и во всех системах - да. Какой путь может отобразить система - на такой и имеют.
    Правда, во время реального чтения/записи/траверса ОС применяет ACL и непривилегированная программа просто не сможет даже прочитать закрытый для траверса каталог, но само создание дескриптора через open() это не проверяет - это не его работа.

    Так что да, хакер и солонки.

     
  • 2.11, Аноним (11), 10:42, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    Ты такие вопросы тоже задаёшь, когда кодишь под огороженный контейнер или его дебажишь?
     
  • 2.23, Аноним (23), 11:21, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +5 +/–
    Потому что везде проталкивать "безопасность" это ненормально.
     
  • 2.36, Аноним (47), 14:14, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    "секур бай дезинг"
     
  • 2.50, Аноним (50), 18:39, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    >Почему изначально к системным частям фс и переменным имеют доступ все и каждый?

    Потому что UNIX - это про удобство написания программ, а не про создание идеальной "правильной" системы. См. "worse-is-better" и "MIT way vs UNIX way"

     

  • 1.6, Аноним (6), 10:15, 05/10/2026 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • –1 +/–
     
  • 1.7, ТабакошкаМойЛюбимыйМультик (?), 10:22, 05/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/–
    Кто знает, как получить прямой доступ к файловой системе?
     
     
  • 2.30, Аноним (30), 11:47, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +6 +/–
    # hexedit /dev/sda
     

  • 1.8, Аноним (8), 10:23, 05/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/–
    В openbsd нет механизмой apparmor/selinux чтобы можно было сделать ограничения доступа к ФС для процессов?
     
     
  • 2.24, Аноним (22), 11:23, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • –1 +/–
    да везде всё есть - на какой-нить винде вы без суперюзера и мусор с родного рута С:\ не вынесите, но вот специально оформленная веб-страница... как пруф могу менее месячной давности новость подложить - плойку5 вскрыли, по-моему также через веб-кит встроенный, что там, итерация фряхи?
     
  • 2.43, Аноним (42), 15:26, 05/10/2026 Скрыто ботом-модератором     [к модератору]
  • +/–
     

  • 1.9, Жироватт (ok), 10:25, 05/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/–
    Теперь осталось уговорить всех и каждого писателя софта использовать openat(), вместо привычной и давно указанной во всех пособиях, хендбуках и манах open().

     
     
  • 2.18, Аноним1234 (?), 11:07, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • –1 +/–
    > Теперь осталось уговорить всех и каждого писателя софта использовать openat(), вместо привычной
    > и давно указанной во всех пособиях, хендбуках и манах open().

    И сделав тем самым свой софт несовместимый ни с чём кроме беты openbsd либо добавить дефайны типа ifdef OPENBSD_VERSION_XX > YY

     
  • 2.26, Аноним (26), 11:27, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    Алло, знатоки! openat описана в том же мане, что и open. И в линуксовом тоже, ага.
     

  • 1.19, Аноним (19), 11:08, 05/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/–
    Только сразу продумайте, что будет, если в каталоге будет вложенный каталог, который является символической ссылкой на /
    А то будет как всегда.
     
     
  • 2.25, Аноним (22), 11:24, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    мечта корпорастов - никакого рута в своей же системе лол
     
     
  • 3.40, Аноним (47), 14:19, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    ты же без хозяина никак жить не можешь, храни господи хозяина!
     

  • 1.28, Fareast (ok), 11:38, 05/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/–
    Интересная тема
     
     
  • 2.37, Аноним (47), 14:16, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    так он далек от понятия безопасность. За место того, чтобы проектировать по определению (дизайну) безопасную систему, он костыляет курам на смех.
     

  • 1.33, Аноним (33), 13:10, 05/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/–
    Не ожидал такого бреда от самого безопасного.

    > вызовы openat() с абсолютным путём или с переходом вверх через ".." будут завершаться ошибкой ENOENT

    А тео не помнит сколько сотен способов сбежать из линуксового chroot было потому что он на таких проверках строился?

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

    Подумать только. А просто наоткрывать новых дескрипторов при RCE без pledge/unveil кто запретит? Тео изобрёл security through inconvenience.

    > но сделать это при помощи функций unveil() и pledge() не представлялось возможным

    А может лучше эти изобретения допилить до уровня, где ими можно пользоваться в настоящих приложениях?

     
     
  • 2.38, Аноним (47), 14:17, 05/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    а шо, тов. майор готов платить больше?
     

  • 1.45, аниме эксперт (?), 16:35, 05/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/–
    Ох уж Раадт такой весь Раадт. Предложил фигню и рад.
     
  • 1.48, Аноним (48), 18:19, 05/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/–
    Тео -- сказочный. На полном серьёзе предлагает доверить кодерам правильно ограничить поведение своей программы, которое надо ограничивать в первую очередь потому, что 99% кодеров не могут пройти по массиву не вывалившись за его пределы.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    XSQUARE
    Inferno Solutions
    Hosting by Hoster.ru
    Хоcтинг: