Уразлівасць у ld.so OpenBSD

Дынамічны загрузчык ld.так, які ўваходзіць у склад OpenBSD, пры пэўных умовах можа для SUID/SGID-прыкладанні пакінуць зменную асяроддзі LD_LIBRARY_PATH і такім чынам дазволіць загрузіць іншы код у кантэксце працэсу, які выконваецца з падвышанымі прывілеямі. Патчы з выпраўленнем уразлівасці даступныя для рэлізаў 6.5 и 6.6. Бінарныя патчы (syspatch) для платформаў amd64, i386 і arm64 ужо запушчаныя ў вытворчасць і павінны быць даступныя для загрузкі да моманту публікацыі дадзенай навіны.

Сутнасць праблемы: падчас працы ld.so спачатку здабывае з асяроддзя значэнне зменнай LD_LIBRARY_PATH, з дапамогай функцыі _dl_split_path() ператварае яго ў масіў радкоў - шляхоў да каталогаў. Калі пазней высвятляецца, што бягучы працэс запушчаны SUID/SGID-прыкладаннем, то створаны масіў і, уласна, зменная LD_LIBRARY_PATH чысцяцца. Пры гэтым, калі падчас працы _dl_split_path() сутыкнецца з недахопам памяці (што цяжка з-за наяўнасці відавочнага абмежавання на памер зменных асяроддзі ў 256 кБайт, але тэарэтычна магчыма), то зменная _dl_libpath атрымае значэнне NULL, і наступная праверка значэння гэтай зменнай прапусціць выклік _dl_unsetenv("LD_LIBRARY_PATH").

Уразлівасць знойдзена спецыялістамі Якасныя, гэтак жа як і некалькі раней расчыненых праблем. Якія выявілі ўразлівасць даследнікі бяспекі адзначылі аператыўнасць рашэння праблемы: патч быў падрыхтаваны, і абнаўленні выпушчаныя на працягу трох гадзін пасля атрымання апавяшчэння праектам OpenBSD.

Дадатак: Праблеме прысвоены нумар CVE-2019-19726. У спісе рассылання oss-security зроблены афіцыйны анонс, улучальны прататып эксплоіта, які працуе ў OpenBSD 6.6, 6.5, 6.2 і 6.1 на архітэктурах
amd64 і i386 (эксплоіт можа быць адаптаваны і для іншых архітэктур).
Праблема эксплуатуецца ва ўсталёўцы па змаўчанні і дазваляе непрывілеяванаму лакальнаму карыстачу выканаць код з правамі root праз падстаноўку бібліятэкі пры запуску suid-утыліт chpass або passwd. Для стварэння неабходных для эксплуатацыі ўмоў недахопу памяці выкарыстоўваецца ўстаноўка абмежавання RLIMIT_DATA праз setrlimit.

Крыніца: opennet.ru

Дадаць каментар