Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
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.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2023-4911 — CVE-2023-4911 (Looney Tunables) informe de análisis y laboratorio de reproducción Docker | Kitploit
Herramientas/GitHubGitHub/baeseungwon1010/cve-2023-4911
Escalada de PrivilegiosAnálisis de VulnerabilidadesExplotaciónAprendizaje y EducaciónExplotación de BinariosLabs y Práctica
GitHubbaeseungwon1010/cve-2023-4911

CVE-2023-4911

CVE-2023-4911 (Looney Tunables) informe de análisis y laboratorio de reproducción Docker

Ver Repositorio
45hace 2 mesesAú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

Vulnerabilidad de desbordamiento del búfer del montón de glibc (CVE-2023-4911)

ElementoContenido
ID CVECVE-2023-4911
Tipo de ataqueDesbordamiento del búfer del montón → Escalada de privilegios local
CVSS 3.17.8 (Alta)
Fecha de divulgación2023-10-03
Punto vulnerableAnalizador GLIBC_TUNABLES del cargador dinámico de glibc (ld.so)
Versiones vulnerablesglibc 2.34 a 2.38

1. Resumen

CVE-2023-4911 es una vulnerabilidad de desbordamiento del búfer del montón que ocurre cuando el cargador dinámico de GNU C Library (glibc) analiza la variable de entorno GLIBC_TUNABLES. El atacante puede aprovechar este desbordamiento para manipular la ruta de búsqueda de bibliotecas (RPATH) del cargador dinámico, de modo que cuando se ejecute un binario SUID root (su, sudo, etc.), se cargue una biblioteca compartida maliciosa preparada por el atacante en su lugar, permitiendo ejecutar código arbitrario con privilegios de root. Dado que glibc es un componente central de prácticamente todas las principales distribuciones de Linux, esta vulnerabilidad afectó a la mayoría de las distribuciones basadas en glibc lanzadas después de abril de 2021.

2. Parte del código vulnerable

while (true)
{
    char *name = p;
    size_t len = 0;

    /* 이름(name) 길이 찾기 */
    while (p[len] != '=' && p[len] != ':' && p[len] != '\0')
        len++;

    /* '=' 없이 끝나면 종료 */
    if (p[len] == '\0')
    {
        if (__libc_enable_secure)
            tunestr[off] = '\0';
        return;
    }

    /* ':'를 먼저 만나면 잘못된 항목 */
    if (p[len] == ':')
    {
        p += len + 1;
        continue;
    }

    /* '='를 만났으므로 value 시작으로 이동 */
    p += len + 1;

    /* 원본 문자열에서 value 계산 */
    char *value = &valstring[p - tunestr];

    len = 0;

    /* value 길이 찾기 */
    while (p[len] != ':' && p[len] != '\0')
        len++;

    ...
    /* tunestr에 복사 */
    ...

    if (p[len] != '\0')
        p += len + 1;
}

3. Análisis de la causa

3.1 Flujo de procesamiento normal

  1. __tunables_init() busca GLIBC_TUNABLES en la lista de variables de entorno.
  2. tunables_strdup() asigna un búfer con __minimal_malloc() y copia la cadena original (en este punto, malloc es una implementación muy temprana que aún no está completamente inicializada).
  3. parse_tunables() recorre este búfer usando : (dos puntos) como delimitador, separa cada par key=value y asigna el valor al ajustable correspondiente.

3.2 Punto de fallo

parse_tunables() procesa un ajustable en el orden: análisis de nombre → avance de p → análisis de valor → avance de p. En una entrada normal, después de procesar todo el valor, p avanza a la posición de inicio del siguiente ajustable para analizar el siguiente elemento.

Sin embargo, si se proporciona una entrada de la forma name=name=value como la siguiente,

GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA...(긴 문자열)

Durante el primer análisis, glibc.malloc.mxfast=AAAA... completo se reconoce como un único valor y se copia en el búfer tunestr. Luego, como no hay ningún dos puntos (:) después del valor para separar el siguiente ajustable, el puntero de análisis (p) no puede avanzar al siguiente elemento y vuelve a apuntar al inicio del valor ya copiado.

El problema es que este valor en sí mismo tiene la forma name=value. En la siguiente iteración, el analizador lo reconoce erróneamente como un nuevo ajustable y escribe datos duplicados en el búfer. Como tunestr solo está asignado para el tamaño de la cadena original, se produce una escritura duplicada que causa un desbordamiento del búfer del montón.

3.3 Efecto del desbordamiento

El desbordamiento del búfer del montón ocurrido sobrescribe las áreas de montón adyacentes asignadas consecutivamente por __minimal_malloc(). El atacante puede usar esto para cambiar el puntero l_info[DT_RPATH] de la estructura interna link_map del cargador dinámico (ld.so) a una dirección de pila controlada por el atacante.

En esa área de la pila se ha colocado una estructura Elf64_Dyn manipulada previamente, la cual especifica el directorio que el atacante desea como nueva ruta de búsqueda de bibliotecas (RPATH). Como resultado, ld.so carga preferentemente la biblioteca compartida preparada por el atacante en lugar de las bibliotecas del sistema normales.

4. Cadena de ataque

  1. El atacante construye la variable de entorno GLIBC_TUNABLES en la forma name=name=value.
  2. Ejecuta un programa SUID (como su) con permisos de usuario normal.
  3. El kernel, debido al bit SUID, cambia el UID efectivo del proceso a root y luego ejecuta el cargador dinámico (ld.so).
  4. Se produce un desbordamiento del búfer del montón en parse_tunables() de ld.so.
  5. Utilizando el desbordamiento, manipula el puntero l_info[DT_RPATH] de link_map para que apunte a una dirección de pila donde se encuentra una estructura Elf64_Dyn falsa preparada por el atacante.
  6. ld.so utiliza la información RPATH manipulada para cargar la maliciosa libc.so.6 preparada por el atacante.
  7. El código de inicialización (o la rutina de inicio modificada) de la maliciosa libc.so.6 se ejecuta con privilegios de root, realizando setuid(0), setgid(0) y la ejecución de /bin/sh.
  8. Este proceso ocurre antes de que se ejecute la lógica de autenticación de su, por lo que se obtiene una shell de root sin verificación de contraseña.

El PoC utiliza un enfoque de fuerza bruta que repite execve() hasta que la aleatorización (ASLR) produzca el diseño de memoria deseado. Por lo tanto, el éxito del ataque y el tiempo requerido pueden variar según el entorno, y generalmente se necesitan cientos o miles de intentos repetidos.

5. Condiciones de reproducción

  • Debe existir un binario que permita la escalada de privilegios, como SUID, SGID, etc.
  • El atacante debe poder ejecutar ese binario con variables de entorno arbitrarias.
  • glibc debe ser una versión anterior al parche.

6. Reproducción del entorno de práctica (PoC)

Primero, clona el contenido del repositorio en un directorio.

git clone https://github.com/baeseungwon1010/CVE-2023-4911

Construye la imagen de Docker con el siguiente comando

cd C* && docker compose run --rm cve-2023-4911-lab

Después de entrar al contenedor, ejecuta el código de exploit

cd /home/student/exploit && ./exp

Después de ejecutarlo y esperar, se puede ver que el usuario normal cambia a sudo(0)

7. Medidas de mitigación

Actualice glibc de la versión vulnerable a una versión superior. Después del parche, si es posible, reinicie/reenicie para que no queden versiones anteriores de glibc en memoria. Si no se puede parchear de inmediato, existe una solución temporal de eliminar procesos innecesarios SUID, SGID, etc.

8. Referencias

  • NVD: CVE-2023-4911
  • Ubuntu Security Notice: CVE-2023-4911
  • leesh3288/CVE-2023-4911 PoC
  • Debian Sources - glibc 2.28-10 dl-tunables.c
Descargar herramienta