Filbehörigheter i Linux

Hej alla. Vi går aktivt in i arbetet och förbereder redan många kraftfulla lanseringar i januari. Bland annat har anmälan tillkännagivits för en ny ström av allas favoritkurs. "Linux-administratör". I väntan på lanseringen delar vi traditionellt översättningar av användbart material.

Filbehörigheter i Linux

Filbehörigheter erbjuder ett säkert alternativ till SUID-körbara filer, men kan verka lite förvirrande till en början.


Vi vet alla att binärer SUID är dåligt beslut ur säkerhetssynpunkt. Lyckligtvis, om din applikation kräver vissa begränsade privilegier, finns det ett mer effektivt sätt som kallas filbehörigheter.

Jag sparar dig lite tid om du vill undvika att läsa artikeln ovan i detalj: I huvudsak tillåter filbehörigheter processer som körs som root och får därför göra något för att behålla vissa möjligheter, begränsade denna listanär de tappar privilegier och körs av en oprivilegierad användare. Detta innebär att om en angripare lyckas äventyra en process med hjälp av ett buffertspill eller annan exploatering, kommer de inte att kunna dra nytta av något annat än vissa minimala privilegier som processen faktiskt behöver.

Behörigheter är bra för tjänster som vanligtvis alltid körs som root, men hur är det med kommandoradsverktyg? Lyckligtvis stöds detta också förutsatt att du har rätt verktyg installerade. Om du använder Ubuntu behöver du till exempel paketet libcap2-bin. Du kommer också att behöva köra en icke-arkaisk kärna (från version 2.6.24).

Dessa funktioner tillåter att behörigheter associeras med körbara filer, på samma sätt som att ställa in SUID-biten, men bara för en specifik uppsättning behörigheter. Verktyg 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 den här artikelns skull antar jag att det finns ett nätverksdiagnosverktyg som heter tracewalk, som ska kunna användas råa uttag. Detta kräver vanligtvis att applikationen körs som root, men vid visning listan det visar sig att det bara krävs tillstånd CAP_NET_RAW.

Förutsatt att du är i katalogen där binären finns tracewalk, kan du lägga till denna behörighet så här:

sudo setcap cap_net_raw=eip tracewalk

Ignorera suffixet för tillfället =eip för upplösning, jag ska prata om det om ett par sekunder. Observera att behörighetsnamnet är med gemener. Du kan nu kontrollera om du har konfigurerat behörigheter korrekt med:

setcap -v cap_new_raw=eip tracewalk

Eller så kan du lista alla behörighetsuppsättningar för en given körbar fil:

getcap tracewalk

Som referens kan du också ta bort alla behörigheter från den körbara filen med:

setcap -r tracewalk

Vid det här laget bör du kunna köra den körbara filen som en oprivilegierad användare, och den ska kunna fungera med råa sockets, men inte ha någon av de andra privilegierna som rotanvändaren har.

Så vad betyder detta konstiga suffix? =eip? Detta kräver viss förståelse för karaktären av behörigheter. Varje process har tre uppsättningar behörigheter − effektiv, ärftlig och tillåten:

  • Effektiv Behörigheter är de som definierar vad en process faktiskt kan göra. Till exempel kan den inte hantera råa uttag om CAP_NET_RAW är inte i den effektiva uppsättningen.
  • Tillgängliga behörigheter är de som en process tillåts ha om den begär dem med rätt anrop. De hindrar en process från att faktiskt göra någonting såvida den inte specifikt skrevs för att begära nämnda tillstånd. Detta gör att processer kan skrivas för att lägga till kritiska behörigheter till den effektiva uppsättningen endast för den period då de faktiskt krävs.
  • Ärftlig behörigheter är de som kan ärvas i den tillgängliga uppsättningen av den skapade underordnade processen. Under operation fork() eller clone() den underordnade processen får alltid en kopia av den överordnade processens behörigheter eftersom den fortfarande kör samma körbar vid den tidpunkten. En ärftlig uppsättning används när exec() (eller motsvarande) anropas för att ersätta den körbara filen med en annan. Vid denna tidpunkt maskeras processens tillgängliga uppsättning av den ärftliga uppsättningen för att erhålla den tillgängliga uppsättningen som kommer att användas för den nya processen.

Alltså nyttan setcap tillåter oss att lägga till behörigheterna för dessa tre uppsättningar oberoende för en given körbar fil. Observera att betydelsen av grupper tolkas något annorlunda för filbehörigheter:

  • tillgänglig filbehörigheter är de som alltid är tillgängliga för en körbar fil, även om den överordnade processen som anropade den inte hade dem. De brukade kallades "tvingade" tillstånd.
  • Ärvt filbehörigheter definierar en extra mask som också kan användas för att ta bort behörigheter från anropsprocessens uppsättning. De gäller utöver anropsprocessens ärvda uppsättning, så behörigheten ärvs endast om den finns i båda uppsättningarna.
  • Effektiv filbehörigheter är faktiskt bara en enstaka bit, inte en uppsättning, och om den är inställd betyder det att hela den tillgängliga uppsättningen också kopieras till den nya processens effektiva uppsättning. Detta kan användas för att lägga till behörigheter till processer som inte specifikt skrevs för att begära dem. Eftersom det är en bit, om du ställer in det för någon behörighet, måste det ställas in för alla behörigheter. Du kan tänka på det som en äldre bit eftersom det används för att tillåta behörigheter att användas av applikationer som inte stöder dem.

När du anger behörigheter via setcap tre bokstäver e, i и p hänvisa till effektiv, ärftlig och tillgänglig uppsättningar respektive. Så, den tidigare specifikationen:

sudo setcap cap_net_raw=eip tracewalk

...indikerar att upplösningen CAP_NET_RAW måste läggas till de tillgängliga och ärvbara uppsättningarna och att den effektiva biten också måste ställas in. Detta kommer att åsidosätta alla tidigare inställda behörigheter för filen. För att ställa in flera behörigheter samtidigt, använd en kommaseparerad lista:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Behörighetsguide diskuterar allt detta mer i detalj, men förhoppningsvis har detta inlägg avmystifierat vad som händer lite. Det finns bara några varningar och knep kvar att nämna.

För det första fungerar inte filfunktioner med symboliska länkar - du måste tillämpa dem på själva den binära filen (dvs. målet för symbollänken).

För det andra fungerar de inte med tolkade manus. Till exempel, om du har ett Python-skript som du vill tilldela behörighet till, måste du tilldela det till själva Python-tolken. Uppenbarligen är detta ett potentiellt säkerhetsproblem eftersom då kommer alla skript som körs med den tolken att ha den angivna behörigheten, även om detta fortfarande är betydligt bättre än att göra det till SUID. Den vanligaste lösningen verkar vara att skriva en separat körbar fil i C eller motsvarande som kan utföra nödvändiga operationer och anropa den från ett skript. Detta liknar metoden som används av Wireshark som använder en binär /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). Det samma gäller för LD_PRELOAD, så vitt jag vet.

1. Eftersom en angripare uppenbarligen kan ersätta ett av standardbiblioteken och använda LD_LIBRARY_PATHatt tvinga sitt bibliotek att anropas framför systemet ett, och därför ha sin egen godtyckliga kod exekverad med samma privilegier som den anropande applikationen.

Det är allt. Mer information om kursprogrammet finns på webbseminarium, som äger rum den 24 januari.

Källa: will.com

Lägg en kommentar