LINUX.ORG.RU

Уязвимости в Nix и Lix, позволяющие поднять привилегии в системе

 lix, ,


0

3

В пакетных менеджерах Nix (github.com) и Lix (lix.systems) выявлена уязвимость, позволяющая выполнить код с правами фонового процесса, который в NixOS и многопользовательских установках выполняется под пользователем root. Проблема (CVE не присвоен) проявляется в фоновом процессе nix-daemon, применяемом для организации доступа непривилегированных пользователей к сборочным операциям и хранилищу пакетов.

Уязвимость возникает из-за отсутствия ограничения рекурсивной обработки директорий в коде для разбора архивов NAR (Nix Archive), что можно использовать для инициирования исчерпания стека сопрограмм и перезаписи содержимого кучи (heap), размещённой после стека без сторожевых страниц памяти. Проблема может быть эксплуатирована любым пользователем, способным устанавливать соединения к nix-daemon. По умолчанию все пользователи имеют такую возможность, что позволяет поднять свои привилегии до пользователя root в многопользовательских установках Nix.

Проблема решена ограничением уровня рекурсии в 64 вложенных директории, добавлением сторожевых страниц памяти между стеком и кучей и реализацией дополнительных проверок символических ссылок в NAR. В Nix уязвимость проявляется начиная с версии 2.24.4 и устранена в выпусках 2.34.7, 2.33.6, 2.32.8, 2.31.5, 2.30.5, 2.29.4, 2.28.7. В Lix уязвимость появилась в выпуске 2.93.0 и устранена в обновлениях 2.93.4, 2.94.2 и 2.95.2. Пакетный менеджер Guix уязвимость не затрагивает.

Помимо этого в опубликованных обновлениях Nix устранена ещё одна уязвимость (CVE отсутствует), которой присвоен средний уровень опасности (4.3 из 10). Проблема проявляется начиная с выпуска Nix 2.24.7 и позволяет организовать запись файлов в область за пределами корневого каталога, в который осуществляется распаковка архива. Уязвимость эксплуатируется через создание в tar-файлах элементов с абсолютными файловыми путями. При распаковке подобных архивов командой nix-prefetch-url --unpack или nix store prefetch-file --unpack файлы с абсолютными путями извлекаются как есть, без преобразования в относительный путь.

>>> Источник: OpenNET

★★★★★

Проверено: hobbit ()
Последнее исправление: maxcom (всего исправлений: 2)

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

Навернули костылей. А могли бы просто озадачить нейросеть на расте переговнокодить всё. Зря память дорожала штоле.

apt_install_lrzsz ★★★★
()

Не понял при чём тут конкретно nix. Уязвимость с переполнением стека в аллоцированную память была архитектурная, проявилась особенно явно в Xorg несколько лет назад, тогда ещё Линус лично внёс какие-то фиксы в ядро чтобы такого не происходило. Как nix смог их обойти?

firkax ★★★★★
()
Ответ на: комментарий от firkax

Хмм. Мне казалось что года 2-3 назад читал это на лоре и оно было актуальным.

Но нашлось только вот что из 2010 года https://lwn.net/Articles/400746/

Ну читал то я точно недавно, но возможно значит это какая-то старая тема была.

firkax ★★★★★
()

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

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)

А вы ещё спрашивал зачем нужен Guix.

Camel ★★★★★
()
Ответ на: комментарий от CrX

А чем это принципиально отличается от пакетного менеджера, который пользователям приходится запускать от root’а?

Camel ★★★★★
()
Ответ на: комментарий от apt_install_lrzsz

Навернули костылей. А могли бы просто озадачить нейросеть на расте переговнокодить всё. Зря память дорожала штоле.

Lix is designed for evolution of its codebase. Lix already uses the more modern meson build system, which improves developer usability and decreases build times. Plans include a gradual, piecewise introduction of the memory-safe Rust programming language – to both supplement and replace sections of the current C++ codebase.

Camel ★★★★★
()

Хорошо что этим пользовались всего три с половиной школьника :)

I-Love-Microsoft ★★★★★
()

Это потому что на Rust не написано.

mskrasnov
()

выполняется под пользователем root

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

На кой хрен собирать под root? Они прям до такой степени не смогли в архитектуру ОС?

zabbal ★★★★☆
()

Уязвимости в Nix и Lix

Прям Биба и Боба :-P

zabbal ★★★★☆
()
Ответ на: комментарий от Camel

А чем это принципиально отличается от пакетного менеджера, который пользователям приходится запускать от root’а?

Тем, что в случае с пакетным менеджером, просто запускаемым от root’а нет никакого демона, нет ситуации, когда именно такая уязвимость может появиться, когда в случайный момент времени запущенная от любого юзера программа (в том числе от того, который не имеет прав на запуск чего-либо через sudo — это может быть вообще какой-то технический «пользователь» с очерь ограниченными правами) может повысить привилегии благодаря постоянно запущенному демону.

CrX ★★★★★
()

У нас что, неделя уязвимостей?

kirill_rrr ★★★★★
()
Ответ на: комментарий от CrX

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

kirill_rrr ★★★★★
()
Ответ на: комментарий от CrX

Ну вот например systemd - постоянно запущенный демон. Кто то гарантирует что попытка потрогать юнит с именем длинее 4Гб (для примера) не приведёт к выполнению кода с правами рута?

kirill_rrr ★★★★★
()
Ответ на: комментарий от kirill_rrr

Естественно могут. И свято, что твой код безупречен и не имеет багов приводящих к уязвимости — плохая стратегия. Но если нет постоянно запущенного от рута демона, то использование этих уязвимостей на практике сильно затрудняется и начинает требовать более специфичных условий. В случае с обычным пакетным менеджером злоумышленику придётся сперва как-то поднять привилегии (например через уязвимость в sudo), чтобы запустить этот самый ПМ от рута, и только потом уже делать свои деструктивные действия. А здесь возникает новая поверхность для атаки.

CrX ★★★★★
()
Ответ на: комментарий от kirill_rrr

Ну вот например systemd - постоянно запущенный демон. Кто то гарантирует что попытка потрогать юнит с именем длинее 4Гб (для примера) не приведёт к выполнению кода с правами рута?

Очень правильный ход мыслей. Никто. systemd — это вообще главная проблема линукса, начиная с его повсеместного внедрения.

Переусложнение компонентов ведёт к большей поверхности для атаки.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от Camel

Lix is designed for evolution of its codebase. Lix already uses the more modern meson build system, which improves developer usability and decreases build times. Plans include a gradual, piecewise introduction of the memory-safe Rust programming language – to both supplement and replace sections of the current C++ codebase.

Хорошая отмазка, возьму на вооружение: «Ребят, код не говно, он просто готов к эволюции».

Bfgeshka ★★★★★
()
Ответ на: комментарий от CrX

запущенная от любого юзера программа

При необходимости можно задать allowed-users = root @wheel в nix.conf, что позволит подключаться к nix-daemon только руту и пользователям из группы wheel.

kneedeep
()

Астрологи объявляют неделю решета. CVE всех проектов возросло.

splinter ★★★★★
()
Ответ на: комментарий от Camel

А чем это принципиально отличается от пакетного менеджера, который пользователям приходится запускать от root’а?

если пользователь может запустить пакетный менеджер через sudo, значит ему права такие дали.

В случае же данной уязвимости

Проблема может быть эксплуатирована любым пользователем, способным устанавливать соединения к nix-daemon. По умолчанию все пользователи имеют такую возможность

Прав на sudo может и не быть , а рута всё равно сможешь получить.

Psilocybe ★★★★★
()
Ответ на: комментарий от kneedeep

Можно. И нафига тогда вообще этот демон?

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

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от CrX

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

kneedeep
()
Ответ на: комментарий от CrX

Пожалуй всё это так, но ведь надо же как то дать обычным юзерам права на установку обновлений. Опционально там, или конкретно в этом дистрибутиве. И сама эта возможность - воле для уязвимостей.

kirill_rrr ★★★★★
()
Последнее исправление: kirill_rrr (всего исправлений: 1)
Ответ на: комментарий от kirill_rrr

Если конкретно обновлений, а не установки новых пакетов, то можно дать права на sudo конкретной команды. Без возможности установки чего-то или передачи ещё каких-то аргументов. Да, в этом случае тоже есть некоторая вероятность наткнуться на уязвимость. Но она намного, прям очень намного ниже, меньше поверхность для атаки.

Да и даже если с установкой новых пакетов — ты дашь эти права конкретным юзерам. И только они смогут вообще в принципе запустить менеджер пакетов. У тебя не будет ситуации, что постоянно висит демон, запущенный от рута, к которому может постучаться вообще любой юзер, имеющийся в системе. Да, выше сказали, что список таких пользователей можно ограничить — но это ограничение внутри демона всё равно, уязвимость гипотетически может срабатывать до проверки на вхождение юзера в список.

CrX ★★★★★
()
Ответ на: комментарий от kneedeep

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

Нет, не так. С таким подходом выясняется, что не стоит усложнять там, где и простое работает.

CrX ★★★★★
()
Ответ на: комментарий от CrX

«постучаться» до демона тоже можно по разному. Например через одноклеточный текстовый api, способный передавать 4 команды и имя пакета.

kirill_rrr ★★★★★
()
Ответ на: комментарий от kirill_rrr

Ну в принципе да. Но тем не менее, нет демона там, где он не требуется — нет проблем.

CrX ★★★★★
()
Ответ на: комментарий от CrX

В данном случае стоит, потому что простое не умеет почти ничего, кроме как просто ставить и удалять пакеты. Лично мне не нужен очередной простой как палка pacman, xbps или apk.

kneedeep
()
Ответ на: комментарий от CrX

Кстати, ответ от Guix’а тоже давно уже подъехал.

Daemon Running Without Privileges

The second and preferred option is to run guix-daemon as an unprivileged user. It has the advantage of reducing the harm that can be done should a build process manage to exploit a vulnerability in the daemon.

Camel ★★★★★
()
Ответ на: комментарий от CrX

systemd — это вообще главная проблема линукса

Главная проблема линукса это необучаемые идиоты, возомнившие себя сисадминами. С остальными проблемами systemd справляется на отлично.

начиная с его повсеместного внедрения

Это вообще лучшее что случалось c GNU/Linux в этом веке.

Переусложнение компонентов ведёт к большей поверхности для атаки.

Верно подмечено - это один из плюсов внедрения systemd: высокая модульность и продуманные интерфейсы вместе с грамотными механизмами защиты резко сокращают поверхность атаки.

zabbal ★★★★☆
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.