Sveiki visi. Aktyviai kimbame į darbus ir jau ruošiame daug galingų startų sausio mėnesį. Be kita ko, buvo paskelbta registracija į naują visų mėgstamų kursų srautą.
Failų leidimai yra saugi alternatyva SUID vykdomiesiems failams, tačiau iš pradžių gali atrodyti šiek tiek painu.
Visi žinome, kad dvejetainiai
Sutaupysiu šiek tiek laiko, jei nenorėsite išsamiai skaityti aukščiau esančio straipsnio: Iš esmės failų teisės leidžia procesus, kurie veikia kaip root ir todėl jiems leidžiama daryti ką nors, kad išlaikytų tam tikras galimybes, ribotas.
Leidimai puikiai tinka paslaugoms, kurios paprastai visada paleidžiamos kaip root, bet kaip dėl komandų eilutės paslaugų? Laimei, tai taip pat palaikoma, jei esate įdiegę tinkamas paslaugas. Pavyzdžiui, jei naudojate Ubuntu, jums reikės paketo libcap2-bin
. Taip pat turėsite paleisti nearchajišką branduolį (iš versijos 2.6.24).
Šios funkcijos leidžia susieti teises su vykdomaisiais failais, panašiai kaip nustatant SUID bitą, bet tik tam tikram leidimų rinkiniui. Naudingumas setcap
naudojamas leidimams pridėti ir pašalinti iš failo.
Pirmas žingsnis yra pasirinkti reikiamus leidimus. Dėl šio straipsnio darau prielaidą, kad yra tinklo diagnostikos įrankis tracewalk
, kurį turėtų galėti naudoti CAP_NET_RAW
.
Darant prielaidą, kad esate kataloge, kuriame yra dvejetainis failas tracewalk
, galite pridėti šį leidimą taip:
sudo setcap cap_net_raw=eip tracewalk
Kol kas nekreipkite dėmesio į galūnę =eip
dėl sprendimo pakalbėsiu apie tai po kelių sekundžių. Atminkite, kad leidimo pavadinimas rašomas mažosiomis raidėmis. Dabar galite patikrinti, ar tinkamai sukonfigūravote leidimus naudodami:
setcap -v cap_new_raw=eip tracewalk
Arba galite išvardyti visus tam tikram vykdomajam failui nustatytus leidimus:
getcap tracewalk
Taip pat galite pašalinti visus vykdomojo failo leidimus naudodami:
setcap -r tracewalk
Šiuo metu turėtumėte turėti galimybę paleisti vykdomąjį failą kaip neprivilegijuotas vartotojas ir jis turėtų dirbti su neapdorotais lizdais, bet neturėti jokių kitų privilegijų, kurias turi pagrindinis vartotojas.
Taigi, ką reiškia ši keista priesaga? =eip
? Tam reikia šiek tiek suprasti leidimų prigimtį. Kiekvienas procesas turi tris leidimų rinkinius − veiksmingas, paveldimas ir leistinas:
- Veiksmingas Leidimai yra tie, kurie apibrėžia, ką procesas iš tikrųjų gali padaryti. Pavyzdžiui, jis negali susidoroti su neapdorotais lizdais, jei
CAP_NET_RAW
nėra efektyviame rinkinyje. - Yra leidimai yra tie, kuriuos procesui leidžiama turėti, jei jis jų prašo naudodamas atitinkamą iškvietimą. Jie neleidžia procesui iš tikrųjų nieko daryti, nebent tai buvo specialiai parašyta norint paprašyti leidimo. Tai leidžia rašyti procesus, kad prie galiojančio rinkinio būtų pridėti svarbūs leidimai tik tuo laikotarpiu, kai jų iš tikrųjų reikia.
- Paveldima leidimai yra tie, kurie gali būti paveldimi pasiekiamame sukurto antrinio proceso rinkinyje. Operacijos metu
fork()
arbaclone()
antriniam procesui visada suteikiama pirminio proceso leidimų kopija, nes tuo metu jis vis dar vykdo tą patį vykdomąjį failą. Paveldimas rinkinys naudojamas, kaiexec()
(arba lygiavertis) yra iškviečiamas pakeisti vykdomąjį failą kitu. Šiuo metu galimą proceso rinkinį užmaskuoja paveldimas rinkinys, kad būtų gautas pasiekiamas rinkinys, kuris bus naudojamas naujam procesui.
Taigi naudingumas setcap
leidžia mums atskirai pridėti šių trijų rinkinių leidimus tam tikram vykdomajam failui. Atminkite, kad grupių reikšmė failų leidimams interpretuojama šiek tiek kitaip:
- Galima failo leidimai yra tie, kurie visada pasiekiami vykdomajam failui, net jei pirminis procesas, kuris jį iškvietė, jų neturėjo. Anksčiau jie buvo vadinami „priverstiniais“ leidimais.
- Paveldėtas failo leidimai apibrėžia papildomą kaukę, kurią taip pat galima naudoti norint pašalinti leidimus iš skambinimo proceso rinkinio. Jie taikomi kartu su iškvietimo proceso paveldėtu rinkiniu, todėl leidimas paveldimas tik tuo atveju, jei jis yra abiejuose rinkiniuose.
- Veiksmingas failo leidimai iš tikrųjų yra tik vienas bitas, o ne rinkinys, o jei nustatytas, tai reiškia, kad visas galimas rinkinys taip pat nukopijuojamas į naujo proceso efektyvų rinkinį. Tai gali būti naudojama norint pridėti leidimus procesams, kurie nebuvo specialiai parašyti jų prašymui. Kadangi tai yra vienas bitas, jei jį nustatote bet kokiam leidimui, jis turi būti nustatytas visiems leidimams. Galite galvoti apie tai kaip apie seną bitą, nes jis naudojamas leidimams leisti naudoti programoms, kurios jų nepalaiko.
Nurodant leidimus per setcap
trys raidės e
, i
и p
susieti su veiksmingas, paveldimas ir prieinamas rinkiniai atitinkamai. Taigi, ankstesnė specifikacija:
sudo setcap cap_net_raw=eip tracewalk
...nurodo, kad rezoliucija CAP_NET_RAW
turi būti pridėtas prie turimų ir paveldimų rinkinių, taip pat turi būti nustatytas veiksmingas bitas. Tai nepaisys visų anksčiau nustatytų failo leidimų. Norėdami vienu metu nustatyti kelis leidimus, naudokite kableliais atskirtą sąrašą:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalk
Pirma, failų galimybės neveikia su simbolinėmis nuorodomis – jas turite pritaikyti pačiam dvejetainiam failui (t. y. simbolinės nuorodos tikslui).
Antra, jie neveikia su interpretuotais scenarijais. Pavyzdžiui, jei turite Python scenarijų, kuriam norite priskirti leidimą, turite jį priskirti pačiam Python interpretatoriui. Akivaizdu, kad tai yra potenciali saugumo problema, nes tada visi su tuo interpretatoriumi vykdomi scenarijai turės nurodytą leidimą, nors tai vis tiek yra žymiai geriau nei padaryti jį SUID. Atrodo, kad labiausiai paplitęs sprendimas yra parašyti atskirą vykdomąjį failą C arba lygiaverčiu, kuris gali atlikti reikiamas operacijas ir iškviesti jį iš scenarijaus. Tai panašu į Wireshark naudojamą metodą, kuris naudoja dvejetainį kodą /usr/bin/dumpcap
atlikti privilegijuotas operacijas:
$ getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip
Trečia, failų teisės išjungiamos, jei naudojate aplinkos kintamąjį LD_LIBRARY_PATH
dėl akivaizdžių saugumo priežasčių(1). Tas pats pasakytina ir apie LD_PRELOAD
, kiek aš žinau.
1. Kadangi užpuolikas akivaizdžiai gali pakeisti vieną iš standartinių bibliotekų ir naudoti LD_LIBRARY_PATH
priversti savo biblioteką iškviesti pirmenybę, o ne sisteminę, ir todėl turėti savo savavališką kodą, vykdomą su tomis pačiomis privilegijomis kaip ir skambinanti programa.
Tai viskas. Daugiau informacijos apie kursų programą rasite adresu
Šaltinis: www.habr.com