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.
Bestânsmooglikheden biede in feilich alternatyf foar SUID-útfierbere bestannen, mar kinne earst in bytsje betiizjend lykje.
Wy allegearre witte dat binaries
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
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 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()
ofclone()
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 wannearexec()
(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
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_PATH
om 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
Boarne: www.habr.com