2012-03-19 4 views
9

En un sistema integrado (kernel 2.4) necesito acceso de socket sin procesar a la interfaz eth0 desde un proceso no ejecutando como root.acceso de socket sin formato como usuario normal en Linux 2.4

Intenté resolver este problema estableciendo la capacidad CAP_NET_RAW desde la línea de comando y programáticamente usando cap_set_proc(), ambos sin éxito. Parece que no tengo el permiso para hacerlo, en el programa me sale un error EPERM, en la línea de comandos

No se ha podido establecer que está en proceso de `1586' cap: (Operación no permitida)

¿Hay alguna manera más fácil de hacer lo que quiero? De lo contrario, ¿qué pasos son necesarios para establecer correctamente la capacidad de CAP_NET_RAW?

EDITAR: Tengo acceso de administrador, pero ejecutar el proceso permanentemente como root no es una opción. La versión de libcap es 1.10, no hay ningún binario 'setcap', sino un 'setpcaps'.

EDITAR - respondiendo a George Skoptsov:

Si consigo que la derecha, su sugerencia es comenzar un proceso con setuid, a continuación, establecer la capacidad CAP_NET_RAW y luego soltar los privilegios. Intenté esto con el siguiente código, pero parece que no funciona, aunque el comando de mayúsculas no devuelve errores. Con la seteuid() como comentario, obras de acceso primas, pero sólo desde que el proceso se está ejecutando como root a continuación:

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(); 

Gracias por su ayuda. Chris

+0

Si sigue mi sugerencia a continuación, su proceso no se ejecutará s root, pero tendrá privilegios de root al inicio, lo que le permitiría establecer las capacidades que desea. –

+0

Gracias por sus sugerencias George, sin embargo, no tuve éxito ... ver mis ediciones. – Chris

+0

Chris, tal vez usted puede ser muy cuidadoso con la escalada de privilegios cuando sea necesario explícitamente en 'function_that_needs_raw_access()' –

Respuesta

6

En general, usted necesita permisos de root para recibir paquetes sin formato en una interfaz. Esta restricción es una precaución de seguridad, porque un proceso que recibe paquetes sin procesar obtiene acceso a las comunicaciones de todos los otros procesos y usuarios que usan esa interfaz.

Sin embargo, si usted tiene acceso a root en la máquina, puede utilizar la bandera setuid para dar su proceso de privilegios de root incluso cuando el proceso se ejecuta como un usuario no root.

Primero, asegúrese de que esta capacidad se establezca correctamente cuando el proceso se ejecuta como raíz. A continuación, utilice

sudo chown root process 
sudo chmod ugo+s process 

para establecer root como propietario del proceso y establecer el indicador setuid. Luego, verifique que la capacidad esté configurada cuando otros usuarios ejecutan el proceso. Como este proceso ahora tendrá todos los privilegios de superusuario, debe observar las precauciones de seguridad y descartar los privilegios tan pronto como su código ya no lo requiera (después de habilitar CAP_NET_RAW).

Puede seguir this method para asegurarse de que los está cayendo correctamente.

+0

No sé cómo habilitar CAP_NET_RAW. No hay un comando setcap. Al ejecutar el proceso con el indicador setuid todo funciona, pero no quiero ejecutar el proceso como root ... – Chris

+0

No está ejecutando el proceso como root. Puede eliminar estos privilegios tan pronto como termine de configurar las capacidades, lo que funciona para usted en la raíz. –

+0

Mi problema original no está realmente resuelto, pero acepto esta respuesta ya que George trató de ayudarme y esta es la solución "más cercana". – Chris

3

El proceso debe ejecutarse como root o tener las capacidades de CAP_NET_RAW en el ejecutable.

Para establecer CAP_NET_RAW, necesita ejecutar el comando setcap como root. Una vez configurado, puede ejecutar el ejecutable como otro usuario y tendrá acceso a la captura de paquetes sin formato.

Si no tiene acceso de administrador de ninguna manera, ni puede obtener acceso root para establecer CAP_NET_RAW o raíz de setuid en el ejecutable, no podrá realizar la captura de paquetes como usuario no root.

+0

No hay un comando setcap, solo setpcaps. He intentado ejecutar setpcaps como root para establecer los topes para el proceso en ejecución, pero eso no funcionará (ver el mensaje de error en la publicación original). – Chris

1

Puede otorgar a un programa ejecutable la posibilidad de utilizar el privilegio CAP_NET_RAW sin otorgarle otros privilegios de administrador.

$ setcap cap_net_raw=pe *program* 

No puede dar este privilegio sin tener este privilegio. Ciertamente, root puede otorgar este privilegio a los programas.

+0

No hay capacidades de archivo en linux '2.6.24'. De eso se trata la pregunta. –

0

TL; DR IMHO no admitido en kernel < 3.0.

Hubo una discusión sobre el apoyo que en el kernel lista de correo netdev: https://lwn.net/Articles/420800/ y https://lwn.net/Articles/420801/.

y la incluyó en cometer c319b4d76b9e583a5d88d6bf190e079c4e43213d, lanzado en el 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 

de ping reproducción sin CAP_NET_RAW (es decir, sin el establecimiento de capacidades o sin set-UID) se implementó para el ping en la revisión 87dbb3a5db657d5eae6934707beaf0507980a1c3 , publicado en 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 
Cuestiones relacionadas