it-swarm-es.com

¿Debería molestarme más en enseñar desbordamientos de búfer?

Los estudiantes son escépticos de que apagar pilas no ejecutables, apagar canarios y apagar ASLR represente un ambiente realista. Si PaX, DEP, W ^ X, etc., son efectivos para detener las vulnerabilidades de desbordamiento del búfer, ¿todavía hay valor en conocerlos?

44
Fixee

Absolutamente. ASLR y DEP son medidas de defensa en profundidad. Existen exploits que pueden pasar por alto a cada uno de ellos (para un ejemplo del mundo real, mira el exploit Pwn2Own de Peter Vreugdenhil que usó contra IE ).

Todo lo que necesita para evitar ASLR para Windows es una vulnerabilidad de divulgación de información que le permitirá conocer la dirección base de un DLL cargado en el proceso) (esa fue la primera vulnerabilidad que Vreugdenhil explotó). , puede usar un ataque ret-to-libc para llamar a cualquier función en esa DLL.

El resultado final: los desbordamientos de pila (y montón) siguen siendo absolutamente relevantes hoy en día. Son más difíciles de explotar de lo que solían ser, pero siguen siendo relevantes.

Además de las excelentes respuestas concisas de @ Larry y @ SteveS, quiero señalar un punto muy importante:

Los estudiantes son escépticos de que apagar pilas no ejecutables, apagar canarios y apagar ASLR represente un ambiente realista.

Esperemos que esto sea cierto para los sistemas de sus alumnos.
En el resto del mundo, sin embargo, esto todavía es muy común, desafortunadamente. Además de las plataformas que no son compatibles con estos, siempre hay productos mal construidos que requieren apagarlos, versiones anteriores del sistema operativo e incluso malas configuraciones incorrectas.
Todavía muy realista, tristemente.

Además de todo eso, 2 comentarios más de un punto de vista educativo:
1. alguien tiene que construir esas defensas, ¿verdad?
2. Incluso si hipotéticamente tenían razón - you only need pointers in C/C++ no significa un Java desarrollador no debería aprender cómo estas cosas funcionan, dentro de la computadora, ¿verdad?

18
AviD

Si. Además de los sistemas donde los desbordamientos del búfer conducen a exploits exitosos, las explicaciones completas sobre los desbordamientos del búfer son siempre una excelente manera de demostrar cómo debe pensar en la seguridad. En lugar de concentrarse en cómo debe ejecutarse la aplicación, vea qué se puede hacer para que la aplicación se descarrile.

Además, independientemente de la ejecución de la pila y de cuántos canarios gritando instales, un desbordamiento de búfer es un error. Todas esas características de seguridad simplemente alteran el consecuencias del error: en lugar de un Shell remoto, "simplemente" obtiene un bloqueo inmediato de la aplicación. No preocuparse por los bloqueos de la aplicación (en particular, los bloqueos que se pueden activar de forma remota) es, en el mejor de los casos, una programación muy descuidada. No en mi reloj!

Para completar, las pilas no ejecutables y los canarios no evitan los desbordamientos del búfer; simplemente cortaron algunas de las formas fáciles de explotar los desbordamientos del búfer. El desbordamiento del búfer tradicional consiste en reemplazar la dirección de retorno con un puntero al código malicioso que se carga como parte de los datos que desbordaron el búfer; el código malicioso se ejecuta cuando vuelve la función. La pila no ejecutable significa que el atacante no podrá colocar su código en la pila (tendrá que organizar un salto a algún código de biblioteca, por ejemplo, la implementación execve() en la biblioteca estándar). El canario evita que se use la dirección de retorno si se desbordó un búfer de pila (suponiendo que el desbordamiento sea "simple": una porción contigua de datos). Pero el desbordamiento también puede sobrescribir algunos otros datos, incluidos los punteros de función (en particular en el contexto de C++).

17
Thomas Pornin

Absolutamente. No debería ser suficiente que sepan que estas son soluciones al problema, deben saber cómo y por qué son soluciones al problema.

Además, no todas las plataformas admiten estas tecnologías.

10
Steve

Me gustaría responder desde el punto de vista de un estudiante que recientemente comenzó a aprender en profundidad sobre los ataques de desbordamiento de búfer. Yo también tenía las mismas preocupaciones y tenía dudas sobre los beneficios de aprender acerca de los ataques de desbordamiento del búfer, pero teniendo en cuenta lo mucho que he aprendido para llegar al fondo, estoy muy contento de haber elegido hacerlo.

Hasta ahora he tenido que:

  1. Learn x86 Assembly - principalmente basado en Ubuntu
  2. Aprende algo de programación en C
  3. Conviértete en un ninja con gdb
  4. Comprender el código de Shell
  5. Busque todos los foros de seguridad de TI que pueda y aprenda el proceso de hacer que los sistemas operativos/software sean más seguros

Estas habilidades son muy transferibles y no me arrepiento. Desafortunadamente, no tengo a alguien que me enseñe esto. Tuve que lidiar con tutoriales en video y códigos de ejemplo para mi proyecto de maestría. Los ataques de desbordamiento de búfer pueden ser menos preocupantes para la seguridad de TI que hace 5-10 años, pero definitivamente pueden servir como un trampolín para aprender sobre amenazas más complejas o contemporáneas.

7
SunnyNewb

Ya hay excelentes respuestas aquí, así que no intentaré volver a cubrirlas. Sin embargo, dado que estamos hablando de mecanismos que evitan el desbordamiento del búfer, me gustaría enfatizar algo que le gustaría transmitir a sus alumnos:

El hecho de que un programa esté escrito en Java no no significa que no hay desbordamientos del búfer. El Java La máquina virtual en sí no está implementada en Java; está implementada en (probablemente) C o C++, que son tan propensas a desbordamientos de búfer como cualquier otro programa.

Además de eso hay muchas implementaciones de la JVM . Por cada uno que arregles, hay diez más que probablemente sigan siendo vulnerables.

Espero no tropezar con mi caja de jabón ... :-)

7
Jeremy Powell

No, no enseñe desbordamientos de búfer. Enseñar corrupción de memoria. Enseñar a explotar primitivas. Sí, también necesitan conocer la historia, pero no debería ocupar más de la mitad de la clase. Cuando se trata de la tarea real, les digo que les den desafíos que tengan todas las protecciones de memoria habilitadas, pero que tal vez debiliten al servidor vulnerable, con algunas revelaciones de memoria que dan pistas sobre varias compensaciones.

También deben comprender que muchas protecciones de memoria son en su mayoría trucos, y muchas veces las "compensaciones aleatorias" no son realmente tan aleatorias como podría pensar que son. Deben aprender a reconocer los errores y utilizar los errores que tienen para detectar las cosas que saben, de modo que puedan llegar a las cosas que desean.

Deberían pensar en términos de sobrescribir punteros de función en lugar de direcciones de retorno, y saltar al código ejecutable conocido (ret2libc, ROP) en lugar de saltar al shellcode en la pila/montón.

3
pierce

Siendo un estudiante universitario recién salido de una clase de C++, sí, sé que no es lo mismo ... pero mi profesor se aseguró de poner un énfasis adicional en la enseñanza sobre desbordamientos de búfer y cómo prevenirlos, y realmente te animo a que continúes enseñando sobre el búfer se desborda en cualquier curso que enseñe programación. No puede hacerles daño hacerlo.

1
Todd-ProNoob