FreeRDP 是远程桌面协议 (RDP) 的免费实现,在 Apache 许可证下发布。受影响的版本会受到整数下溢的影响,导致“zgfx_decompress_segment”函数中的越界读取。在“CopyMemory”的上下文中,可能会读取超出传输数据包范围的数据,并可能导致崩溃。此问题已在版本 2.11.0 和 3.0.0-beta3 中得到解决。建议用户升级。此问题没有已知的解决方法。
-
受影响的版本
<= 2.10.0,<= 3.0.0-beta2
-
修补版本
2.11.0、3.0.0-beta3
细节一、
FreeRDP/libfreerdp/codec/zgfx.c
zgfx -> pbInputCurrent = pbSegment ;
zgfx -> pbInputEnd = & pbSegment [ cbSegment - 1 ];
NumberOfBitsToDecode = ((NumberOfBytesToDecode - 1) * 8) - ValueOfLastByte */
zgfx -> cBitsRemaining = 8 * ( cbSegment - 1 ) - * zgfx -> pbInputEnd ;
zgfx -> cBitsCurrent = 0 ;
zgfx -> BitsCurrent = 0 ;
中可能发生整数下溢cBitsRemaining
细节二、FreeRDP/libfreerdp/codec/zgfx.c
else
{
/* Unencoded */
zgfx_GetBits(zgfx, 15);
count = zgfx->bits;
zgfx->cBitsRemaining -= zgfx->cBitsCurrent;
zgfx->cBitsCurrent = 0;
zgfx->BitsCurrent = 0;
if (count > sizeof(zgfx->OutputBuffer) - zgfx->OutputCount)
return FALSE;
if (count > zgfx->cBitsRemaining / 8)
return FALSE;
CopyMemory(&(zgfx->OutputBuffer[zgfx->OutputCount]), zgfx->pbInputCurrent,
count);
zgfx_history_buffer_ring_write(zgfx, zgfx->pbInputCurrent, count);
zgfx->pbInputCurrent += count;
zgfx->cBitsRemaining -= (8 * count);
zgfx->OutputCount += count;
}
概念验证
- 启动带压缩的 gfx 数据包传输(flags== 0x24)。
- 传输以下主体数据:0b10001000 0b00111111 0b11111111.
- 在执行zgfx->cBitsRemaining = 8 * (cbSegment - 1) - *zgfx->pbInputEnd;期间,计算8 * (1 - 1) - 0xFF结果出现整数下溢。
- 令牌类型为0b10001,距离为0b00000。的值count是0x7e00,导致越界读取。
影响
越界读取
参考:
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-mxp4-rx7x-h2g8
- https://github.com/FreeRDP/FreeRDP/blob/2252d53001d9ce8a452f0a0a5b1f5ed9db6d57f1/libfreerdp/codec/zgfx.c#L256-L261
- https://github.com/FreeRDP/FreeRDP/blob/2252d53001d9ce8a452f0a0a5b1f5ed9db6d57f1/libfreerdp/codec/zgfx.c#L334-L355
原文始发于微信公众号(Ots安全):FreeRDP 是远程桌面协议 (RDP) 越界读取 - CVE-2023-40181
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论