我想报告在 Mongoose(v7.17)最新版本中发现的一个安全漏洞。该问题存在于 WebSocket 模块中,具体位于负责处理传入 WebSocket 帧的 mg_ws_cb 函数内。
该函数容易受到整数溢出的影响,在某些精心构造的输入下可能导致越界内存访问。远程攻击者可能利用此条件导致内存损坏或应用程序崩溃。
由于不同厂商对 WebSocket 业务逻辑的实现方式不同,此漏洞可能进一步导致远程代码执行。
详细信息:
根本漏洞位于 mg_ws_cb 函数中:
客户端发送的特制 WebSocket 数据包可以在此时将 ofs=0,这会在计算 ofs-1 时引发整数溢出,导致结果值远大于 recv.buf 的长度。
在后续的 WebSocket 处理函数中,这个 buf 可能会被使用,由于它的长度大于实际长度,可能导致越界访问或程序崩溃。
漏洞触发:
为了演示,我选择了项目中现有的名为“websocket-server”的 WebSocket 示例。除了在编译时添加 ASAN 检查外,我没有对代码做任何更改。
运行程序并发送特定的 WebSocket 数据包时,会直接导致崩溃。
poc:
我还选择了项目中现有的“websocket-client”作为客户端,仅对 main.c 的 fn 函数中用于发送请求的两个参数进行了修改。
运行修改后的程序将导致服务器崩溃。