0x00 蓝屏的堆栈
在XP SP3上跑POC之后,一段时间之后会出现蓝屏,蓝屏的堆栈如下,可以看出是ACKData里面CALL了一个0指针导致的蓝屏
0x01 蓝屏原因
1 ETW(Event Tracing for Windows)是系统提供的一种事件监控机制,用ETW可以用来监控网络IO,磁盘IO等事件。XP SP3上ETW内部如何实现网络监控,原理是利用到了tcpip提供的一个指针回调来实现对网络IO的监控,这个指针就是tcpip!TCPCPHandlerRoutine。StartTrace的时候,内核会tcpip!TCPCPHandlerRoutine这个指针设置为WmipTraceNetwork,续相关网络事件发生时,都会调用该回调。StopTrace的时候,内核会把tcpip!TCPCPHandlerRoutine置为NULL,这个过程对tcpip!TCPCPHandlerRoutine的操作是不加锁的。
2 哪些地方会引用tcpip!TCPCPHandlerRoutine
可以看出TCPIP里面很多处地方都会引用tcpip!TCPCPHandlerRoutine
不过,只有AckData这处地方的引用才有可能导致蓝屏,原因很简单ACKData对tcpip!TCPCPHandlerRoutine的判空存在多线程的问题。其它地方的判断就没这个问题,因为指针先mov到寄存器里面了。
0x03 BUG的触发
1 有一个线程不断的开启,停止ETW的网络监控,这样tcpip!TCPCPHandlerRoutine会不断的被置为NULL和非NULL
2 开另外的线程不断的发送TCP数据,接收数据包,这样可以频繁的触发AckData
3 当AckData里面对tcpip!TCPCPHandlerRoutine判断非空之后,调用tcpip!TCPCPHandlerRoutine之前上层把tcpip!TCPCPHandlerRoutine又设置为NULL,蓝屏就发生了。
0x04 POC
1 ControlTrace调用返回比较慢,导致触发这个BUG的时间被延长
2 目前只有XP SP3会出现蓝屏,SP2则不会,SP2 AckData里面对tcpip!TCPCPHandlerRoutine的判空又没问题了
3 蓝屏触发时,上下文是System,不过也是有可能是当前进程的上下文的