← 文章 / 开源项目
rustsec 5小时前 · 2026-09-23 17:47:40 · 0 阅读

RUSTSEC-2026-0304:connectrpc 中的漏洞

受影响版本的 connectrpc 在拦截器或处理器运行之前,会为每个客户端流式和双向流式调用启动一个后台任务来读取请求体。调用可能在请求体尚未完全消费之前就已结束:处理器可能在未读完请求流的情况下就返回,拦截器可能拒绝该调用,或者请求超时已触发。随后,该后台任务会继续读取,且没有时间上限。如果客户端在消息传输中途停止发送,或永远不发送剩余部分,该任务、其已缓冲的该消息片段(最大为 max_message_size,默认为 4 MiB)以及 HTTP/2 流或 HTTP/1.x 连接,将会一直保留,直到客户端完成流或关闭连接为止。

影响

客户端可以利用此缺陷耗尽服务器的内存、任务和文件描述符。使用内置 Server 的默认限制时,单个 HTTP/2 连接可保留 200 个停滞的流,在默认消息大小下约占 800 MiB,且服务器不限制连接数量。如果在 Tower 中间件中进行身份验证(即在请求到达服务之前),则仅暴露给拥有有效凭证的调用方。如果服务器未进行身份验证,或在拦截器中进行身份验证,则暴露给任何客户端。本公告仅涵盖客户端流式和双向流式调用。

修复版本

版本 0.8.2 和 0.9.1 限制了等待时间。当处理器结束后,读取器会释放该消息片段,并丢弃剩余请求体,限制为最多 5 秒和 1 MiB,然后丢弃它,这将重置 HTTP/2 流或关闭 HTTP/1.x 连接。在 wasm32 上,由于没有时钟,仅应用 1 MiB 的限制。版本 0.2.0 到 0.7.0 包含相同的读取器且未打补丁;请升级到 0.8.2 或更高版本。

缓解措施

在 Tower 中间件而非拦截器中进行身份验证,以便在启动任何读取器之前拒绝没有凭证的请求。设置 Server::with_max_connection_age,当连接达到其年龄和宽限期后,关闭该连接及其上的所有停滞请求体。降低 Limits::with_max_message_sizeServer::with_max_concurrent_streams 可以减少单个客户端可保留的资源,但无法释放停滞的请求体。

该公告基于 CC0-1.0 许可证提供。

原始来源: rustsec

评论 (0)