Aller au contenu

CVE-2026-40170: dépassement de tampon de pile dans ngtcp2

L’analyse indique qu’une vulnérabilité de dépassement de tampon de pile existe dans la bibliothèque ngtcp2. Cette faille, référencée sous le nom CVE-2026-40170, réside dans la logique de sérialisation des paramètres qlog. Un attaquant distant non authentifié peut exploiter cette condition en envoyant des paramètres de transport conçus malicieusement lors de la poignée de main (handshake) QUIC, à condition que l’application ait activé qlog.

La vulnérabilité se situe dans la fonction ngtcp2_qlog_parameters_set_transport_params() au sein du fichier lib/ngtcp2_qlog.c.

J’ai observé que cette fonction utilise un tampon de pile fixe de 1024 octets (uint8_t buf[1024]) pour stocker les paramètres de transport sérialisés du pair. Crucialement, l’implémentation manque de vérifications des limites (bounds checking) adéquates lors du traitement de ces paramètres. Lorsque la fonctionnalité qlog est activée, le processus de sérialisation ajoute divers champs influencés par le pair, tels que les identifiants de connexion et les jetons d’adresse, dans ce tampon.

Un attaquant peut fournir des paramètres de transport dont la taille est suffisante pour pousser le pointeur de sérialisation p au-delà de la limite de 1024 octets. Les opérations d’écriture ultérieures, spécifiquement celles effectuées par ngtcp2_encode_hex et d’autres fonctions auxiliaires, entraînent des écritures hors limites (out-of-bounds writes) incontrôlées dans la mémoire de la pile.

L’exploitation nécessite une application utilisant la bibliothèque ngtcp2 avec qlog activé (qlog->write != NULL). En initiant une poignée de main QUIC et en fournissant des paramètres de transport surdimensionnés, un pair distant peut provoquer une corruption de la mémoire.

J’ai vérifié cette vulnérabilité en utilisant ASAN, qui rapporte systématiquement un dépassement de tampon de pile (stack-buffer-overflow) provenant de la pile d’appels de la fonction susmentionnée. L’atténuation officielle, fournie dans le commit 708a764, augmente la taille du tampon à 2048 octets ; cependant, il s’agit d’une mesure temporaire qui ne résout pas le manque fondamental de validation stricte des limites.

Lors de l’analyse forensique des systèmes touchés, recherchez :

  • Signatures au niveau réseau : paquets de poignée de main contenant des paramètres de transport QUIC anormalement larges ou malformés.
  • Artefacts au niveau système : plantages récurrents des applications (SIGSEGV) liées à la version vulnérable de ngtcp2.
  • Sortie mémoire/débogueur : rapports ASAN citant spécifiquement le dépassement de tampon de pile dans la pile d’appels de ngtcp2_qlog_parameters_set_transport_params.

La mise à niveau vers ngtcp2 version 1.22.1 est obligatoire pour appliquer le correctif. Si une mise à niveau immédiate n’est pas possible, je recommande de désactiver qlog côté client.

Utilisez les règles suivantes pour surveiller les tentatives d’exploitation ou l’instabilité du système résultant de cette faille.

title: Tentative potentielle de dépassement de tampon de pile ngtcp2
id: 5a31b26a-465f-8c8f-a2e1-456789012345
status: experimental
description: Détecte les plantages liés à la bibliothèque ngtcp2 lors du traitement des paramètres de poignée de main QUIC.
logsource:
category: process_creation
product: linux
detection:
selection:
Image|endswith: '/votre_application_utilisant_ngtcp2'
condition: selection and event_id: 1001
level: high
Event
| where EventID == 1001
| where RenderedDescription contains "ngtcp2_qlog_parameters_set_transport_params"
| where RenderedDescription contains "stack-buffer-overflow"
| project TimeGenerated, Computer, RenderedDescription