Cambiar los "capabilities" de un proceso...

Iniciado por >FedeX<, 25 Enero 2011, 03:09 AM

0 Miembros y 1 Visitante están viendo este tema.

>FedeX<

Hola comunidad

Estaba programando un app para android, cuando descubro que no se pueden usar los puertos 0-1023 como puerto local. Entonces, busqué el modo de solucionarlo y me encontré con el modo de ejecutar un programa compilado en C++ como Superusuario... Muy feliz, creo un simple programa que nada mas hace:

Código (cpp) [Seleccionar]
syscall(SYS_capget,&header,&data);
data.effective |= CAP_TO_MASK(CAP_NET_BIND_SERVICE);
data.permitted |= CAP_TO_MASK(CAP_NET_BIND_SERVICE);
data.inheritable = 0;
syscall(SYS_capset,&header,&data);


Ejecutando SYS_capget despues del SYS_capset descubro que los capabilities siguen siendo 0. No hubo efecto alguno :S

Googleando me encuentro con un patch que supuestamente impedirá que un proceso cambie los capabilities de otro... Supongo que esa es la razón... porque los syscalls devuelven 0 (no error)...

La pregunta es, ¿existe algún otro método que permita cambiar los capabilities de otro proceso en linux?.

Gracias!

madpitbull_99

Esto encaja mejor en Java o Programación.



Has probado pidiendo permiso de root para ejecutar la aplicación?

Algo como en el ejemplo de abajo:

Código (java) [Seleccionar]
Process p;
try {
// Preform su to get root privledges
p = Runtime.getRuntime().exec("su");

// Attempt to write a file to a root-only
DataOutputStream os = new DataOutputStream(p.getOutputStream());
os.writeBytes("echo \"Do I have root?\" >/system/sd/temporary.txt\n");

// Close the terminal
os.writeBytes("exit\n");
os.flush();
try {
p.waitFor();
if (p.exitValue() != 255) {
// TODO Code to run on success
toastMessage("root");
}
else {
// TODO Code to run on unsuccessful
toastMessage("not root");
}
} catch (InterruptedException e) {
// TODO Code to run in interrupted exception
toastMessage("not root");
}
} catch (IOException e) {
// TODO Code to run in input/output exception
toastMessage("not root");
}


Si todo sale bien debería salirte un mensaje pidiéndote permiso de root, como este:



El código lo saqué de aquí, pero hace unas semanas vi un articulo mas o menos sobre lo mismo, si lo encuentro modifico la respuesta y dejo el enlace.

PD: Encontré otro muy parecido pero no es el que dije: Android Root Source Code: Looking at the C-Skills



«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red

>FedeX<

#2
Gracias por la atención

Ese código no eleva los privilegios del proceso actual (osea de mi app). Solo, crea otro proceso con privilegios root. No puedo ejecutar mis apps-java con esto y no me pareceria practico... Solo programas compilados o binarios... Entonces la idea era crear un programa que otorgue los privilegios que necesito al proceso donde corre mi app-java, para que pueda abrir los benditos puertos celestiales...

Acabo de descubrir que mi programa compilado, aun corriendo como "root", no tiene el capability CAP_SETPCAP que me permite hacer lo que quiero hacer, dar privilegios a otro proceso... Tiene todos los capabilities excepto esa (0xFFFFFEFF)...

No sé que hacer, aún siendo root no puedo!!! :S ¿Es que hay otro super-superusuario en linux?.. No entiendo para qué crean tanta seguridad inútil y molesta...

Gracias por la atención
Salu2