Linux өзөгүндөгү тамырдын аялуулугу жана systemdде кызмат көрсөтүүдөн баш тартуу

Qualys компаниясынын коопсуздук изилдөөчүлөрү Linux ядросуна жана системалык система менеджерине таасир эткен эки алсыздыктын чоо-жайын ачып беришти. Ядродогу алсыздык (CVE-2021-33909) жергиликтүү колдонуучуга жогорку уяланган каталогдорду манипуляциялоо аркылуу тамыр укуктары менен коддун аткарылышына жетишүүгө мүмкүндүк берет.

Алсыздыктын коркунучу изилдөөчүлөр Ubuntu 20.04/20.10/21.04, Debian 11 жана Fedora 34 демейки конфигурациясында иштеген жумушчу эксплойттарды даярдай алганы менен күчөйт. Башка бөлүштүрүүлөр текшерилген эмес, бирок теориялык жактан да көйгөйгө дуушар болуп, чабуулга дуушар болушу мүмкүн экени белгиленет. Эксплуатациялардын толук коду көйгөй бардык жерде жок кылынгандан кийин жарыяланат деп убада кылынган, бирок азырынча системанын бузулушуна алып келген чектелген функционалдуулуктун прототиби гана жеткиликтүү. Көйгөй 2014-жылдын июлунан бери орун алып келет жана 3.16дөн баштап ядро ​​​​релиздерине таасирин тийгизет. Алсыздыкты оңдоо коомчулук менен макулдашылып, 19-июлда ядрого кабыл алынган. Негизги дистрибьюторлор өзөктүк топтомдоруна жаңыртууларды жасап коюшкан (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Алсыздык, жазуулардын ырааттуулугунан файлдарды түзгөн seq_file кодунда операцияларды аткаруудан мурун size_t to int конверсиясынын натыйжасын текшербегендиктен келип чыгат. Текшерилбесе, өтө уя салынган каталог түзүмүн түзүүдө, монтаждоодо жана жок кылууда (жолдун көлөмү 1 ГБдан чоңураак) буферге чектен тышкары жазуулар болушу мүмкүн. Натыйжада, чабуулчу бөлүнгөн буфердин алдындагы аймакты көрсөтүп, "-10 ГБ - 2 байт" офсетинде жазылган 10 байттык "//deleted" сапка жетиши мүмкүн.

Даярдалган эксплойт иштөө үчүн 5 ГБ эстутум жана 1 миллион бош инод талап кылат. Эксплуатация 1 ГБ ашкан файл жолунун өлчөмүнө жетүү үчүн миллионго жакын подкаталогдордун иерархиясын түзүү үчүн mkdir() чакырып иштейт. Бул каталог 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" 0гө, ал эми eBPF программаларын ядрого жүктөөнү өчүрүү үчүн "/proc/sys/kernel/unprivileged_bpf_disabled" 1ге коюу сунушталат.

Белгилей кетчү нерсе, чоң каталогду орнотуу үчүн FUSE механизминин ордуна FUSE механизмин колдонууну камтыган альтернативалуу чабуулду талдап жатып, изилдөөчүлөр системалык башкаруучуга таасир эткен дагы бир алсыздыкка (CVE-2021-33910) туш болушкан. FUSE аркылуу жолдун көлөмү 8 МБ ашкан каталогду орнотууга аракет кылып жатканда, башкарууну инициализациялоо процессинде (PID1) стек эстутуму түгөнүп, бузулуп, системаны "паника" абалына келтирет.

Көйгөй, systemd /proc/self/mountinfo мазмунуна көз салып, талдайт жана динамикалык түрдө бөлүнгөн эстутумга эмес, маалыматтарды стекке жайгаштырган strdupa() операциясын аткарган unit_name_path_escape() функциясында ар бир орнотуу чекити иштетет. . Стектин максималдуу өлчөмү RLIMIT_STACK аркылуу чектелгендиктен, орнотуу чекитине өтө чоң жолду иштетүү PID1 процессинин бузулушуна жана системанын токтоп калышына алып келет. Чабуул үчүн сиз эң жөнөкөй FUSE модулун монтаждык чекит катары жогорку уяланган каталогду колдонуу менен бирге колдонсоңуз болот, анын жол өлчөмү 8 МБ ашат.

Көйгөй systemd 220 (2015-жылдын апрель айы) бери пайда болуп, негизги системалык репозиторийде оңдолгон жана дистрибуцияларда (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch) бекитилген. Белгилей кетчү нерсе, systemd 248-релизинде эксплуат /proc/self/mountinfo иштетилбей калышына алып келген systemd кодундагы катадан улам иштебейт. Кызыгы, 2018-жылы ушундай эле жагдай пайда болуп, Linux өзөгүндөгү CVE-2018-14634 аялуулугу үчүн эксплойт жазууга аракет кылып жатканда, Qualys изилдөөчүлөрү systemdде үч маанилүү алсыздыкка туш болушкан.

Source: opennet.ru

Комментарий кошуу