Cómo explicar el desbordamiento de búfer a un lego

51

De vez en cuando (cuando pienso en voz alta y la gente me escucha) me veo obligado a explicar qué es un desbordamiento de búfer. Como realmente no puedo pensar en una buena metáfora, termino dedicando unos 10 minutos a explicar cómo funcionan los programas (vulnerables) y la asignación de memoria, y luego tengo aproximadamente 2 oraciones en el exploit real ("por lo que un desbordamiento de búfer llena el búfer". con sin sentido y sobrescribe el puntero para que apunte a lo que yo quiera que apunte a "). En este momento, la mayoría de las personas se han convertido en suicidas ... ¿Cuál es una buena manera de explicar un desbordamiento de búfer a los laicos? Si es posible, incluya un componente de "desbordamiento", pero también al menos una introducción a por qué esto significa que el atacante puede obtener lo que quiere. Recuerde, las personas de inteligencia promedio (y por debajo del promedio) deberían poder tener una idea de lo que estoy hablando, así que mientras usted debería sentirse absolutamente libre (alentador, en realidad) para explicar lo que representa cada parte de su metáfora (¿analogía?) , no confíe en ninguna descripción super-técnica ...

PS, una pregunta relacionada que explica en términos técnicos lo que hace el desbordamiento del búfer: ¿Qué es? un desbordamiento de búfer?

    
pregunta KnightOfNi 22.03.2014 - 00:57
fuente

7 respuestas

109

Imagina que tienes una lista de personas a quienes debes dinero.

Además,tienesunlápizextrañoconlíquidocorrectorincorporado,demodoquesiescribesalgoenunlugarenparticularyluegoescribesalgomás,seborraloprimeroqueescribiste.Asíescomofuncionalamemoriadelacomputadora,queesunpocodiferentedecómofuncionalaescritura.

Lepagaaalguienundepósitode$500enunautomóvilde$5000,porloqueahoraledebe$4500.TedicenquesunombreesJohnSmith.Escribalacantidad(4500)yelnombre(JohnSmith)enlatabla.Sumesaahoraseveasí:

Más tarde, tu mesa te recuerda que debes devolverlos. Usted paga $ 4500 (más intereses) y lo borra de la tabla, por lo que ahora su tabla está nuevamente en blanco.

Luego obtienes un préstamo de $ 1000 de otra persona. Te dicen que su nombre es "John Smithxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9999999999". Escribe la cantidad (1000) y el nombre (John Smithxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9999999999) en tu tabla. Su mesa ahora se ve así:

(elúltimo0de1000nosesobrescribió.Estonoesimportante)

Alescribirelnombre,noparócuandollegóalfinaldelacolumnade"nombre", ¡y siguió escribiendo en la columna de "cantidad adeudada"! Esto es un desbordamiento de búfer.

Más tarde, su tabla le recuerda que debe $ 99999999990 a John Smithxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. Lo encuentras de nuevo y le pagas casi 100 mil millones de dólares.

    
respondido por el immibis 22.03.2014 - 03:00
fuente
15

La idea de usar más espacio del que te dieron y, por lo tanto, extenderse a un campo diferente es lo suficientemente simple como para visualizarlo. Pero probablemente no esté claro cómo esto puede llevar a que un tipo malo ejecute su propio código.

Esto es bastante simple de explicar si lo entiendes lo suficientemente bien. Sólo asegúrese de golpear en el fondo importante. Más o menos en este orden:

  • La "pila" es un lugar donde puede almacenar información temporal. El "puntero de pila" determina dónde está el final de la pila. Cuando se ejecuta una función, mueve el puntero de la pila para darse memoria para trabajar, y cuando termina, mueve el puntero hacia atrás donde lo encontró.

  • La pila crece hacia atrás. Así que para darte 100 bytes en la pila, debes restar 100 del puntero de pila en lugar de agregarlo. Si la pila de la función anterior comenzó en 1000 y quiero 100 bytes, entonces mi pila comienza en 900.

  • Esto significa que si usa más espacio del que se dio a sí mismo, no solo continuará escribiendo en el espacio vacío, en realidad comenzará a sobrescribir los valores de pila anteriores.

  • Cuando mi función comienza, el valor más alto que me queda en la pila por la función anterior es la dirección de retorno a la que debo ir cuando termine mi función.

  • Esto significa que si mi función supera su pila, la primera cosa que se va a sobrescribir es la dirección de retorno. Si el atacante tiene cuidado con lo que llena la pila, puede especificar la dirección de retorno que desee.

  • Cuando existe mi función, el código que se encuentre en esa dirección de devolución es el que se ejecutará a continuación.

Ejemplo simple

En Smashing the Stack for Fun and Profit , donde esta técnica se describió originalmente, la más simple y directa Se introdujo la técnica. Imagina que la función lee tu nombre y luego regresa. Así que tu pila se ve así:

Stack Pointer                                      Prev. Stack Ptr
+----------------------------------+--------------+................
| Your Name Here                   | Return Addr  |  Old stack ...
+----------------------------------+--------------+................

Pero el chico malo hace que su nombre sea lo suficientemente largo como para desbordar el espacio. Y no solo eso, en lugar de escribir un nombre real, escribe algunos códigos de maldad, algunos rellenos y la dirección de ese código de maldad.

+----------------------------------+--------------+................
| [ Evil Code ]xxxxxxxxxxxxxxxxxxxxxxEvil Address |  Old stack ...
+----------------------------------+--------------+................
  ▲──────────────────────────────────┘

Ahora, en lugar de volver al interlocutor anterior, salta directamente al [Evil Code] . Ahora estás ejecutando su código en lugar de tu programa. A partir de ahí es casi un juego terminado.

Mitigación y otras técnicas

Dos de las técnicas utilizadas para reducir la efectividad de aplastar pilas son DEP y ASLR.

DEP ("Prevención de ejecución de datos") funciona marcando la pila como no ejecutable. Esto significa que el [Evil Code] en la pila no se ejecutará, porque ya no se permite ejecutar el código en la pila. Para evitar esto, el atacante encuentra trozos de código existente que hará fragmentos de lo que quiere. Y en lugar de solo sobrescribir su propia dirección de retorno, crea una cadena de direcciones de retorno a través de la pila para todas las funciones que quiere ejecutar por turno. Lo llaman "Programación Orientada al Retorno", o ROP. La cadena de devoluciones se llama "ROP Chain". Esto es muy difícil de hacer. Pero hay herramientas para ayudar.

ASLR ("Asignación aleatoria del diseño del espacio de direcciones") funciona al asignar al azar las ubicaciones de todas las funciones interesantes. Ahora, crear una cadena ROP no es tan fácil: cada vez que se ejecuta el programa, todas las direcciones están en diferentes lugares. Entonces, cuando el atacante sobrescribe la dirección de retorno con su propia Dirección del Mal, no sabrá qué números usar porque el código siempre está en diferentes lugares.

Ni el DEP ni el ASLR por sí solos ofrecen mucha protección, pero los dos juntos hacen que la explotación exitosa sea muy difícil. Aunque a veces existen algunas circunferencias, no hay una solución que funcione en todas partes . Si puede moverse por DEP + ASLR, es un éxito único.

    
respondido por el tylerl 22.03.2014 - 05:35
fuente
3

Intentaré esto sin usar ninguna analogía.

Una computadora es básicamente toda la memoria, esa es la parte importante, el contenido de la memoria son instrucciones que le dicen a la computadora qué hacer y datos que las instrucciones utilizan y pueden usar o modificar. Con frecuencia es necesario almacenar datos que tienen una longitud variable. Por ejemplo, si un programa tiene que mantener un registro de la dirección de correo electrónico de alguien que podría ser muy breve (a@b.com) o muy larga (first-name.middle-name.last-name@mycustomdomainname.co.uk). Algunos programas no hacen un seguimiento de la longitud máxima de sus registros de datos muy bien. Entonces, si un programa se diseñó con un máximo de, por ejemplo, 100 caracteres para una dirección de correo electrónico y alguien le dio una dirección de correo electrónico con más de 100 caracteres, el programa simplemente continuará escribiendo el resto de la dirección en la memoria después del final de su pre Espacio asignado. La parte importante a recordar es que la memoria lo es todo, el programa en sí está en la memoria justo al lado de los registros de datos.

Alguien que supiera exactamente cómo funcionaba este programa podría darle una dirección de correo electrónico muy cuidada que era muy larga y tenía caracteres especiales al final. La idea es que cuando el programa almacenó la dirección de correo electrónico en la memoria, escribiría ciegamente esos caracteres especiales en una parte de la memoria donde el programa creía que estaban otras partes de sí mismo, y luego, cuando iba a ejecutar esas partes, en cambio ejecutaría cualquier Programar los caracteres especiales traducidos en código de computadora. De esa manera, sería posible que alguien consiguiera que la computadora ejecutara lo que quisiera, simplemente elaborando los datos que le dieron al programa.

    
respondido por el Wedge 24.03.2014 - 15:37
fuente
2

Las otras respuestas son todavía bastante técnicas, así que estoy ofreciendo esto.

Imaginemos que tienes una clase de jardín de infantes. Hay agujeros de cubículo para que cada estudiante ponga sus zapatos. Cada agujero de cubículo contiene un zapato. Por lo tanto, para cada alumno, proporciona dos agujeros para cubículos.

A cada estudiante se le asignan dos agujeros adyacentes. Luego, el maestro llama a los alumnos al azar para que coloquen sus zapatos en los huecos de los cubículos a los que están asignados.

Cuando el maestro llama a Bad Billy , Bad Billy quiere meterse con Stupid Sally . Los huecos de Billy son los números 5 y 6 y Sally's son los números 7 y 8 . Billy coloca sus programas en 5 y 6 y luego desborda su límite definido y coloca un sapo viscoso en el número de cubby de Sally 7 .

Debido a que el profesor no está aplicando ninguna protección en el límite definido para el uso de agujeros de cubículo en el orden adyacente, Billy puede desbordar su límite y desordenar el almacenamiento de Sally . Ahora, cuando Sally va a buscar su zapato, obtendrá un sapo viscoso en lugar de yuck!

+-------------------+--------------------+-------------------+--------------------+
|      CUBBY 5      |       CUBBY 6      |      CUBBY 7      |       CUBBY 8      |
+-------------------+--------------------+-------------------+--------------------+
|                   |                    |                   |                    |
| Billy's Left Shoe | Billy's Right Shoe | Sally's Left Shoe | Sally's Right Shoe |
+-------------------+--------------------+-------------------+--------------------+

Billy ingresa tres elementos donde se define que solo debe poner 2, así es como funciona un desbordamiento de pila en un nivel alto, alguien está jugando con el almacenamiento para el cual no está autorizado y luego cuando se lee ese almacenamiento, no es lo que esperabas.

+-------------------+--------------------+------------+--------------------+
|      CUBBY 5      |       CUBBY 6      |   CUBBY 7  |       CUBBY 8      |
+-------------------+--------------------+------------+--------------------+
|                   |                    |            |                    |
| Billy's Left Shoe | Billy's Right Shoe | Slimy Toad | Sally's Right Shoe |
+-------------------+--------------------+------------+--------------------+

Se podría haber evitado un desbordamiento de búfer si el maestro prestara más atención y se asegurara de que cada estudiante solo usara la cantidad de almacenamiento que se esperaba.

    
respondido por el Eric G 22.03.2014 - 16:48
fuente
1

Buena pregunta. Aquí hay una analogía que no es la más precisa técnicamente, pero debería transmitir la idea.

Imagine un libro de recetas en papel perforado de 3 orificios en una carpeta (memoria) y un cocinero muy tonto (el procesador, es decir, la CPU).

  • Las personas pueden agregar o eliminar páginas del cuaderno (cargar o descargar programas y datos en la memoria)
  • El cocinero simplemente sigue todas las instrucciones de la página en la que están
  • El cocinero comienza desde el principio (gestor de arranque) y continúa hasta que la instrucción es "cerrar libro"
    • Incluso si la instrucción es pasar a otra página (pase a la página 394)

Entonces, normalmente, escribiría en la página uno "Pasar a la página 200 (waffles)", abriría la carpeta y colocaría waffles en la página 200. Luego, ¡comience la cocción - la cocinera debería hacer waffles!

Pero espera ... hay un atacante! Escribieron notas en los márgenes de su receta de waffles (fuera del búfer), y el cocinero ejecuta esas instrucciones a pesar de que obviamente están escritas a mano.

Nunca se le dijo a la cocinera que solo hiciera lo que está impreso en la hoja original (en el espacio normal del búfer); después de eso, la cocinera también hará cualquier cosa (en la memoria después del búfer).

Quizás el cocinero agregue vinagre a los wafles (corrompe sus archivos). Tal vez el cocinero pasa a la página trescientos noventa y cuatro y simplemente deja el huevo crudo allí, sin usar, hasta que se pudre y se descompone (desactiva el antivirus). Tal vez el cocinero tira todo en la cocina (borra todos los archivos), o cierra la puerta de la cocina para mantenerlo alejado (ransomware), o abre la ventana (instala un troyano / puerta trasera) para que el atacante pueda subir al ventana.

    
respondido por el Anti-weakpasswords 22.03.2014 - 03:07
fuente
1

Siempre lo explico como reventar un cubo. El depósito está allí para proteger el contenido desde el exterior y viceversa, pero está utilizando el contenido para llegar al exterior del depósito y, por lo tanto, acceder a áreas del sistema a las que de otra forma no debería tener acceso.

    
respondido por el David 24.03.2014 - 20:36
fuente
0

¿Qué tal esto?

Los datos en una computadora se almacenan como una larga lista de números, como las pistas en un cassette de música. A diferencia de la música, que se reproduce desde el principio hasta el final, las computadoras deben saltar de una pista a otra, por lo que necesitan una "lista de canciones" para decirles dónde comienza cada una.

Las listas de pistas son fáciles para la música, ya que cada canción tiene una longitud conocida. Con una computadora, la cantidad de datos que necesitamos almacenar puede que aún no se conozca, por ejemplo, si proviene de Internet. Si la pista que estamos usando se llena, necesitamos cambiar a una diferente, sin usar. Si no lo hacemos, por ejemplo, si asumimos erróneamente que nunca recibiremos más de una cierta cantidad de datos, podríamos usar demasiada cinta y "grabar sobre" la siguiente pista. Cuando un programa intenta leer la siguiente pista, recuperará parte de nuestros datos en lugar de lo que había antes.

Esto puede ser peligroso, porque los datos sobrescritos pueden haber sido un conjunto de instrucciones para llevar a cabo. Si es así, ¡la computadora ahora llevará a cabo las instrucciones descargadas directamente de Internet!

    
respondido por el Warbo 24.03.2014 - 15:53
fuente

Lea otras preguntas en las etiquetas