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)
Ответ на: комментарий от intelfx

монолитность надёжнее, т. к. она уменьшает количество стыков и «движущихся частей».

Если бы последователи Поттеринга делали корабли, то они, по всей видимости, приваривали бы спасательные шлюпки к корпусу.

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

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

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

уменьшит attack surface с сохранением возможностей

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

Перечитай еще раз то, что я писал ранее:

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

Простой пример. Мне необходимы функции X, Y, Z. В случае хорошо написанных программ, которые делают только одно, и делают это хорошо, я просто составлю себе из этого набора программ то, что мне нужно F1 = { X, Y, Z }.

В случае с systemd я получу F2 = { X, Z, S, Y, S, T, E, M, D, I, S, C, R, A, P, W, A, R, E }.

Как ты думаешь, в каком случае поверхность атаки будет выше? F1 или F2?

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

S, Y, S, T, E, M, D, I, S, C, R, A, P, W, A, R, E

У тебя так мило припекает, продолжай.

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

А если я использую все (или почти все) возможности? Почему я должен увеличивать свою «поверхность атаки» за счёт того, что какому-то хейтеру захотелось труъ юниксъ модульности, и к совокупной сложности кода PID 1 systemd добавилась ещё сложность точек сопряжения?

И теперь ответь на вопрос: кому, кроме трёх с половиной лоровских теоретиков, потребуется выкидывать что-то из функциональности PID 1 systemd (которой там не так много)?

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

А причем тут PID 1 вообще? Речь идет о systemd в целом.

добавилась ещё сложность точек сопряжения?

И какая точка сопряжения добавится между демоном синхронизации времени и демоном инициализации?

кому потребуется выкидывать что-то из функциональности systemd

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

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

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

И какая точка сопряжения добавится

Никакой, потому что это две независимые программы (полностью).

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

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

Как ты ухитряешься не устанавливать systemd в RHEL 7?

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

потому что всё остальное работает без рута

И это автоматически решает все проблемы безопасности? Так считать очень наивно.

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

Как ты ухитряешься не устанавливать systemd в RHEL 7?

Очень просто — там, где очень важна безопасность, использую Gentoo.

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

всё остальное работает без рута

мне кажется это не совсем верно

ps aux | grep systemd | grep root
root       261  0.0  0.1  77644 37644 ?        Ss   сен08   0:10 /usr/lib/systemd/systemd-journald
root       295  0.0  0.0  36088  3720 ?        Ss   сен08   0:02 /usr/lib/systemd/systemd-udevd
root       501  0.0  0.0  38516  3764 ?        Ss   сен08   0:02 /usr/lib/systemd/systemd-logind
systemctl --version
systemd 231
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN

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

Security by obscurity?

Нет. А почему ты так решил?

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

Я ожидал услышать всё что угодно, но не такое.

А вам, таким красивым, религия не позволяет проверить все ОДИН раз нормально и далее передавать всем желающим что-то типа «struct valid_unitname»? Заодно сразу с плюшками типа длины, позиций @, extension и т.д (что там еще нужно), вместо четырех-пятикратных повторных разборов этого несчастного имени-выражения.
А ведь еще можно забацать какой нибудь «unitname_modificator» тип, в котором (т.е. в одном месте) держать литералы и прочее нужное для работы. Но нет, конечно же лучше гордо кидаться указателями на char, проверять и парсить одно и то же по дюжине раз, используя куски копипасты …

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

Твоя правда. Есть бинарники, которые работают от рута. Но они не перестают быть опциональными.

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

Не договаривай за меня. Ты протестовал против отсутствия модульности в systemd, которое якобы заставляет тебя выполнять в своей системе ненужный код и таким образом увеличивать поверхность атаки. Я ответил, что это не так, поскольку почти (кроме udev) все компоненты systemd (по границам бинарников) отключаемы и взаимозаменяемы, а дробить на модули дальше (например, разбивать PID 1 на куски) нецелесообразно.

Слова про «не от рута» — не более чем примечание на полях (к тому же ещё и не совсем верное, см. выше).

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

Никакой, потому что это две независимые программы (полностью).

Тогда почему они вообще находятся в одном дереве исходников? Это же не ls и cat.

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

почти (кроме udev) все компоненты systemd (по границам бинарников) отключаемы и взаимозаменяемы

ШТО. udev вроде никто раньше не заставлял использовать. Это journald нельзя убрать совсем, не?

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

Тогда почему они вообще находятся в одном дереве исходников?

А почему stty, chown и tr находятся в одном дереве?

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

А почему stty, chown и tr находятся в одном дереве?

И ведь действительно, в чем причина того, что столь разнородные утилиты находятся в одном дереве?

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

Тогда почему они вообще находятся в одном дереве исходников?

Because we can.

With some greetings, Lennart Pottering.

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

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

Шли годы, а ученики из Хогвартса все еще повторяют как мантру то, что systemd был кому-то нужен, кроме red hat.

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

Обычный способ ведения бизнеса для капиталистов.

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

journald убрать можно (замаскировать сервис и сокет), хоть и говорят, что нельзя. Просто потеряешь все логи. А между systemd и udev сейчас внутренний интерфейс (не libudev), и я не уверен, что systemd перенесёт отсутствие udev.

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

Да, ещё systemd нужен как минимум мне.

Был, котенок, я говорил о том, что был. Сейчас он ясно кому-то нужен, ибо любая технология собирает фанбоев. Это не зависит от того, хорошая она или плохая.

Но политика остается политикой. Раньше мелкомягкий баловался eee (хотя он и сейчас этим занимается), а теперь и красношапка подобным же дерьмом начала.

Обида, первый дистриб как никак.

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

Тут такое дело: я баловался апстартом и OpenRC, ещё когда systemd не было. И мне не понравилось. А systemd понравился, и я им пользуюсь с каких-то там двадцатых релизов. Так что мимо. И не думаю, что я один такой.

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

Котенок, а в чем проблема то? Я тебя задел тем, что ты не был «у самых истоков systemd»? Так это ты зря! Я и не об этом говорил совсем. Совсем совсем не о тебе. Нет.

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

Во-первых, свою фамильярность можешь куда-нибудь убрать, от неё ни тепло ни холодно. Во-вторых, ты утверждал, что «systemd был нужен только Red Hat», что неверно, т. к. необходимость ощущалась (например, мне). Ну такой себе формальный контрпример.

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

На сколько долей процента?

Сильно зависит от реализации проверок, что проверяем, и частоты их использования, «при остром желании» и «пароход» остановить можно. Я видел когда эти лишнии проверки становились проблемой в пром. контролерах, «пока мы все еще проверяем» «моторчик-то крутится» и «долетает до концевика», в то время как ему надо было остановиться гораздо раньше.

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

Если бы последователи Поттеринга делали корабли, то они, по всей видимости, приваривали бы спасательные шлюпки к корпусу.

:))) Причем резак/болгарка/etc находились бы в трюме

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

Сильно зависит от реализации проверок, что проверяем, и частоты их использования, «при остром желании» и «пароход» остановить можно

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

Я видел когда эти лишнии проверки становились проблемой в пром. контролерах, «пока мы все еще проверяем» «моторчик-то крутится» и «долетает до концевика», в то время как ему надо было остановиться гораздо раньше.

А давай не сравнивать hard realtime и линуксовый юзерспейс?

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

Любая лишняя проверка это работа железа, т.е. дополнительное время. Да и выше вам уже ответили.
PS " линуксовый юзерспейс" афигеть «юзерспейс» в pid1

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

А давай не сравнивать hard realtime и линуксовый юзерспейс?

Я кстати про «пароход» не случайно написал, несколько месяцев назад тут пролетало про завод в тайване и «параход» где заменили старые спарки на qemu. Так что чем вам не realtime ?

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

Любая лишняя проверка это работа железа, т.е. дополнительное время.

Я повторяю вопрос: сколько этого лишнего времени будет? В процентах.

Да и выше вам уже ответили.

С анонимусом согласен. С тобой — нет.

афигеть «юзерспейс» в pid1

Посмотри в словаре значение слова «юзерспейс», почитай про реалтайм в линуксе (точнее, про отсутствие оного) и больше не приплетай сюда промышленные контроллеры и станки с ЧПУ.

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

Я повторяю вопрос: сколько этого лишнего времени будет? В процентах.

Сколько «средняя температура по больнице включая гнойное и морг»(ц) ?
Вы реальный знаток сабжа, и я уважаю вас за то что помогаете здесь с возникающими вопросами!
Но выполнение любой команды есть процессорное время, копирование данных из/в память, передача по конвейеру, и т.д. все занимает время. А мы все удивляемся чей-то современные компы тормозят в ДЕ/браузерах и т.п. хотя все тоже самое раньше работало на мощностях в разы ниже.
Отвечая на ваш вопрос, да хз сколько процентов... 100500 раз проверить вхождение символа в char* 512k или два раза /0

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

Отвечая на ваш вопрос, да хз сколько процентов...

В таком случае какие могут быть разговоры?

100500 раз проверить вхождение символа в char* 512k или два раза /0

Предъяви, пожалуйста, в коде systemd пример избыточно многократного поиска символа по строке, размер которой может достигать 512k.

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