Hej allesammans. Vi integrerar oss aktivt i arbetet och förbereder redan mÄnga kraftfulla lanseringar i januari. Bland annat har vi utlyst ett nytt program av den populÀra kursen. . I samband med lanseringen delar vi traditionellt med oss av en översÀttning av anvÀndbart material.

Filbehörigheter erbjuder ett sÀkert alternativ till SUID-exekverbara filer, men kan vid första anblicken verka nÄgot förvirrande.
Vi vet alla att binÀra filer Àr . Lyckligtvis, om din applikation krÀver vissa begrÀnsade privilegier, finns det ett mer effektivt sÀtt, kallat .
Jag sparar tid för dig om du vill undvika att noggrant lÀsa artikeln ovan: i grunden tillÄter filbehörigheter processer som körs av root-anvÀndaren och dÀrmed har rÀtt att göra nÄgot, att behÄlla vissa möjligheter, begrÀnsade till , nÀr de avsÀger sig privilegier och körs som en icke-privilegierad anvÀndare. Detta innebÀr att om en angripare lyckas kompromettera en process genom en buffertöverföring eller annan sÄrbarhet, sÄ kan de inte utnyttja nÄgot annat Àn de specifika minimala privilegier som verkligen behövs för processen.
Behörigheter Àr utmÀrkta för tjÀnster som vanligtvis alltid körs som root-anvÀndare, men hur Àr det med kommandoradsverktyg? Lyckligtvis stöds det ocksÄ sÄ lÀnge du har de rÀtta verktygen installerade. Om du anvÀnder Ubuntu, behöver du till exempel paketet libcap2-bin. Du mÄste ocksÄ köra en icke-Älderdomlig kÀrna (frÄn och med version 2.6.24).
Dessa funktioner möjliggör koppling av behörigheter till exekverbara filer pÄ samma sÀtt som att stÀlla in SUID-bit, men endast för en specifik uppsÀttning behörigheter. Verktyget setcap anvÀnds för att lÀgga till och ta bort behörigheter frÄn en fil.
Det första steget Àr att vÀlja de behörigheter du behöver. För denna artikel antar jag att det finns ett nÀtverksdiagnosverktyg som kallas tracewalk, som bör kunna anvÀnda . Vanligtvis krÀvs det att applikationen körs som root-anvÀndare, men nÀr man granskar det visar sig att endast behörighet krÀvs CAP_NET_RAW.
Förutsatt att du befinner dig i katalogen dÀr den körbara filen ligger tracewalk, kan du lÀgga till denna behörighet pÄ följande sÀtt:
sudo setcap cap_net_raw=eip tracewalk Ignorera för tillfÀllet suffixet =eip för behörigheten, jag kommer att förklara detta om en sekund. Observera att namnet pÄ behörigheten Àr i smÄ bokstÀver. Nu kan du kontrollera om du har konfigurerat behörigheterna korrekt med:
setcap -v cap_new_raw=eip tracewalkEller sÄ kan du lista alla behörigheter som har stÀllts in för den angivna körbara filen:
getcap tracewalk
För information kan du ocksÄ ta bort alla behörigheter frÄn den körbara filen med:
setcap -r tracewalkVid det hÀr laget bör du kunna köra den körbara filen som en icke-privilegierad anvÀndare, och den bör kunna arbeta med rÄa sockets, men utan nÄgra andra privilegier som root-anvÀndaren har.
SĂ„ vad betyder detta konstiga suffix =eip? ĐĐŽĐ”ŃŃ ĐżĐŸŃŃДбŃĐ”ŃŃŃ ŃĐŸĐ»ĐžĐșа ĐżĐŸĐœĐžĐŒĐ°ĐœĐžŃ ĐżŃĐžŃĐŸĐŽŃ ŃазŃĐ”ŃĐ”ĐœĐžĐč. ĐажЎŃĐč ĐżŃĐŸŃĐ”ŃŃ ĐžĐŒĐ”Đ”Ń ŃŃĐž ĐœĐ°Đ±ĐŸŃа ŃазŃĐ”ŃĐ”ĐœĐžĐč â effektiva, Ă€rvda och tillĂ„tna (effective, inheritable och permitted):
- Effektiva (Effective) behörigheter Àr de som definierar vad processen faktiskt kan göra. Till exempel kan den inte interagera med rÄa sockets om
CAP_NET_RAWdet inte finns i den effektiva uppsÀttningen. - TillÄtna (Permitted) behörigheter Àr de som en process har tillstÄnd att ha, om den begÀr dem med hjÀlp av det relevanta anropet. De tillÄter inte att processen faktiskt gör nÄgot, om den inte har skrivits specifikt för att begÀra den angivna behörigheten. Detta möjliggör för processer att lÀgga till sÀrskilt viktiga behörigheter till den effektiva uppsÀttningen endast under den tidsperiod de faktiskt behövs.
- Ărvda (Inheritable) behörigheter Ă€r de som kan Ă€rvas i den tillĂ„tna uppsĂ€ttningen av den avkommande processen. Under operationen
fork()ellerclone()fÄr den avkommande processen alltid en kopia av behörigheterna frÄn den överordnade processen, eftersom den vid denna tidpunkt fortfarande kör samma körbara fil. Den Àrvda uppsÀttningen anvÀnds nÀrexec()(eller motsvarande) anropas för att byta ut den körbara filen mot en annan. Vid detta tillfÀlle maskeras den tillÄtna uppsÀttningen för processen av den Àrvda uppsÀttningen för att fÄ den tillÄtna uppsÀttning som ska anvÀndas för den nya processen.
SÄledes Àr verktyget setcap möjliggör för oss att lÀgga till behörigheterna för dessa tre uppsÀttningar oberoende för den angivna körfilen. Observera att gruppens vÀrde tolkas nÄgot annorlunda för filbehörigheter:
- TillgÀngliga filbehörigheter Àr de som alltid Àr tillgÀngliga för körfilen, Àven om den överordnade processen som anropade den inte hade dem. De kallades tidigare "tvingande" behörigheter.
- Ărvda filbehörigheterna definierar en extra mask som ocksĂ„ kan anvĂ€ndas för att ta bort behörigheter frĂ„n den anropande processens uppsĂ€ttning. De tillĂ€mpas ovanpĂ„ den överordnade uppsĂ€ttningen frĂ„n den anropande processen, sĂ„ behörigheten Ă€rver bara om den finns i bĂ„da uppsĂ€ttningarna.
- Effektiva filbehörigheter Àr faktiskt bara en bit, inte en uppsÀttning, och om den Àr instÀlld betyder det att hela den tillgÀngliga uppsÀttningen ocksÄ kopieras till den effektiva uppsÀttningen för den nya processen. Detta kan anvÀndas för att lÀgga till behörigheter till processer som inte specifikt Àr skrivna för att begÀra dem. Eftersom detta Àr en bit, om du stÀller in den för nÄgon behörighet, mÄste den stÀllas in för alla behörigheter. Du kan tÀnka pÄ den som en legacy-bit eftersom den anvÀnds för att tillÄta anvÀndning av behörigheter för applikationer som inte stöder dem.
NÀr behörigheter anges via setcap tre bokstÀver e, i och p syftar pÄ effektiv, Àrvd och tillgÀnglig uppsÀttningar respektive. SÄ den tidigare specifikationen:
sudo setcap cap_net_raw=eip tracewalk ... anger att behörigheten CAP_NET_RAW mÄste lÀggas till de tillgÀngliga och Àrvda uppsÀttningarna och att Àven den effektiva biten bör stÀllas in. Detta kommer att ersÀtta eventuella tidigare instÀllda behörigheter i filen. För att stÀlla in flera behörigheter samtidigt, anvÀnd en lista genom kommatecken:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalkdiskuterar allt detta mer ingÄende, men förhoppningsvis har detta inlÀgg avmystifierat vad som pÄgÄr nÄgot. Det ÄterstÄr bara att nÀmna nÄgra varningar och fÀllor.
För det första fungerar inte filbehörigheterna med symlĂ€nkar â du mĂ„ste tillĂ€mpa dem pĂ„ den sjĂ€lva binĂ€ra filen (dvs. mĂ„let för symlĂ€nken).
För det andra fungerar de inte med tolkade skript. Om du till exempel har ett Python-skript som du vill ge behörighet, mÄste du ge det till Python-tolken sjÀlv. Det Àr uppenbart att detta Àr ett potentiellt sÀkerhetsproblem, eftersom dÄ alla skript som körs med denna tolk kommer att ha den angivna behörigheten, Àven om det fortfarande Àr betydligt bÀttre Àn att anvÀnda SUID. Den vanligaste arbetsvÀgen verkar vara att skriva en separat körbar fil i C eller en liknande, som kan utföra de nödvÀndiga operationerna och anropas frÄn skriptet. Detta liknar den metod som anvÀnds av Wireshark, som anvÀnder en binÀr fil. /usr/bin/dumpcap för att utföra privilegierade operationer:
$ getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip För det tredje inaktiveras filbehörigheter om du anvÀnder en miljövariabel LD_LIBRARY_PATH av uppenbara sÀkerhetsskÀl(1). Detsamma gÀller för LD_PRELOAD, sÄvitt jag vet.
1. Eftersom en angripare uppenbarligen kan byta ut ett av de standardbibliotek som anvÀnds och anvÀnda LD_LIBRARY_PATH, för att fÄ sitt bibliotek att anropas i stÀllet för systemet, och dÀrmed fÄ sin egen godtyckliga kod att köras med samma privilegier som det anropande programmet.
Det Àr allt. Mer information om kursprogrammet kan fÄs pÄ
KĂ€lla: habr.com
