В systemd выявлена (https://github.com/systemd/systemd/issues/6237) ошибка, приводящая к выполнению сервисов с правами другого пользвователя, если в параметрах запуска указано имя пользователя, начинающееся с цифры. Например, если в сервисе указан "User=0day" и пользователь 0day присутствует в системе, то сервис будет запущен с идентификатором 0, т.е. с правами root. Леннарт Поттеринг отказался исправлять ошибку и закрыл (https://github.com/systemd/systemd/issues/6237#event-1143774643) уведомление с меткой "not-a-bug".Позиция Поттеринга: В Linux исторически не разрешено использовать имена пользователей, начинающиеся с цифры, которые считаются некорректными. Например, в утилитах из состава shadow-utils применяется ограничение "[a-z_][a-z0-9_-]*[$]". Подобное ограничение принято чтобы избежать путаницы между передачей UID и имени пользователя в качестве аргументов типовых утилит, которые могут воспринять цифровую часть как цифровой идентификатор пользователя (перевести строку в число), если имя начинается с цифры. В systemd идентификатор пользователя, начинающийся с цифры, приводит к выводу в лог предупреждения, но при попытке запуска сервиса строка будет игнорирована и сервис с "User=0day" будет запущен под UID 0, если пользователь 0day присутствует в системе (если пользователя нет, то попытка выполнения завершится ошибкой). При этом расчёт делается на то, что создание некорректного пользователя, подобного "0day", не должно быть допущено другими компонентами дистрибутива.
Аргументы сторонников исправления подобного поведения: Фактически ограничение на использование цифр в именах в современных реалиях повсеместно не применяется, например, начиная с RHEL 7/CentOS 7 штатный инструментарий дистрибутива позволяет создавать и использовать пользователей, имена которых начинаются с цифры. Стандарт POSIX/IEEE Std 1003.1-2001 не накладывает ограничений по использованию цифр в именах пользователей, а в ситуациях когда допускается обработка и имени и UID требует вначале проверять наличие имени пользователя, и если оно отсутствует воспринимать цифровой идентификатор как UID. В утилитах GNU рекомендуется явно выделять цифровые идентификаторы префиксом "+".
Кроме того, даже если systemd воспринимает имя некорректным, следует вывести ошибку, а не молча запускать сервис под другим пользователем. Некоторые рассматривают проблему как уязвимость, так как если кто-то убедит администратора хоста установить вредоносное ПО под именем пользователя, начинающегося с нуля, и настроить запуск сервиса systemd от этого пользователя, то данное ПО будет выполнено с правами root, а не того непривилегированного пользователя, под которым ожидает выполнения администратор.
URL: https://ma.ttias.be/giving-perspective-systemds-usernames-st.../
Новость: https://www.opennet.dev/opennews/art.shtml?num=46798
>Позиция Поттеринга:Весьма странная. Очевидно же что 0day это не 0. Очевидно, что что-то происходит не так. Нельзя выполнять что попало от имени рута при заведомо(!) некорректных входных данных. Пните его там -- он явно ещё не проснулся.
Я так понял, он имеет ввиду то, что такое имя при корректной работе остальной системы до этого пункта дойти не сможет. Теоретически, должно что-то будет раньше чем произойти чем указанная ошибка.
Однако может иметь место банальная опечатка, когда вместо nginx кто-то укажет 0nginx. И получит совершенно непредсказуемое поведение. Ну то есть... поттеринг говорит что 0nginx эквивалентно root. Норм че.
Может, но это как с rm -rfЮзер может ошибиться и стереть себе нафиг ВСЁ, нужно ли страховать его от такого или нет?
Подход "страховать" исповедуется в Windows, где с настройками по умолчанию на каждый чих нужно подтверждать действия, по мнению системы, опасные.
> Может, но это как с rm -rf
> Юзер может ошибиться и стереть себе нафиг ВСЁ, нужно ли страховать его
> от такого или нет?"Опасные действия" и "действия с непонятным и неоднозначным вводом пользователя" вроде бы две большие разницы.
Или у вас уствновлена особая, суровая версия rm, которая для rm -f "*.x", не найдя подходящих файлов (.x), начнет удалять все (*)?
> Однако может иметь место банальная опечатка, когда вместо nginx кто-то укажет 0nginx.Для это надо ещё что бы такой пользователь с опечаткой (0nginx) реально существовал в системе.
Например опечатка может случиться в одном месте, в системе автоматизации. А оттуда расползётся уже дальше. Да, конечно это "криворучье", т.е. человеческий фактор. И таки разумней было бы вываливаться с диагнозом "тут ошибка". Но...
Однако произошло. Всё-таки это в масштабе одной программы можно возложить проверку входных данных на одну функцию и больше не париться по этому вопросу. А при межпрограммном взаимодействии верить никому нельзя. Даже Мюллеру. Тем более, что тут вопрос буквально пары строк кода.
Это ещё что, я отправлял feature request под свои задачи, разумеется указал свою версию systemd из состава дистрибутива. А feature request относился к последней версии, что называется, на будущее, о чём я явно потом сказал. Но Поттеринг закрыл запрос, аргументировав это тем, что принимаются запросы только по последним двум версиям systemd и указав на уже существующие возможности, которые мне ну никак не подходили (т. е. человек даже не вникал в суть задачи).systemd задала новый стандарт де факто для системы загрузки, он действительно хорошо, но когда-нибудь systemd ждёт серьёзный форк от недовольных.
А в SysVinit не отправлял? Там что сказали?
А в сис5 эти фичи были уже 20 лет как реализованы )))-- другой аноним
А что за фичи то?
Все возможные фичи и парочка невозможных тоже. Это же проверенный временем безошибочный универсальный идеально заточенный под инициализацию системы sysV. Там такой фигни нет!
> Все возможные фичи и парочка невозможных тоже. Это же проверенный временем безошибочный
> универсальный идеально заточенный под инициализацию системы sysV. Там такой фигни нет!Точнее, там любая фигня есть! Это же исконно-посконный sysV.
> Все возможные фичи и парочка невозможных тоже. Это же проверенный временем безошибочный
> универсальный идеально заточенный под инициализацию системы sysV. Там такой фигни нет!Ну это не совсем так, просто sysV бесконечно расширяемый, за счёт скриптовости своей натуры, в отличии от того же systemd где до сих пор например нельзя задать свою команду для restart сервиса :-)
ExecReload= не подходит?
И куда ты лезешь? Ты что никогда не работал с CVS, SVN, git? Ну, то-то и оно. Не лезь. И мысли у тебя наверняка глупые.
> systemd задала новый стандарт де факто для системы загрузки, он действительно хорошо, но когда-нибудь systemd ждёт серьёзный форк от недовольных.И я надеюсь форк будет от Линуса.
>> systemd задала новый стандарт де факто для системы загрузки, он действительно хорошо, но когда-нибудь systemd ждёт серьёзный форк от недовольных.
> И я надеюсь форк будет от Линуса.Не раньше, чем:
- Линус продаст все свои акции RedHat
или
- RedHat пошлёт ЛП на... в... в винду.
>>systemd ждёт серьёзный форк от недовольных.
> И я надеюсь форк будет от Линуса.Пока ждёте, вас порадует https://gnu.org/s/shepherd/ Ричард.
Это не сон, это гордыня. И она никого никогда к хорошему не приводила.
This - http://mobile.opennet.ru/openforum/vsluhforumID3/111642.html#14
Поттер сказал — нотабуг, значит нотабуг!
Чую, мемасиков нарисуют, как в Bumblebee
ЧСХ, таких нотабуг стало подозрительно много. И не только в systemd
> ЧСХ, таких нотабуг стало подозрительно много. И не только в systemdВзрослеете, однако.
Вроде не впервой, о чём новость-то?
>не впервойМожно пару примеров? Я кроме ошибки в grub2 ничего больше не помню.
>>не впервой
> Можно пару примеров? Я кроме ошибки в grub2 ничего больше не
> помню.Из громких — была еще ситуация с тем, что rm -fr убивает материнку: https://github.com/systemd/systemd/issues/2402 (Поттеринг считает, что это ОК) и https://github.com/systemd/systemd/issues/5644 — удаление по маске .* удаляет и родительский каталог (Поттеринг не знал, что этого не должно происходить)
Ты поцтеровы нотабуги смотри, а не в чужие программы
Одно дело дыры, а другое, когда их игнорируют.
Каюсь, раньше не понимал, за что Лёню так не любят.
Любая ошибка есть ошибка, а Леня — лентяй и/или пудак.
Второе, второе. Это новый аналог Ульриха "ВашеМудачество" Дреппера, с его бессмертным "stop reopening".
Дреппер — автор глибца, а "стоп реопенинг" — от автора рпм. Это разные люди.А Дреппер в своё время не хотел вставлять в глибц костыли для обхода бага во флеше и в какой-то проприетарной софтине, используемой Линусом. А ещё ругался на Линуса, что в нормальных операционках данные от ядра получаются бинарным sysctl-ем, тогда как в линуксе для этого надо парсить текстовый файл в недрах /proc. Так что Дреппер был адекватным в отличие от.
> Дреппер — автор глибца, а "стоп реопенинг" — от автора рпм. Это разные люди.Именно Дреппер и именно в глибЦе: https://sourceware.org/bugzilla/show_bug.cgi?id=4980
Млин, действительно :(Спутал с этим: https://bugzilla.redhat.com/show_bug.cgi?id=119185
> Леннарт Поттеринг отказался исправлять ошибку и закрыл уведомление с меткой "not-a-bug".
> начиная с RHEL 7/CentOS 7 штатный инструментарий дистрибутива позволяет создавать и использовать пользователей, имена которых начинаются с цифры.он же вроде в Red Hat работает, ему там еще не настучали ?
Будто вы с пульсой историю незнание? Через пару лет Лёню снимут с проекта придут тругие программам ты и все перепишут как надо.
пульсу уже переписали как надо?
Внезапно - да. Замечательно работает поверх JACK'а в качестве замены алсового dmix.
> пульсу уже переписали как надо?Вылезайте из криокамеры! Давно уже - теперь шипение еще более сочное и глубокое, как и жор проца! И даже, в 7 версии, решили что выход по SIGTERM не обязательно является критической ошибкой.
> пульсу уже переписали как надо?с разморозкой тебя. ты отсутствовал 5 лет
Теперь нескучно шипит.
действительно такой эффект имеется. Сделал скрипт и запустил от 0day. В итогеroot 8746 1 0 21:17 ? 00:00:00 /bin/bash /usr/local/2.sh
от моего имени запускается как положенно. КАК МОЖНО ЭТО НЕ СЧИТАТЬ БАГОМ??
> root 8746 1 0 21:17 ? 00:00:00 /bin/bash /usr/local/2.sh
> /usr/local/2.sh
> 2.shалло, это двош? тут постят несмешное!
Сделай тоже самое, но от "day". Пользователь не должен существовать.Посмотри результат. Потом задумайся.
Я знаю, что надо сделать. Концепт многопользовательской операционной системы — это легаси UNIX'а 70-, не совместимый с новейшими принципами systemd. У каждого пользователя должен быть свой контейнер от systemd-nspawn. Это решит проблему (ну может еще пару приложений сломает, но чего не сделаешь ради прогресса).
Собственно, это не так безумно, как кажется - по факту абсолютное большинство систем однопользовательские, а "пользователи" используются исключительно для разделения прав. А с приходом контейнеров на серверах (в которых часто вообще всё, что можно, от рута крутится - но этого "всего" в каждом контейнере мало) и разделение прав уходит на другие механизмы. Да и прочего legacy в POSIX хватает.Но безумия Поттеринга - и вообще, и в данном случае - это не отменяет :-)
> У каждого пользователя должен быть свой контейнерДжоанна?
> Джоанна?VM/370
на z/VM примерно так. Пользователь == виртуалка.
Лозунги - это хорошо, но только для лохов.А я например ради прогресса встроил бы в systemd тест который в "непрогрессивных дистрах" кричал бы при первом запуске: "Галактикавопасностэ!!! 0root работает как root!! Давай-ка накати обновления друг!!!"
Но прежде чем делать такую хрень, я бы рассчитал бы 25 раз точно ли тут прогресс и стоит ли оно того.
ps: А еще я подумал кем является человек который декларирует и воспринимает профанство в разработке systemd в качестве новейших принципов. И знаешь..я тебе из лучших побуждении искренне рекомендую молчать.
По-моему, тут дружно не заметили в иронию в посте предлагавшего
Привет из 2019го. Мы уже оценили Ваше предложение и сделали шаги в этом направлении:
https://www.opennet.dev/opennews/art.shtml?num=51532
(Люди в шутку придумывают безумные вещи про будущее развитие systemd, но постоянно оказывается не так уж далеки от истины)
То есть о defensive programming бедный Леннарт тоже ничего не слышал?
> Programming? Шигорин? WHAT!?На полном серьёзе, разъясни суть претензий.
Лингво утверждает, что используются обе слово-формы. https://www.lingvolive.com/ru-ru/translate/en-ru/programing
Макмиллиан знает только о "Programming". http://www.macmillandictionary.com/dictionary/british/progra...
нечто, поттеринг пишетYes, as you found out "0day" is not a valid username. I wonder which tool permitted you to create it in the first place. Note that not permitting numeric first characters is done on purpose: to avoid ambiguities between numeric UID and textual user names.
Я создал юзера стандартной useradd в моей федоре 25. Он удивляется какой тулзой это можно сделать. Он вообще когда в последний раз в редхатовском дистре работал, наверно сидит в своих новых проектах а на этот ему наплевать. За такое поведение достоин увольнения
не только в редхетовском работает. в убунте тоже создается
Интересно, он реально не знает, что /etc/passwd можно править текстовым редактором?
ага тока суть в том, что нуно быть рутом чтобы создать нового "0day", а потом ещё его прописывать в сервис )
Он для логов бинарный формат придумал, смотреть который надо специальной утилитой. Какая уж тут правка конфигов универсальным текстовым редактором...
> Он вообще когда в последний раз в редхатовском дистре работал...Интересный вопрос, особенно учитывая то, что он работает в Red Hat.
он просто дурачок, строящий из себя серьёзного технического специалиста. Но не очень получается. Зато Редхат компенсирует это протекторатом.
Позиция Лёни Дэ подозрительна. Сейчас модно косо смотреть на параноиков, везде усматривающих заговоры, но это уже ни в какие ворота.
Если по ТЗ функция должна получать на вход целые числа от 1 до 100, то проверять на 0 нет смысла.Поттеринг прав.
Не нравится - меняйте ТЗ.
Анон такой анон, отрой уже для себя типизацию.
> Если по ТЗ функция должна получать на вход целые числа от 1 до 100, то проверять на 0 нет смысла.Верно. Но если вы вдруг использовали нечто на входе не проверив что у вас это нечто есть число от 1 до 100, то сразу надо в дворники. Notabug.
Ну, во-первых нет такого типа, чтобы сам по себе имел диапазон 1-100. uint8_t - это [0,256]. Во-вторых, для целых чисел недостаточной разрядности есть опасность переполнения типа. В-третьих, пётеринг отказывается делать проверку, мотивируя тем, что "вам запрещено передавать в функцию числа больше 100". То что по факту хакеры вертели его запреты на детородном органе, сабж признавать отказывается.Так что да, тут злостное нарушение практики defensive programming в критически важном компоненте системы, и отказ признать свою неправоту после прицельного тычка носом в получившуюся кучу.
Ещё раз: есть здравый смысл (на который ты напираешь), а есть ТЗ. Если в ТЗ написано что будет, значит это БУДЕТ. Как, почему, а может всё-таки стоит - это неправильные вопросы. Если в ТЗ написано что пункт меню должен называться "Параматеры", то он ДОЛЖЕН называться "Параматеры". Это требование (ТРЕБОВАНИЕ!!!!!) и ты обязан (ОБЯЗАН) его выполнить.Это как описание API: не надо додумывать и переиначивать то, что написано прямым текстом.
Напр. функция поиска подстроки в php должна вернуть "Возвращает указанную подстроку. Если подстрока не найдена, возвращается FALSE". Не может быть числа на выходе. Не может быть массива на выходе. Не может и всё тут. Но ты ведь всё равно проверишь что это не число и не массив, да?
Чувак, иди учись дальше. Входные данные, за которые ты не можешь поручиться головой (то есть пришедшие откуда угодно извне) всегда проверяются. Это основа основ.P.S. А входные данные, за которые ты головой поручиться таки готов - лучше тоже проверить, если ресурсы позволяют. Потому что от ошибок в своём коде никто не застрахован.
Если проверка параметров нужна (а обычно она нужна), то делается функция-обёртка, которая только и делает что проверяет параметры и вызывает функцию-обработчик. Обёртка может выполнять кэширование, проверку прав доступа и многое другое.Кто будет писать обёртку тебя не касается, это не ты.
А того, кто будет писать обёртку, не касается кем, где и как будет реализован функционал.
Есть паттерны, которые называются Заместитель и Декоратор, но ты с ними явно не знаком. И к проектной работе ты тоже не готов.
У царя Мидаса всё в золото превращалось, а у вас - в дерьмо. Вечно хотите запихать в функцию и проверку параметров, и функционал, и отрисовку, и кэширование.Подходишь, ничего не сделано. "А я тут занимался ***". Ну вот на *** ты этим занимался?????!!!!! Тебя просили? Тебе прямым текстом сказали "не надо". Ты дурак???? "Но ведь это тоже надо делать..." Надо. Но не тебе. И не так.
> У царя Мидаса всё в золото превращалось, а у вас - в
> дерьмо. Вечно хотите запихать в функцию и проверку параметров, и функционал,
> и отрисовку, и кэширование.
> Подходишь, ничего не сделано. "А я тут занимался ***". Ну вот на
> *** ты этим занимался?????!!!!! Тебя просили? Тебе прямым текстом сказали "не
> надо". Ты дурак???? "Но ведь это тоже надо делать..." Надо. Но
> не тебе. И не так.Подходишь такой к Поттерингу, попросил показать инит. "А я сделал комбайн. Тут DNS-сервер, сканер QR-кодов, бинарные логи, и ещё 20 ненужных вещей"
Подходишь, ничего не сделано. "А я тут занимался проектированием с применением десятка патернов, о которых на днях прочитал в умной книжке. Ну вот на *** ты этим занимался?????!!!!! Тебя просили? Тебе прямым текстом сказали "не надо". Ты дурак????"
Ничо, ничо. Начнёшь проверять все данные сразу после первого серьёзного факапа из-за некорректных данных.
Не начнет, он же манагер по образу мышления. Отбрехается тем, что в ТЗ этого не было, а ТЗ согласовали, вот подписи. А то, что проверка данных ожидается по умолчанию от качественного кода, его не колышет, он без понятия об этих умолчаниях, у него бумажка с ТЗ есть.
>Ещё раз: есть здравый смысл (на который ты напираешь), а есть ТЗ.А где оно, ТЗ на системду, не подскажешь?
Вообще-то такие типы есть - в Аде, например (хм, init на Аде - интересная мысль, в принципе). В остальном - согласен.
> Вообще-то такие типы есть - в Аде, напримерПаскальщина же, ну и заодно модула.
Модулу не знаю, а на паскалях (FP и Delphi) это делается только через аналог enum. Внутри там те же integer-ы с разрядностью как у процессора. Более того, рантайм может не отлавливать получение числа, не попадающего в разрешённый диапазон.То есть проверять надо.
> Модулу не знаю, а на паскалях (FP и Delphi) это делается только через аналог enum.Садись - "двойка"!
var I:1..100;
> Внутри там те же integer-ы с разрядностью как
> у процессора. Более того, рантайм может не отлавливать получение числа, не
> попадающего в разрешённый диапазон.А может и "отлавливать". Начиная с... врать не буду, но начиная с TurboPascal 5.0 for DOS - точно мог "отлавливать".
> То есть проверять надо.
Т.е. уроки прогуливать не надо.
>нет такого типа, чтобы сам по себе имел диапазон 1-100ты не умеешь в типизацию
enum?
> Ну, во-первых нет такого типа, чтобы сам по себе имел диапазон 1-100.
> uint8_t - это [0,256].Скоро кто-то прочитает Ваш пост и поверит что это именно так. И сделает очередную чудо-приблуду, с которой Поттерингу придётся разбираться.
Дело в том, что реальный мир - это не ТЗ. Его трудно изменить, и его свойства приходится учитывать. А позиция "если факты противоречат моей теории, тем хуже для фактов" инфантильная.
В реальном мире платят за точность исполнения ТЗ. когда мы собирали один девайс в тз был уровень шума, мы смогли его снизить и чуть не нарвались на штрафы. Как сказал заказчик: не ваше собачье дело почему девайс должен шуметь. Он должен, поэтому это написано в тз. Пришлось вставлять в девайс шумелку.
И теперь ты ходишь в каске и улыбаешься.
Cool story, bro. Теперь спрошу еще раз: где ТЗ на systemd? Где в нем пункт, где прямо описано сабжевое поведение?
Там же, где ТЗ на Линукс. Мотивировочную часть Поттеринг представил. Читай пока не поймёшь его позицию, там всего 10 слов.
>Читай пока не поймёшь его позицию, там всего 10 слов.Как он растянул их на 148 блогов-постов? Активно использовал воду и знаки переносов?...
Поможете нам отделить те 10 слов от тех-тех 148 блог-постов? Типа, мучаемся же.
>Мотивировочную часть Поттеринг представил. Читай пока
> не поймёшь его позицию, там всего 10 слов.Девять?! Не десять??7
""Poettering describes systemd development as "never finished, never complete, but tracking progress of technology"."" --https://en.wikipedia.org/wiki/Systemd#Design
Раз его нет, то какого черта ты тут тогда про ТЗ задвигаешь?
Я так понимаю, с вашим участием пока что было разработано не много девайсов :)В реальном мире как-то так: http://ekimoff.ru/download/job/1.jpg
И... количество вопросов "зачем?" к создателям Devuan становится меньше.
Поттеринг всего лишь "послал" выскочку, который кто такой вообще, чтобы репортить баги? Удивительно что вообще обосновал позицию, а не закрыл страничку молча. В своё время так же "послали" Кона Коливаса, только в тот раз Ingo Molnár. "Кто ты такой вообще, пролетарий, ветеринар, чтобы учить меня как ядро писать?"
> man 3 strtoulЕсли исправлять баг, то тут:)
Думаю каждый хоть раз парсил текст в числа этой функцией.
И многие знают про этот баг не первый год.
strtoul тут не при чём. Поттеринг же объяснил, что имя пользователя начинающееся с цифры systemd рассматривает как ошибку и игнорирует соответствующую строчку конфига. Пишет в лог об ошибке и продолжает работать так, будто этой строчки и не было. А если user не указан, то по дефолту используется root.
Это была ирония...
Отмазывайся теперь.
> имя пользователя начинающееся с цифры systemd рассматривает как ошибку
> и игнорирует соответствующую строчку конфига. Пишет в лог об ошибке
> и продолжает работать так, будто этой строчки и не было.
> А если user не указан, то по дефолту используется root.Это только если пользователя с таким именем не существует. А если существует, то должен использовать его, а использует root. Хотя наверное и при несуществующем пользователе запуск происходить не должен. И наверное не происходит.
И какой же там баг?
Бага там как раз нету:)
Функция делает то, что и должна делать.Она кстати вернет 0 в случаях, когда первая цифра не 0.
Например, 'day0' или '-day'.
> Она кстати вернет 0 в случаях, когда первая цифра не 0.
> Например, 'day0' или '-day'.Ну вернет 0 для day0 и что? В мане отлично описано, что нужно делать в таком случае.
>> man 3 strtoul
> Если исправлять баг, то тут:)
> Думаю каждый хоть раз парсил текст в числа этой функцией.
> И многие знают про этот баг не первый год.Да все там есть:
https://github.com/systemd/systemd/blob/7e867138f586a7113f43...
int safe_atou(const char *s, unsigned *ret_u) {
char *x = NULL;
unsigned long l;
...
errno = 0;
l = strtoul(s, &x, 0);
if (errno > 0)
return -errno;
if (!x || x == s || *x)
return -EINVAL;
Как и целая куча копипасты "safe_atoXX" с вариациями в одну-две строки -- все в лучших традициях.
Хм, интересно. А то, что эта функция для строки "0" выдаёт ошибку - это так задумано художником?
> Хм, интересно. А то, что эта функция для строки "0" выдаёт ошибкуХм, а с чего вы так решили?
С того, что strtoul возвращает 0 как в результате ошибки, так и в результате корректного преобразования строки "0".
> С того, что strtoul возвращает 0 как в результате ошибки, так и
> в результате корректного преобразования строки "0".
unsigned long int strtoul(const char *nptr, char **endptr, int base);
Хм, а использовать/проверять endptr не позволяют религиозные убеждения (и вообще, душа просит эмуляции старого доброго атоя)?> If endptr is not NULL, strtoul() stores the address of the first invalid character in *endptr.
> If there were no digits at all, strtoul() stores the original value of nptr in *endptr (and returns 0).
> In particular, if *nptr is not '\0' but **endptr is '\0' on return, the entire string is valid.Ну или если в более разжеванном виде:
http://www.gnu.org/software/libc/manual/html_node/Parsing-of...
> You should not check for errors by examining the return value of strtol, because the string might be a valid representation of 0l, LONG_MAX, or LONG_MIN. Instead, check whether tailptr points to what you expect after the number (e.g. '\0' if the string should end after the number). You also need to clear errno before the call and check it afterward, in case there was overflow.
>
Это вы не мне, а автору кода, процитированного выше, рассказывайте.
>>> эта функция для строки "0" выдаёт ошибку
>> С того, что strtoul возвращает 0 как в результате ошибки, так и в результате корректного преобразования строки "0".
> Это вы не мне, а автору кода, процитированного выше, рассказывайте.И правда -- рассказывать вам, похоже, бесполезно.
http://ideone.com/SEriLl
input: 0day, err: -22, val: 1337
input: day0, err: -22, val: 1337
input: 42, err: 0, val: 42
input: -0, err: -34, val: 42
input: -1, err: -34, val: 42
input: 0, err: 0, val: 0
input: 1337, err: 0, val: 1337
input: 0p3nn3, err: -22, val: 1337
> С того, что strtoul возвращает 0 как в результате ошибки, так и
> в результате корректного преобразования строки "0".man errno
Ещё один. Автору кода выше расскажите.
В systemd выявлена ошибка, приводящая к выполнению сервисов с правами другого пользвователя
У меня в системе нету пользвователей, так что не страшно.
> У меня в системе нету пользвователей, так что не страшно.Вам в DOS'е хорошо! А у нас тут интыпрайз :)
Эпичненько. Всетаки входной контроль данных должен быть.
> Эпичненько. Всетаки входной контроль данных должен быть.если вы намекаете на отдел кадров рехатта, то, как тут уже писали, там тз совсем не про вас.
Всё правильно. В Linux нет багов, есть только фичи.. :)
Пожалуй, это и есть причина появления "Лёни".Можно сколько угодно кидаться на с-д, но ошибки, всё-таки, в консерватории. А именно, стойкое игнорирование мелочей и фидбека юзеров, которые, якобы, тупее "светлейшего разработчика". На место "светлейшего" претендует и Лёня и тысячи других гениев-основателей, которые из-за ЧСВ не признают своих косяков. Лёня - дитя системы и отлично вписывается linux-мир
Лене на пенсию пора уже, по состоянию душевного здоровья. А анонимным опеннетовцам, одобряющим "not a bug" в данном случае - пора, наконец, перестать противоречить любой критике святых мощей systemd, а сначала включить мозг. Леня зарвался, а тут находятся люди, готовые любой его высер оправдать.
По состоянию душевного здоровья на пенсию по инвалидности надо отправлять 95% населения opennet'а, которое даже не попытавшись въехать в тему обвиняет Поттеринга во всех смертных грехах. Как и написано в заголовке новости -- это спорная ошибка. Ошибка она или не ошибка? Ошибка в unit-файле, об этой ошибке админу сообщается. Весь сыр-бор в том, что может быть надо не просто сообщать об ошибке, но ещё и сервис не запускать. И, по-моему, это было бы здравым решением. Наверное.
Но, с другой стороны, Лёню тоже можно понять -- у него там в issues сидят толпы обезьян с развитием на уровне opennet'а. Обсуждать с ними такие тонкости -- совершенно непродуктивная практика: глянь на это обсуждение и ты поймёшь. Проще закрыть issue, а если будет очень надо, то либо переоткрыть, либо открыть новый, либо молча исправить тип ошибки с синтаксической на семантическую и обваливать запуск сервиса. Но молча. Или обсуждая со своими. Не с имбецилами в интернете.
Леня заслуживает такое коммьюнити ровно по той же самой причине, по которой лично вы заслуживаете такой опеннет.В любой ситуации проще всего обозвать всех вокруг имбецилами и обезьянами, которые ничего не понимают. Все дело в том, что с таким подходом рано или поздно вокруг только имбецилы и обезьяны и останутся. Вы сами оттолкнули от себя конструктивно критикующих людей, не оставив им никакой другой формы диалога, кроме как пообезьянничать. А теперь обиженно наблюдаете вокруг одних обезьян. Чему же тут удивляться-то?
> Леня заслуживает такое коммьюнити ровно по той же самой причине, по которой
> лично вы заслуживаете такой опеннет.Нет, ситуации различны. Я могу покинуть опеннет в любой момент.
> Вы сами оттолкнули от себя конструктивно критикующих людей, не оставив им никакой
> другой формы диалога, кроме как пообезьянничать. А теперь обиженно наблюдаете вокруг
> одних обезьян. Чему же тут удивляться-то?
> конструктивно критикующих
> конструктивноХы. Можно конкретные ссылки на этих конструктивно критикующих, чтобы я мог оценить масштабы тех потерь, которые я понёс в результате своего опрометчивого поведения? Я не вижу ни одного, везде, вместо рациональных аргументов, сплошной эмоциональный ad hominem типа "если Лёня, значит мyдaк, значит любое принятое им решение мудацкое". На ad hominem ответим ad hominemom. Но если я не прав, я покаюсь. Ссылки в студию.
Сознательное создание дыры, под предлогом "всё равно таких юзеров нет" - полная безалаберность, простительная школоте. Если это предлагает чел старше 30 лет, то он полный му****к.
> Сознательное создание дыры, под предлогом "всё равно таких юзеров нет" - полная
> безалаберность, простительная школоте. Если это предлагает чел старше 30 лет, то
> он полный му****к.Если возможность для рута запускать сервисы от своего имени -- это дыра, то я с вами соглашусь стопроцентов. Но я не согласен с первой частью утверждения. А раз так, то меня гложут сомнения в том, что этот баг является дырой. То есть, как я уже сказал выше, я всё же скорее склонен не соглашаться с Поттерингом по этому вопросу, но у меня нет твёрдой уверенности. В отличие от 95% местного населения, которое всегда поражено синдромом Даннинга-Крюгера по самые гланды, и всегда имеет определённое мнение по любому вопросу и всегда твёрдо уверено в своей правоте.
В системах, в которых Системд, уже исправили работу патча Бармина? Раньше стирало UEFI BIOS. Если нет - то и эту багофигу не исправят и подавно! Ну, будет ещё один способ получения рута :-) Это как в Windows 98: Введите логин и пароль. Ввёл. Неправильный пароль. Нажал отмена. Успешный вход!
> Ну, будет ещё один способ получения рутаЭто типа, чтоб получить рут права надо для начала с рут правами записать конфигурацию сервиса?
Гениальное хакерство.
>> Ну, будет ещё один способ получения рута
> Это типа, чтоб получить рут права надо для начала с рут правами
> записать конфигурацию сервиса?
> Гениальное хакерство.Видимо, предлагается ногами притопать к руту и попросить его добавить пользователя 0day прям как в https://xkcd.com/327/
>> Ну, будет ещё один способ получения рута
> Это типа, чтоб получить рут права надо для начала с рут правами
> записать конфигурацию сервиса?
> Гениальное хакерство.Пакетируем какой-нибудь софт, который использует init-скрипты, например TeamViewer.
> Пакетируем какой-нибудь софт, который использует init-скрипты, например TeamViewer.И? так и без этой штуки можно напакетировать туда сервис рутовый.
> Леннарт Поттеринг отказался исправлять ошибку и закрыл уведомление с
> меткой "not-a-bug".Чё-то он меня бесит. Когда я предложил смерджить все его поделки в один пакет и затолкать ему в гузно во имя мира на земле, модеры меня потёрли. Обидно.
Да, обидно. Но даже не то, что ваше сообщение потерли, а не прислушались к вашему совету.
Потому что шакал Поццеринг работает на кого-то ещё, им НУЖНЫ дыры, которые помогут спецслужбам. Не удивительно, КАК ДРУЖНО мир лину|~|с подхватил казалось бы самую бестолковую идею, противоречащую всему!
> КАК ДРУЖНО мир лину|~|с подхватил казалось
> бы самую бестолковую идею, противоречащую всему!Это не мир. В основном это боты для раскачивания. А от них уже заражаются психически неустойчивые. "Все пошли и я пошёл". Теперь они агенты Смиты, и пока не выздоровят, надо стараться от них изолироваться (игнорировать) и изгонять из защищаемых сообществ.
Акела промахнулся! Промахнулся Акела!
Шакал шакала ставит идеалом...
А как должна работать
# chown 0day anyfile.txt
> А как должна работать
> # chown 0day anyfile.txtservant# ls -l tmp.txt
-rw-r--r-- 1 ivan ivan 1821 1 янв 00:57 tmp.txt
servant# grep 0day /etc/passwd
servant# pw useradd 0day
servant# grep 0day /etc/passwd
0day:*:1003:1003:User &:/home/0day:/bin/sh
servant# chown 0day tmp.txt
servant# ls -l tmp.txt
-rw-r--r-- 1 0day ivan 1821 1 янв 00:57 tmp.txt
servant#Правда у меня FreeBSD.
> ошибка закрыта без исправленияКакой наркоман заголовок писал?
Закрыта не ошибка, а отчет об ошибке.
> Закрыта не ошибка, а отчет об ошибкеЗакрыт не отчет об ошибке, а issue, содержащий в себе отчет об ошибке.
По английски и я могу, а по-русски слабо?
яПони
если ты сделал пользователя 0day то ты конечно уже скомпрометировал всё.. можно же сразу всё под рутом делать.
Ну хоть бы под nobody запускал по умолчанию что-ли.
А смысл? Что бы букв было больше?
Вообще убрать этот параметр из юнит файла.
Ответ от энтузиастов openbsd: https://marc.info/?l=openbsd-tech&m=149902196520920&w=2
>В Linux исторически не разрешено использовать имена пользователей, начинающиеся с цифры, которые считаются некорректнымида хрен с этими цифрами. когда в linux можно будет создать пользователя с именем кириллицей? а то в винде вот уже лет двадцать как можно...
Надеюсь, никогда.
> да хрен с этими цифрами. когда в linux можно будет создать пользователя
> с именем кириллицей? а то в винде вот уже лет двадцать
> как можно...И с пробелами неплохо бы, а то как-то скучно стало жить
В чем бугурт? С точки зрения systemd строка User=0day неверна _синтаксически_. Строка отбрасывается, но в логе появляется отметка о косяке. User=notexists - верна синтаксически, но неверна семантически, поэтому берется во внимание, но при запуске скажет - user not found. По мне, так вроде логично всё. В любом случае косяк не уходит молча в пустоту, а в лог кидается предупреждение.
>В чем бугурт? С точки зрения systemd строка User=0day неверна _синтаксически_Сам спросил - сам ответил.
По стандарту POSIX 0day - корректное имя пользователя. С чего вдруг такая запись должна быть синтаксически неверна?
Наверно "бугурт" в том, что Леня набросал код, даже не думая о том как он должен работать.
Теоретически если к примеру в какой-то момент случайно удалить пользователя, то сервис запустится под рутом. В нормальной программе это может регулироваться параметром.
Тут же пробелы в логике в работе(запуск сервисов). По умолчанию следовало не запускать сервис, если в нем есть синтаксические(или любые другие). А вот если пользователь хочет, то скажем неким параметром указывать системе запускать сервис, если информации для запуска сервиса достаточно. То есть напрочь отсутствует политика безопасности запуска сервисов.
> Теоретически если к примеру в какой-то момент случайно удалить пользователя, то сервис
> запустится под рутом.Нет, не запустится. Несуществующий пользователь != невалидный пользователь.
>При этом расчёт делается на то, что создание некорректного пользователя, подобного "0day", не должно быть допущено другими компонентами дистрибутива.ЗАТКНИТЕСЬ ВСЕ! Пость поттеринг лучше игнорирует этот баг, чем заменяет /etc/{passwd,shadow,group} на бинарную поделку прибитую к systemd
>>При этом расчёт делается на то, что создание некорректного пользователя, подобного "0day", не должно быть допущено другими компонентами дистрибутива.
> ЗАТКНИТЕСЬ ВСЕ! Пость поттеринг лучше игнорирует этот баг, чем заменяет /etc/{passwd,shadow,group}
> на бинарную поделку прибитую к systemdразве ещё не заменил?
Ни капли не удивлюсь, если оно так в скором времени и станет.
> Ни капли не удивлюсь, если оно так в скором времени и станет.Креста на http://openwall.com/tcb/ вас нет, ироды !
Так как бы наоборот, ничего хорошего из этого не выйдет. Просто после systemd меня вообще мало чем можно удивить.
>Кроме того, даже если systemd воспринимает имя некорректным, следует вывести ошибку, а не молча запускать сервис под другим пользователемвот это было бы правильным решением
Правильным решением было бы не запускать сервис, если в нем(юнит файл) допущены ошибки.
> Правильным решением было бы неТак, ша! Тут лёнарт решает, что правильно.
Поддержу.
К примеру, тот же nginx не запустится, если в конфиге ошибка.
> В Linux исторически не разрешеноВ языке C исторически сложилось так, что memcpy() копирует данные "от начала к концу". 35 лет подряд так и делали. А потом вдруг внезапно решили, что "от конца к началу" тоже будет зашибись, потому что иначе не ускорить memcpy() с помощью SSE4 на системах x86_64. А всем несогласным сказали "нам плевать как там сложилось исторически - есть стандарт, вот и следуйте ему".
Что за двойные стандарты в мире Open Source? В проекте Glibc сказали "плевать что так исторически сложилось", а в проекте Systemd говорят "плевать что есть стандарт". Проект X11 демонтируют инноваторы, потому что там есть сетевая прозрачность, поэтому Wayland лучше. Проект PulseAudio добавляют потому что там есть сетевая прозначность, поэтому PulseAudio лучше. И таких ситуаций - полно!
"If developers don't force themselves into the constraints of the POSIX API, they could develop some really innovative software, like systemd shows" (C) L.P., 2011
> исторически сложилось такИди в винду, ламер.
По моему, еще Кениган и Ричи в своей книжке писали, что поверение memcpy зависит от реализации.
Поттеринг поступил совершенно верно. Описанное поведение не является ошибкой.
Скачал Fedora. Установил Fedora. Загрузилась FreeBSD. Вот так нет никаких ошибок.
Хэш-то надо было сверять...
> Хэш-то надо было сверять...Неверный хеш был по-лёнартовки проверен-и-отброшен. Есть путь.
> Описанное поведение не является ошибкой.Тогда это бэкдор.
Расскажи что ли, где бекдор-то.По факту в юнит-файле игнорируется директива User, если указанный пользователь невалидный.
В чем уязвимость?
Итак, господа, возникает вопрос!
Все ли хорошо в openrc и стоит ли выкинуть сустемд (и пульсу заодно)?
1. Да, все хорошо, но количество программ, зависящих от него, колеблется в зависимости от заинтересованности мейнтеров конкретного дистрибутива.
2. Если В Вашем дистре достаточно openrc пакетов, то конечно стоит. Ну а пшшшаудио ненужно априори. На крайний случай можете выкинуть сервер и оставить libpulse в качестве плагина для альсы, если есть программы, которые зависят от сабжа и лень перекомпилять их/искать альтернативы.Алсо есть еще runit, но он, вроде, в глубокой разработке и еще далек от идеала. Ну и, банально, проблематично его найти вне войда
>оставить libpulsehttps://github.com/i-rinat/apulse
>есть еще runitесть еще runitЭтих систем инициализаций вагон и маленькая тележка. Бери любуй, подпиливай под неё свои скрипты и пользуйся. Хоть sinit, хоть uselessd, хоть самописный на баше. Просто делай как тебе удобно и всё.
"Исторически сложилось...", конечно, аргумент серьезный, но POSIX все таки важнее.
Регексп, приведённый в комментарии, матчит любое число.
https://gist.github.com/bloerwald/a482791395114fa82636e2ab20...То есть можно создать юзера с именем (не uid) 0, 123 или любым другим, не отличимым от uid.
Как предполагается обрабатывать данную ситуацию ВСЕМУ софту, который не использует раздельные параметры для user и uid (а это значительная часть софта и подавляющее большинство утилит для администрирования) и какой стандарт регламентирует, что должно иметь приоритет для такого параметра?В качестве домашнего задания попробуйте сделать:
useradd 0
pkill -9 -u 0И уже на базе этого подумайте, кто именно и где неправ.
> В качестве домашнего задания попробуйте сделать:
> useradd 0
> pkill -9 -u 0
> И уже на базе этого подумайте, кто именно и где неправ.В качестве домашнего задания попробуйте почитать внимательно багтрекер. Подсказка:
Невалидный пользователь отбрасывается при парсинге и сервис запускается от рута. А вот если пользватель валидный, но его нет в системе, тогда никто ничего не запускет. Классно, ага.
Ответ на твой вопрос содержится прямо в тексте новости.
А теперь попробуйте в качестве домашнего задания внимательнее прочитать новость и сделать вот так:
useradd 0day
pkill -9 -u 0dayУбьются ли у вас процессы пользователя 0day, или процессы пользователя root, как это сделал бы systemd?
И уже на базе этого подумайте, кто именно и где неправ. На мой взгляд всё очевидно - пользователь с именем 0day - это не пользователь с uid 0.
Вообще пользователи могут появляться в системе не только из /etc/passwd но и через сетевые сервисы типа Kerberos или YP/NIC. А там таких ограничений нет. Странно что Леннарт работая на RedHat, не рассматривает такой вариант.
Похоже у парня крыша едет от очущения собственной крутизны.
> не рассматривает такой вариантТак он же, говорят, в десктопном подразделении шапки работает. На локалхосте керберосы всякие не нужны, потому и рассматривать нечего.
Страница автора systemd - http://0pointer.de/lennart/Феерично - 0pointer !