In che modo macOS consente agli utenti standard di eseguire il ping

2

Qui ho una domanda piuttosto profonda che spero che qualcuno possa rispondere. In macOS, gli utenti regolari possono eseguire il ping così come root. Normalmente, è richiesto l'accesso root per aprire il socket raw necessario per eseguire ping. Ho notato su Linux che questo in genere si ottiene aggiungendo attributi estesi al file di programma ping per consentire l'accesso a livello di root per l'apertura di socket raw (in passato, ciò avveniva semplicemente impostando il bit setuid sul programma ping, permettendogli di fare qualsiasi cosa nella sua programmazione come root).

Ho guardato / sbin / ping su macOS (High Sierra, in particolare), e non sono stati impostati tali attributi, e nessuno dei due è setuid. Quindi cosa sta facendo macOS per consentire agli utenti standard (non-root) di eseguire il ping? Stanno inviando pacchetti ICMP su TCP o UDP? Se è così (o se c'è un altro meccanismo che mi manca del tutto), puoi indicarmi alcuni documenti? Qualsiasi aiuto sarebbe apprezzato.

    
posta le_jawa 19.01.2018 - 20:33
fonte

1 risposta

4

Diamo un'occhiata al codice sorgente per l'implementazione ping di Apple. In particolare, vediamo questo:

if (getuid())
    s = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP);
else
    s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
sockerrno = errno;

getuid restituisce 0 se root. Quindi questo codice sta dicendo: "apri il socket in DGRAM (modalità datagramma) se siamo non root.Se siamo root, apri come raw".

Quindi un socket raw viene usato solo quando sei root. Un pacchetto ping IMCP è un pacchetto DGRAM standard e non richiede socket non elaborati.

Tuttavia, ci sono alcuni flag che possono essere passati a ping che richiedono root, e per quelli si otterrà una "Operazione non consentita". Ad esempio:

>ping -f
ping: -f flag: Operation not permitted

Quando viene eseguito come root, non ottengo l'operazione non consentita. Quindi l'implementazione di Apple ti consentirà di eseguire operazioni di ping standard che non richiedono root, ma richiedono l'esecuzione come root per determinati flag e operazioni.

A seconda se sei root, puoi impostare alcune opzioni di socket aggiuntive:

if (uid == 0)
    (void)setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&hold,
        sizeof(hold));
    
risposta data 19.01.2018 - 21:04
fonte

Leggi altre domande sui tag