
Hace más de un mes se divulgó una falla de seguridad en Linux que hasta el día de hoy se discute desde varios puntos de vista: La reacción de los desarrolladores, la forma en que se manejan estos problemas, y las decisiones de diseño que pueden ayudar a que éstas ocurran.
El problema en sí es bastante sencillo, y es fácil de entender para todo aquél que alguna vez haya tenido que programar en lenguajes cercanos a la máquina como es el caso del lenguaje C. Uno de los problemas comunes es el uso de variables no inicializadas, específicamente referencias a la dirección 0, también conocida como null.
Esto ocurre cuando se usa una variable que debería apuntar a un objeto válido en memoria, pero al no ser inicializada apunta a la dirección 0 (null pointer dereference). Esto podría provocar resultados indeterminados, pero en Linux se usa una característica del hardware para que este tipo de errores se detecte inmediatamente. Lo que se hace es que en la dirección cero no se mapea ninguna página de memoria, por lo tanto cualquier intento de acceder a esa zona provocará una excepción de hardware indicando que no hay nada en esa ubicación, lo que el usuario ve como un Segmentation Fault.
Los programadores, confiando en este sistema de detección pueden asumir que estos casos serán manejados siempre de esta forma, con un resultado conocido. Pero qué pasa si alguien efectivamente pone código en esa zona para que un error de este tipo no provoque una excepción de hardware, sino que la ejecución de código malicioso.
El kernel impide que esto se pueda hacer, estableciendo un límite inferior de dirección de memoria mapeable. Pero cuando se da mayor privilegio al código, estos límites no son considerados, y es ahí en donde se puede abusar del sistema.
Un usuario mostró que este caso es posible, y que las referencias a null podrían ser abusadas si se lograba poner código en la zona prohibida. La demostración la hizo con PulseAudio, que permite cargar bibliotecas indicadas por el usuario, si el ejecutable de PulseAudio se ejecuta con privilegios de root, como lo hacen algunas distribuciones, y se usa SELinux en donde los límites no son considerados, se puede cargar código que se activará cuando se use un puntero no inicializado.
Aunque parezca contradictorio, en este caso en particular, el sistema de seguridad SELinux originado en la National Security Agency (NSA) dejaba al sistema vulnerable frente a esta falla de seguridad.
Las correcciones no tardaron (tanto) en llegar, aunque este tipo de problemas son igual que los accidentes, se debe dar una compleja combinación de factores para que ocurran, pero eventualmente ocurrirán.
¿Qué es lo que falló? ¿Las auditoría son insuficientes? ¿Problemas de diseño? Es la naturaleza imperfecta del humano, manifestada en el software. Se generó una gran discusión respecto a aumentar los niveles de control y revisión, y es aquí en donde nuevamente Linus enseña algo importante en la lista de correo del kernel:
La buena memoria no se trata de recordar todo. La buena memoria se trata de olvidar lo irrelevante, de tal forma que las cosas importantes permanezcan y se puedan recordar. Pero el asunto es que: Sí, debes olvidar cosas. Y eso significa que vas a perder los detalles – pero se espera que se pierdan aquellos detalles que no son importantes. Aquí las palabras claves son “se espera”. La mayor parte del tiempo funciona, pero todos sabemos que a veces somos capaces de olvidar detalles que resultan ser cruciales después de todo.
Link: Null pointers, one month later (LWN.net)
Publicado por Franco Catrin el 3 de September 2009 en la categoría Destacados, Software con los tags Linus Torvalds, Linux, Programación, Seguridad. Tiene 68 comentarios.
68 Comentarios
Cuando pequeños detalles desencadenan complejos problemas

-7yo mismo dijo el 3-9-2009 a las 08:59:
Franco, esto solo ocurría con SElinux, o con todas las distribuciones?

6leopard dijo el 3-9-2009 a las 09:08:
una sumatoria de fatalidades… como programador solo puedo decir lo que siempre digo: “Todo el software es beta. Nada es definitivo”
@Franco:
Al totalmente off-topic, que solo alguien como tu podria comentar aca… la distribucion mas veterana de linux estrena nueva version
saludos!
Ver Comentario... manuti dijo el 3-9-2009 a las 09:15 ...

-3Danipilze dijo el 3-9-2009 a las 09:25:
muy buen articulo
es importante tomar casos como este para hacer muy buenas y útiles reflexiones

14serroba dijo el 3-9-2009 a las 09:29:
@yo mismo: SELinux no es distribucion. SELinux= Security-Enhanced Linux
Viene en el kernel que utilizan las distribuciones

4Inkubot dijo el 3-9-2009 a las 09:33:
vaya leopard, pense que ya nadie se fijaba en esas noticias. Por mi parte, ya estoy en Slack 13.0 :3
Ver Comentario... Sergio dijo el 3-9-2009 a las 09:41 ...

8MasterCracker3d dijo el 3-9-2009 a las 09:49:
Dado que los codigos de librerias y programas en linux siempre se descargan de repositorios validados, es bien baja la posibilidad de infectar a un server no creen?

-1HellCat dijo el 3-9-2009 a las 09:51:
como informatico con interes en la filosofia, creo que, como se menciona en el texto, “Es la naturaleza imperfecta del humano, manifestada en el software”… Solo un ser perfecto (como Dios, si es que crees en el) puede decidir si crear algo perfecto o imperfecto, pero nosotros (los humanos), somos seres imperfectos, y solo podemos aspirar a crear cosas imperfectas. o tambien hay una frase gringa que sirve en casos asi “shit happens”…
Ver Comentario... *p=NULL dijo el 3-9-2009 a las 09:54 ...

12Altair dijo el 3-9-2009 a las 09:55:
Que facil como te salio el segmentation fault, más fácil que el “hola edmundo”.

3owned.net dijo el 3-9-2009 a las 09:55:
QUEREMOS MAS PUNTEROS!!!!! (articulos referentes a.. con linux)

41Luisk. dijo el 3-9-2009 a las 09:56:
@Franco Catrin Excelentees tus notas!, empeze a leer todas tus notas y eres el unico que realmente explica y pone su argumento sobre la mesa, no como los otros weones que no cachan y solo le ponen copiar y pegar al traductor de google. XD

20Franco Catrin dijo el 3-9-2009 a las 10:02:
@Sergio
La falla existió en algún momento y fue solucionada.
Es distinto a fallas de seguridad por diseño del sistema, en donde la solución no es tan sencilla y no se puede realizar sin afectar la funcionalidad, ese es el caso de Windows.
Ahora, siendo justos, Windows cambió bastante después de graves incidentes de seguridad al comienzo de la decada, marcando un hito cuando enfocándose en solucionar el problema sacaron Service Pack 2 para Windows XP. Un montón de aplicaciones dejaron de funcionar, pero a la larga todos salieron beneficiados.

2leopard dijo el 3-9-2009 a las 10:03:
@Inkubot
noticias asi no pasan desapercibidas para algunos que somos de la vieja escuela
date una vuelta por mi blog…
salu2!
Ver Comentario... Suikakuyu dijo el 3-9-2009 a las 10:06 ...

5scatter dijo el 3-9-2009 a las 10:21:
C es el lenguaje mas cercano a la maquina despues de assembly….
De todas maneras, en el ejemplo que se dió, el puntero no está direccionado a cero puesto a que las variables locales no se inicializan a menos que se diga explicitamente, entonces el puntero p del ejemplo contiene basura informativa solamente y está apuntando a cualquier parte….pero no a 0.

7Franco Catrin dijo el 3-9-2009 a las 10:32:
@scatter y @ Suikakuyu
La discusión sobre si C es de bajo o alto nivel siempre se ha dado. Al menos yo lo considero cercano al bajo nivel por lo mismo que menciona scatter.
Sobre el ejemplo: La idea era mostrar un puntero no inicializado, ni siquiera puesto en null.
Como el programa es chico, la probabilidad de que apunte a un área no mapeada y por lo tanto de que de un segmentation fault es alta.

7Rodolfo dijo el 3-9-2009 a las 10:52:
Quiere null pointer?
int main(int argc, char *argv[]){
int *p;
p=0; // lorea que no es *p
}
Chan!

-5El Santa dijo el 3-9-2009 a las 10:52:
@Franco con los 2 segundos párrafos mataste al tercio de los lectores que aún piensa que para hacer una planilla “Excel” hay que ser informático.
El usuario medio va a quedarse con el preciso mensaje del último párrafo, si es que no sucumbe antes a la tentación de no seguir leyendo el artículo.
Gracias por subirle el pelo al FayerWayer, aunque a veces exageres un resto (MHO).

3ElAlecs dijo el 3-9-2009 a las 11:05:
De nuevo me hiciste entender algo complejo en un par de líneas, Franco gracias por tus aportaciones.

0zeta dijo el 3-9-2009 a las 11:09:
lo bueno que se prestan a dar soluciones, y es de ver lo importate para nosotros los desarrolladores de software es que jamas vamos a cubrir todas las necesidades, siempre hay bugs y es de gran programador reconocerlo. sino recuerden el problema de http://www.fayerwayer.com/2007/09/excel-2007-no-sabe-multiplicar-pero-aprendera/ como no puede hacer una simple mutiplicacion???
es a lo que estamos expuesto.
por cierto amigos programadores, no le ha pasado que cuando van a presentar el programa, ya sea tarea de la u o a un cliente, precisamente prueban donde hay mas problemas o algo que no hemos terminado o simplemente no sabiamos que estaba y se nos olvido ese bugs??? a mi me paso varias veces pero bueno…..

0Luis dijo el 3-9-2009 a las 11:18:
@Franco: dos cosas:
No creo que Brad Spengler solo sea un usuario
Que a partir de la divulgacion de este problema de seguridad ya se han hecho publico otros con similares caracteristicas, incluido un bug del kernel que data desde el 2001.
Luis

-3DeX dijo el 3-9-2009 a las 11:31:
Si ejecutas algo como root.. obviamente… cualquier cosa puede ser… cudiado con el rooto!!

4Franco Catrin dijo el 3-9-2009 a las 11:31:
@Marko
Es GNOME, de hecho ese es el GNOME Terminal
@Luis
En todo caso!
Un tema que no comenté fue lo que expresó Linus respecto a la mala idea de tener una lista “secreta” de seguridad, si se confían de ella entonces se pueden relajar y dejar pasar estos problemas… pero el artículo ya iba muy largo.
Ver Comentario... caca dijo el 3-9-2009 a las 11:35 ...

0zeta dijo el 3-9-2009 a las 11:38:
lo bueno que se prestan a dar soluciones, y es de ver lo importate para nosotros los desarrolladores de software es que jamas vamos a cubrir todas las necesidades, siempre hay bugs y es de gran programador reconocerlo. sino recuerden el problema de http://www.fayerwayer.com/2007/09/excel-2007-no-sabe-multiplicar-pero-aprendera/ como no puede hacer una simple mutiplicacion???

-3Cactoos dijo el 3-9-2009 a las 11:46:
que se preocupan de que sea o no perfecto pff…
Las cosas perfectas son sólo aquellas que llegaron a su máximo punto de desarrollo, por lo tanto son incapaces de evolucionar y mejorar. Por eso disfruto ser imperfecto, porque puedo mejorar. Igual linux. Dios es el único que jamás llegará a ser mejor de lo que es ahora.
Ver Todos Páginas: [1] 2 3 Próximos 30 Comentarios →
Ver Todos Páginas: [1] 2 3 Próximos 30 Comentarios →