LINUX.ORG.RU

Обход аутентификации сервера OpenSSH на системах musl

 , ,


0

3

OpenSSH позволяет войти в систему под пользователем, парольный вход в систему которому был выключен путем установки ‘*’ в поле хеша пароля. Для того нужно передать любой пароль длиннее 256 символов. Уязвимы только системы с включенной парольной аутентификацией и выключенным PAM. Затронуты все системы, основанные на musl: Alpine Linux, OpenWRT, buildroot — с настройками по умолчанию — и другие. Проблема существует с 2016 года, исправлена в openssh 10.6p2.

>>> Подробнее

anonymous

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

Баг не в openssh а в musl, а в openssh просто подкостылили бажную библиотеку.

Конкретнее musl crypt() фейлится на паролях длиннее 256 байт (они решили что sha512 от таких паролей будет слишком нагружать проц) и в качестве фейла возвращает строку «*» (звёздочка) которая оказывается совпадающей с полем хеша пароля в системной базе юзеров для тех у кого отключён парольный логин.

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

на конкурсе а-ля «премия Дарвина», за самый идиотский из опасных багов, это претендент в высшую лигу и призовые места

MKuznetsov ★★★★★
()

OpenWRT

Там dropbear же, а не OpenSSH.

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

Ну проверить надо, но если бага в Мусле, то какая разница, что там в качестве OpenSSH. Разве что еще и переполнение буфера случиться :)

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

Кстати, надо проверить, что у меня в DLinke происходит.

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

Ну проверить надо, но если бага в Мусле, то какая разница, что там в качестве OpenSSH.

На этом sshhole.com пишут, что в dropbear проблемы нет.

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

У DLink кастомная прошивка, что там в качестве SSH-сервера я чот не задумывался.

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

Ну хоть так, догадались проверить корректность возвращаемого значения. :)

gns ★★★★★
()

о, кстати напомнило. https://github.com/kaniini/capsudo - авторка (she/her) этого говнокода с жирнейшей CVE (упражнение, найти CVE без помощи нейронок) является главной по безопасности в Alpine, так что не удивительно что и эта бага в мюсле была благополучно пропущена))

Lrrr ★★★★★
()
- Стой! Кто такой?! А ну пароль мне говори!
+ П5КМс6уФГы987-000гндафлнык
- Кхм 
+ ПузфныыыпкМыло-343==90:ап
- Кхм-кхмммм...
+ кмсыпыкуЛагоолалату-тумба-ыфыцксща
- Чё там было ыфыфцк...
- Ой да задолбал ты уже, проходи

И смех и грех какой-то

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от Lrrr

авторка (she/her)

Там «авторка» с вооот такущим подвохом есличо.

является главной по безопасности в Alpine

Штош. Пропал, значит, калабуховский дом. Куда теперь деваться-то?

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

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

Lrrr ★★★★★
()

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

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

У нас было два гендерквира; семьдесят пять небинарных; пять штук трансвеститов; отдел контроля качества, до половины наполненный сапиосексуалами; целое созвездие разноцветных фурфагов – взбодриться, успокоиться, поорать, поржать; а также группа демигендеров, стайка феминисток, сейф-спейс, три упоротых эйчарки и две дюжины активистов с крашеными волосами. Всех их мы наняли накануне вечером, как ужаленные гоняя по округу Лос-Анджелес от Топанги до Уоттса. Хватали всех, кто шел в руки. Многовато для одной компании, но, когда начинаешь всерьез подгонять фирму под стандарты разнообразия, бывает трудно остановиться.

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

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

Не, всё-таки проблема в OpenSSH. Смотри, из мана crypt на арче с glibc:

Upon successful completion, crypt, crypt_r, crypt_rn, and crypt_ra return a pointer to a string which encodes both the hashed passphrase, and the settings that were used to encode it. This string is directly usable as setting in other calls to crypt, crypt_r, crypt_rn, and crypt_ra, and as prefix in calls to crypt_gensalt, crypt_gensalt_rn, and crypt_gensalt_ra. It will be entirely printable ASCII, and will not contain whitespace or the characters ‘:’, ‘;’, ‘*’, ‘!’, or ‘\’.

Upon error, crypt_r, crypt_rn, and crypt_ra write an invalid hash to the output field of their data argument, and crypt writes an invalid hash to its static storage area. This string will be shorter than 13 characters, will begin with a ‘*’, and will not compare equal to setting.

Технически musl вполне имел право возвращать звездочку, а вот OpenSSH обрабатывает это некорректно.

Короче, что я имею сказать:

  1. Это API - просто эталонное говнище. Вместо того, чтобы всегда возвращать NULL, оно заставляет тебя дрочить вприсядку.
  2. В соседнем треде спрашивали, что можно сделать, чтобы юниксы были безопасными. Ответ - выкинуть нахрен весь говнокод с кулхакерствами, понаписанный ВЕЛИКИМИ ДИДАМИ.
liksys ★★★★
()

Охрененно сэкономили 500 килобайт или сколько там эта чахотка выдаёт по сранению с glibc?

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

Чувствуется рука товарища Майора

Это не рука - пересядь на другой стул пока не привык, а то ещё понравится ;-)

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

Upon error, crypt_r, crypt_rn, and crypt_ra write an invalid hash

Ну, то есть, ‘*’, прилагается к ERANGE в качестве возвращаемого значения. Таки дело в OpenSSН походу.

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

Да. Но API crypt() тоже говно, так делать нельзя.

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

Ну вообще crypt-у на вход дали валидные данные и рассчитывали на валидный ответ, а он вместо этого фейлится, проблема в первую очередь в этом. То что индикатор ошибки у них совпадает с шаблоном отсутствующего пароля - уже вторично. Если бы не первая причина, такая ситуация при неиспорченной базе паролей (т.е. без соучастия рута) не произошла бы. Да, дополнительная проверка в openssh не помешает, всё-таки это инструмент безопасности, но она там нужна именно для нейтрализации багов в других местах, а не как основная логика.

Что касается API то да, оно сомнительное в целом (даже с учётом ниженаписанного).

Кроме того man 3posix crypt пишет:

RETURN VALUE
       Upon  successful  completion, crypt() shall return a pointer to the en‐
       coded string. The first two bytes of the returned value shall be  those
       of the salt argument. Otherwise, it shall return a null pointer and set
       errno to indicate the error.

ERRORS
       The crypt() function shall fail if:

       ENOSYS The functionality is not supported on this implementation.

И раньше в линуксе так и было, но musl решили чинить несломавшееся, а вслед за ними и видимо glibc это сделали (хотя по ссылке написано что это некий libxcrypt). В фрибсд возвращает NULL.

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

рассчитывали на валидный ответ

Вот так и пишут лучшие сишники лора свои программы без багов. Ошибка может быть, значит нужно обрабатывать, а не «рассчитывать».

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

раньше в линуксе также было 100%

я из 3 или 4 фришки брал реализацию crypt (автор был phk, полагаю ты знаешь кто это), уж не помню зачем, попутно сравнивал с glibc, на которую только что переползли с libc5.

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

должно было вернуть NULL, но небинарным это активно не нравилось, слишком бинарно!

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