Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
gsscred-move-uaf — CVE-2018-4343: Prueba de concepto para un uso después de liberación en el demonio GSSCred en macOS y iOS. | Kitploit
Herramientas/GitHubGitHub/bazad/gsscred-move-uaf
Seguridad iOSForensia de MemoriaAnálisis de VulnerabilidadesExplotaciónExplotación de Binarios
GitHubbazad/gsscred-move-uaf

gsscred-move-uaf

CVE-2018-4343: Prueba de concepto para un uso después de liberación en el demonio GSSCred en macOS y iOS.

Ver Repositorio
72hace 8 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

GSSCred-move-uaf

El servicio XPC com.apple.GSSCred, que se ejecuta como root en macOS e iOS, no implementa correctamente el comando "move", lo que provoca una condición de use-after-free en la función do_Move. El servicio GSSCred puede ser alcanzado desde el sandbox de aplicaciones predeterminado en iOS.

Este programa aprovecha la vulnerabilidad para provocar la caída del servicio GSSCred. Lograr la ejecución de código en GSSCred depende de sobrescribir la memoria liberada con datos controlados durante la ventana de concurrencia. Probado en macOS High Sierra 10.13.2 Beta 17C79a.

La vulnerabilidad

Aquí están las partes relevantes de do_Move de Heimdal-520, con algunas comprobaciones de errores no importantes omitidas:

root@kitploit:~
//
// 1. from and to are fully controlled UUID objects deserialized from the XPC request.
//
CFUUIDRef from = HeimCredMessageCopyAttributes(request, "from", CFUUIDGetTypeID());
CFUUIDRef to = HeimCredMessageCopyAttributes(request, "to", CFUUIDGetTypeID());
...
//
// 2. credfrom and credto are HeimCredRef objects looked up by the from and to UUIDs.
//    CFDictionaryGetValue() returns the objects without adding a reference. Note that if
//    the from and to UUIDs are the same, then credfrom and credto will both reference the
//    same object.
//
HeimCredRef credfrom = (HeimCredRef)CFDictionaryGetValue(peer->session->items, from);
HeimCredRef credto = (HeimCredRef)CFDictionaryGetValue(peer->session->items, to);
...
//
// 3. credfrom is removed from the dictionary. Since there was only one reference
//    outstanding, this causes credfrom to be freed.
//
CFMutableDictionaryRef newattrs = CFDictionaryCreateMutableCopy(NULL, 0, credfrom->attributes);
CFDictionaryRemoveValue(peer->session->items, from);
credfrom = NULL;
...
//
// 4. At this point we check credto. If credfrom and credto refer to the same object, then 
//    credto is a non-NULL pointer to the freed HeimCredRef object.
//
if (credto == NULL) {
	...
} else {
	//
	// 5. Now we dereference credto, passing a value read from freed memory as a
	//    CFDictionaryRef object to CFDictionaryGetValue().
	//
	CFUUIDRef parentUUID = CFDictionaryGetValue(credto->attributes, kHEIMAttrParentCredential);
	...
}

Este código hace lo siguiente:

  1. Deserializa dos UUIDs, from y to, de la solicitud XPC. La solicitud está completamente controlada, por lo que podemos establecer los valores de estos UUIDs arbitrariamente. No hay verificación de si estos dos UUIDs son iguales.
  2. Busca los objetos HeimCredRef, credfrom y credto, correspondientes a los UUIDs from y to respectivamente. El diccionario peer->session->items almacena todas las credenciales gestionadas por GSSCred en nombre del programa cliente actualmente conectado. Nótese que la función CFDictionaryGetValue devuelve una referencia a los objetos HeimCredRef, pero no incrementa su contador de referencias. En particular, si from y to son el mismo UUID, entonces credfrom y credto apuntarán al mismo HeimCredRef con un contador de referencias de 1 (retenido por el CFDictionary contenedor).

Este programa no intenta ganar esta ventana de concurrencia. En su lugar, permite que el destructor de HeimCredRef ponga a cero el campo attributes, desencadenando una desreferencia de puntero NULL en CFDictionaryGetValue.

Uso

Para compilar, ejecute make. Consulte la parte superior del Makefile para varias opciones de compilación.

Ejecutar el exploit mostrará la secuencia de mensajes XPC intercambiados con GSSCred:

root@kitploit:~
$ ./GSSCred-move-uaf
create: <dictionary: 0x7ff359e07740> { count = 1, transaction: 0, voucher = 0x0, contents =
        "attributes" => <dictionary: 0x7ff359e06b60> { count = 5, transaction: 0, voucher = 0x0, contents =
                "kHEIMObjectType" => <string: 0x7ff359e06a00> { length = 19, contents = "kHEIMObjectKerberos" }
                "kHEIMAttrBundleIdentifierACL" => <array: 0x7ff359e06a70> { count = 1, capacity = 1, contents =
                        0: <string: 0x7ff359e06aa0> { length = 1, contents = "*" }
                }
                "kHEIMAttrUUID" => <uuid: 0x7ff359e06b20> AB000000-0000-0000-0000-000000000000
                "kHEIMAttrStoreTime" => <date: 0x7ff359e06c60> Sat Dec 09 15:09:56 2017 PST (approx)
                "kHEIMAttrType" => <string: 0x7ff359e06ce0> { length = 17, contents = "kHEIMTypeKerberos" }
        }
}
Event: <error: 0x7fff9959cc60> { count = 1, transaction: 0, voucher = 0x0, contents =
        "XPCErrorDescription" => <string: 0x7fff9959cfd0> { length = 22, contents = "Connection interrupted" }
}
move: <error: 0x7fff9959cc60> { count = 1, transaction: 0, voucher = 0x0, contents =
        "XPCErrorDescription" => <string: 0x7fff9959cfd0> { length = 22, contents = "Connection interrupted" }
}

Los eventos XPC de "Connection interrupted" indican que la conexión XPC fue interrumpida, probablemente porque GSSCred murió.

Licencia

El código de GSSCred-move-uaf se libera al dominio público. Como cortesía, pido que si hace referencia o utiliza parte de este código, me atribuya el crédito correspondiente.

Descargar herramienta
  • A continuación, credfrom se elimina del diccionario peer->session->items. Esto suele ser seguro, porque cuando from y to son UUIDs diferentes, el objeto credfrom se libera y ya no se vuelve a referenciar. Sin embargo, cuando from y to son el mismo, habrá problemas, ya que credto se referenciará más tarde.
  • Luego el código verifica si credto es NULL. Dado que credfrom y credto son iguales y credfrom no era NULL, entramos en la rama else.
  • Finalmente, el código desreferencia credto para leer el campo attributes, que se pasa como primer parámetro a CFDictionaryGetValue. Si la memoria liberada a la que apunta credto ha sido reasignada mientras tanto y la ubicación del campo attributes cambió para apuntar a un objeto CFDictionary falso especialmente manipulado, entonces debería ser posible lograr la ejecución de código con este paso.