Բարև բոլորին: Մենք ակտիվորեն լծվում ենք աշխատանքին և արդեն պատրաստում ենք շատ հզոր մեկնարկներ հունվարին։ Ի թիվս այլ բաների, հայտարարվել է սիրելի դասընթացի նոր ընդունում . Մեկնարկին ընդառաջ մենք ավանդաբար կիսում ենք օգտակար նյութերի թարգմանությունը:

Ֆայլի թույլտվություններն առաջարկում են ապահով այլընտրանք SUID գործարկվողներին, բայց սկզբում կարող է մի փոքր շփոթեցնող թվալ:
Մենք բոլորս գիտենք, որ երկուական ֆայլերը են . Բարեբախտաբար, եթե ձեր դիմումը պահանջում է որոշ սահմանափակ արտոնություններ, կա ավելի արդյունավետ միջոց, որը կոչվում է .
Ես ձեզ որոշ ժամանակ կխնայեմ, եթե ցանկանում եք խուսափել վերը նշված հոդվածը մանրամասն կարդալուց: Հիմնականում, ֆայլի թույլտվությունները թույլ են տալիս գործընթացներին, որոնք աշխատում են որպես root, և, հետևաբար, թույլտվություն ունեն անելու բաներ, պահպանել որոշակի հնարավորություններ, որոնք սահմանափակ են: , երբ նրանք հրաժարվում են արտոնություններից և ղեկավարվում են ոչ արտոնյալ օգտվողի կողմից: Սա նշանակում է, որ եթե հարձակվողին հաջողվի խախտել գործընթացը՝ օգտագործելով բուֆերային հոսք կամ այլ շահագործում, նրանք չեն կարողանա օգտագործել որևէ այլ բան, քան որոշակի նվազագույն արտոնություններից, որոնք իրականում անհրաժեշտ են գործընթացին:
Թույլտվությունները հիանալի են ծառայությունների համար, որոնք սովորաբար միշտ աշխատում են որպես root, բայց ի՞նչ կասեք հրամանի տողի ծրագրաշարի մասին: Բարեբախտաբար, սա նույնպես աջակցվում է, եթե տեղադրված են համապատասխան ծրագրաշարերը: Եթե օգտագործում եք Ubuntuօրինակ, ձեզ անհրաժեշտ կլինի փաթեթ libcap2-bin. Ձեզ անհրաժեշտ կլինի նաև գործարկել ոչ արխայիկ միջուկ (սկսած տարբերակից 2.6.24).
Այս հատկանիշները թույլ են տալիս թույլտվությունները կապված լինել գործարկվող ֆայլերի հետ՝ SUID բիթը սահմանելու նման ձևով, բայց միայն թույլտվությունների որոշակի փաթեթի համար: Կոմունալ setcap օգտագործվում է ֆայլից թույլտվություններ ավելացնելու և հեռացնելու համար:
Առաջին քայլը ձեր ուզած թույլտվությունների ընտրությունն է: Այս հոդվածի համար ես ենթադրում եմ, որ կա ցանցի ախտորոշման գործիք, որը կոչվում է tracewalk, որը պետք է կարողանա օգտագործել . Սա սովորաբար պահանջում է, որ հավելվածը գործարկվի որպես արմատ, բայց դիտելիս պարզվում է, որ միայն թույլտվություն է պահանջվում CAP_NET_RAW.
Ենթադրելով, որ դուք գտնվում եք այն գրացուցակում, որտեղ գտնվում է երկուականը tracewalk, այս թույլտվությունը կարող եք ավելացնել հետևյալ կերպ.
sudo setcap cap_net_raw=eip tracewalk Առայժմ անտեսեք վերջածանցը: =eip թույլտվության համար մի երկու վայրկյանից կպատմեմ այդ մասին։ Նկատի ունեցեք, որ թույլտվության անունը փոքրատառ է: Այժմ դուք կարող եք ստուգել, թե արդյոք ճիշտ եք սահմանել թույլտվությունները՝
setcap -v cap_new_raw=eip tracewalkԿամ կարող եք թվարկել տվյալ գործարկվող նյութի համար սահմանված բոլոր թույլտվությունները.
getcap tracewalk
Հղման համար կարող եք նաև հեռացնել բոլոր թույլտվությունները գործարկվող ֆայլից հետևյալով.
setcap -r tracewalkԱյս պահին դուք պետք է կարողանաք գործարկել գործարկվողը որպես ոչ արտոնյալ օգտվող, և այն պետք է կարողանա կառավարել չմշակված վարդակներ, բայց չունենալ որևէ այլ արտոնություն, որն ունի արմատային օգտվողը:
Այսպիսով, ի՞նչ է նշանակում այս տարօրինակ վերջածանցը: =eip? Սա կպահանջի թույլտվությունների բնույթի մի փոքր հասկանալ: Յուրաքանչյուր գործընթաց ունի թույլտվությունների երեք հավաքածու. արդյունավետ, ժառանգական և թույլատրելի:
- Արդյունավետ Թույլտվություններն այն են, որոնք որոշում են, թե իրականում ինչ կարող է անել գործընթացը: Օրինակ, այն չի կարող գործ ունենալ հումքի վարդակների հետ, եթե
CAP_NET_RAWարդյունավետ հավաքածուի մեջ չէ: - Հասանելի (թույլատրվում է) Թույլտվություններն այն թույլտվություններն են, որոնք թույլատրվում է ունենալ գործընթացին, եթե այն պահանջի համապատասխան զանգով: Նրանք կանխում են գործընթացն իրականում որևէ բան անելուց, եթե այն հատուկ գրված չէ նշված թույլտվությունը պահանջելու համար: Սա թույլ է տալիս գրել գործընթացներ՝ արդյունավետ փաթեթին կարևոր թույլտվություններ ավելացնելու համար միայն այն ժամանակահատվածի համար, երբ դրանք իրականում անհրաժեշտ են:
- Ժառանգական թույլտվություններն այն թույլտվություններն են, որոնք կարող են ժառանգվել ծնված երեխայի գործընթացի թույլատրված փաթեթում: Վիրահատության ընթացքում
fork()կամclone()Երեխայի գործընթացին միշտ տրվում է մայր գործընթացի թույլտվությունների պատճենը, քանի որ այդ պահին այն դեռ աշխատում է նույն գործարկիչը: Ժառանգական հավաքածուն օգտագործվում է, երբexec()(կամ համարժեք) կոչվում է գործարկվող ֆայլը մեկ այլով փոխարինելու համար: Այս փուլում գործընթացի հասանելի հավաքածուն դիմակավորված է ժառանգված բազմությամբ՝ ձեռք բերելու հասանելի հավաքածուն, որը կօգտագործվի նոր գործընթացի համար:
Այսպիսով, օգտակար setcap թույլ է տալիս մեզ ինքնուրույն ավելացնել այս երեք հավաքածուների թույլտվությունները տվյալ գործադիրի համար: Նկատի ունեցեք, որ խմբերի իմաստը մի փոքր այլ կերպ է մեկնաբանվում ֆայլի թույլտվությունների համար.
- Առկա է ֆայլի թույլտվություններն այն թույլտվություններն են, որոնք միշտ հասանելի են գործարկվող ֆայլին, նույնիսկ եթե այն կանչող մայր պրոցեսը չուներ դրանք: Դրանք նախկինում կոչվում էին «պարտադիր» թույլտվություններ։
- Ժառանգված ֆայլի թույլտվությունները սահմանում են լրացուցիչ դիմակ, որը կարող է օգտագործվել նաև զանգի գործընթացի հավաքածուից թույլտվությունները հեռացնելու համար: Նրանք կիրառվում են ի լրումն զանգի գործընթացի ժառանգական հավաքածուի, ուստի թույլտվությունը ժառանգվում է միայն այն դեպքում, եթե այն գոյություն ունի երկու խմբերում:
- Արդյունավետ ֆայլի թույլտվությունները իրականում ընդամենը մեկ բիթ են, ոչ թե մի շարք, և եթե այն սահմանված է, նշանակում է, որ ամբողջ հասանելի հավաքածուն պատճենվում է նաև նոր գործընթացի արդյունավետ հավաքածուին: Սա կարող է օգտագործվել թույլտվություններ ավելացնելու համար այն գործընթացներին, որոնք հատուկ գրված չեն դրանք պահանջելու համար: Քանի որ այն մեկ բիթ է, եթե այն սահմանել եք որևէ բանաձևի համար, այն պետք է սահմանվի բոլոր բանաձեւերի համար: Դուք կարող եք դա համարել որպես ժառանգական բիթ, քանի որ այն օգտագործվում է թույլտվությունները միացնելու համար այն հավելվածների համար, որոնք չեն աջակցում դրանք:
միջոցով թույլտվությունները նշելիս setcap երեք տառ e, i и p վերաբերում են արդյունավետ, ժառանգական և հասանելի սահմանում է համապատասխանաբար: Այսպիսով, ավելի վաղ հստակեցում.
sudo setcap cap_net_raw=eip tracewalk … ցույց է տալիս, որ բանաձեւը CAP_NET_RAW պետք է ավելացվի հասանելի և ժառանգելի բազմություններին, և որ արդյունավետ բիթը նույնպես պետք է սահմանվի: Սա կփոխարինի ֆայլի վրա նախկինում սահմանված թույլտվություններին: Միանգամից մի քանի թույլտվություններ սահմանելու համար օգտագործեք ստորակետերով բաժանված ցուցակ.
sudo setcap cap_net_admin,cap_net_raw=eip tracewalkքննարկում է այս ամենն ավելի մանրամասն, բայց հուսով ենք, որ այս գրառումը մի փոքր ապակողմնորոշել է այն, ինչ կատարվում է: Մնացել են նշել մի քանի նախազգուշացումներ և հնարքներ:
Նախ, ֆայլի հնարավորությունները չեն աշխատում symlinks-ի հետ, դուք պետք է դրանք կիրառեք հենց երկուականի վրա (այսինքն՝ symlink թիրախին):
Երկրորդ, նրանք չեն աշխատում մեկնաբանված սցենարներով։ Օրինակ, եթե ունեք Python սկրիպտ, որին ցանկանում եք թույլտվություն տալ, դուք պետք է այն վերագրեք հենց Python թարգմանչին։ Ակնհայտ է, որ սա պոտենցիալ անվտանգության խնդիր է, քանի որ այդ դեպքում այդ թարգմանիչով կատարված բոլոր սկրիպտները կունենան նշված թույլտվությունը, թեև դա դեռ զգալիորեն ավելի լավ է, քան այն SUID դարձնելը: Ամենատարածված լուծումը, թվում է, C-ով կամ նմանատիպ առանձին գործարկիչ գրելն է, որը կարող է կատարել պահանջվող գործողությունները և զանգահարել այն սկրիպտից: Սա նման է Wireshark-ի կողմից օգտագործվող մոտեցմանը, որն օգտագործում է երկուական ֆայլ /usr/bin/dumpcap արտոնյալ գործողություններ իրականացնելու համար.
$ getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip Երրորդ, ֆայլի թույլտվությունները անջատված են, եթե դուք օգտագործում եք շրջակա միջավայրի փոփոխական LD_LIBRARY_PATH ակնհայտ անվտանգության նկատառումներով(1). Նույնը վերաբերում է LD_PRELOAD, որքան գիտեմ։
1. Քանի որ հարձակվողը կարող է ակնհայտորեն փոխարինել ստանդարտ գրադարաններից մեկը և օգտագործել LD_LIBRARY_PATH, ստիպել իր գրադարանին կանչել նախընտրելով համակարգայինը, և այդպիսով ունենալ իր կամայական ծածկագիրը՝ նույն արտոնություններով, ինչ կանչող հավելվածը։
Այսքանը: Դասընթացի ծրագրի մասին լրացուցիչ մանրամասներ կարող եք գտնել այստեղ
Source: www.habr.com
