5 votos

¿Cómo permite el MacOS a los usuarios estándar hacer ping

Tengo una pregunta muy profunda aquí que espero que alguien pueda responder. En MacOS, los usuarios habituales pueden hacer ping además de a Root. Normalmente, el acceso a Root es necesario para abrir el enchufe crudo necesario para ejecutar el ping. He notado en Linux que esto usualmente se logra agregando atributos extendidos al archivo del programa ping para permitir el acceso a nivel de root para abrir sockets crudos (en el pasado, esto se hacía con sólo establecer el bit setuid en el programa ping, permitiéndole hacer cualquier cosa en su programación como root).

He mirado /sbin/ping en MacOS (High Sierra, específicamente), y no se establecen tales atributos, y tampoco se establece. Entonces, ¿qué está haciendo MacOS para permitir a los usuarios Estándar (no-Root) hacer ping? ¿Están enviando paquetes ICMP a través de TCP o UDP? Si es así (o si hay otro mecanismo que me falta por completo), ¿puede indicarme algunos documentos? Cualquier ayuda sería apreciada.

0 votos

El ICMP está un nivel por debajo de la capa de transporte (TCP, UDP...).

2 votos

Podrías documentar "normalmente, se requiere acceso Root para abrir el socket raw". Esto parece ser simplemente que MacOS no cumple con sus expectativas y me gustaría evitar cerrar esto como poco claro / buscando referencias fuera del sitio. Simplemente, el modelo de seguridad no requiere las prohibiciones que eligió Linux.

0 votos

¿Preguntas cómo hacer ping como usuario estándar o cómo Apple permite hacer ping a los usuarios estándar? Sólo para que quede claro.

8voto

Ben Puntos 729

Echemos un vistazo a la código fuente para Apple's ping la aplicación. Notablemente, vemos esto:

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

getuid devuelve 0 si Root. Así que este código está diciendo, "abre el socket en DGRAM (modo datagrama) si estamos no root. Si somos Root, abridlo todo".

Así que un enchufe crudo sólo se usa cuando eres Root. Un paquete ping IMCP es un paquete estándar de DGRAM y no requiere enchufes sin procesar.

Sin embargo, hay algunas banderas que puede se le pasará a ping que sí requieren de Root, y para ellos obtendrá una "Operación No Permitida". Por ejemplo:

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

Cuando se ejecuta como root, no consigo que la operación no esté permitida. Por lo tanto, la implementación de Apple te permitirá hacer operaciones de ping estándar que no requieren de Root, pero que requieren que se ejecute como Root para ciertas banderas y operaciones.

Dependiendo de si es Root, puede establecer algunas opciones de enchufe adicionales:

if (uid == 0)
    (void)setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&hold,
        sizeof(hold));

0 votos

No tenía ni idea de que Apple había liberado ese código fuente. ¡Fantástico! Y eso responde a mi pregunta, muchas gracias.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X