Perché io non riesco a creare socket di tipo raw in Ubuntu?

Sto imparando come lavorare con i raw socket in Linux. Sto cercando di creare un socket:

if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
    perror("socket() failed");
    exit(-1);
}

Ma tutto quello che ho ottenuto dopo il lancio è:

socket() failed: Operation not permitted

So che solo l’utente root può creare socket di tipo raw, ma se lo faccio funzionare con il bit SUID o sudo – i
il problema è lo stesso. Cosa c’è di sbagliato? Il sistema è Ubuntu 11.04.

Forse sono compresi inutile intestazioni?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netdb.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>

E mi chiedo – perché SUID è inutile?

interessante; ha cercato di essere davvero root? (e verificata privilegi non vengono eliminati prima che l’esecuzione di tale linea?)
no, ho appena chiamata setuid(getuid()); a destra dopo la creazione del socket, ma non anche quella.
se volete fare: sudo bash (o sudo qualunque-shell-si-usa) e quindi si esegue il programma…? funziona?
Hmm, sì, funziona in questo modo. Ma perché suid è inutile?
Hai provato a fare seteuid — il bit setuid il programma non consente di impostare l’uid effettivo, e che potrebbe essere necessario impostare a livello di programmazione.

OriginaleL’autore Enchantner | 2011-07-26

3 risposte

  1. 13

    I miei soldi su di voi non è in esecuzione il codice correttamente.

    Ho copiato e incollato il tuo codice esatto, in un vuoto main(). Ottengo lo stesso errore se funziona come a me, ma non viene eseguito correttamente in sudo. Questo è su Ubuntu.

    Codice:

    #include <sys/socket.h>
    #include <netinet/in.h>
    
    int main()
    { 
      int sd;
      if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
        perror("socket() failed");
        return -1;
      }
      return 0;
    } 

    Esegui come me:

    [email protected]:~$ ./a.out 
    socket() failed: Operation not permitted
    [email protected]:~$

    Eseguire come root:

    [email protected]:~$ sudo ./a.out 
    [email protected]:~$
    Il tuo codice funziona perfettamente, troppo. Ma il mio codice è diverso dal tuo, solo le intestazioni. Ho incluso tutto il materiale (aggiunto in questione).
    quello che altri utenti possono fare per il real è configurabile, è possibile ubuntu 11 predefinito per sudoers, non è quello di dare un reale radice-powered utente?
    Mi ha salvato un bel po ‘ di tempo. Molto apprezzato NPE.

    OriginaleL’autore

  2. 8

    secondo uomo: Solo i processi con un ID utente valido di 0 o il CAP_NET_RAW capacità sono permesso di aprire un socket di tipo raw

    Così è possibile eseguire l’applicazione con sudo come è stato suggerito di seguito o impostare CAP_NET_RAW capacità (in realtà avrete bisogno di CAP_NET_ADMIN troppo):

    # setcap cap_net_raw,cap_net_admin=eip PATH_TO_YOUR_APPLICATION

    Dettagli possono essere trovati al http://ftp.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.4/capfaq-0.2.txt

    fatto interessante, non sapeva…

    OriginaleL’autore

  3. 0

    Intestazione non influenzano in alcun modo.

    Anche se sarebbe l’aggiunta di alcuni più file inutili che non influisce sul funzionamento del programma.

    OriginaleL’autore

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *