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
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. –
Gracias por sus sugerencias George, sin embargo, no tuve éxito ... ver mis ediciones. – Chris
Chris, tal vez usted puede ser muy cuidadoso con la escalada de privilegios cuando sea necesario explícitamente en 'function_that_needs_raw_access()' –