简介
NFS(Network File System)是一种用于服务器和客户机之间文件访问和共享的通信协议,通过它,客户机可以远程访问存储设备上的数据。CVE-2023-24941是微软在2023年5月份补丁日修复的一个位于Windows网络文件系统中的远程代码执行漏洞。根据微软的描述,该漏洞可在NFSV4.1协议中触发。经过简单分析发现,该漏洞是由于NFS协议在处理服务器内存不足时的方式不当所致。当申请内存失败时,程序仍然执行了写入操作,攻击者可以通过精心构造的utf8strings数据包来触发该漏洞,从而导致服务器崩溃甚至执行任意代码的风险。
01 漏洞分析
通过对补丁进行diff,可以发现在Nfs4SrvCppDecodeCompoundHeaderAndInitializeArgs与XdrDecodeString中都做了基本相同的改动,以下是在更新前的XdrDecodeString函数。
发现具体执行逻辑为,如果(a1+0x108)指向的值小于0后,跳转到LABEL_17执行XdrDecodeOpaqueSlow函数执行后,将(a3+v5)指向的值写0,而更新后的执行逻辑如下。
可以看出,仅当在(a1+0x108)指向的值大于等于0时,才会做下面一系列的操作,也就是说,在(a1+0x108)小于0时,代表程序已经出现错误,本该进入异常流程,但是还是跑去执行了XdrDecodeOpaqueSlow函数,并且有关键的写入操作。
02 漏洞触发
对XdrDecodeString函数进行功能的分析,可以推测,该函数功能为从XDR数据中解码出字符串并保存到指定的字符数组,函数的具体执行流程如下:首先判断返回值是否小于0,也就是在之前的处理中,数据包是否有问题,如果没问题,获取将要存储的剩余字符数组的长度以及将要解码的xdr数据长度,如果剩余字符数组长度不够,进入XdrDecodeOpaqueSlow执行缓慢写入操作,否则就调用memove函数将XDR数据拷贝到字符数组,并且追加写x00实现字符串的截断。
这里我们就会发现,我们要探索的a3为一个字符串数组,寻找其交叉引用,在Nfs4SvrXdrpDecode_STRING函数中,我们发现a3在Nfs4SrvCpGetScratchBuffer中被赋值,
查看Nfs4SrvCpGetScratchBuffer函数,其功能为根据传入的大小计算缓冲区的大小(按照16字节对齐),检查是否需要分配新的缓冲区,如果需要则调用Nfs4SrvCppAddScratchBuffer函数来添加缓冲区,而Nfs4SrvCppAddScratchBuffer函数则是根据给定的大小分配内存,并与链表相连接,形成带有头结点的链表。
查询使用Nfs4SvrXdrpDecode_STRING进行解析的结构,发现凡是涉及到utf8strings传入的结构解析都可以触发,那么首先我们需要伪造一个NFSV4.1中的一个客户端与其通信,构造如下通信流程,获取打开文件必备的FILEHANDLE,
然后构造如下打开文件操作的数据包。
当一切正常时,ExAllocatePool2分配成功,在调用XdrDecodeString时,a3为一个正常的heap地址。而当ExAllocatePool2分配失败时候,XdrDecodeString函数中的写0操作仍在执行,最终导致crash。
03 参考资料
[1] https://www.zerodayinitiative.com/blog/2023/5/31/cve-2023-24941-microsoft-network-file-system-remote-code-execution
[2] https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-24941
绿盟科技天元实验室专注于新型实战化攻防对抗技术研究。
研究目标包括:漏洞利用技术、防御绕过技术、攻击隐匿技术、攻击持久化技术等蓝军技术,以及攻击技战术、攻击框架的研究。涵盖Web安全、终端安全、AD安全、云安全等多个技术领域的攻击技术研究,以及工业互联网、车联网等业务场景的攻击技术研究。通过研究攻击对抗技术,从攻击视角提供识别风险的方法和手段,为威胁对抗提供决策支撑。
M01N Team公众号
聚焦高级攻防对抗热点技术
绿盟科技蓝军技术研究战队
官方攻防交流群
网络安全一手资讯
攻防技术答疑解惑
扫码加好友即可拉群
原文始发于微信公众号(M01N Team):CVE-2023-24941 Windows NFS 远程代码执行漏洞分析