Exploit de iMessage zero-click

Hacking 10 de may. de 2022

Una obra de la ingeniería informática‌‌

NSO Group es una empresa de tecnología israelí cuyo spyware mas conocido y destacado es Pegasus, que permite la vigilancia remota de Smart phones. Es muy difícil encontrar los exploits de Pegasus, pero gracias a una activista saudí, Citizen Lab (laboratorio de investigación y desarrollo en la intersección del ciberespacio, la seguridad global y los derechos humanos) pudo recuperar exploits zero-click iMessage desde un iPhone.

¿Qué es un zero-click exploit?

En un escenario de zero-click no es necesario ninguna interacción, lo que significa que el atacante no necesita hacer ataques de phishing, el malware se podrá instalar en el dispositivo sin que la víctima haga clic en ningún enlace y el exploit trabajara silenciosamente, a no ser que no uses un dispositivo no hay forma de evitar un zero-click exploit.

¿Cómo se pudo crear este exploit?

iMessage, el servicio de mensajería instantánea desarrollado por Apple, permite a sus usuarios enviar gifs, las imágenes animadas típicamente pequeñas y de baja calidad populares en la cultura meme, Apple quería hacer que esos GIF se reprodujeran sin cesar en lugar de reproducirlos solo una vez, por lo que después de recibir un mensaje pero mucho antes de que se muestre, iMessage llama al siguiente método en el proceso IMTranscoderAgent (fuera de la sandbox "BlastDoor"), pasando cualquier archivo de imagen recibido con la extensión .gif. Pegasus utiliza "fake gif", un pdf disfrazado de gif para atacar una vulnerabilidad en el CoreGraphics PDF parser. Es cierto que se puede ejecutar código JavaScript en archivos pdf pero no en CoreGraphics PDF parser, a pesar de eso, Pegasus encontró una forma.

JBIG2
Es un estándar de compresión de imágenes lanzado en los años 2000. Al usar scan to pdf se producen unos archivos muy pequeños llegando a pesar unos cuantos kilobytes.

The vulnerability

La vulnerabilidad es un clásico integer overflow al comparar y examinar segmentos referenciados en el formato JBIG2

  Guint numSyms; // (1)
  numSyms = 0;
  for (i = 0; i < nRefSegs; ++i) {
    if ((seg = findSegment(refSegs[i]))) {
      if (seg->getType() == jbig2SegSymbolDict) {
        numSyms += ((JBIG2SymbolDict *)seg)->getSize();  // (2)
      } else if (seg->getType() == jbig2SegCodeTable) {
        codeTables->append(seg);
      }
    } else {
      error(errSyntaxError, getPos(),
            "Invalid segment reference in JBIG2 text region");
      delete codeTables;
      return;
    }
  }
...
  // get the symbol bitmaps
  syms = (JBIG2Bitmap **)gmallocn(numSyms, sizeof(JBIG2Bitmap *)); // (3)
  kk = 0;
  for (i = 0; i < nRefSegs; ++i) {
    if ((seg = findSegment(refSegs[i]))) {
      if (seg->getType() == jbig2SegSymbolDict) {
        symbolDict = (JBIG2SymbolDict *)seg;
        for (k = 0; k < symbolDict->getSize(); ++k) {
          syms[kk++] = symbolDict->getBitmap(k); // (4)
        }
      }
    }
  }

numSyms es un entero de 32 bits declarado en (1). Al proporcionar segmentos de referencia cuidadosamente elaborados es posible que la adición repetida en (2) provoque que numSyms se desborde a un valor pequeño y controlado.

Ese valor más pequeño se usa para el tamaño de asignación de almacenamiento dinámico en (3), lo que significa que syms apunta a un búfer de tamaño insuficiente.

Dentro del bucle más interno en (4), los valores del puntero JBIG2Bitmap se escriben en el búfer de sims de tamaño inferior.

Una vista simplificada del diseño de la memoria, que muestra el búfer de tamaño insuficiente debajo del búfer de respaldo GList y el JBIG2Bitmap

El PDF está construido para explotar esta vulnerabilidad en el formato JBIG2 para preparar la memoria y tomar el control de la ejecución y al ser construido cuidadosamente se puede aplicar AND, OR, XOR y XNOR entre regiones de memoria, con estos operadores lógicos se puede calcular cualquier función computable.

JBIG2 no puede ejecutar comandos, pero cuando lo combinamos con esta vulnerabilidad, tiene la capacidad de emular circuitos de puertas lógicas que operan en la memoria. Entonces ¿por qué no construir tu propia arquitectura de computadora y usar eso? Bueno, eso es exactamente lo que hace, utilizando 70000 segmentos de comandos con operadores lógicos crea una pequeña computadora para ejecutar código (escrito específicamente para dicha máquina) que prepara el contexto para la ejecución del payload el cual es el que orquesta el escape del sandbox que se encuentra presente en iMessage, para luego descargar y ejecutar un binario obtenido del servidor de C&C (Command & Control).

‌‌¿Sorprendente y aterrador no?

Lo bueno es que fue arreglado, lo malo es que encontraran otra manera.

A deep dive into an NSO zero-click iMessage exploit: Remote Code Execution
Posted by Ian Beer & Samuel Groß of Google Project Zero We want to thank Citizen Lab for sharing a sample of the FORCEDENTRY exploit w...

Etiquetas

¿Te gustó el contenido o lo que hacemos? ¡Cualquier colaboración es agradecida para mantener los servidores o crear proyectos!

Jhonny Gary Mamani Cortez

Estudiante de Ingeniería en sistemas, estudiante del área de seguridad informática

Comentarios:

¡Genial! Te has suscrito con éxito.
¡Genial! Ahora, completa el checkout para tener acceso completo.
¡Bienvenido de nuevo! Has iniciado sesión con éxito.
Éxito! Su cuenta está totalmente activada, ahora tienes acceso a todo el contenido.