Linux-ի միջուկի խոցելիություն, որը կարող է խաթարել միայն կարդալու ֆայլերը

Linux-ի միջուկում (CVE-2022-0847) հայտնաբերվել է խոցելիություն, որը թույլ է տալիս էջի քեշի բովանդակությունը վերագրանցել ցանկացած ֆայլի համար, ներառյալ միայն կարդալու ռեժիմում, բացված O_RDONLY դրոշով կամ տեղակայված ֆայլային համակարգերում: տեղադրված է միայն կարդալու ռեժիմում: Գործնական առումով, խոցելիությունը կարող է օգտագործվել կամայական գործընթացների մեջ ծածկագիրը ներարկելու կամ բացված ֆայլերում կոռումպացված տվյալները: Օրինակ, դուք կարող եք փոխել authorized_keys ֆայլի բովանդակությունը sshd գործընթացի համար: Փորձարկման համար հասանելի է շահագործման նախատիպը:

Խնդիրը ստացել է Dirty Pipe կոդային անվանումը, որը նման է 2016 թվականին հայտնաբերված Dirty COW կրիտիկական խոցելիությանը: Նշվում է, որ վտանգի մակարդակի առումով Dirty Pipe-ը նույն մակարդակի վրա է, ինչ Dirty COW-ը, բայց շատ ավելի հեշտ է շահագործել: Խոցելիությունը հայտնաբերվել է ցանցի միջոցով ներբեռնվող ֆայլերի պարբերական վնասման վերաբերյալ բողոքների վերլուծության ժամանակ՝ լոգարիթմական սերվերից սեղմված արխիվները ներբեռնող համակարգում (37 կոռուպցիա 3 ամսվա ընթացքում բեռնված համակարգում), որի պատրաստման համար օգտագործվել է splice() օպերացիան։ և անանուն խողովակներ:

Խոցելիությունը հայտնվում է սկսած Linux միջուկից 5.8, որը թողարկվել է 2020 թվականի օգոստոսին, այսինքն. առկա է Debian 11-ում, բայց չի ազդում Ubuntu 20.04 LTS-ի բազային միջուկի վրա: RHEL 8.x և openSUSE/SUSE 15 միջուկներն ի սկզբանե հիմնված են հին ճյուղերի վրա, բայց հնարավոր է, որ խնդիր առաջացնող փոփոխությունը հետնախորագրված լինի դրանց մեջ (դեռևս ճշգրիտ տվյալներ չկան): Դուք կարող եք հետևել փաթեթների թարմացումների հրապարակմանը բաշխումներում այս էջերում՝ Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux: Խոցելիության ուղղումն առաջարկվել է 5.16.11, 5.15.25 և 5.10.102 թողարկումներում: Ֆիքսը ներառված է նաև Android հարթակում օգտագործվող միջուկում:

Խոցելիությունը պայմանավորված է copy_page_to_iter_pipe() և push_pipe() ֆունկցիաների կոդի «buf->flags» արժեքի սկզբնավորման բացակայությամբ, չնայած այն հանգամանքին, որ հիշողությունը չի մաքրվում կառուցվածքը հատկացնելիս և որոշակի մանիպուլյացիաների ժամանակ: անանուն խողովակներ, արժեք մեկ այլ գործողությունից: Օգտագործելով այս հատկությունը, տեղական ոչ արտոնյալ օգտվողը կարող է հասնել դրոշի PIPE_BUF_FLAG_CAN_MERGE արժեքի տեսքին, որը թույլ է տալիս կազմակերպել տվյալների վերագրանցումը էջի քեշում՝ պարզապես նոր տվյալներ գրելով հատուկ պատրաստված անանուն խողովակի վրա:

Հարձակման համար թիրախային ֆայլը պետք է ընթեռնելի լինի, և քանի որ մուտքի իրավունքները չեն ստուգվում խողովակում գրելիս, էջի քեշի փոխարինումը կարող է կատարվել նաև այն ֆայլերի համար, որոնք տեղակայված են միայն կարդալու համար տեղադրված միջնորմներում (օրինակ՝ c CD- ֆայլերի համար ROM): Էջի քեշում տեղեկատվությունը փոխարինելուց հետո ֆայլից տվյալներ կարդալիս գործընթացը կստանա ոչ թե իրական տվյալները, այլ փոխարինված տվյալները։

Գործողությունը հանգում է նրան, որ ստեղծվի անանուն ալիք և լրացվի այն կամայական տվյալներով, որպեսզի համոզվի, որ PIPE_BUF_FLAG_CAN_MERGE դրոշակը դրված է դրա հետ կապված բոլոր օղակային կառույցներում: Հաջորդը, տվյալները կարդացվում են ալիքից, բայց դրոշը մնում է սահմանված pipe_buffer կառուցվածքի բոլոր ատյաններում pipe_inode_info օղակաձև կառուցվածքներում: Այնուհետև զանգ է կատարվում դեպի splice()՝ նպատակային ֆայլից տվյալները անանուն խողովակի մեջ կարդալու համար՝ սկսած ցանկալի օֆսեթից: Այս անանուն խողովակի վրա տվյալներ գրելիս, PIPE_BUF_FLAG_CAN_MERGE դրոշակի առկայության պատճառով, էջի քեշի տվյալները կվերագրվեն՝ pipe_buffer կառուցվածքի նոր օրինակ ստեղծելու փոխարեն:

Source: opennet.ru

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