Ciao a tutti. Ci stiamo attivamente impegnando nel lavoro e già a gennaio prepariamo molti lanci potenti. Tra le altre cose, è stato annunciato l'avvio di un nuovo ciclo del corso che tutti amano. In previsione del lancio, condividiamo tradizionalmente la traduzione di materiale utile.

Le autorizzazioni dei file offrono un'alternativa sicura ai file eseguibili SUID, ma possono sembrare un po' complicate a prima vista.
Tutti sappiamo che i file binari sono Fortunatamente, se la tua applicazione richiede alcune limitate privilegi, esiste un modo più efficace chiamato .
Ti risparmierò tempo se vuoi evitare una lettura dettagliata dell'articolo sopra: in sostanza, le autorizzazioni dei file consentono ai processi che vengono avviati con i privilegi dell'utente root e che, quindi, hanno il diritto di fare qualsiasi cosa, di mantenere determinate capacità limitate , quando riducono i privilegi e vengono eseguiti come utente non privilegiato. Ciò significa che se un malintenzionato riesce a compromettere un processo tramite un overflow del buffer o un'altra vulnerabilità, non potrà sfruttare nulla se non le minime autorizzazioni necessarie al processo.
Le autorizzazioni sono ottime per i servizi che di solito vengono sempre eseguiti come utente root, ma cosa possiamo dire delle utility da riga di comando? Fortunatamente, ciò è supportato a patto che tu disponga degli strumenti giusti. Se stai usando Ubuntu, ad esempio, avrai bisogno del pacchetto libcap2-bin.Dovrai anche eseguire un kernel non obsoleto (a partire dalla versione 2.6.24).
. Queste funzionalità permettono di collegare le autorizzazioni ai file eseguibili in modo simile all'impostazione del bit SUID, ma solo per un determinato set di autorizzazioni. L'utilità setcap è utilizzata per aggiungere e rimuovere autorizzazioni da un file.
Il primo passo è scegliere le autorizzazioni necessarie. Per questo articolo, suppongo che ci sia uno strumento di diagnostica di rete chiamato tracewalk, che dovrebbe essere in grado di usare Di solito, ciò richiede che l'applicazione venga eseguita come utente root, ma esaminando si scopre che è necessaria solo l'autorizzazione CAP_NET_RAW..
Supponendo che tu sia nella directory in cui si trova il file binario tracewalk, puoi aggiungere questa autorizzazione nel seguente modo:
sudo setcap cap_net_raw=eip tracewalk. Per ora, ignora il suffisso =eip per l'autorizzazione, ne parlerò tra un paio di secondi. Tieni presente che il nome dell'autorizzazione è in minuscolo. Ora puoi controllare se hai impostato correttamente le autorizzazioni con:
setcap -v cap_new_raw=eip tracewalk.Oppure puoi elencare tutte le autorizzazioni impostate per il file eseguibile:
getcap tracewalk.
Per tua informazione, puoi anche rimuovere tutte le autorizzazioni da un file eseguibile con:
setcap -r tracewalk.A questo punto dovresti essere in grado di eseguire il file eseguibile come utente non privilegiato, e dovrebbe essere in grado di lavorare con sockets RAW, ma non avere altri privilegi che possiede l'utente root.
Quindi, cosa significa questo strano suffisso? =eip? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — effettive, ereditate e disponibili (effective, inheritable e permitted).:
- Le autorizzazioni effettive (Effective) sono quelle che determinano cosa un processo può effettivamente fare. Ad esempio, non può gestire sockets RAW se
CAP_NET_RAW.non è nel set effettivo. - Le autorizzazioni disponibili (Permitted) sono quelle che è consentito avere a un processo, se le richiede tramite la chiamata appropriata. Non consentono a un processo di fare effettivamente nulla, a meno che non sia stato specificamente scritto per richiedere quella particolare autorizzazione. Questo consente di scrivere processi per aggiungere autorizzazioni particolarmente importanti al set effettivo solo per il periodo in cui sono realmente necessarie.
- Le autorizzazioni ereditate (Inheritable) sono quelle che possono essere ereditate nel set disponibile di un processo figlio. Durante l'operazione
fork()oclone()al processo figlio vengono sempre dati una copia delle autorizzazioni del processo genitore, poiché in quel momento sta ancora eseguendo lo stesso file eseguibile. Il set ereditato viene utilizzato quandoexec()(o simile) viene invocato per sostituire il file eseguibile con un altro. A questo punto, il set disponibile del processo è mascherato dal set ereditato per ottenere il set disponibile che sarà utilizzato per il nuovo processo.
Così, l'utilità setcap ci permette di aggiungere le autorizzazioni di questi tre set in modo indipendente per il file eseguibile. Nota che il valore dei gruppi viene interpretato in modo leggermente diverso per i diritti di accesso ai file:
- Disponibile le autorizzazioni dei file sono quelle sempre disponibili per il file eseguibile, anche se il processo genitore che lo ha richiamato non le aveva. In passato venivano chiamate "autorizzazioni forzate".
- Ereditate le autorizzazioni dei file definiscono una maschera aggiuntiva, che può essere utilizzata anche per rimuovere autorizzazioni dal set del processo chiamante. Si applicano in aggiunta al set ereditato dal processo chiamante, quindi un'autorizzazione è ereditata solo se esiste in entrambi i set.
- Effettive le autorizzazioni dei file rappresentano in realtà solo un singolo bit e non un set, e se è impostato, ciò significa che l'intero set disponibile viene anche copiato nel set effettivo del nuovo processo. Questo può essere utilizzato per aggiungere autorizzazioni a processi che non sono stati specificamente scritti per richiederle. Poiché è un singolo bit, se lo imposti per un'autorizzazione, deve essere impostato per tutte le autorizzazioni. Puoi pensarlo come a un bit legacy, perché viene utilizzato per consentire l'uso delle autorizzazioni per applicazioni che non le supportano.
Quando si specificano le autorizzazioni tramite setcap tre lettere e, i e p si riferiscono a effettive, ereditate e disponibili set rispettivamente. Quindi, la specifica precedente:
sudo setcap cap_net_raw=eip tracewalk. … indica che l'autorizzazione CAP_NET_RAW. deve essere aggiunta ai set disponibili e ereditati e che deve essere impostato anche il bit effettivo. Questo sostituirà eventuali autorizzazioni impostate in precedenza nel file. Per impostare più autorizzazioni contemporaneamente, utilizzare un elenco separato da virgola:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalkdiscute tutto questo in dettaglio, ma spero che questo post abbia un po' demistificato ciò che sta accadendo. Rimane solo da menzionare alcune avvertenze e accorgimenti.
In primo luogo, le capacità dei file non funzionano con i symlink: devi applicarle al file binario stesso (cioè all'obiettivo del symlink).
In secondo luogo, non funzionano con script interpretati. Ad esempio, se hai uno script Python a cui desideri assegnare un'autorizzazione, devi assegnarla all'interprete Python stesso. È ovvio che questo rappresenta un potenziale problema di sicurezza, poiché quindi tutti gli script eseguiti con questo interprete avranno l'autorizzazione specificata, anche se è comunque significativamente migliore rispetto a fare uno SUID. La soluzione più comune sembrerebbe essere quella di scrivere un programma eseguibile separato in C o simili, che può eseguire le operazioni necessarie e richiamarlo dallo script. Questo è simile all'approccio utilizzato da Wireshark, che utilizza un file binario /usr/bin/dumpcap per svolgere operazioni privilegiate:
$ getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip In terzo luogo, le autorizzazioni dei file vengono disabilitate se si utilizza la variabile d'ambiente LD_LIBRARY_PATH per ovvi motivi di sicurezza(1). Lo stesso vale per LD_PRELOAD, per quanto ne so.
1. Poiché un attaccante può evidentemente sostituire una delle librerie standard e utilizzare LD_LIBRARY_PATH, per forzare la propria libreria ad essere chiamata in priorità rispetto a quella di sistema, e quindi avere il proprio codice arbitrario eseguito con le stesse autorizzazioni dell'applicazione chiamante.
Questo è tutto. Maggiori dettagli sul corso verranno forniti nel
Fonte: habr.com
