FlawOpen

flawopen.com/Incidents/citrix-bleed-session-token-leak-october-2023

● Citrix · CVE-2023-4966 · October 2023 · CVSS 9.4 · Crítica
Investigación · FlawOpen

Citrix Bleed: robo de tokens y evasión de MFA

CVE-2023-4966 expuso memoria de NetScaler con tokens de sesión; su robo permitió secuestrar sesiones y evadir MFA. Explotada desde agosto de 2023.[1], [2]

💡 Explicación en Lenguaje Sencillo (ELI5)

Le pides a un asistente que copie un mensaje en una tarjeta pequeña y te diga cuánto mide. En la tarjeta solo caben 50 caracteres, así que escribe 50, pero cuando le preguntas por la longitud responde con sinceridad «800 caracteres», porque eso medía el original. Entonces das la tarjeta a otra persona y le dices que lea 800 caracteres. Lee tus 50 y sigue leyendo lo que haya escrito en el resto de la hoja.[2]

Conceptos Clave y Términos

snprintf
Función de C que da formato a texto en un búfer de tamaño fijo. Si el texto no cabe lo trunca, pero devuelve la longitud que habría tenido el texto completo.[3]
NetScaler ADC / Gateway
Dispositivos de Citrix que ofrecen acceso remoto y balanceo de carga en el perímetro de la red. Solo estaban afectados los configurados como Gateway o servidor virtual AAA.[1]
Lectura fuera de límites (CWE-125)
Leer más allá del final de un búfer. No se sobrescribe nada, pero se revela lo que haya en la memoria contigua. Describe el mecanismo específico de lectura fuera de límites (CWE-125); Citrix clasifica CVE-2023-4966 de forma general como CWE-119.[1], [3]
Token de sesión
El valor que demuestra que un usuario ya inició sesión. Quien lo presenta es tratado como ese usuario, sin pedirle contraseña ni MFA.[2]

Mapeos de marcos

Cronología del Incidente

2023-08

Empieza la explotación del fallo como zero-day, según informes posteriores de respuesta a incidentes.[2]

2023-10-10

Citrix publica el boletín CTX579459 con las versiones corregidas 14.1-8.50, 13.1-49.15 y 13.0-92.19.[1]

2023-10-18

CISA añade CVE-2023-4966 a su catálogo Known Exploited Vulnerabilities.[4]

Flujo de Ataque Paso a Paso

Paso 1

Una cabecera demasiado grande

Una petición sin autenticar con una cabecera Host muy larga llega al código que genera una respuesta de descubrimiento OpenID Connect en el dispositivo.[2], [3]

Paso 2

Se malinterpreta la longitud

snprintf trunca el texto para que quepa en el búfer, pero devuelve la longitud completa que habría tenido, y el código la trata como el número de bytes escritos.[3], [2]

Paso 3

Se envía memoria más allá del búfer

La respuesta se envía con esa longitud mayor, de modo que el dispositivo devuelve memoria contigua junto con el JSON truncado.[2]

Paso 4

Se secuestran sesiones

La memoria filtrada puede incluir tokens de sesión válidos. Reutilizar uno da al atacante la sesión del usuario sin contraseña ni MFA.[2], [1]

Código Fuente: Vulnerable vs. Seguro

C ilustrativo, no es código fuente de NetScaler. La corrección comprueba el valor que devuelve snprintf, que indica la longitud que habría tenido la salida completa. Si es negativo o igual o mayor que el tamaño del búfer, el formato falló o se truncó y la función no envía nada. Así, send_response solo recibe la longitud cuando la respuesta completa cabe en buf.[3], [2]

IMPLEMENTACIÓN VULNERABLE
#include <stdio.h>

int send_response(const char *data, int len);

int send_oidc_config(const char *host)
{
    char buf[256];
    /* n es la cantidad de bytes que se habrían escrito y puede superar sizeof(buf) */
    int n = snprintf(buf, sizeof(buf), "{\"issuer\":\"https://%s\"}", host);
    return send_response(buf, n);   /* envía n bytes y lee más allá de buf */
}
PARCHE SEGURO Y ROBUSTO
#include <stdio.h>

int send_response(const char *data, int len);

int send_oidc_config(const char *host)
{
    char buf[256];
    int n = snprintf(buf, sizeof(buf), "{\"issuer\":\"https://%s\"}", host);
    if (n < 0 || (size_t)n >= sizeof(buf))
        return -1;                  /* rechace la salida truncada; nunca envíe más allá del búfer */
    return send_response(buf, n);
}

Lista de Verificación de Seguridad para Ingeniería

Fuentes