CVE-2021-31166:http协议栈远程代码执行漏洞

CVE-2021-31166:http协议栈远程代码执行漏洞

时间:2023-01-31 作者:安帝科技


Internet Information Services (IIS) 是一种灵活、可扩展、安全且可管理的 Web 服务,用于托管 Web 上的静态和动态内容。IIS 支持各种 Web 技术,包括 HTML、ASP、ASP.NET、JSP、PHP 和 CGI。此功能通过称为 http 协议栈 ( http.sys ) 的内核模式设备驱动实现。此驱动程序负责解析 http 请求并对客户端响应。
漏洞出现在http.sys内,未授权的攻击者可以构造恶意请求包攻击目标服务器,成功利用该漏洞的攻击者可导致目标服务器蓝屏,或执行任意代码。

Part1 漏洞状态

Part2 漏洞描述


影响范围
未安装的KB5003173补丁的
Windows 10 2004/20H2
Windows Server 2004/20H2

分析环境:
Win10 20H2(19042.928)

Part3 漏洞分析

通过PoC触发该漏洞,靶机蓝屏。

蓝屏信息为KERNEL_SECURITY_CHECK_FAILURE。
KERNEL_SECURITY_CHECK_FAILURE在发生于ring0时,为执行中断int 29h时出现,该中断在Windows8中被添加,用于快速的抛出异常,在sdk中,被声明为__fastfail。

分析DUMP,调用栈可见异常出现在UlFreeUnknownCodingList函数内,该函数由UlpParseAcceptEncoding调用,接下来对这两个函数进行分析。

查看UlpParseAcceptEncoding函数伪代码,在函数内首先会通过UlpParseContentCoding,循环处理http请求标头Accept-Encoding内的值,确认其中内容是否为受支持或为无效字符串。

如字符串无效,便在UlpParseAcceptEncoding函数内链接到,UnknownCodingList循环双链表。
若要进入漏洞执行流程,需要UlpParseContentCoding函数返回特定值0xC0000225,如返回值满足要求,在UnknownCodingList内包含链接并符合条件的情况下,会将UnknownCodingListHead与Requst内结构体进行链接。

链接完毕后,如UlpParseContentCoding的返回值v5小于0,跳转到LABEL_33,调用UlFreeUnknownCodingList函数,释放传入链表的结点。

在该函数内,符合条件的情况下,会将链表内的结点释放。
在此过程中,执行至__fastfail的条件为,UnknownCodingList->Flink->Flink->Blink不等于UnknownCodingList->Flink或UnknownCodingList->Flink->Blink->Flink不等于UnknownCodingList->Flink。


对该函数下断点,断下后UnknownCodingList链表如下:

在第一次循环时,不会达成此条件,UnknownCodingListFlink->Flink被释放。

在第二次循环时,还会进行此判断,因UnknownCodingList->Flink已被释放,UnkownCodingList->Flink->Flink->Blink的指向已被修改,但此处还是会引用UnknownCodingListHead,导致执行至__fastfail。

此时的UnknownCodingList链表:

导致BSOD的原因如上文分析,但如果想进入触发漏洞的流程,需要UlpParseContentCoding函数返回0xC0000225。分析PoC可以看到,Accept-Encoding字段内容经过特殊构造,由受支持的字符、无效的字符、空格和”,”构成。

返回0xC0000225的情况有两种,使用该PoC时,传入的非制表符,非空格后的字符为”,”,便可使UlpParseContentCoding返回0xC0000225,执行触发漏洞流程。

此漏洞已经于补丁KB5003173内修复,通过对UnknownCodingList链表重置,避免了此问题发生。

Part4 修复建议

安装KB5003173或后续汇总补丁。

————————————————
获取更多情报
联系我们,获取更多漏洞情报详情及处置建议,让企业远离漏洞威胁。
电话:18511745601
邮箱:shiliangang@andisec.com