Udhaifu wa mizizi katika kinu cha Linux na kunyimwa huduma katika systemd

Watafiti wa usalama kutoka Qualys wamefichua maelezo ya udhaifu mbili unaoathiri kernel ya Linux na msimamizi wa mfumo wa mfumo. Athari kwenye kernel (CVE-2021-33909) huruhusu mtumiaji wa karibu kufikia utekelezaji wa msimbo na haki za mizizi kupitia utumiaji wa saraka zilizo na viota vya juu.

Hatari ya hatari hiyo inazidishwa na ukweli kwamba watafiti waliweza kuandaa ushujaa wa kufanya kazi ambao hufanya kazi kwenye Ubuntu 20.04/20.10/21.04, Debian 11 na Fedora 34 katika usanidi chaguo-msingi. Imebainika kuwa usambazaji mwingine haujajaribiwa, lakini kinadharia pia huathirika na shida na inaweza kushambuliwa. Nambari kamili ya ushujaa imeahidiwa kuchapishwa baada ya shida kuondolewa kila mahali, lakini kwa sasa ni mfano tu wa utendaji mdogo unaopatikana, na kusababisha mfumo kuharibika. Tatizo limekuwepo tangu Julai 2014 na linaathiri kutolewa kwa kernel kuanzia 3.16. Marekebisho ya kuathiriwa yaliratibiwa na jumuiya na kukubaliwa katika msingi tarehe 19 Julai. Usambazaji kuu tayari umetoa sasisho kwa vifurushi vyao vya kernel (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Athari hii inasababishwa na kushindwa kuangalia matokeo ya ubadilishaji wa size_t hadi int kabla ya kutekeleza shughuli katika msimbo wa seq_file, ambao huunda faili kutoka kwa mlolongo wa rekodi. Kukosa kuangalia kunaweza kusababisha uandishi wa nje ya mipaka kwa bafa wakati wa kuunda, kupachika, na kufuta muundo wa saraka uliowekwa kiota (ukubwa wa njia zaidi ya GB 1). Kwa hivyo, mshambulizi anaweza kufikia kamba ya baiti 10 "//iliyofutwa" iliyoandikwa kwa usawa wa "-2 GB - baiti 10" inayoelekeza kwenye eneo linalotangulia bafa iliyotengwa.

Matumizi yaliyotayarishwa yanahitaji kumbukumbu ya GB 5 na ingizo milioni 1 bila malipo ili kufanya kazi. Unyonyaji huo unafanya kazi kwa kupiga simu mkdir() kuunda safu ya takriban milioni ndogo ili kufikia saizi ya njia ya faili inayozidi GB 1. Saraka hii imewekwa kupitia bind-mount katika nafasi tofauti ya jina la mtumiaji, baada ya hapo kazi ya kukokotoa ya rmdir() inaendeshwa ili kuiondoa. Sambamba, thread imeundwa ambayo inapakia programu ndogo ya eBPF, ambayo imezuiwa kwenye hatua baada ya kuangalia pseudocode ya eBPF, lakini kabla ya mkusanyiko wake wa JIT.

Katika nafasi ya majina ya mtumiaji ambayo haijabahatika, faili /proc/self/mountinfo inafunguliwa na jina refu la njia ya saraka iliyopachikwa husomwa, na kusababisha kamba "//kufutwa" kuandikwa kwa eneo kabla ya kuanza kwa bafa. Nafasi ya kuandika laini imechaguliwa ili kubatilisha maagizo katika programu ya eBPF ambayo tayari imejaribiwa lakini bado haijakusanywa.

Ifuatayo, katika kiwango cha programu ya eBPF, uandishi usiodhibitiwa wa nje ya bafa hubadilishwa kuwa uwezo unaodhibitiwa wa kusoma na kuandika kwa miundo mingine ya kernel kupitia upotoshaji wa miundo ya btf na map_push_elem. Kama matokeo, matumizi huamua eneo la modprobe_path[] buffer katika kumbukumbu ya kernel na kubatilisha njia ya "/sbin/modprobe" ndani yake, ambayo hukuruhusu kuanzisha uzinduzi wa faili yoyote inayoweza kutekelezwa iliyo na haki za mizizi katika tukio la a request_module() simu, ambayo inatekelezwa, kwa mfano, wakati wa kuunda tundu la netlink.

Watafiti hutoa suluhisho kadhaa ambazo zinafaa tu kwa unyonyaji maalum, lakini usiondoe shida yenyewe. Inapendekezwa kuweka "/proc/sys/kernel/unprivileged_userns_clone" hadi 0 ili kuzima saraka za uwekaji katika nafasi tofauti ya kitambulisho cha mtumiaji, na "/proc/sys/kernel/unprivileged_bpf_disabled" hadi 1 ili kuzima upakiaji wa programu za eBPF kwenye kernel.

Ni muhimu kukumbuka kuwa wakati wa kuchambua shambulio mbadala linalohusisha utumiaji wa FUSE badala ya bind-mound kuweka saraka kubwa, watafiti waligundua hatari nyingine (CVE-2021-33910) inayoathiri meneja wa mfumo. Ilibadilika kuwa wakati wa kujaribu kuweka saraka na saizi ya njia inayozidi 8 MB kupitia FUSE, mchakato wa uanzishaji wa udhibiti (PID1) hutoka kwa kumbukumbu ya stack na shambulio, ambayo huweka mfumo katika hali ya "hofu".

Shida ni kwamba systemd inafuatilia na kuchanganua yaliyomo kwenye /proc/self/mountinfo, na kusindika kila sehemu ya mlima katika unit_name_path_escape() kazi, ambayo hufanya strdupa() operesheni ambayo huweka data kwenye stack badala ya kumbukumbu iliyotengwa kwa nguvu. . Kwa kuwa upeo wa ukubwa wa rafu ni mdogo kupitia RLIMIT_STACK, kuchakata njia kubwa sana hadi sehemu ya kupachika husababisha mchakato wa PID1 kuvurugika na kusimamisha mfumo. Kwa shambulio, unaweza kutumia moduli rahisi zaidi ya FUSE pamoja na kutumia saraka iliyo na kiota kama sehemu ya kupachika, saizi ya njia ambayo inazidi MB 8.

Shida imekuwa ikionekana tangu systemd 220 (Aprili 2015), tayari imesasishwa kwenye hazina kuu ya mfumo na kusasishwa kwa usambazaji (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Hasa, katika toleo la systemd 248 unyonyaji haufanyi kazi kwa sababu ya mdudu kwenye nambari ya mfumo ambayo husababisha uchakataji wa /proc/self/mountinfo. Inafurahisha pia kwamba mnamo 2018, hali kama hiyo iliibuka na wakati wa kujaribu kuandika unyonyaji kwa hatari ya CVE-2018-14634 kwenye kernel ya Linux, watafiti wa Qualys waligundua udhaifu mkuu tatu katika systemd.

Chanzo: opennet.ru

Kuongeza maoni