
Глубокий технический анализ CVE‑2026‑41096, критического переполнения кучи в Windows DNSAPI.dll, позволяющего удаленное выполнение кода через специально сформированные DNS‑ответы. Включает векторы атак, информацию о патчах и рекомендации по защите для команд безопасности.
Углубленный технический анализ CVE‑2026‑41096, критического переполнения кучи в Windows DNSAPI.dll, позволяющего удаленное выполнение кода через поддельные DNS-ответы. Включает векторы атак, анализ патча и рекомендации по защите для команд безопасности.
CVE‑2026‑41096 — это переполнение буфера в куче в DNSAPI.dll, компоненте Windows, отвечающем за разбор каждого DNS-ответа, получаемого машиной. Поскольку DNS-запросы происходят постоянно и незаметно в фоновом режиме, эта уязвимость превращает обычную сетевую операцию в надежный вектор удаленного выполнения кода.
Простыми словами: Один поддельный DNS-ответ может скомпрометировать рабочую станцию или сервер Windows без каких-либо действий со стороны пользователя.
Windows хранит разобранные DNS-ответы в структурах, выделяемых в куче. Ошибка появляется в функции, которая вычисляет, сколько памяти необходимо для каждой записи ответа. Когда DNS-ответ содержит запись A или AAAA, за которой следуют дополнительные данные (CNAME/NS и т.д.), парсер неверно вычисляет размер буфера.
Windows записывает несколько байт за пределами выделенного блока, повреждая следующую структуру кучи, которая содержит указатель на функцию, используемый позже в процедуре разбора.
Как только этот указатель перезаписан, атакующий получает контроль над потоком выполнения.
Почему это важно Без взаимодействия с пользователем: Windows постоянно выполняет DNS-запросы.
Без аутентификации: DNS по своей природе основан на доверии.
Универсальное воздействие: каждая машина Windows 11 / Server 2022 / Server 2025 использует DNSAPI.dll.
Идеально для горизонтального перемещения: один скомпрометированный хост может быстро перемещаться по сети.
Как происходит переполнение DNS-пакет следует стандартной структуре 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 …
}
Это классическое повреждение кучи, ведущее к удаленному выполнению кода.
Злоумышленникам не нужно напрямую взламывать цель — им достаточно влиять на DNS-трафик. Это может произойти несколькими реалистичными способами:
Скомпрометированный маршрутизатор Вредоносный провайдер, взломанный маршрутизатор или измененная прошивка могут внедрять поддельные DNS-ответы.
Несанкционированный внутренний DNS-сервер Внутри корпоративной сети злоумышленник может запустить DNS-пересыльщик, возвращающий вредоносные ответы.
Отравление резолвера Манипуляция публичными резолверами (Google, Cloudflare и т.д.) для возврата поддельного ответа.
Вредоносный публичный Wi‑Fi Поддельная точка доступа в кафе или аэропорту может перехватывать и изменять DNS-трафик.
Во всех случаях жертва просто выполняет обычный DNS-запрос — Windows делает остальное.
Детали патча Microsoft устранила проблему в обновлении Patch Tuesday от 12 мая 2026 года (сборка 21.2.24).
Что изменилось Парсер теперь округляет длину данных до границы 4 байт.
Выделение буферов увеличено для обеспечения четкого разделения между записями ответов.
Добавлены дополнительные проверки для обнаружения поврежденных пакетов.
Это полностью устраняет переполнение.
Немедленно установите патч Разверните обновление от 12 мая 2026 года во всех средах Windows 11 и Server.
Используйте контролируемую лабораторную ВМ для проверки:
Эксплойт срабатывает на незапатченных системах.
Запатченная система безопасно отклоняет поврежденный пакет.
Проверьте:
Код Журнал событий → Система → DNS API Ищите необычные события «DNS answer parsed» вокруг подозрительных временных меток.
Укрепите внутренние DNS-резолверы.
Используйте DNSSEC где возможно.
Сегментируйте сети для ограничения горизонтального перемещения.
Использование 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 — одна из самых значимых уязвимостей, связанных с DNS, за последние годы. Поскольку она находится в клиенте DNS Windows, а не на сервере, каждая машина становится поверхностью атаки — ноутбуки, настольные ПК, серверы, контроллеры домена и т.д.
Одного поддельного DNS-ответа достаточно, чтобы скомпрометировать систему.
Патч Microsoft исправляет ошибку расчета границ и полностью устраняет переполнение, но незапатченные среды остаются под высоким риском.
Если вы рекрутер или руководитель отдела разработки, просматривающий этот материал: Этот отчет демонстрирует как коммуникацию на высоком уровне, так и глубокий технический анализ, ожидаемый от исследователя безопасности.