Libertonia
Portada · Todo · Software Libre · Desarrolladores · Comunidad · Internet · Tecnología · Meta · Diarios
Ver: Modo: Orden:
¿que le falta, que le sobra al kernel? | 8 comentarios (8 temáticos, editoriales, 0 ocultos)
Las "capabilities" de Linux (none / 0) (#2)
por jorginius ("jorginius" en Google Mail) a las Fri Oct 3rd, 2003 at 11:13:57 PM CET
(Información Usuario) http://www.rodriguezmoreno.com

En realidad, una parte de lo que pides sí está (más o menos) incluido en el kernel de serie. En concreto:

Podriamos darle al usuario www-data permiso para abrir el puerto 80, y listo.

Si el proceso tiene la capacidad cap_net_bind_service activa, podrá conectarse a un puerto por debajo del 1024, sin importar su *id (sea root o no).

[grsecurity] tiene la opcion de no poder ejecutar ptrace sobre un proceso fuera de la jaula por que se puede inyectar codigo sobre ese proceso y conseguir salirse.

Eso le será imposible si hemos retirado la capacidad cap_ptrace del proceso.

Las capacidades se manejan con las llamadas al sistema cap_init(), cap_get_proc(), cap_set_proc(), etc. Todas ellas conforme al borrador POSIX.1e.

Entonces, qué bien, ¿no?. ¿Qué queremos correr un servidor que se enlace a un puerto privilegiado pero que corra como nobody?, pues nada: desde un pequeño programita lo enjaulamos, cambiamos el uid y el gid, ajustamos las capabilities según lo que necesite, reemplazamos la imagen del proceso con el servidor y ya lo tenemos corriendo de forma segura... El problema es que esto no funciona: aunque cambies las capacidades del proceso con cap_*() y las definas como heredables por los procesos hijos, éstas se perderán en cuanto hagas execv() y creemos una nueva imagen de proceso: las capabilities se resetean. Si haces un fork(), el hijo tiene las capacidades del padre (si las definimos como heredables, por supuesto) pero si hacemos un execv() las capacidades se pierden.

No sé muy bien por qué lo han hecho así. Sospecho que es el comportamiento que describe el estándar. El caso es que si haces un execv() y no eres en ese momento uid 0 (si eres root sí que se conservan) o un setuid() previo, tus capacidades se resetean. Para el caso del setuid() hay una syscall específica de Linux que permite que el proceso las conserve después del cambio de uid, se trata de prctl() con el valor de opción PR_SET_KEEPCAPS, pero esto no afecta a execv(). El parche que haga que execv() conserve las capacidades igual que setuid() si el proceso tiene activa la bandera PR_SET_KEEPCAPS debería ser trivial y no entiendo por qué no está hecho así ya.

Por otro lado, lo del TCFS:

OpenBSD sino recuerdo mal incorpora TCFS. En esa web podemos encontrar tambien parches para Linux, pero que yo sepa, solo estan probados para i386 y no parece que haya parche para 2.4.

Creo que era CFS a secas pero de todos modos, el problema que teníamos con TCFS en las Sparc no era porque el parche no fuera multiplataforma, sino porque el compilador que incluía Debian para el kernel de 64 bits patinaba, indicando un fallo al intentar compilar un código con operaciones con reales cuando éstas estaban deshabilitadas por línea de órdenes, lo cual es bastante sorprendente porque:
  1. No está permitidas las operaciones con reales dentro del kernel, en ninguna arquitectura.
  2. El parche de TCFS no incluye operaciones de este tipo
Vamos, que tenía toda la pinta de que el compilador estaba escupiendo código erróneo, y sabiendo como se las gasta el gcc que empaqueta Debian en la estable... Pues es bastante plausible. Habría que probar con una versión más modernita del gcc, a ver si hay más suerte.



¿que le falta, que le sobra al kernel? | 8 comentarios (8 temáticos, editoriales, 0 ocultos)
Ver: Modo: Orden:
Menu
· crear cuenta
· FAQ
· búsqueda
· Fuentes de Noticias

Login
Nueva cuenta
Usuario:
Contraseña:

ecol Logo Powered by Scoop
Todas las Marcas Registradas y copyrights de esta página son propiedad de sus respectivos dueños.
Los comentarios son propiedad del que los escribe.
Los iconos de las noticias y el logotipo son propiedad de Javier Malonda.
El Resto © 2002 Escomposlinux.org y aledaños.

Puedes sindicar los contenidos de libertonia en formato RSS 1.0 y RDF 0.9. También se puede sindicar la cola de envíos pendientes de moderación.

El proyecto escomposlinux.org está dedicado a la memoria de tas

crear cuenta | faq | búsqueda