¿Cómo pueden ser dañinos los desbordamientos de búfer en Android?

17

¿Cómo pueden los desbordamientos de búfer ser potencialmente peligrosos en Android?

Específicamente, si cada aplicación tiene su propia identificación de usuario y se está ejecutando en una copia de Dalvik VM que tiene la misma identificación. Pensé que incluso si ocurre un desbordamiento, el código de shell escrito en la página mem de la aplicación solo tendrá los mismos privilegios que la aplicación en sí.

    
pregunta shura 23.08.2016 - 15:45
fuente

5 respuestas

20

Tomemos Stagefright, por ejemplo, la biblioteca de medios escrita en C ++

La manera en que los desbordamientos evitan los privilegios asignados es simple; El código C puede escribir directamente en la memoria. Es tu trabajo como desarrollador asegurarte de que encajas, de lo contrario, escribirá felizmente sobre otras instrucciones del mismo privilegio. Stagefright tiene muchos privilegios. Y la información que fluye fuera del búfer podría ser un video cat aleatorio de Internet (que a su vez, gana los privilegios de la biblioteca de medios)

Por lo tanto, sería ingenuo asumir que los desbordamientos no son perjudiciales. Stagefright contenía desbordamientos de búfer y esto es extremadamente peligroso. Los desarrolladores de Android han hecho más difícil la explotación al implementar (entre otras medidas) la aleatorización del diseño del espacio de direcciones (ASLR), lo que hace que las compensaciones sean impredecibles, causando un error en lugar de la ejecución del código. Pero al combinar esto con las vulnerabilidades del navegador, se puede filtrar información sobre la ubicación actual de las páginas de memoria, por lo que aún es posible la ejecución del código.

Recomendaría leer Metaphor, una implementación de Stagefright que incluye bypass ASLR, el documento y el código PoC están disponibles en línea

    
respondido por el J.A.K. 23.08.2016 - 16:46
fuente
9

Permítame parafrasear la pregunta de la operación: ¿Android tiene un modelo de aislamiento de aplicación basado en identificación de usuario y cómo podría el desbordamiento evitarlo?

La respuesta es que se desbordan las partes que se comparten entre las aplicaciones: servicios, aplicaciones del sistema y el propio kernel de Linux. Muchos de estos componentes están escritos en C / C ++, por lo que son vulnerables.

Esto es efectivamente cómo haces la escalada de privilegios en todos los sistemas multiusuario y Android no es nada especial.

    
respondido por el billc.cn 23.08.2016 - 17:12
fuente
2
  

Pensé que incluso si ocurre un desbordamiento, el Shellcode escrito en la página mem de la aplicación solo tendrá los mismos privilegios que la aplicación en sí.

A menos que el desbordamiento esté en el kernel o en algo expuesto a través de la comunicación entre procesos (android proporciona muchas cosas como servicios), sí.

Sin embargo, tenga en cuenta que las tres aplicaciones clave: mensajería, correo electrónico y navegador, tienen muchos privilegios. Suficiente para robar algunos datos privados importantes. Estas aplicaciones también son las que interpretan contenido externo no confiable. Por lo tanto, depende de estas aplicaciones asegurarse de que el contenido externo (como las páginas web) no pueda usar los permisos que no debería.

Estas aplicaciones también ejecutan una gran cantidad de códigos C o C ++ potencialmente vulnerables, ya que la interpretación de parte del contenido (especialmente el video y el javascript) requiere un uso intensivo de la CPU y la memoria hasta el punto de la JVM (la JVM de Android es inferior al escritorio uno) no está a la altura de la tarea, y también antes de que el código se reutilice desde otras plataformas. Las vulnerabilidades en este código son la causa de la mayoría de los ataques graves.

    
respondido por el Jan Hudec 23.08.2016 - 21:27
fuente
1

No soy un experto en seguridad de Android, pero creo que puedo responder la pregunta, digamos, para un escenario de Apache / Linux y creo que también existen amenazas equivalentes para Android (dejemos de lado la pregunta por el momento si es posible que se produzcan desbordamientos de búfer en Android o no).

  1. Un desbordamiento de búfer permite a un atacante inyectar código en la memoria de un proceso en ejecución. Por lo general, el atacante intentaría inyectar un código que inicie un shell (/ bin / bash, por ejemplo) que envía su salida estándar a su caja de ataque remoto y recibe la entrada estándar de esa caja. El resultado es una ventana de terminal en la computadora del atacante, pero el proceso de shell se ejecuta en el cuadro atacado. Ahora, como dices en Android, el proceso se ejecuta en el espacio del usuario. Lo mismo es cierto para un escenario de servidor web normal en Linux. Es decir. inyecta código en una memoria de proceso cuyo propietario no tiene muchos privilegios (www-data o apache no son potentes en Linux). En este momento, solo puede realizar acciones de forma remota desde la casilla de su atacante que el usuario está autorizado a realizar en el sistema operativo. En Linux, esto es bastante limitado y como dices en Android también.
  2. El siguiente paso que apunta un atacante es una escalada de privilegios. Es decir. encuentre otra falla en el sistema operativo / lo que le permita salir del tipo de "caja de arena" en el que está atrapado. Hay cientos / miles de errores en Windows / Linux / lo que permite la escalada de privilegios de un usuario limitado a Raíz / Administrador (contabilizado en los últimos 15 años). Para Android, esto significa que necesitaría encontrar un error de este tipo en el sistema operativo Android que le permita salir del espacio del usuario. Dado que la perfección no existe en este mundo, probablemente existan Bugs que permiten hacerlo. Solo depende de su tiempo y energía, ya sea que los encuentre o no.
  3. ¿Pueden existir desbordamientos de búfer en Android? Por supuesto, ellos pueden. Android está escrito en C como la mayoría de los sistemas operativos. Cada proveedor de telefonía trae su propio sabor del sistema operativo, así que, ¿qué le da la certeza de que ningún desarrollador de Samsung / LG / cualquier otro introduce una falla en el código? En la interfaz entre Java y C, la parte C aún debe realizar una verificación de límites adecuada, de lo contrario, aún sobrescribirá la memoria. Sin embargo, como desarrollador de aplicaciones, ya no tiene que preocuparse por este problema porque no es posible escribir directamente en direcciones de memoria en Java.
respondido por el kaidentity 23.08.2016 - 17:16
fuente
0

Digamos que inyectaste tu código en un proceso. Ahora puedes:

  • Lío con los datos y permisos accesibles para el proceso (robe los detalles de su cuenta de la aplicación, acceda a sus imágenes si la aplicación tiene los permisos, publique un mensaje de Twitter en su nombre si la aplicación atacada fue Twitter, ...)
  • Use un ataque de escalado de privilegios para obtener privilegios más altos
  • A veces, partes de la aplicación (especialmente las bibliotecas de medios) se ejecutan con privilegios más altos. Si los atacas, puedes obtener privilegios más altos. Stagefright usó esto si recuerdo correctamente.
  • Ataca otra aplicación / proceso en el teléfono (también los que no son accesibles de forma remota) y repite todo hasta que alcances tu objetivo

Así que incluso si (inicialmente) solo puedes acceder a tu propio espacio de dirección, tienes muchas posibilidades.

Para aclarar: el proceso de la aplicación se está ejecutando con el ID de usuario. El proceso podría ser la máquina virtual Dalvik. También puede ser código nativo usando el NDK de Android escrito en C / C ++. Esto se usa a menudo en bibliotecas de medios, juegos y funcionalidad de sistema operativo de bajo nivel.

En general, solo las vulnerabilidades críticas de bufferoverflow se tratan en los medios, son solo una pequeña parte de todas las vulnerabilidades.

    
respondido por el H. Idden 24.08.2016 - 10:21
fuente

Lea otras preguntas en las etiquetas