FlawOpen

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

● Citrix · CVE-2023-4966 · October 2023 · CVSS 9.4 · Critique
Recherche · FlawOpen

Citrix Bleed : fuite de jetons et contournement MFA

CVE-2023-4966 a exposé la mémoire NetScaler, dont des jetons de session, permettant le détournement sans MFA. L’exploitation a débuté fin août 2023.[1], [2]

💡 Explication en Langage Simple (ELI5)

Vous demandez à un assistant de recopier un message sur une petite fiche et de vous dire sa longueur. La fiche ne tient que 50 caractères, il en écrit donc 50, mais quand vous lui demandez la longueur du message, il répond honnêtement « 800 caractères », puisque c'était la longueur de l'original. Vous tendez alors la fiche à quelqu'un en lui disant d'en lire 800 caractères. Il lit vos 50, puis continue avec ce qui est écrit sur le reste de la feuille.[2]

Concepts Clés et Termes

snprintf
Fonction C qui met en forme du texte dans un tampon de taille fixe. Quand le texte ne tient pas, elle le tronque mais renvoie la longueur qu'aurait eue le texte complet.[3]
NetScaler ADC / Gateway
Boîtiers Citrix assurant accès distant et répartition de charge en bordure de réseau. Seuls ceux configurés en Gateway ou en serveur virtuel AAA étaient concernés.[1]
Lecture hors limites (CWE-125)
Lire au-delà de la fin d'un tampon. Rien n'est écrasé, mais le contenu de la mémoire voisine est divulgué. Cela décrit le mécanisme précis de lecture hors limites (CWE-125) ; Citrix classe globalement CVE-2023-4966 comme CWE-119.[1], [3]
Jeton de session
La valeur qui prouve qu'un utilisateur s'est déjà connecté. Qui la présente est traité comme cet utilisateur, sans mot de passe ni MFA.[2]

Correspondances de référentiels

Chronologie de l'Incident

2023-08

L'exploitation de la faille en zero-day commence, selon des rapports ultérieurs de réponse à incident.[2]

2023-10-10

Citrix publie le bulletin CTX579459 avec les versions corrigées 14.1-8.50, 13.1-49.15 et 13.0-92.19.[1]

2023-10-18

La CISA ajoute CVE-2023-4966 à son catalogue Known Exploited Vulnerabilities.[4]

Déroulement de l'Attaque Étape par Étape

Étape 1

Un en-tête démesuré

Une requête non authentifiée portant un en-tête Host très long atteint le code qui construit une réponse de découverte OpenID Connect sur le boîtier.[2], [3]

Étape 2

La longueur est mal interprétée

snprintf tronque le texte pour qu'il tienne dans le tampon, mais renvoie la longueur complète qu'il aurait eue, et le code la traite comme le nombre d'octets écrits.[3], [2]

Étape 3

La mémoire au-delà du tampon part

La réponse est envoyée avec cette longueur supérieure : le boîtier renvoie la mémoire voisine en plus du JSON tronqué.[2]

Étape 4

Les sessions sont détournées

La mémoire divulguée peut contenir des jetons de session valides. En rejouer un donne à l'attaquant la session de l'utilisateur, sans mot de passe ni MFA.[2], [1]

Code Source : Vulnérable vs Sécurisé

C illustratif, pas le code source de NetScaler. Le correctif vérifie la valeur renvoyée par snprintf, qui indique la longueur qu'aurait eue la sortie complète. Si elle est négative ou supérieure ou égale à la taille du tampon, le formatage a échoué ou a été tronqué ; la fonction n'envoie alors rien. send_response ne reçoit donc la longueur que si la réponse complète tient dans buf.[3], [2]

IMPLÉMENTATION VULNÉRABLE
#include <stdio.h>

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

int send_oidc_config(const char *host)
{
    char buf[256];
    /* n est le nombre d’octets qui auraient été écrits et peut dépasser sizeof(buf) */
    int n = snprintf(buf, sizeof(buf), "{\"issuer\":\"https://%s\"}", host);
    return send_response(buf, n);   /* envoie n octets en lisant au-delà de buf */
}
PATCH SÉCURISÉ ET ROBUSTE
#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;                  /* rejeter la sortie tronquée ; ne jamais envoyer au-delà du tampon */
    return send_response(buf, n);
}

Liste de Contrôle de Sécurité pour l'Ingénierie

Sources