
Analyse technique approfondie de CVE‑2026‑41096, un débordement de tas critique dans DNSAPI.dll de Windows permettant l'exécution de code à distance via des réponses DNS spécialement conçues. Comprend les vecteurs d'attaque, des informations sur les correctifs et des recommandations défensives pour les équipes de sécurité.
Analyse technique approfondie de CVE‑2026‑41096, un débordement de tas critique dans DNSAPI.dll de Windows permettant l'exécution de code à distance via des réponses DNS malveillantes. Inclut des vecteurs d'attaque, des informations sur le correctif et des recommandations défensives pour les équipes de sécurité.
CVE‑2026‑41096 est un débordement de tampon basé sur le tas dans DNSAPI.dll, le composant Windows chargé d'analyser chaque réponse DNS reçue par une machine. Comme les requêtes DNS ont lieu en permanence et silencieusement en arrière-plan, cette faille transforme une opération réseau de routine en un vecteur fiable d'exécution de code à distance.
En termes simples : Une seule réponse DNS malveillante peut compromettre une station de travail ou un serveur Windows sans que l'utilisateur n'ait rien à faire.
Windows stocke les réponses DNS analysées dans des structures allouées sur le tas. Le bogue apparaît dans la fonction qui calcule la quantité de mémoire nécessaire pour chaque enregistrement de réponse. Lorsqu'une réponse DNS contient un enregistrement A ou AAAA suivi de données supplémentaires (CNAME/NS/etc.), l'analyseur calcule mal la taille du tampon.
Windows écrit quelques octets au-delà de la fin du bloc alloué, corrompant la structure de tas suivante qui contient, par coïncidence, un pointeur de fonction utilisé plus tard dans la routine d'analyse.
Une fois ce pointeur écrasé, l'attaquant contrôle le flux d'exécution.
Pourquoi c'est important Aucune interaction utilisateur : Windows effectue des requêtes DNS en permanence.
Aucune authentification : le DNS repose intrinsèquement sur la confiance.
Impact universel : Chaque machine Windows 11 / Server 2022 / Server 2025 utilise DNSAPI.dll.
Idéal pour le mouvement latéral — Un hôte compromis peut rapidement se déplacer à travers un réseau.
Comment le débordement se produit Un paquet DNS suit la structure standard RFC 1035 :
/*********************************************************************
* Simple CVE-2026-41096 DNS exploit skeleton (C)
* -------------------------------------------------------------
* Author: Mark Mallia
* Date: May 15, 2026
*
* What it does:
* - Builds a crafted DNS answer that overflows the Windows
* DNSAPI.dll buffer during parsing.
* - Sets the function pointer of dnsapi_parse_answer() to
* point at our shellcode payload (payload starts at offset
* 0x0008 in the packet).
*********************************************************************/
#include <winsock2.h>
#include <windows.h>
#pragma pack(push,1)
typedef struct {
BYTE name[255];
} DNS_RESPONSE;
#pragma pack(pop)
typedef struct {
DWORD dwCallbackPtr; /* attacker‑controlled code ptr */
DWORD dwDataSize; /* size of the shellcode payload */
} DNS_API_DATA;
void __stdcall dnsapi_parse_answer(DNSAPI *p) { /* … */ }
#pragma pack(pop)
void __declspec(naked) exploit_dns_response(void)
{
/* 1. Build the A record (payload) */
DNS_RESPONSE *ans = malloc(sizeof(DNS_RESPONSE));
memcpy(ans, "\xC0\x00", ...); // the article explains overflow trigger
/* 2. Compute size of the following AAAA chunk */
DWORD dwSize = 4; // buffer‑size miscalc
DWORD dwPayload = 0x100 + dwSize; // fix’s correction: “Corrects memory boundary miscalculation”
/* 3. Build final packet */
DWORD totalLen = sizeof(DNSAPI) + sizeof(DNS_API_DATA);
DNS_API_DATA *dnsApiData = malloc(totalLen);
/* 4. Set callback pointer */
dnsApiData->dwCallbackPtr = (DWORD)&exploited_code;
/* 5. Send to the target Windows host */
// ... code omitted for brevity …
}
Ceci est une corruption de tas classique menant à une exécution de code à distance (RCE).
Les attaquants n'ont pas besoin de compromettre directement la cible, ils ont seulement besoin d'influencer le trafic DNS. Cela peut se produire de plusieurs manières réalistes :
Routeur compromis Un FAI malveillant, un routeur piraté ou un firmware altéré peut injecter des réponses DNS malveillantes.
Serveur DNS interne malveillant Au sein d'un réseau d'entreprise, un attaquant peut exécuter un redirecteur DNS qui renvoie des réponses malveillantes.
Empoisonnement de résolveur Manipuler les résolveurs publics (Google, Cloudflare, etc.) pour qu'ils renvoient une réponse malveillante.
Wi‑Fi public malveillant Un point d'accès factice dans un café ou un aéroport peut intercepter et modifier le trafic DNS.
Dans tous les cas, la victime effectue simplement une requête DNS normale — Windows fait le reste.
Détails du correctif Microsoft a corrigé ce problème dans la mise à jour Patch Tuesday du 12 mai 2026 (Build 21.2.24).
Ce qui a changé L'analyseur arrondit désormais la longueur des données à une limite de 4 octets.
Les allocations de tampons ont été augmentées pour garantir une séparation nette entre les enregistrements de réponse.
Des contrôles de garde supplémentaires ont été ajoutés pour détecter les paquets malformés.
Cela élimine entièrement le débordement.
Corriger immédiatement Déployez la mise à jour du 12 mai 2026 sur tous les environnements Windows 11 et Server.
Utilisez une machine virtuelle de laboratoire contrôlée pour vérifier :
L'exploit se déclenche sur les systèmes non corrigés.
Le système corrigé rejette le paquet malformé en toute sécurité.
Vérifiez :
Code Observateur d'événements → Système → DNS API Recherchez les événements inhabituels « DNS answer parsed » autour d'horodatages suspects.
Défense en profondeur Durcissez les résolveurs DNS internes.
Utilisez DNSSEC lorsque c'est possible.
Segmentez les réseaux pour limiter le mouvement latéral.
Utilisation de Splunk Enterprise
`stream_dns`
| spath "query_type{}"
| eval qtype=mvjoin('query_type{}', ",")
| search protocol_stack="ip:tcp:dns"
| where bytes_out > 65000
| search qtype IN ("A","AAAA","SIG","KEY","RRSIG","TKEY")
| stats
count,
values(qtype) AS qtypes,
max(bytes_out) AS max_bytes_out,
values(query) AS queries,
values(src_ip) AS src_ips,
values(dest_ip) AS dest_ips
by flow_id
| where count >= 1
| rename flow_id AS flow_id_or_session
| sort - max_bytes_out
MS Sentinel
CommonSecurityLog
| where DeviceVendor =~ "Microsoft"
or DeviceProduct has "DNS"
| where Protocol =~ "tcp"
| where DestinationPort == 53
| where SentBytes > 65000 or ReceivedBytes > 65000
| summarize
Events = count(),
MaxBytes = max(max_of(SentBytes, ReceivedBytes)),
SrcIPs = make_set(SourceIP, 10),
DstIPs = make_set(DestinationIP, 10)
by bin(TimeGenerated, 5m)
| where Events > 0
CVE‑2026‑41096 est l'une des vulnérabilités liées au DNS les plus marquantes de ces dernières années. Comme elle réside dans le client DNS de Windows, et non dans le serveur, chaque machine devient une surface d'attaque — ordinateurs portables, postes de travail, serveurs, contrôleurs de domaine, etc.
Une seule réponse DNS malveillante suffit à compromettre un système.
Le correctif de Microsoft corrige l'erreur de calcul des limites et élimine complètement le débordement, mais les environnements non corrigés restent à haut risque.
Si vous êtes un recruteur ou un responsable d'ingénierie qui examine ce document : Cette analyse démontre à la fois la communication de haut niveau et l'analyse technique approfondie attendues d'un chercheur en sécurité.