2012-03-19 14 views
9

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

+0

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. –

+0

Grazie per i tuoi suggerimenti George, tuttavia, non ho avuto successo ... vedi le mie modifiche. – Chris

+0

Chris, forse puoi stare molto attento con i privilegi di escalation quando necessario esplicitamente in 'function_that_needs_raw_access()'? –

risposta

6

In genere, è necessario disporre delle autorizzazioni root per ricevere i pacchetti non elaborati su un'interfaccia. Questa restrizione è una precauzione di sicurezza, perché un processo che riceve pacchetti grezzi ottiene l'accesso alle comunicazioni di tutti gli altri processi e utenti che utilizzano tale interfaccia.

Tuttavia, se si ha accesso a root sulla macchina, è possibile utilizzare il flag setuid per dare i privilegi di root processo anche quando il processo viene eseguito come utente non root.

primo luogo, garantire che tale capacità è impostato correttamente quando il processo viene eseguito come root. Quindi utilizzare

sudo chown root process 
sudo chmod ugo+s process 

impostare radice come proprietario del processo e impostare il flag setuid. Quindi verificare che la capacità sia impostata quando il processo è eseguito da altri utenti. Poiché questo processo avrà ora tutti privilegi di superutente, si dovrebbe osservare le precauzioni di sicurezza, e rilasciare i privilegi non appena il codice non è più lo richiede (dopo aver abilitato la CAP_NET_RAW).

È possibile seguire this method per garantire la cadere in modo corretto.

+0

Non so come abilitare il CAP_NET_RAW. Non c'è il comando setcap. Quando si esegue il processo con flag setuid tutto funziona, ma non voglio eseguire il processo come root ... – Chris

+0

Non si sta eseguendo il processo come root. Puoi eliminare questi privilegi non appena hai finito di impostare le funzionalità, che funzionano per te sotto root. –

+0

Il mio problema originale non è stato risolto, ma accetto questa risposta da quando George ha cercato di aiutarmi e questa è la soluzione "più vicina". – Chris

3

il processo deve essere eseguito come root, o avere la capacità CAP_NET_RAW sulla eseguibile.

Per impostare CAP_NET_RAW, è necessario eseguire il comando setcap come root. Una volta impostato, è possibile eseguire l'eseguibile come un altro utente e avrà accesso all'acquisizione dei pacchetti non elaborati.

Se non si dispone dell'accesso di root in alcun modo, né si può ottenere chiunque con accesso root per impostare CAP_NET_RAW o setuid root sull'eseguibile, non sarà possibile effettuare l'acquisizione di pacchetti come utente non root.

+0

Non c'è un comando setcap, solo setpcaps. Ho provato a eseguire setpcaps come root per impostare i limiti per il processo in esecuzione, ma non funzionerà (vedi messaggio di errore nel post originale). – Chris

1

È possibile assegnare a un programma eseguibile la possibilità di utilizzare il privilegio CAP_NET_RAW senza concedere altri privilegi di root.

$ setcap cap_net_raw=pe *program* 

Non si può dare questo privilegio senza avere questo privilegio. Certamente root può dare questo privilegio ai programmi.

+0

Non ci sono funzionalità file in linux '2.6.24'. Ecco di cosa si tratta. –

0

TL; DR IMHO non supportato nel kernel < 3.0.

C'è stata una discussione su supporto in kernel netdev mailing list: https://lwn.net/Articles/420800/ e https://lwn.net/Articles/420801/.

e inserito nella commettere c319b4d76b9e583a5d88d6bf190e079c4e43213d, uscito nel kernel 3.0:

commit c319b4d76b9e583a5d88d6bf190e079c4e43213d 
Author: Vasiliy Kulikov <[email protected]> 
Date: Fri May 13 10:01:00 2011 +0000 

    net: ipv4: add IPPROTO_ICMP socket kind 

Follows: v2.6.39-rc2 
Precedes: v3.0-rc1 

Correre ping senza CAP_NET_RAW (cioè senza impostare funzionalità o senza set-uid) è stato implementato per ping nella revisione 87dbb3a5db657d5eae6934707beaf0507980a1c3 , rilasciato in iputils s20150815:

commit 87dbb3a5db657d5eae6934707beaf0507980a1c3 
Author: Nikos Mavrogiannopoulos <[email protected]> 
Date: Fri May 29 11:01:00 2015 +0200 

    This patch allows running ping and ping6 without root privileges on 
    kernels that support it. Almost identical to Lorenzo 
    Colitti's original patch except: 
    ... 

Follows: s20140519 
Precedes: s20150815