осебпазирии реша дар ядрои Linux ва рад кардани хидмат дар systemd

Муҳаққиқони амният аз Qualys тафсилоти ду осебпазириро, ки ба ядрои Linux ва мудири системаи systemd таъсир мерасонанд, ошкор карданд. осебпазирӣ дар ядро ​​(CVE-2021-33909) ба корбари маҳаллӣ имкон медиҳад, ки тавассути коркарди директорияҳои хеле лонашуда иҷрои кодро бо ҳуқуқи реша ба даст орад.

Хавфи осебпазирӣ аз он иборат аст, ки муҳаққиқон тавонистанд эксплойтҳои кориро, ки дар конфигуратсияи пешфарз дар Ubuntu 20.04/20.10/21.04, Debian 11 ва Fedora 34 кор мекунанд, омода кунанд. Қайд карда мешавад, ки тақсимоти дигар санҷида нашудаанд, аммо аз ҷиҳати назариявӣ низ ба мушкилот осебпазиранд ва метавонанд ҳамла кунанд. Коди пурраи истисморҳо ваъда дода мешавад, ки пас аз рафъи мушкилот дар ҳама ҷо нашр карда мешавад, аммо ҳоло танҳо як прототипи функсияҳои маҳдуд мавҷуд аст, ки боиси вайрон шудани система мегардад. Мушкилот аз моҳи июли соли 2014 вуҷуд дорад ва ба релизҳои ядро ​​​​аз 3.16. Ислоҳи осебпазирӣ бо ҷомеа мувофиқа карда шуд ва 19 июл ба ядро ​​қабул карда шуд. Дистрибюцияҳои асосӣ аллакай навсозиҳои бастаҳои ядроии худро тавлид кардаанд (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

осебпазирӣ дар натиҷаи тафтиш накардани натиҷаи табдили size_t ба int пеш аз иҷрои амалҳо дар коди seq_file, ки файлҳоро аз пайдарпаии сабтҳо эҷод мекунад, ба вуҷуд меояд. Набудани тафтиш метавонад боиси навиштанҳои берун аз ҳудуд ба буфер ҳангоми эҷод, насб ва нест кардани сохтори директорияи хеле лонашуда (андозаи роҳ аз 1 ГБ зиёд) гардад. Дар натиҷа, ҳамлакунанда метавонад ба сатри 10-байтии "//нӯзшуда" ноил шавад, ки бо офсети "-2 ГБ - 10 байт" навишта шудааст, ки ба майдони бевоситаи пеш аз буфери ҷудошуда ишора мекунад.

Эксплоити омодашуда барои кор 5 ГБ хотира ва 1 миллион иноди ройгонро талаб мекунад. Эксплоит бо занги mkdir() кор мекунад, то зинанизоми тақрибан як миллион зеркаталогҳоро эҷод кунад, то андозаи роҳи файл аз 1 ГБ зиёд бошад. Ин директория тавассути bind-mount дар фазои алоҳидаи корбар насб карда мешавад, ки пас аз он функсияи rmdir() барои нест кардани он иҷро мешавад. Дар баробари ин, риштае сохта мешавад, ки барномаи хурди eBPF-ро бор мекунад, ки дар марҳила пас аз санҷиши псевдокоди eBPF, аммо пеш аз тартиб додани JIT он баста мешавад.

Дар фазои номи корбарии беимтиёз, файли /proc/self/mountinfo кушода мешавад ва номи роҳи дарози директорияи ба пайвастшуда хонда мешавад, ки дар натиҷа сатри "//deleted" ба минтақа пеш аз оғози буфер навишта мешавад. Мавқеи навиштани сатр тавре интихоб карда мешавад, ки он дастурро дар барномаи eBPF аллакай санҷидашуда, вале ҳанӯз тартиб дода нашудааст, баргардонад.

Минбаъд, дар сатҳи барномаи eBPF, навиштани берун аз буфери идоранашаванда ба қобилияти идорашавандаи хондан ва навиштан ба дигар сохторҳои ядро ​​тавассути коркарди сохторҳои btf ва map_push_elem табдил меёбад. Дар натиҷа, эксплоит ҷойгиршавии буфери modprobe_path[]-ро дар хотираи ядро ​​​​муайян мекунад ва роҳи "/sbin/modprobe"-ро дар он аз нав менависад, ки ба шумо имкон медиҳад, ки дар ҳолати пайдо шудани файли иҷрошаванда бо ҳуқуқи реша оғоз намоед. request_module() занг, ки барои мисол, ҳангоми сохтани васлаки netlink иҷро мешавад.

Тадқиқотчиён якчанд роҳҳои муваққатиро пешниҳод мекунанд, ки танҳо барои истисмори мушаххас самараноканд, аммо худи мушкилотро бартараф намекунанд. Тавсия дода мешавад, ки "/proc/sys/kernel/unprivileged_userns_clone" барои ғайрифаъол кардани директорияҳои васлкунӣ дар фазои номи корбар алоҳида ва "/proc/sys/kernel/unprivileged_bpf_disabled" ба 0 барои хомӯш кардани боркунии барномаҳои eBPF ба ядро.

Ҷолиби диққат аст, ки ҳангоми таҳлили ҳамлаи алтернативӣ бо истифодаи механизми FUSE ба ҷои пайвастшавӣ барои насб кардани директорияи калон, муҳаққиқон ба осебпазирии дигаре дучор шуданд (CVE-2021-33910), ки ба мудири системаи система таъсир мерасонад. Маълум шуд, ки ҳангоми кӯшиши насб кардани директория бо андозаи роҳ аз 8 МБ аз тариқи FUSE, раванди оғозкунии идоракунӣ (PID1) аз хотираи стек тамом мешавад ва ба садама дучор мешавад, ки ин системаро дар ҳолати "ваҳима" мегузорад.

Мушкилот дар он аст, ки systemd мундариҷаи /proc/self/mountinfo-ро пайгирӣ ва таҳлил мекунад ва ҳар як нуқтаи васлкуниро дар функсияи unit_name_path_escape() коркард мекунад, ки амалиёти strdupa()-ро иҷро мекунад, ки маълумотро на дар хотираи динамикӣ ҷудошуда дар стек ҷойгир мекунад. . Азбаски андозаи ҳадди ниҳоии стек тавассути RLIMIT_STACK маҳдуд аст, коркарди роҳи аз ҳад калон ба нуқтаи васлшавӣ боиси вайрон шудани раванди PID1 мегардад ва системаро қатъ мекунад. Барои ҳамла, шумо метавонед соддатарин модули FUSE-ро дар якҷоягӣ бо истифода аз директорияи хеле лонашуда ҳамчун нуқтаи васлкунӣ, ки андозаи роҳи он аз 8 МБ зиёд аст, истифода баред.

Мушкилот аз замони systemd 220 (апрели 2015) ба вуҷуд омадааст, ки аллакай дар анбори асосии система ислоҳ шудааст ва дар дистрибюторҳо (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch) ислоҳ шудааст. Қобили зикр аст, ки дар версияи 248-и systemd истисмор аз сабаби хато дар коди systemd, ки боиси нокомии коркарди /proc/self/mountinfo мегардад, кор намекунад. Инчунин ҷолиб он аст, ки дар соли 2018 вазъияти шабеҳ ба миён омад ва ҳангоми кӯшиши навиштани осебпазирии CVE-2018-14634 дар ядрои Linux, муҳаққиқони Qualys бо се осебпазирии муҳим дар systemd дучор шуданд.

Манбаъ: opennet.ru

Илова Эзоҳ