Կրիտիկական խոցելիություն PolKit-ում, որը թույլ է տալիս արմատային մուտք գործել Linux բաշխումների մեծ մասում

Qualys-ը հայտնաբերել է խոցելիություն (CVE-2021-4034) Polkit (նախկին PolicyKit) համակարգի բաղադրիչում, որն օգտագործվում է բաշխումների մեջ՝ թույլ չտալու արտոնյալ օգտվողներին կատարել գործողություններ, որոնք պահանջում են մուտքի բարձր իրավունքներ: Խոցելիությունը թույլ է տալիս ոչ արտոնյալ տեղական օգտագործողին մեծացնել իրենց արտոնությունները՝ արմատախիլ անելու և համակարգի վրա լիակատար վերահսկողություն ձեռք բերելու համար: Խնդիրը ստացել է PwnKit կոդային անվանումը և աչքի է ընկնում աշխատանքային շահագործման համար, որն աշխատում է լռելյայն կազմաձևում Linux բաշխումների մեծ մասում:

Խնդիրն առկա է PolKit-ի pkexec կոմունալում, որը գալիս է SUID արմատային դրոշակով և նախատեսված է այլ օգտվողի արտոնություններով հրամաններ գործարկելու համար՝ ըստ սահմանված PolKit կանոնների: Հրամանի տողի արգումենտների սխալ մշակման պատճառով, որոնք փոխանցվել են pkexec-ին, ոչ արտոնյալ օգտվողը կարող է շրջանցել նույնականացումը և գործարկել իր կոդը որպես root՝ անկախ մուտքի սահմանված կանոններից: Հարձակման համար կարևոր չէ, թե ինչ կարգավորումներ և սահմանափակումներ են նշված PolKit-ում, բավական է, որ SUID արմատային հատկանիշը սահմանվի գործարկվող ֆայլի համար pkexec կոմունալով:

Pkexec-ը չի ստուգում գործընթաց սկսելիս փոխանցված հրամանի տող արգումենտի հաշվարկի վավերականությունը: pkexec-ի մշակողները ենթադրում էին, որ argv զանգվածի առաջին մուտքը միշտ պարունակում է պրոցեսի անունը (pkexec), իսկ երկրորդը կամ NULL արժեք կամ pkexec-ի միջոցով գործարկված հրամանի անվանումը։ Քանի որ արգումենտի քանակը չի ստուգվել զանգվածի իրական բովանդակության հետ և ենթադրվում էր, որ այն միշտ 1-ից մեծ է, եթե գործընթացը փոխանցվի դատարկ argv զանգվածով, ինչպես թույլ է տալիս Linux execve ֆունկցիան, pkexec-ը կվերաբերի NULL-ին որպես առաջին արգումենտ ( գործընթացի անվանումը) և հաջորդը՝ որպես բուֆերային հիշողությունից դուրս, ինչպես զանգվածի հետագա բովանդակությունը։ |———+———+——+————|———+———+——+————| | արգվ[0] | արգվ[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV «ծրագիր» «-option» NULL «արժեք» «PATH=անուն» NULL

Խնդիրն այն է, որ argv զանգվածից հետո հիշողության մեջ կա envp զանգված, որը պարունակում է շրջակա միջավայրի փոփոխականներ։ Այսպիսով, եթե argv զանգվածը դատարկ է, pkexec-ը տվյալներ է հանում բարձր արտոնություններով գործարկվող հրամանի մասին զանգվածի առաջին տարրից շրջակա միջավայրի փոփոխականներով (argv[1] դարձել է envp[0]-ի նույնական), որի բովանդակությունը կարելի է կառավարել։ հարձակվողի կողմից։

Ստանալով argv[1] արժեքը՝ pkexec-ը փորձում է, հաշվի առնելով PATH-ի ֆայլի ուղիները, որոշել գործարկվող ֆայլի ամբողջական ուղին և ցուցիչ է գրում տողի վրա՝ ամբողջ ուղով դեպի argv[1], որը հանգեցնում է շրջակա միջավայրի առաջին փոփոխականի արժեքի վերագրանցմանը, քանի որ argv[1]-ը նույնական է envp[0]-ին: Շահարկելով առաջին միջավայրի փոփոխականի անունը՝ հարձակվողը կարող է փոխարինել pkexec-ում մեկ այլ միջավայրի փոփոխական, օրինակ՝ փոխարինել «LD_PRELOAD» միջավայրի փոփոխականը, որն անթույլատրելի է suid ծրագրերում, և կազմակերպել, որ իրենց ընդհանուր գրադարանը բեռնվի գրադարանում: գործընթաց։

Աշխատանքային շահագործումը ներառում է GCONV_PATH փոփոխականի փոխարինում, որն օգտագործվում է սիմվոլների տրանսկոդավորման գրադարան տանող ճանապարհը որոշելու համար, որը դինամիկ բեռնված է g_printerr() ֆունկցիան կանչելիս, որի կոդը օգտագործում է iconv_open(): GCONV_PATH-ում ուղին վերասահմանելով՝ հարձակվողը կարող է համոզվել, որ բեռնված է ոչ թե ստանդարտ iconv գրադարանը, այլ իր սեփական գրադարանը, որից մշակողները կկատարվեն, երբ սխալի հաղորդագրությունը ցուցադրվի այն փուլում, երբ pkexec-ը դեռ աշխատում է: արմատային իրավունքները և նախքան գործարկման թույլտվությունները ստուգվում են:

Նշվում է, որ չնայած այն հանգամանքին, որ խնդիրը պայմանավորված է հիշողության խաթարմամբ, այն կարող է հուսալիորեն և կրկնակի շահագործվել՝ անկախ օգտագործվող ապարատային ճարտարապետությունից: Պատրաստված շահագործումը հաջողությամբ փորձարկվել է Ubuntu-ում, Debian-ում, Fedora-ում և CentOS-ում, սակայն կարող է օգտագործվել նաև այլ բաշխումների վրա: Բնօրինակ շահագործումը դեռևս հասանելի չէ հանրությանը, ինչը ցույց է տալիս, որ այն աննշան է և կարող է հեշտությամբ վերստեղծվել այլ հետազոտողների կողմից, ուստի կարևոր է հնարավորինս շուտ տեղադրել կարկատել թարմացումը բազմաբնակարան օգտատերերի համակարգերում: Polkit-ը հասանելի է նաև BSD համակարգերի և Solaris-ի համար, սակայն չի ուսումնասիրվել դրանց օգտագործման համար: Հայտնի է, որ հարձակումը չի կարող իրականացվել OpenBSD-ի վրա, քանի որ OpenBSD միջուկը թույլ չի տալիս execve() կանչելիս զրոյական argc արժեք փոխանցել:

Խնդիրն առկա է 2009 թվականի մայիսից՝ pkexec հրամանի ավելացումից հետո։ PolKit-ի խոցելիության ուղղումը ներկայումս հասանելի է որպես կարկատել (կարկատելի թողարկում չի թողարկվել), բայց քանի որ բաշխման մշակողները նախապես տեղեկացվել են խնդրի մասին, բաշխումների մեծ մասը հրապարակել է թարմացումը խոցելիության մասին տեղեկատվության բացահայտման հետ միաժամանակ: Խնդիրը շտկված է RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux և Manjaro-ում: Որպես խոցելիությունը արգելափակելու ժամանակավոր միջոց, դուք կարող եք հեռացնել SUID արմատային դրոշակը /usr/bin/pkeexec ծրագրից («chmod 0755 /usr/bin/pkeexec»):



Source: opennet.ru

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