Di kernel Linux-ê de qelsiya root û redkirina karûbarê di systemd de

Lekolînwanên ewlehiyê ji Qualys hûrguliyên du qelsiyên ku bandorê li kernel Linux û rêveberê pergala pergalê dikin eşkere kirin. Zelalbûnek di kernelê de (CVE-2021-33909) dihêle bikarhênerek herêmî bi manîpulekirina pelrêtokên pir hêlînkirî ve bi mafên root re pêkanîna kodê bi dest bixe.

Xetereya qelsbûnê ji ber vê yekê zêde dibe ku lêkolîner karîbûn kelûmelên xebatê yên ku li ser Ubuntu 20.04/20.10/21.04, Debian 11 û Fedora 34 di veavakirina xwerû de dixebitin amade bikin. Tê destnîşan kirin ku dabeşên din nehatine ceribandin, lê ji hêla teorîkî ve jî ji pirsgirêkê re têkildar in û dikarin werin êrîş kirin. Koda bêkêmasî ya îstîsmaran tê soz kirin ku piştî ku pirsgirêk li her deverê were rakirin were weşandin, lê heya niha tenê prototîpek fonksiyonek tixûbdar heye, ku dibe sedema têkçûna pergalê. Pirsgirêk ji Tîrmeha 2014-an vir ve heye û ji 3.16-an pê ve li ser berdanên kernelê bandor dike. Çareserkirina qelsbûnê bi civakê re hate hevrêz kirin û di 19-ê Tîrmehê de di kernelê de hate pejirandin. Belavokên sereke jixwe nûvekirinên pakêtên kernel ên xwe (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch) çêkirine.

Zelalbûn ji ber nebûna kontrolkirina encama veguheztina size_t ber bi int ve berya pêkanîna operasyonan di koda seq_file de ye, ku pelan ji rêzek tomaran diafirîne. Dema ku sazûmanek pelrêça pir hêlîn çêdibe, çêdibe û jêbirin dibe ku (mezinahiya rê ji 1 GB mezintir e) çênebe ku neyê kontrol kirin. Wekî encamek, êrîşkarek dikare rêzek 10-byte "// jêbirin" bi dest bixe ku bi rengek "-2 GB - 10 bytes" hatî nivîsandin, ku li devera ku yekser berî tamponê hatî veqetandin destnîşan dike.

Ji bo xebitandina amadekirî 5 GB bîranîn û 1 mîlyon inode belaş hewce dike ku bixebite. Kêmasî bi gazîkirina mkdir() dixebite da ku hiyerarşiyek bi qasî mîlyon binkrektorî biafirîne da ku mezinahiya riya pelê ya ku ji 1 GB zêdetir e bigihîje. Ev pelrêça bi rêya bind-mount di nav cîhek bikarhênerek cihêreng de tê danîn, piştî ku fonksiyona rmdir() tê xebitandin da ku wê jê bibe. Di paralelê de, mijarek tê afirandin ku bernameyek piçûk eBPF bar dike, ku di qonaxê de piştî kontrolkirina pseudokdê eBPF, lê berî berhevkirina JIT-ê tê asteng kirin.

Di nav cîhê bikarhênerê yê bêdestûr de, pelê /proc/self/mountinfo tê vekirin û navê riya dirêj a pelrêça bind-siwarkirî tê xwendin, di encamê de rêzika "// jêbirin" li herêmê berî destpêkirina tamponê tê nivîsandin. Cihê ji bo nivîsandina rêzê tê hilbijartin da ku ew rêwerzê di bernameya eBPF ya ku jixwe hatî ceribandin lê hêj nehatiye berhev kirin de binivîsîne.

Dûv re, di asta bernameya eBPF de, nivîsandina derveyî-bufferê ya nekontrolkirî di nav manîpulekirina strukturên btf û map_push_elem ve vediguhere şiyana kontrolkirî ya xwendin û nivîsandina strukturên din ên kernelê. Wekî encamek, îstismar cîhê tampona modprobe_path[] di bîra kernel de destnîşan dike û riya "/sbin/modprobe" tê de dinivîse, ku destûrê dide te ku hûn di bûyerek de dest bi destpêkirina pelek îcrakar bi mafên root bikin. banga request_module() ya ku, wek nimûne, dema çêkirina soketa netlinkê tê darve kirin.

Lekolînwan gelek rêgiran peyda dikin ku tenê ji bo karek taybetî bi bandor in, lê pirsgirêk bixwe ji holê ranakin. Tê pêşniyar kirin ku hûn "/proc/sys/kernel/unprivileged_userns_clone" li ser 0-ê destnîşan bikin da ku pelrêçikên hilanînê di nav cîhek nasnameya bikarhênerê ya cihê de neçalak bikin, û "/proc/sys/kernel/unprivileged_bpf_disabled" li ser 1-ê ji bo neçalakkirina barkirina bernameyên eBPF di kernelê de.

Hêjayî balkişandinê ye ku dema analîzkirina êrîşek alternatîf a ku tê de karanîna mekanîzmaya FUSE-ê li şûna girêdan-mound-ê ji bo danîna pelrêçek mezin vedihewîne, lêkolîner rastî xetereyek din (CVE-2021-33910) hatin ku bandorê li rêveberê pergala pergalê dike. Derket holê ku dema ku meriv hewl dide ku pelrêçekek bi mezinahiya rêyek ku ji 8 MB-ê zêdetir e bi FUSE-ê ve girêbide, pêvajoya destpêkirina kontrolê (PID1) ji bîra stackê diqede û têk diçe, ku pergalê dixe rewşek "panîkê".

Pirsgirêk ev e ku systemd naveroka /proc/self/mountinfo dişopîne û pars dike, û her nuqteya mountê di fonksiyona unit_name_path_escape() de pêvajo dike, ku karek strdupa() pêk tîne ku daneyan li ser stikê li şûna bîranîna dînamîkî veqetandî pêk tîne. . Ji ber ku mezinahiya stûnê ya herî zêde bi RLIMIT_STACK ve sînorkirî ye, pêvajokirina rêyek pir mezin berbi xala çiyê dibe sedem ku pêvajoya PID1 têk bibe û pergalê rawestîne. Ji bo êrîşekê, hûn dikarin modula FUSE ya herî hêsan bi hev re bi karanîna pelrêçekek pir hêlînkirî wekî xala mountê bikar bînin, mezinahiya rê ya ku ji 8 MB derbas dibe.

Pirsgirêk ji systemd 220 (Nîsana 2015) derketiye holê, jixwe di depoya pergalê ya sereke de hatî rast kirin û di belavkirinan de (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch) hatî rast kirin. Nemaze, di serbestberdana systemd 248 de îstismar ji ber xeletiyek di koda pergalê de ku dibe sedem ku pêvajoya /proc/self/mountinfo têk biçe kar nake. Di heman demê de balkêş e ku di sala 2018-an de, rewşek bi vî rengî derket û dema ku hewl dida ku ji bo qelsiya CVE-2018-14634 di kernel Linux-ê de îstismarek binivîsîne, lêkolînerên Qualys di pergalê de rastî sê qelsiyên krîtîk hatin.

Source: opennet.ru

Add a comment