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 файлын 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 механизмін пайдалануды қамтитын балама шабуылды талдау кезінде зерттеушілер жүйелік жүйе менеджеріне әсер ететін тағы бір осалдыққа (CVE-2021-33910) тап болды. Жол өлшемі 8 МБ асатын каталогты FUSE арқылы орнатуға әрекет жасағанда, басқаруды инициализациялау процесі (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 жүйесінде үш маңызды осалдыққа тап болды.

Ақпарат көзі: opennet.ru

пікір қалдыру