Bestânsmooglikheden yn Linux

Hoi allegearre. Wy geane aktyf oan it wurk en meitsje al in protte krêftige lansearringen yn jannewaris ta. Under oaren is ynskriuwing bekend makke foar in nije stream fan elkenien syn favorite kursus. "Linux behearder". Yn ôfwachting fan de lansearring diele wy tradisjoneel oersettingen fan brûkber materiaal.

Bestânsmooglikheden yn Linux

Bestânsmooglikheden biede in feilich alternatyf foar SUID-útfierbere bestannen, mar kinne earst in bytsje betiizjend lykje.


Wy allegearre witte dat binaries SÚD binne de min beslút út in feiligens eachpunt. Gelokkich, as jo applikaasje wat beheinde privileezjes fereasket, is d'r in effisjintere manier neamd triem tagongsrjochten.

Ik sil jo wat tiid besparje as jo it artikel hjirboppe net yn detail lêze wolle: Yn essinsje kinne triemfergunningen prosessen tastean dy't rinne as root en kinne dêrom wat dwaan om bepaalde mooglikheden te behâlden, beheind dizze listas se privileezjes falle en wurde útfierd troch in unprivileged brûker. Dit betsjut dat as in oanfaller it slagget om in proses te kompromittearjen mei in bufferoerstream of oare eksploitaasje, se sille net kinne profitearje fan wat oars as bepaalde minimale privileezjes dy't it proses eins nedich is.

Tastimmingen binne geweldich foar tsjinsten dy't normaal altyd as root rinne, mar hoe sit it mei kommandorigel-nutsbedriuwen? Gelokkich wurdt dit ek stipe as jo de juste hulpprogramma's ynstalleare hawwe. As jo ​​​​Ubuntu brûke, sille jo bygelyks it pakket nedich hawwe libcap2-bin. Jo sille ek in net-arkayske kernel moatte útfiere (fan ferzje 2.6.24).

Dizze funksjes kinne tagongsrjochten wurde assosjearre mei útfierbere triemmen, fergelykber mei it ynstellen fan it SUID-bit, mar allinich foar in spesifike set fan tagongsrjochten. Utility setcap brûkt om tagongsrjochten ta te foegjen en te ferwiderjen fan in bestân.

De earste stap is om de tagongsrjochten te selektearjen dy't jo nedich binne. Om 'e wille fan dit artikel nim ik oan dat d'r in netwurkdiagnostykark is neamd tracewalk, dy't brûke moatte kinne rauwe sockets. Dit fereasket normaal dat de applikaasje as root wurdt útfierd, mar by it besjen de list it docht bliken dat allinnich tastimming nedich is CAP_NET_RAW.

Stel dat jo yn 'e map binne wêr't de binêre sit tracewalk, kinne jo dizze tastimming sa tafoegje:

sudo setcap cap_net_raw=eip tracewalk

Negearje it efterheaksel foar no =eip foar resolúsje, Ik sil prate oer dat yn in pear sekonden. Tink derom dat de tastimming namme is yn lytse letters. Jo kinne no kontrolearje oft jo tagongsrjochten goed ynsteld hawwe mei:

setcap -v cap_new_raw=eip tracewalk

Of jo kinne alle ynstelde tagongsrjochten foar in opjûne útfierbere list listje:

getcap tracewalk

Foar referinsje kinne jo ek alle tagongsrjochten fan 'e útfierbere fuortsmite mei:

setcap -r tracewalk

Op dit punt moatte jo de útfierbere kinne útfiere as in unprivileged brûker, en it moat wêze kinne om te wurkjen mei rauwe sockets, mar net hawwe ien fan 'e oare privileezjes dy't de root brûker hat.

Dus wat betsjut dit frjemde efterheaksel? =eip? Dit freget wat begryp fan 'e aard fan tagongsrjochten. Elk proses hat trije sets fan tagongsrjochten - effektyf, erflik en tastien:

  • Effektyf Fergunningen binne dejingen dy't definiearje wat in proses eins kin dwaan. Bygelyks, it kin net omgean mei rauwe sockets as CAP_NET_RAW is net yn 'e effektive set.
  • Beskikber tagongsrjochten binne dyjingen dy't in proses is tastien te hawwen as it freget se mei help fan de passende oprop. Se foarkomme dat in proses wirklik neat docht, útsein as it spesifyk skreaun is om sein tastimming te freegjen. Hjirmei kinne prosessen wurde skreaun om krityske tagongsrjochten ta te foegjen oan 'e effektive set allinich foar de perioade wêryn't se eins nedich binne.
  • Erflik tagongsrjochten binne dejingen dy't kinne wurde erfde yn 'e tagonklike set fan it spawned bernproses. Tidens operaasje fork() of clone() it bernproses wurdt altyd in kopy jûn fan de tagongsrjochten fan it âlderproses, om't it op dat punt noch altyd itselde útfierber is. In erflike set wurdt brûkt wannear exec() (of lykweardich) wurdt neamd om it útfierbere bestân te ferfangen troch in oar. Op dit punt wurdt de beskikbere set fan it proses maskearre troch de erflike set om de tagonklike set te krijen dy't sil wurde brûkt foar it nije proses.

Dus it nut setcap lit ús tafoegje de tagongsrjochten fan dizze trije sets selsstannich foar in jaan útfierbere. Tink derom dat de betsjutting fan groepen wat oars wurdt ynterpretearre foar triemrjochten:

  • Beskikber triemrjochten binne dejingen dy't altyd beskikber binne foar in útfierber bestân, sels as it âlderproses dat it neamde se net hie. Se waarden eartiids "twongen" fergunningen neamd.
  • Erfd triemrjochten definiearje in ekstra masker dat ek kin wurde brûkt om tagongsrjochten te ferwiderjen fan 'e set fan it opropproses. Se jilde neist de erflike set fan it opropproses, dus de tastimming wurdt allinich erfd as it yn beide sets bestiet.
  • Effektyf triem tagongsrjochten binne eins mar in inkele bit, net in set, en as ynsteld, it betsjut dat de hiele beskikbere set wurdt ek kopiearre yn de nije proses syn effektive set. Dit kin brûkt wurde om tagongsrjochten ta te foegjen oan prosessen dy't net spesifyk skreaun binne om se te freegjen. Om't it ien bit is, as jo it ynstelle foar elke tastimming, moat it ynsteld wurde foar alle tagongsrjochten. Jo kinne it tinke as in legacy-bit, om't it wurdt brûkt om tagongsrjochten te brûken troch applikaasjes dy't se net stypje.

By it opjaan fan tagongsrjochten fia setcap trije letters e, i и p ferwize nei effektyf, erflik en tagonklik sets respektivelik. Dus, de eardere spesifikaasje:

sudo setcap cap_net_raw=eip tracewalk

... jout oan dat de resolúsje CAP_NET_RAW moat tafoege wurde oan de beskikbere en erflike sets en dat de effektive bit moat ek ynsteld wurde. Dit sil alle earder ynstelde tagongsrjochten op it bestân oerskriuwe. Om meardere tagongsrjochten tagelyk yn te stellen, brûk in komma-skieden list:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Fergunnings Guide besprekt dit alles yn mear detail, mar hooplik hat dizze post demystifisearre wat der in bytsje bart. D'r binne mar in pear caveats en trúkjes oer om te neamen.

Earst wurkje triemmooglikheden net mei symlinks - jo moatte se tapasse op it binêre bestân sels (dus it doel fan 'e symlink).

Twad, se wurkje net mei ynterpretearre skripts. As jo ​​bygelyks in Python-skript hawwe dat jo tastimming tawize wolle, moatte jo it tawize oan de Python-tolk sels. Fansels is dit in potinsjele feiligensprobleem, om't dan alle skripts dy't útfierd wurde mei dy tolk de opjûne tastimming hawwe, hoewol dit noch signifikant better is dan it SUID te meitsjen. De meast foarkommende oplossing liket te wêzen om in apart útfierber te skriuwen yn C of lykweardich dat de nedige operaasjes kin útfiere en it út in skript neame. Dit is fergelykber mei de oanpak brûkt troch Wireshark dy't in binêr brûkt /usr/bin/dumpcap om befoarrjochte operaasjes út te fieren:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

Tredde, triemrjochten binne útskeakele as jo in omjouwingsfariabele brûke LD_LIBRARY_PATH foar dúdlike feiligens redenen(1). Itselde jildt foar LD_PRELOAD, foar safier't ik wit.

1. Sûnt in oanfaller kin fansels ferfange ien fan de standert biblioteken en gebrûk LD_LIBRARY_PATHom syn bibleteek te twingen om oproppen te wurden yn foarkar foar it systeem ien, en hawwe dêrom syn eigen willekeurige koade útfierd mei deselde privileezjes as de opropapplikaasje.

Da's alles. Mear details oer it kursusprogramma is te finen op webinar, dat sil plakfine op 24 jannewaris.

Boarne: www.habr.com

Add a comment