¿CVE-2016-2324 permitió la ejecución remota de código?

5

Digamos que tengo este tipo de código :

// In revision.c
char *path_name(const struct name_path *path, const char *name) // by design, name_path->len is a 32 bits int, but this doesn’t concern name
{
      const struct name_path *p;
      char *n, *m;
      int nlen = strlen(name); // the size is converted to a positive number (the correct size was allocated previously with an unsigned long). I got 705804100
      int len = nlen + 1;

      for (p = path; p; p = p->up) { //loop is skipped (except in another case fixed since 2.7.1)
          if (p->elem_len)
              len += p->elem_len + 1;
      }
      n = xmalloc(len); // if len is negative, it will also be converted to a negative 64 bits integer *(which explains it is normally trying to allocate serveral Pb of ram most of the time)* which will be read as positive after that. // but this isn’t the run case that is interesting here.
      m = n + len - (nlen + 1); // the size of m is lower than name
      strcpy(m, name); // strcpy rely on the null terminating character. The result is written in an unallocated memory from heap. This is the definition of heap overflow enabling server side remote code execution if name[] contains assembly, and have the correct size. This open the way to defeat canaries aslr, and nx combined see http://security.stackexchange.com/q/20497/36301#comment182004_20550
      for (p = path; p; p = p->up) {
          if (p->elem_len) {
              m -= p->elem_len + 1;
              memcpy(m, p->elem, p->elem_len);
              m[p->elem_len] = '/';
          }
      }
      return n;
}

¿Podría haber un caso en el que el sistema permita que se produzca el desbordamiento mientras se mantiene completamente cerrada la ruta a la ejecución remota de código?

Una ruta creada en una base de datos git (un árbol git) debe contener código binario para realizar la ejecución remota del código. Sin embargo, una ruta no puede contener el nul byte (ya que se usa como un delimitador en un árbol git) .

Si se necesita un caso específico , es Ubuntu con linux versión < 3.16 y todas las protecciones de seguridad habilitadas (me refiero a nx aslr y dep combinados pero los canarios exceptuados) . La arquitectura es x86_64 . libc es una versión antigua de (pero con parche de seguridad) de glibc .

Actualización:

Ahora, crear una prueba debería ser más fácil .

    
pregunta user2284570 25.02.2016 - 21:09
fuente

3 respuestas

7

Un desbordamiento de búfer (del tipo de "escritura") le brinda alguna ventaja a un atacante solo si el atacante puede organizar que el desbordamiento se derrame sobre otros bytes que se utilizan para otra cosa. En cualquier momento, el proceso se ejecuta en un espacio de direcciones , la mayoría de los cuales no están asignados. Si el búfer que se desborda se encuentra al final del espacio de direcciones, o está seguido solo por bytes no utilizados, entonces una página no asignada, entonces el desbordamiento no ayudará al atacante.

Recuerdo un caso con la herramienta de línea de comandos rlogin en SunOS 4.1.4 (sistemas sparc). Fue root suid, y podría hacer que segfault si la variable de entorno TERM contenía una cadena de más de 64 caracteres. Sin embargo, el búfer desbordado estaba al final de la sección de datos, y no había nada más allá de eso para sobrescribir.

No obstante, tenga en cuenta que malloc() puede usar bytes adicionales antes y después de cada bloque asignado para realizar un seguimiento de los bloques asignados. Dependiendo de la implementación de malloc() , la modificación de estos bytes puede o no ayudar al atacante. La conclusión es que, si bien no se pueden explotar algunos desbordamientos de búfer, por lo general es muy difícil asegurarse de que no se pueda explotar un desbordamiento de búfer. Es más seguro suponer que cualquier desbordamiento de búfer puede llevar a consecuencias drásticas y no permitir que ocurran en absoluto.

    
respondido por el Thomas Pornin 25.02.2016 - 21:19
fuente
1

No todos los desbordamientos de búfer conducen a la ejecución remota de código. Depende de cómo se asigna el búfer, y si el puntero de la instrucción puede ser controlado por el atacante. Hay muchos factores que influyen en la posibilidad o no de la ejecución remota de código.

    
respondido por el RoraΖ 25.02.2016 - 21:15
fuente
0

Usos de Ubuntu data protección de ejecución . Esto detiene el código que se está ejecutando desde la memoria en la parte de datos del proceso. Esto efectivamente hará que el código inyectado a través de un desbordamiento de búfer sea imposible de ejecutar. Entonces el desbordamiento puede ocurrir aunque la ejecución no puede. Técnicas como ROP se utilizan para solucionar el problema de DEP.

    
respondido por el Neil Smithline 25.02.2016 - 21:17
fuente

Lea otras preguntas en las etiquetas