In un sistema embedded (kernel 2.4) ho bisogno di accesso socket raw all'interfaccia eth0 da un processo non eseguito come root.accesso socket raw come utente normale su linux 2.4
Ho cercato di risolvere questo problema impostando la funzionalità CAP_NET_RAW dalla riga di comando e utilizzando cap_set_proc(), entrambi senza successo. Sembra che io non ho il permesso di farlo, il programma si ottiene un errore EPERM, sulla linea di comando
Impossibile impostare c'è sul processo di `1586' tappo: (operazione non permessa)
C'è un modo più semplice per fare ciò che voglio? In caso contrario, quali passaggi sono necessari per impostare correttamente la funzionalità CAP_NET_RAW?
EDIT: ho accesso root, ma facendo funzionare il processo in modo permanente come root è alcuna opzione. La versione di libcap è 1.10, non esiste un binario "setcap", ma un "setpcaps".
EDIT - rispondendo George Skoptsov:
Se ti prendo a destra, il tuo suggerimento è quello di avviare un processo con setuid, quindi impostare la capacità CAP_NET_RAW e poi cadere i privilegi. Ho provato questo con il seguente codice, ma non sembra funzionare, anche se il comando caps non restituisce errori. Con il seteuid() commentata, opere di accesso prime, ma solo dal momento che il processo è in esecuzione come root quindi:
cap_t caps = cap_get_proc();
cap_value_t cap_list[1];
cap_list[0] = CAP_NET_RAW;
if (cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1)
{
printf("cap_set_flag error");
}
if (cap_set_proc(caps) == -1)
{
printf("cap_set_proc error");
}
if (seteuid(getuid()) != 0)
{
printf("seteuid error");
}
function_that_needs_raw_access();
Grazie per il vostro aiuto. Chris
Se si segue il mio suggerimento di seguito, il processo non verrà eseguito un s root, ma avrà i privilegi di root all'avvio, il che gli consentirebbe di impostare le funzionalità desiderate. –
Grazie per i tuoi suggerimenti George, tuttavia, non ho avuto successo ... vedi le mie modifiche. – Chris
Chris, forse puoi stare molto attento con i privilegi di escalation quando necessario esplicitamente in 'function_that_needs_raw_access()'? –