LINUX.ORG.RU

systemd local DoS

 


1

5

В системном менеджере systemd выявлена локальная уязвимость. Процесс PID 1 зависает на системном вызове pause() при поступлении в сокет уведомлений systemd сообщения нулевой длины, после чего невозможно запустить/остановить демоны или выполнить «чистую» перезагрузку, а systemd-сервисы в стиле inetd перестают принимать соединения. Так как сокет уведомлений /run/systemd/notify доступен всем на запись, то любые локальные пользователи могут вызвать отказ в обслуживании на системах с systemd.

Уязвимость проявляется во всех версиях systemd, начиная, по крайней мере, с версии 209.

Атака сводится к выполнению команды

NOTIFY_SOCKET=/run/systemd/notify systemd-notify ""

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Последнее исправление: sudopacman (всего исправлений: 4)
Ответ на: комментарий от spqr

Как надо было сделано до того, как начали всю эту возню.

[sarcasm] Ну да, что понимают дураки из redhata, ублюдочный upstart с кривой архитектурой значительно лучше, ога [/sarcasm]

e7z0x1 ★★★★★
()

Поправьте новость на while [ 1 ]; do NOTIFY_SOCKET=/run/systemd/notify systemd-notify ""; done
А то неосиляторов слишком много. :) Что как бэ намекает на контингент ненужного :)

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

Это ты щаз случайно не про ту самую контейнерную виртуализацию говоришь, в которой нормальной практикой является запихивание снапшотов *забагованных-дырявых* версий базовых компонентов ос? :-D , я уж молчу про 777 :-) ..

Мне плевать на «нормальные практики». Я (да-да, лично я) могу взять lxc, сделать контейнер, засунуть туда свою софтинку и буду счастлив.

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

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

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

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

Ты его синтаксис видел? Я даже не уверен, что опаснее — убожество C или наркомания rust.

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

даже если rust наркомания, он работает как и задумано, развивается стремительно. Для софта который должен просто работать это то что нужно.

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

даже если rust наркомания, он работает как и задумано, развивается стремительно. Для софта который должен просто работать это то что нужно.

Ага. Фанаты perl говорят примерно то же самое. Их код более понятным от этого не становится.

kirk_johnson ★☆
()

Пёсик высрал ошибку, что не может подключиться. Пришлось делать REISUB.

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

Я один не понимаю всех этик терок? Почему если линукс идет путем развития офтопика, то это хорошо? Почему нельзя как раньше, хочешь использовать системд - используй, не хочешь - openrc/sysvinit/upstart или что там еще есть. Должна быть альтернатива в линуксах, а то так скоро скатимся до одного единственного ЛеннартОС с гном3, намертво прибитым гвоздями. Да, различные браузеры и плееры тоже надо запретить, свести все к одному единственному мплееру и гуглохрому. Не надо спорить и/или кидаться экскрементами. Пусть у каждого будет право выбора и каждый остается на своей территории со своей демократией

anonymous
()
Ответ на: комментарий от kirk_johnson

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

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

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

Ты понимаешь, что код на haskell(!) частенько более понятный, чем простыни Ok/Err на rust?

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

Я не уверен, что раст спасёт от мудаков, ставящих ассерт на строки, получаемые извне.

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

код на haskell(!) частенько более понятный

Код на Haskell обычно даже более понятный чем код на C.

простыни Ok/Err на rust

Тащемта, никто не мешает юзать .and_then(). Просто кто-то говнокодер.

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

Код на Haskell обычно даже более понятный чем код на C.

Частенько да.

Тащемта, никто не мешает юзать .and_then(). Просто кто-то говнокодер.

Только их почему-то мало кто юзает. В том проекте, где авторы писали ОС на rust, уровень вложенность Ok/Err до пяти доходил.

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

А есть истории успеха с «memory-safe» языками?!

Там не об этом идёт речь. Там говорится что используя memory-unsafe language нужно быть аккуратным вдвойне и что за N лет использования таких языков выработано множество общепринятых подходов и практик позволяющих минимизировать как количество возможных проблем так и их влияние.

К сожалению systemd не использует эти общеизвестные подходы и практики и поэтому постоянно страдает от ошибок.

anonymous
()
Ответ на: комментарий от upcFrost

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

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

А RedHat'овцы говорили где-нибудь ясно и чётко, зачем они это делают? (и да, редхат я последний раз видел лет 8 назад, но скоро снова придётся)

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

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

DoS всего сервера из контейнера теперь не считается значимой? Серьезно?

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

повод хейтить систумд есть, в моем случае - куцые юнит-файлы, которые умеют env-файл, но не умеют скажем cli-opts-файл. в плане - параметры запуска можно передавать только через env, а не через командную строку. если надо '/usr/bin/prog -a -b -c', и эти параметры могут меняться - пишем еще один инит-файл костылем-оберткой к юниту систумд

систумд-фанбой тут вещал что это мол «слишком высокий уровень, кококо, низзя», но почему тогда env это не слишком высоко? тут уж либо крестик снять, либо штаны надеть. имхо могли бы тупо сделать спецдиректорию типа /etc/conf или /etc/defaults (как было, блин), и чтоб файлы в ней тупо имели строку которую надо подсунуть скрипту.

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

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

параметры запуска можно передавать только через env, а не через командную строку. если надо '/usr/bin/prog -a -b -c', и эти параметры могут меняться - пишем еще один инит-файл костылем-оберткой к юниту систумд

Да что ты говоришь. А ты пробовал читать документацию?

[Service]
EnvironmentFile=/path/to/env
ExecStart=/path/to/daemon $DAEMON_OPTS
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от kirk_johnson

DoS всего сервера из контейнера

А вот про это поподробнее. С какой радости ты получишь DoS всего сервера, если у контейнера свой notify-сокет (сабжевый) и свой процесс инита?

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

Я говорю на фоне других «интересных» уязвимостей, не локальных.

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

Я сам, скажем так, «не очень уважаю» ненужнод. Просто пытаюсь быть объективным, в данном топике мы обсуждаем конкретную локальную уязвимость в сабже, не более того. Да, действительно уязвимость «забавная», ну так и нефиг ставить ненужнод на сервера. А если поставил (я не про вас конкретно, а в вакууме :) ) - ссзб.

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

А вот про это поподробнее. С какой радости ты получишь DoS всего сервера, если у контейнера свой notify-сокет (сабжевый) и свой процесс инита?

А вы попробуйте. Народ вон говорит сабж норм работает в контейнерах.

anc ★★★★★
()

Вот тут подумалось. А были когда нибудь уязвимости в system V или bsd init? Я не помню, но это не значит что их небыло. Может кто-то что вспомнит?

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

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

anonymous
()
Ответ на: комментарий от anc

Да, действительно уязвимость «забавная», ну так и нефиг ставить ненужнод на сервера.

проблема в том, что ненужнод сейчас дефолтом и в дебиане, и в шапке/центоси, и в ...

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

Как надо было сделано до того, как начали всю эту возню.

Эту ложь я слышу все пятнадцать лет своей карьеры сисадмина. И все пятнадцать лет недоумеваю: если было сделано как надо, то зачем djb писал свои daemontools?

anonymous
()

почему это известие идет мининовостью, а не полной новостью?!

почему оно идет с таким коротким названием? чтобы сложнее было заметить?

и да, усилиями красной шапки основные дистрибутивы линукс скатываются в дерьмо, почти такое же, как винда и ос х

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

А вот про это поподробнее. С какой радости ты получишь DoS всего сервера, если у контейнера свой notify-сокет (сабжевый) и свой процесс инита?

Чувак выше писал, что у него хостовый systemd вешается, когда он это в контейнере запускает.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 1)

и объясните, кто знает, один момент:

разве может нормально написанный сетевой сервис «в стиле inetd» применять вызов pause()? или это признак говнокода?

я вот про что:

Процесс PID 1 зависает на системном вызове pause() ... после чего ... systemd-сервисы в стиле inetd перестают принимать соединения

сетевой сервис «в стиле inetd», по идее, должен *всегда* висеть на чем-то типа select, или что там модернового понапридумывали; с чего ему вдруг может потребоваться pause?

а если pause сетевому сервису «в стиле inetd» все-таки потребовался, значит он тормоз — в это (пусть даже небольшое) время он не сможет работать

понятно, что если сервис многонитевый или заблаговременно форкает worker-процессы, то родительский процесс/нить может и может сделать pause, однако речь именно о сервисах «в стиле inetd», где, как мне кажется, единственный выход — висеть на select

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

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

ну давай, приведи примеры уязвимостей

вот база уязвимостей в дебиане с 1997 года, т.е. почти за 20 лет, одним файлом: https://security-tracker.debian.org/tracker/data/json и по sysv грепается там только один баг, причем, конечно, баг не /sbin/init, а баг процесса инсталляции (и внесенный, судя по всему, из-за убунты, гы-гы)

з.ы. смотреть (или грепать) эту базу удобнее так: cat debian-security.json | perl -Wpe 's/}}}},/}}}},\n\n/g' | less

з.ы.ы. sysv, т.к. пакеты в дебиане называются sysvinit-четотам, а баги относятся к пакетам

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

и в дополнение: в пакете sysvinit_2.71-2.deb:

-rwxr-xr-x root/root 19592 1997-05-08 17:40 sbin/init

пакет взят отсюда: http://archive.debian.org/debian/dists/bo/main/binary-i386/base/sysvinit_2.71...

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

скатимся до одного единственного ЛеннартОС с гном3

Быстрее бы. Куда нести деньги, чтобы ускорить этот процесс?

Хочу, чтобы GNU/Linux соперничал с macOS.

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

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

anonymous
()
Ответ на: комментарий от kirk_johnson

Чувак выше писал, что у него хостовый systemd вешается, когда он это в контейнере запускает.

Запустил в двух контейнерах: arch и debian, оба с systemd. В обоих получил 100500 «Failed to notify init system: Connection refused», и ничего нигде не зависло. Нужно как-то пропатчить? :)

anonymous
()
Ответ на: комментарий от www_linux_org_ru

и объясните, кто знает, один момент:
разве может нормально написанный сетевой сервис «в стиле inetd» применять вызов pause()? или это признак говнокода?

Это признак срабатывания assert().

intelfx ★★★★★
()
Ответ на: Даже больше.... от arren

Если запустить это под LXC-контейнером из непривелигированного пользователя то на материнском хосте systemd встает колом, статус degraded.

Тут говорят, что ты пизд^W неправ. Подробности в студию (чо за OS, например).

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

А почему у меня нэма?

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

zabbal ★★★★★
()

Леннарт Поттеринг — спаситель Linux'a! Спасибо ему за неустанный труд!

А всех хейтеров принудительно отправить на курсы по изучению systemd с экзаменом в конце.

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

Точно, точно... все так и есть «пожлобился дать денег апстриму». А все почему? - потому что у меня в работе нет ни одного сервака с ненужнод. А centos7 в вируалке на потыкать палочкой поднимал.
Так что буду продолжать - «быть жадным и глупым»

anc ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.