Detección de patrones de acceso de ruta inseguros con PathAuditor


#! / bin / sh
gato / hogar / usuario / foo

¿Qué puede salir mal si este comando se ejecuta como root? ¿Cambia algo si foo es un enlace simbólico a / etcetera / shadow? ¿Cómo se va a utilizar la salida?

Dependiendo de las respuestas a las preguntas anteriores, acceder a los archivos de esta manera podría ser una vulnerabilidad. La vulnerabilidad existe en syscalls que operan en rutas de archivos, como open, rename, chmod o exec. Para que una vulnerabilidad esté presente, parte de la ruta debe ser controlada por el usuario y el programa que ejecuta la llamada al sistema debe ejecutarse en un nivel de privilegio más alto. En una posible explotación, el atacante puede sustituir la ruta de un enlace simbólico y crear, eliminar o ejecutar un archivo. En muchos casos, es posible que un atacante cree el enlace simbólico antes de ejecutar la llamada al sistema.

En Google, hemos estado trabajando en una solución para encontrar estos problemas potencialmente problemáticos a escala: PathAuditor. En esta publicación de weblog, describiremos el problema y explicaremos cómo puede evitarlo en su código con PathAuditor.

Echemos un vistazo a un ejemplo del mundo authentic. los tmpreaper La utilidad contenía el siguiente código para verificar si un directorio es un punto de montaje:
if ((dst = malloc (strlen (ent-> d_title) + 3)) == NULL)
mensaje (LOG_Fatal, «malloc falló. n»)
strcpy (dst, ent-> d_identify)
strcat (dst, «/ X»)
rename (ent-> d_title, dst)
if (errno == EXDEV) {
(…)

Este código llamará a renombrar («/ tmp / usuario / controlado», «/ tmp / usuario / controlado / X»). Bajo el capó, el núcleo resolverá la ruta dos veces, una para el primer argumento y otra para el segundo, luego realizará algunas comprobaciones si el cambio de nombre es válido y finalmente intentará mover el archivo de un directorio a otro.

Sin embargo, el problema es que el usuario puede competir con el código del kernel y reemplazar el «/ tmp / consumer / command» con un enlace simbólico entre las dos resoluciones de ruta.

Un ataque exitoso se vería más o menos así:

  • Convierta «/ tmp / consumer / handle» en un archivo con contenido controlado.
  • El núcleo resuelve esa ruta para que el primer argumento cambie el nombre () y ve el archivo.
  • Reemplace «/ tmp / consumer / control» con un enlace simbólico a / and so forth / cron.
  • El núcleo resuelve la ruta nuevamente para el segundo argumento y termina en / and many others / cron.
  • Si los directorios tmp y cron están en el sistema de archivos, el núcleo moverá el archivo controlado por el atacante a / etc / cron, lo que conducirá a la ejecución del código como root.

¿Podemos encontrar tales errores a través del análisis automatizado? Pues sí y no. Como se muestra en el ejemplo de tmpreaper, la explotación de estos errores puede requerir un poco de creatividad y, en primer lugar, depende del contexto si son vulnerabilidades. El análisis automatizado puede descubrir instancias de este patrón de acceso y recopilará tanta información como sea posible para ayudar con futuras investigaciones. Sin embargo, también producirá naturalmente falsos positivos.

No podemos saber si una llamada para abrir (/ person / command, O_RDONLY) es una vulnerabilidad sin mirar el contexto. Depende de si el contenido se devuelve al usuario o si se united states of america de alguna manera reasonable a la seguridad. Una llamada a chmod (/ usuario / controlado, modo) dependiendo del modo puede ser un DoS o una escalada de privilegios. Acceder a archivos en directorios fijos (como / tmp) puede convertirse en vulnerabilidades si el atacante encuentra un mistake adicional para eliminar archivos arbitrarios.

Cómo funciona Pathauditor

Para encontrar problemas como este a escala, escribimos PathAuditor, una herramienta que supervisa los accesos a archivos y registra posibles vulnerabilidades. PathAuditor es una biblioteca compartida que se puede cargar en procesos usando LD_PRELOAD. Luego conecta todas las funciones de libc relacionadas con el sistema de archivos y comprueba si el acceso es seguro. Para eso, recorremos la ruta y verificamos si algún componente podría ser reemplazado por un usuario sin privilegios, por ejemplo, si un directorio es editable por el usuario. Si detectamos dicho patrón, lo registramos en syslog para su análisis guide.

Aquí le mostramos cómo puede usarlo para encontrar vulnerabilidades en su código:

  • LD_PRELOAD la biblioteca a su binario y luego analice sus hallazgos en syslog. También puede agregar la biblioteca a /and many others/ld.so.preload, que la precargará en todos los archivos binarios que se ejecutan en el sistema.
  • Luego reunirá el PID y la línea de comando del proceso de llamada, los argumentos de la función vulnerable y un seguimiento de la pila esto proporciona un punto de partida para una mayor investigación. En este punto, puede usar el seguimiento de la pila para encontrar la ruta del código que desencadenó la violación y analizar manualmente lo que sucedería si señalara la ruta a un archivo o directorio arbitrario.
  • Por ejemplo, si el código abre un archivo y devuelve el contenido al usuario, puede usarlo para leer archivos arbitrarios. Si controla la ruta de chmod o chown, es posible que pueda cambiar los permisos de los archivos elegidos, and so forth.

PathAuditor ha tenido éxito en Google y estamos entusiasmados de compartirlo con la comunidad. El proyecto aún está en las primeras etapas y estamos trabajando activamente en él. Esperamos con interés escuchar cualquier vulnerabilidad que descubra con la herramienta, y esperamos ver solicitudes de extracción con mejoras adicionales.

Pruebe la herramienta PathAuditor aquí.


Marta Rożek fue pasante de Google Summer season en 2019 y contribuyó a este blog y a la herramienta PathAuditor




Enlace a la noticia initial