XP SP3范围检查是否隐藏溢出条件?深入解析终端服务RPC接口安全实践

本文针对Windows XP SP3中终端服务RPC函数RpcWinStationEnumerateProcesses新增的范围检查机制进行技术解析,探讨RPC接口设计最佳实践与底层内存分配机制,澄清安全社区对潜在溢出漏洞的误解。

XP SP3范围检查隐藏溢出条件?| MSRC博客

我们收到了一些关于完整披露帖子http://seclists.org/fulldisclosure/2007/Dec/0470.html的询问,该帖子指出Windows XP SP3为终端服务器RPC函数RpcWinStationEnumerateProcesses添加了范围检查。推测称此更改是为了隐藏溢出条件,可能导致旧版Windows中存在可被利用的漏洞。实际上,对终端服务RPC接口定义的这一更新是为了更好地遵循我们自身的RPC最佳实践。

从《IDL技术实现更优接口和方法设计》中:

对于标记有[out, size_is]属性元组的参数,当数据长度在客户端已知或客户端有合理上限时,方法定义在参数属性和序列上应类似以下形式:

1
2
3
4
outKnownSize(
    [in, range(MIN_COUNT, MAX_COUNT)] long lSize,
    [out, size_is(lSize)] UserDataType * pArr
);

在这种情况下,客户端为pArr提供固定大小的缓冲区,允许服务器端RPC服务以较高确信度分配合理大小的缓冲区。请注意,在示例中数据是从服务器接收的([out])。对于传递给服务器的数据([in]),定义类似。

查看IDA反汇编代码,可以看到该值用于从RtlAllocateHeap检索内存块。然后该内存被传递给NtQuerySystemInformation,后者用各种系统信息填充它——正如您所猜测的。如果由于此值存在溢出,它将在这些较低级别的函数中存在并被修复,而不是在高级接口定义中。


反汇编 | 完整披露 | IDA | RPC

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计