导语:以前红队讲车,进 CAN 拿方向盘。现在多了一个战场:CCS(Combined Charging System,组合充电系统)充电口。EVCC(Electric Vehicle Communication Controller,车端通信控制器)走 ISO 15118 协议和 SECC(Supply Equipment Communication Controller,桩端通信控制器)握手,握手完传支付证书、充电参数、车辆状态。Pavel Khunt 与 Thomas Sermpinis(化名 Cr0wTom)在 DEF CON 32 上放了 V2GEvil 工具,让红队第一次能直接站在桩这一侧攻击车。
一、新战场:充电口不是单纯接电网
传统燃油车只有 12V 电池 + CAN 总线。电动车不一样,充电口是车和外部世界数据通道最直接的接口——比车机蓝牙还直接,比 OTA 还近物理。
ISO 15118 设计目标本是把”插枪即充”和”Plug & Charge 自动支付”做出来:用户插上充电枪,车桩自动 TLS 握手、车辆出示数字证书、桩验证后开始计费充电。整条链路默认信任桩端——这就把”充电桩”变成了车的一个高权限入口。
V2GEvil 的核心思路反过来:桩端不是可信的。研究者的角色就是坐在充电桩背后,给 EVCC 喂畸形 SDP(SECC Discovery Protocol,桩端发现协议)、畸形 V2GTP、畸形 EXI(Efficient XML Interchange,高效 XML 交换格式)消息,看 EVCC 怎么炸。
二、协议栈四层:电力线通信是软肋
CCS 充电口通信分四层,从物理到应用:

2.1 IEC 61851:低层 PWM
CP(Control Pilot,控制导引)和 PE(Protective Earth,保护接地)两根线传 1kHz PWM(脉宽调制)。5% 占空比是暗号:”请升级到 ISO 15118 高层通信”。这条路径纯硬件,没有加密——物理层就能开打。
2.2 SLAC:PLC 配对
Höger 协议里的 SLAC(Signal Level Attenuation Characterization,信号衰减特性测量)用 HomePlug Green PHY(HPGP,家用电力线绿色物理层)做 PLC(Power Line Communication,电力线载波通信)配对。EVCC 和 SECC 通过交换 M-Sounds 帧测量信道衰减,匹配出可通信的节点。这一步是攻击的物理边界:HPGP 走电力线传导,所以同一变压器下的任意电源插座都能打。
2.3 V2GTP:传输层协议
V2GTP(Vehicle-to-Grid Transfer Protocol,车网传输协议)走 IPv6 link-local(fe80::/10,链路本地地址),UDP 15118 端口发 SDP 请求(0x9000),桩回响应(0x9001)携带 IPv6 + 端口 + 安全参数。8 字节头:[版本][反版本][载荷类型][载荷长度],载荷类型 0x8001 才是真正的 V2G 消息。
2.4 EXI:消息编码
V2G 应用层消息用 EXI 编码(不是 XML 也不是 JSON,是二进制的”压缩 XML”)。SessionSetup、AppProtocol 协商、ChargeParameterDiscovery、PaymentServiceSelection 一长串消息全部是 EXI 字节流。V2GEvil 的核心攻击面就埋在这里——EXI 解析器的内存安全问题。
三、V2G 通信五步建链
完整一次 ISO 15118 充电握手走五步:
- IEC 61851 状态切换:A→B,CP 5% PWM 触发高层通信
- SLAC 配对:HPGP 测量信道衰减,匹配出 EVCC 和 SECC
- SDP 发现:EVCC UDP 15118 发 0x9000 请求 → SECC 回 0x9001 响应,告知 IPv6 + 端口
- TCP/TLS 建链:拿到地址后建立 TCP 连接,按 SDP 响应里的安全字段决定是否走 TLS
- EXI V2G 消息交换:SessionSetup → AppProtocol 协商 → PaymentServiceSelection → ChargeParameterDiscovery → PowerDelivery → ChargingStatus
攻击者只要在第 3 步伪造 SDP 响应,把 EVCC 引到自己的桩端 IP,整条链路就被劫了。
四、V2GEvil 工具七大模块
Pavel Khunt 在捷克理工大学(FIT CTU)的硕士论文转成了 V2GEvil 这个工具,2024 年 DEF CON 32 + TROOPERS24 + DeepSec + ScapyCon 连发。架构分七层:
| 模块 | 作用 |
|---|---|
| CLI | 入口调度,所有命令从这里分发 |
| V2GTP | IPv6/UDP/TCP/V2GTP PDU 解析,SDP/EXI 解码,构造响应 |
| Sniffer | 实时 + pcap 离线抓包,按 IPv6/V2GTP 过滤,调用解码器 |
| Messages | V2G 消息 XML schema、JSON/EXI 互转,AC/DC 充电模式字典生成 |
| Station | 模拟 SECC,启 SDP UDP 服务和 TCP/TLS 服务,是所有攻击模块的核心 |
| Enumerator | 探测 EVCC 是否强制 TLS、TLS 版本、支持的密码套件、应用协议 |
| Fuzzer | 给 V2G 响应消息塞畸形值,模式 all/custom/config/message,专注 EXI/XML 解析问题 |
工具用 Python 3.10 + poetry 管理,Poetry 装好之后 v2gevil --help 看子命令。Live 抓包需要 root。WHL 打包放 dist/ 目录直接 pip install。
代码里 Sniffer/Station/Enumerator/Fuzzer 是四个真正会拿 shell 的模块——前两个负责通讯,后两个负责攻击。
五、攻击面与实战路径
5.1 EVCC 端的脆弱点
V2GEvil 设计目标就是替”桩”角色去打”车”,所以研究覆盖的是 EVCC 实现层的常见病:
- TLS 不强制:很多 EVCC 在 SDP 响应里接受
Security = 0x10 No TLS,直接跑明文 TCP - TLS 版本降级:V2GEvil 的 Enumerator 直接测密码套件列表,老 EVCC 还认 TLS 1.0/1.1
- AppProtocol 协商弱点:协商字段没有签名,可篡改优先权和版本号
- EXI 解析器漏洞:畸形 EXI payload 触发整数溢出、缓冲区溢出、递归栈爆掉
- 充电参数注入:ChargeParameterDiscovery 里的电压/电流/功率没有边界校验,写 1000V 桩会发疯
- 支付证书绕过:PaymentServiceSelection 阶段桩端没验证 EVCC 证书链就直接接受
5.2 物理层与近场攻击
DEF CON 演讲里特别强调一点:V2GEvil 跑通了车-桩-协议层攻击,但 SLAC / HPGP 物理层其实还有另一类风险。
学术界最完整的同类研究是 Brokenwire(Sebastian Köhler 团队,NDSS 2022 论文+ 2024 修订):利用 HPGP 协议 CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance,载波监听多路访问/冲突避免)机制的弱点,用 1W 功率、47 米距离的无线电就能把 CCS 充电过程的握手打挂。停车场隔着楼层和围栏都能打。
NDSS VehicleSec 2024 又出了一篇《Securing EV Charging System against Physical-layer Signal Injection Attack》,把这一类物理层注入攻击归为”未来五年最值得防的攻击面”。
5.3 桩端→车端 PoC 路径
实际 PoC 五步:
- 硬件准备:dLAN Green PHY eval board(devolo 出品)+ QCA7000 固件刷成 emob-charger 模式,RJ45 接笔记本
- Josev 启起来:用 iso15118 仓库里的 Josev(Joint Operating System for EV chargers,EV 充电桩联合操作系统)作为 EVCC 模拟器
- V2GEvil Station 跑桩角色:
v2gevil station ...启 SDP + TCP/TLS 服务 - 枚举目标 EVCC:
v2gevil enumerator ...看 TLS 状态、密码套件、AppProtocol - Fuzzer 喂畸形 V2G 消息:从 1 字节越界开始调,逐步加深度,看 EVCC 是否崩、是否泄漏栈、是否进入意外状态
六、防御建议
车端 EVCC 实现的硬性要求:
- 强制 TLS 1.2+,SDP 响应里
Security字段非 0x00 一律拒绝 - TLS 密码套件白名单:ECDHE + AES-GCM 起步,关掉所有 CBC 和 RC4
- EXI 解析器输入校验:用 schema-informed 的 EXI 处理器,写值域范围检查
- ChargeParameter 物理上限:电压/电流/功率字段根据电池包标定值硬性 cap
- PaymentService 证书链校验:OCSP/CRL 在线查询,桩端出示的可信证书链必须有 CA 锚
- AppProtocol 协商签名:协商阶段消息带 EVCC 私钥签名
- 物理层加固:监控 SLAC 配对阶段的 M-Sounds 帧统计,异常 burst 报警
桩端 SECC 实现同样:
- EVCC 证书链白名单,不认”任意 CA 签发”
- 会话 token 一次性,防止中继重放
- 异常协商状态自动断电,不进入”半握手”充电模式
七、思考题(引下一讲)
- V2GEvil 的 Enumerator 模块里
V2G EXI request字典的来源是什么?为什么需要”任意 V2G EXI request 都能加进去”这种开放设计? - Brokenwire 攻击为什么必须是无线的——直接物理接入 PLC 不能做吗?两者的边界在哪里?
- Plug & Charge 的支付证书如果被中间人代理出去(relay),车和桩谁能发现?设计层面有没有原生防重放机制?
八、本期素材出处
- #44 V2GEvil: Ghost in the wires(DEF CON 32 / TROOPERS24 / DeepSec 2024 / ScapyCon 2024 演讲,YouTube 视频):
https://www.youtube.com/watch?v=Ui2etjRyrUE/https://www.youtube.com/watch?v=JVWFfSmIlRY - #45 V2GEvil: Ghost in the wires(DEF CON CHV 视频,同上)
- #74 Khunt, P. Vehicle On-Board Charging Security Scanner, 2024(CTU 硕士论文 PDF):
https://dspace.cvut.cz/handle/10467/113764 - V2GEvil 工具仓库:
https://github.com/khuntpav/V2GEvil - DEF CON 32 官方 slides:
https://media.defcon.org/DEF%20CON%2032/DEF%20CON%2032%20villages/DEF%20CON%2032%20-%20Car%20Hacking%20Village%20-%20Pavel%20Khunt%20%26%20Thomas%20Sermpinis%20(a.k.a.%20Cr0wTom)%20-%20V2GEvil%20-%20Ghost%20in%20the%20wires.pdf - DeepSec 2024 slides:
https://deepsec.net/docs/Slides/2024/v2gEvil_Pavel_Khunt_-_Thomas_Sermpinis.pdf - Brokenwire 攻击(NDSS 2022/2024,Sebastian Köhler):
https://www.brokenwire.fail/ - NDSS VehicleSec 2024 物理层注入论文:
https://www.ndss-symposium.org/wp-content/uploads/vehiclesec2024-79-paper.pdf - Plug & Charge 安全分析(arXiv 2512.15966):
https://arxiv.org/abs/2512.15966














暂无评论内容