Արմատային խոցելիություն 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 միլիոն անվճար ինոդ: Exploit-ն աշխատում է՝ զանգահարելով mkdir()՝ ստեղծելու մոտ մեկ միլիոն ենթագրքերից բաղկացած հիերարխիա՝ 1 ԳԲ-ից ավելի ֆայլի ուղու չափը հասնելու համար: Այս գրացուցակը տեղադրվում է bind-mount-ի միջոցով առանձին օգտվողի անվանատարածքում, որից հետո գործարկվում է rmdir() ֆունկցիան այն հեռացնելու համար: Զուգահեռաբար ստեղծվում է թեմա, որը բեռնում է փոքր eBPF ծրագիր, որն արգելափակվում է փուլում eBPF կեղծ կոդը ստուգելուց հետո, բայց մինչ դրա JIT կազմումը։

Չարտոնյալ օգտագործողի անվանատարածքում բացվում է /proc/self/mountinfo ֆայլը և կարդացվում է bind-mounted գրացուցակի երկար ուղու անունը, որի արդյունքում «//deleted» տողը գրվում է տարածքում նախքան բուֆերի մեկնարկը: Գիծը գրելու դիրքն ընտրված է այնպես, որ այն վերագրի հրահանգը արդեն փորձարկված, բայց դեռ չկազմված eBPF ծրագրում։

Հաջորդը, eBPF ծրագրի մակարդակում, բուֆերից դուրս չվերահսկվող գրությունը վերածվում է միջուկի այլ կառույցներում կարդալու և գրելու վերահսկվող ունակության՝ btf և map_push_elem կառուցվածքների մանիպուլյացիայի միջոցով: Արդյունքում, exploit-ը որոշում է modprobe_path[] բուֆերի գտնվելու վայրը միջուկի հիշողության մեջ և վերագրում է «/sbin/modprobe» ուղին դրա մեջ, որը թույլ է տալիս սկսել գործարկվող ցանկացած գործարկվող ֆայլ՝ արմատային իրավունքներով, եթե առաջանա: request_module() զանգը, որն իրականացվում է, օրինակ, netlink վարդակից ստեղծելիս։

Հետազոտողները առաջարկում են մի քանի լուծումներ, որոնք արդյունավետ են միայն կոնկրետ շահագործման համար, բայց չեն վերացնում խնդիրը: Խորհուրդ է տրվում «/proc/sys/kernel/unprivileged_userns_clone»-ը դնել 0-ի՝ առանձին օգտագործողի ID անվանման տարածքում մոնտաժվող դիրեկտորիաներն անջատելու համար, իսկ «/proc/sys/kernel/unprivileged_bpf_disabled»՝ 1՝ eBPF ծրագրերի միջուկ բեռնումն անջատելու համար:

Հատկանշական է, որ այլընտրանքային հարձակումը վերլուծելիս, որը ներառում է FUSE մեխանիզմի օգտագործումը, bind-mound-ի փոխարեն մեծ գրացուցակ տեղադրելու համար, հետազոտողները հանդիպեցին մեկ այլ խոցելիության (CVE-2021-33910), որն ազդում էր համակարգային համակարգի կառավարչի վրա: Պարզվեց, որ FUSE-ի միջոցով 8 ՄԲ-ը գերազանցող ուղու չափով գրացուցակ տեղադրելու փորձի ժամանակ կառավարման սկզբնավորման գործընթացը (PID1) սպառվում է կուտակային հիշողությունից և խափանում է, ինչը համակարգը դնում է «խուճապի» մեջ:

Խնդիրն այն է, որ systemd-ը հետևում և վերլուծում է /proc/self/mountinfo-ի բովանդակությունը և մշակում է unit_name_path_escape() ֆունկցիայի յուրաքանչյուր մոնտաժային կետ, որն իրականացնում է strdupa() գործողություն, որը տվյալները տեղադրում է կույտի վրա, այլ ոչ թե դինամիկ տեղաբաշխված հիշողության մեջ: . Քանի որ կույտի առավելագույն չափը սահմանափակված է RLIMIT_STACK-ի միջոցով, չափազանց մեծ ճանապարհի մշակումը դեպի ամրացման կետ հանգեցնում է PID1 գործընթացի խափանման և համակարգի դադարեցմանը: Հարձակման համար դուք կարող եք օգտագործել ամենապարզ FUSE մոդուլը` որպես մոնտաժման կետ օգտագործելու բարձր ներդիր գրացուցակ, որի ուղու չափը գերազանցում է 8 ՄԲ-ը:

Խնդիրն ի հայտ է եկել systemd 220-ից (2015թ. ապրիլ), արդեն ֆիքսվել է հիմնական systemd պահոցում և ամրագրված է բաշխումների մեջ (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch): Հատկանշական է, որ systemd թողարկում 248-ում շահագործումը չի աշխատում systemd կոդի սխալի պատճառով, որը հանգեցնում է /proc/self/mountinfo-ի մշակման ձախողմանը: Հետաքրքիր է նաև, որ 2018-ին նմանատիպ իրավիճակ ստեղծվեց, և երբ փորձում էին Linux-ի միջուկում CVE-2018-14634 խոցելիության համար շահագործում գրել, Qualys-ի հետազոտողները բախվեցին համակարգում երեք կարևոր խոցելիության:

Source: opennet.ru

Добавить комментарий