自动驾驶系统(Automated Driving System, ADS)是指通过传感器感知、计算决策和执行控制三大子系统协同工作,实现在特定条件下对车辆进行部分或完全自主操控的技术体系。根据 SAE J3016 标准,自动驾驶被划分为 L0(无自动化)到 L5(完全自动化)六个等级,当前量产车型普遍处于 L2+(部分自动驾驶)至 L3(有条件自动驾驶)阶段,而 Waymo、Cruise、百度 Apollo 等 Robotaxi 项目则在限定区域内推进 L4(高度自动驾驶)的商业化运营。自动驾驶系统的核心在于感知-决策-执行(Perception-Planning-Action)闭环:LiDAR、Camera、Radar 等传感器构建三维环境模型,车载计算平台运行深度学习推理和路径规划算法,线控底盘系统执行转向、制动和加速指令。
近年来,自动驾驶安全事件频发,安全研究社区在传感器欺骗、决策系统投毒、CAN 总线注入、V2X 通信劫持等环节发现了大量可被利用的攻击面。2019 年,以色列 Ben-Gurion 大学研究团队通过在道路上放置微小贴纸成功欺骗 Tesla Model S 的 Autopilot 感知系统,使其将车道线错误识别(T1200 - Hardware Additions);2020 年,UC Berkeley 研究人员利用对抗样本攻击(Adversarial Example)使 Waymo 和 Mobileye 的感知模型产生误判(T1595 - Active Scanning);2023 年,Keen Security Lab 展示了对多个品牌自动驾驶系统的远程攻击链,从传感器层到决策层实现完整突破;2024 年,多个安全团队披露了针对 V2X(Vehicle-to-Everything)通信协议栈的中间人攻击,可在城市交通场景中大规模操纵交通信号和车辆行为。据 Upstream Security 2025 年度报告统计,涉及自动驾驶系统的安全事件年增长率达 40%,其中 60% 可通过远程网络攻击实现。
自动驾驶系统安全取证面临的独特挑战在于:传感器数据的实时性极高,LiDAR 点云以每秒数十万个点的速率产生,Camera 帧率通常为 30-60fps,关键攻击痕迹可能在毫秒级别被覆盖;感知-决策-执行链路跨越多个异构计算平台(GPU、FPGA、ASIC),日志格式和存储机制各不相同;攻击面从物理层(激光干扰 LiDAR)贯穿到应用层(神经网络后门),形成多维度复合攻击链;更重要的是,自动驾驶系统往往缺乏传统的安全日志机制,取证人员需要从原始传感器数据、中间计算结果和执行器反馈中重建攻击场景。本文系统性地构建自动驾驶系统安全取证的完整方法论,从传感器欺骗检测到全链路日志分析,从 CAN 总线攻击痕迹到 V2X 通信审计,结合公开案例和自动化检测工具,为安全取证分析人员提供一份从理论到实践的深度参考。
0x01 技术基础与自动驾驶架构概述 自动驾驶系统架构全景 现代自动驾驶系统遵循感知-融合-决策-规划-执行的分层架构,每一层由独立的软件模块和硬件平台支撑,层间通过标准化接口进行数据流转。
架构层级 核心功能 关键组件 数据类型 取证优先级 感知层 (Perception) 环境感知与目标检测 LiDAR、Camera、Radar、Ultrasonic 点云、图像、雷达信号 🔴最高 融合层 (Fusion) 多传感器数据融合 Sensor Fusion Engine、BEV Transformer 融合特征向量 🔴最高 决策层 (Planning) 行为决策与路径规划 Behavior Planner、Motion Planner 路径轨迹、决策序列 🔴最高 控制层 (Control) 车辆运动控制 线控转向、制动、油门控制器 控制指令(CAN帧) 🟡高 通信层 (Connectivity) 车内外通信 V2X、T-BOX、OTA模块 网络数据包 🟡高 平台层 (Platform) 计算与存储 NVIDIA Orin、地平线J5、华为MDC 计算日志、系统日志 🟡高
自动驾驶系统的传感器配置因级别和应用场景而异。典型的 L2+ 量产车型配置包括:前向 Camera(1-3 个,用于车道线检测和目标识别)、前向毫米波 Radar(1-2 个,用于测距和测速)、环视 Camera(4-8 个,用于全景泊车和近场感知)、超声波传感器(8-12 个,用于近距离障碍物检测)。L3 及以上级别车型还会增加 LiDAR(1-4 个,用于精确 3D 环境建模)、高精度 GNSS/IMU 组合导航系统,以及 V2X 通信模块。
传感器类型 探测距离 角分辨率 数据速率 抗干扰能力 攻击向量 Camera 0-250m 0.1° 30-60fps × 2-8路 受光照影响大 贴纸欺骗、强光致盲、图像注入 LiDAR 0-300m 0.05-0.2° 100K-300K点/秒 较强 激光干扰、虚假点云注入、反射欺骗 Radar 0-250m 1-2° 中等 强(全天候) 中继攻击、信号干扰、目标模拟 Ultrasonic 0-5m 宽角度 低 弱 超声波干扰 GNSS/IMU 全球 N/A 10-100Hz 易受欺骗 GPS欺骗、IMU数据篡改
传感器融合与感知算法 自动驾驶系统普遍采用多传感器融合(Multi-Sensor Fusion)策略来弥补单一传感器的局限性。主流融合架构分为前融合(Early Fusion)和后融合(Late Fusion)两种模式。
融合方式 融合位置 优势 劣势 代表系统 前融合 原始数据层 信息保留完整 计算量大、同步困难 Waymo (早期) 特征融合 中间特征层 平衡性能与效率 需统一特征空间 Tesla FSD (BEV) 后融合 目标检测层 模块独立性强 信息损失大 多数量产 L2+ BEV 融合 鸟瞰图空间 3D 空间理解强 模型复杂度高 华为 ADS 2.0
感知算法方面,当前主流方案基于深度学习目标检测网络(如 YOLO、PointPillars、CenterPoint)和 BEV(Bird’s Eye View)Transformer 架构。Tesla 的 FSD(Full Self-Driving)系统采用纯视觉方案,通过 8 路 Camera 输入构建 BEV 空间表征,再由 Transformer 解码器完成目标检测和路径预测。这种端到端(End-to-End)架构虽然简化了系统复杂度,但也引入了新的安全风险——攻击者可以通过对抗样本或数据投毒直接影响神经网络的输出。
# 使用 CANoe 导出自动驾驶传感器同步日志
# 前提:已通过 Vector CAN 接口连接车辆 OBD-II 端口
canconvert sensor_sync_canoe.asc sensor_sync.csv --layout "timestamp,channel,id,dlc,data"
# 提取传感器时间戳同步信息
awk -F',' 'NR>1 && $4==8 {printf "TS=%s CH=%s ID=0x%s DL=%s DATA=%s%s%s%s%s%s%s%s\n", $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12}' sensor_sync.csv | head -50 自动驾驶安全攻击面映射 基于 MITRE ATT&CK for ICS 框架和汽车安全研究实践,自动驾驶系统的攻击面可映射为以下技术矩阵:
ATT&CK 技术 ID 技术名称 攻击层级 自动驾驶场景 T1190 Exploit Public-Facing Application 通信层 V2X 服务端漏洞利用 T1195 Supply Chain Compromise 平台层 传感器/芯片供应链植入 T1200 Hardware Additions 感知层 物理传感器篡改/贴纸欺骗 T1559 Inter-Process Communication 决策层 ECU 间 IPC 劫持 T1562 Impair Defenses 全链路 禁用安全监控模块 T1565 Data Manipulation 感知层 传感器数据注入/篡改 T1595 Active Scanning 通信层 V2X 频谱扫描与协议探测 T1040 Network Sniffing 通信层 CAN/以太网流量嗅探 T1021 Remote Services 平台层 OTA/远程诊断接口滥用 T1498 Network Denial of Service 通信层 V2X DoS 干扰正常通信
0x02 LiDAR/Camera/Radar 传感器欺骗攻击取证 LiDAR 欺骗攻击检测与取证 LiDAR(Light Detection and Ranging)是自动驾驶系统的核心感知传感器,通过发射激光脉冲并测量反射信号来构建高精度三维点云地图。LiDAR 欺骗攻击主要分为三类:光学干扰(Optical Jamming)、虚假目标注入(Ghost Object Injection)和点云数据篡改(Point Cloud Tampering)。
光学干扰攻击 通过向 LiDAR 接收器发射高功率激光,使传感器产生大量虚假反射点或暂时失明。这种攻击不需要了解 LiDAR 的内部协议,实施门槛最低。安全研究人员已证明,使用售价约 50 美元的激光二极管即可在 100 米距离上干扰多款主流 LiDAR 产品。
虚假目标注入攻击 利用 LiDAR 系统的信号处理漏洞,通过精确同步的反射信号在 LiDAR 点云中生成不存在的"幽灵障碍物",诱导自动驾驶系统执行不必要的紧急制动或转向操作。2023 年,CleverHans 研究团队演示了在 120 米距离上向 Velodyne VLP-16 LiDAR 注入虚假行人的完整攻击链。
攻击类型 攻击原理 所需设备 有效距离 检测难度 ATT&CK 光学干扰 高功率激光致盲/饱和 激光二极管 + 信号发生器 50-200m 🟡中 T1565.001 虚假目标注入 精确同步反射信号伪造目标 定制激光发射器 + FPGA 30-150m 🔴高 T1565.002 点云数据篡改 攻击数据传输链路/存储 CAN/以太网接入 有线距离 🔴高 T1565.003 物理遮挡 遮蔽/覆盖 LiDAR 镜头 无需专业设备 接触距离 🟢低 T1200
# 使用 Velodyne 官方工具捕获原始 LiDAR 点云数据
# 前提:LiDAR 通过以太网连接,IP 为 192.168.1.201
velodyne_capture --ip 192.168.1.201 --port 2368 --output raw_lidar.pcap --duration 60
# 使用 tshark 分析 LiDAR 数据流特征
tshark -r raw_lidar.pcap -Y "udp.port == 2368" -T fields \
-e frame.time_relative -e udp.length -e data.len \
-e udp.srcport -e udp.dstport > lidar_flow.csv
# 检测 LiDAR 数据流中的异常包间隔(可能的注入信号)
python3 -c "
import csv
intervals = []
with open('lidar_flow.csv') as f:
reader = csv.DictReader(f, delimiter='\t')
prev = None
for row in reader:
ts = float(row['frame.time_relative'])
if prev is not None:
intervals.append(ts - prev)
prev = ts
avg = sum(intervals) / len(intervals)
anomalies = [(i, v) for i, v in enumerate(intervals) if abs(v - avg) > 3 * (sum((x-avg)**2 for x in intervals)/len(intervals))**0.5]
print(f'平均包间隔: {avg*1000:.2f}ms, 异常包数: {len(anomalies)}')
for idx, val in anomalies[:20]:
print(f' 异常帧 #{idx}: 间隔 {val*1000:.2f}ms (偏差 {(val-avg)/avg*100:.1f}%)')
" Camera 欺骗攻击检测与取证 Camera 是自动驾驶系统中最常用的感知传感器,负责车道线检测、交通标志识别、行人检测等关键任务。Camera 欺骗攻击具有成本低、隐蔽性强的特点,安全研究人员已展示了多种有效的攻击手段。
对抗贴纸攻击 (Adversarial Patch Attack)是在真实道路环境中实施最为可行的攻击方式。研究团队在 stop sign 上粘贴特定图案的小贴纸,可使目标检测模型将其误分类为 speed limit sign,导致自动驾驶系统在停车标志前不减速。类似地,在车道线上放置特定图案可以诱导系统偏离车道。投影攻击 利用高亮度投影设备将虚假图像投射到道路上或障碍物表面,生成 Camera 可见但 LiDAR 不可见的"幻影目标",利用多传感器不一致性触发系统故障。
# 使用 OpenCV 分析行车记录仪视频中的异常帧
python3 << 'EOF'
import cv2
import numpy as np
import sys
cap = cv2.VideoCapture(sys.argv[1] if len(sys.argv) > 1 else "dashcam_recording.mp4")
fps = cap.get(cv2.CAP_PROP_FPS)
frame_count = 0
anomaly_frames = []
prev_hist = None
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
frame_count += 1
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
hist = cv2.calcHist([gray], [0], None, [256], [0, 256])
hist = cv2.normalize(hist, hist).flatten()
if prev_hist is not None:
diff = cv2.compareHist(prev_hist, hist, cv2.HISTCMP_BHATTACHARYYA)
if diff > 0.4:
ts = frame_count / fps
anomaly_frames.append((frame_count, ts, diff))
cv2.imwrite(f'anomaly_frame_{frame_count}.jpg', frame)
prev_hist = hist
cap.release()
print(f'总帧数: {frame_count}, 异常帧数: {len(anomaly_frames)}')
for fc, ts, d in anomaly_frames[:20]:
print(f' 帧 #{fc} ({ts:.2f}s): 直方图差异 = {d:.4f}')
EOF Radar 欺骗攻击检测与取证 毫米波雷达(Millimeter Wave Radar)通过发射和接收电磁波来测量目标的距离、速度和角度。由于 Radar 信号的物理特性,其抗干扰能力优于 Camera 和 LiDAR,但并非不可攻破。中继攻击(Relay Attack)通过接收并转发真实 Radar 信号来伪造目标存在,常用于自动驾驶测试环境中模拟危险场景。更高级的攻击可以在 Radar 信号处理链路中注入虚假目标,使系统检测到不存在的障碍物。
传感器欺骗对比维度 LiDAR 欺骗 Camera 欺骗 Radar 欺骗 实施成本 中(需定制设备) 低(贴纸/投影) 高(需射频设备) 隐蔽性 中(异常点云模式) 高(不易察觉) 高(信号层隐蔽) 影响范围 全向(360°) 视场角内 视场角内 多传感器融合检出 中(与 Camera 交叉验证) 高(与 LiDAR 交叉验证) 低(Radar 独立性强) 取证可恢复性 中(需原始点云) 高(视频可保存) 低(信号数据难恢复) 代表 CVE CVE-2022-28348 CVE-2021-36347 CVE-2023-29389
0x03 CAN 总线与车载以太网攻击痕迹分析 CAN 总线协议安全分析 CAN(Controller Area Network)总线是车载网络的核心通信协议,自 1986 年由 Bosch 公司开发以来,已成为汽车行业最广泛使用的串行通信标准。CAN 协议工作在 OSI 模型的物理层和数据链路层,支持最高 1Mbit/s 的传输速率,采用多主站(Multi-Master)架构,任何节点都可以在总线空闲时发送消息。
CAN 协议的安全缺陷根植于其设计之初对安全性的忽视:没有消息认证机制、没有加密保护、没有访问控制。每条 CAN 消息由 11 位(标准帧)或 29 位(扩展帧)的标识符(Identifier)、0-8 字节的数据域(Data Field)和 16 位的 CRC 校验组成。所有挂载在同一总线上的节点都可以接收到总线上的所有消息,这意味着攻击者只需接入任一 ECU 即可监听全部通信并注入任意消息。
自动驾驶系统中,CAN 总线承担着关键控制信号的传输任务,包括转向角度(Steering Angle)、制动压力(Brake Pressure)、加速踏板位置(Accelerator Pedal Position)、车速(Vehicle Speed)、档位(Gear Position)等。攻击者对这些关键信号的篡改直接威胁行车安全。
# 使用 candump 实时捕获 CAN 总线流量
# 前提:Linux 系统已加载 CAN 驱动(如 SocketCAN)
sudo ip link set can0 up type can bitrate 500000
candump can0 -t a -c 1000 > can_capture_$( date +%Y%m%d_%H%M%S) .log
# 分析 CAN 消息频率分布(检测异常高频注入)
cat can_capture_*.log | awk '{print $2}' | sort | uniq -c | sort -rn | head -30
# 使用 cansniffer 实时可视化 CAN 总线消息变化
cansniffer can0 -c CAN 总线攻击的取证分析需要关注以下几个维度:消息频率异常(正常 ECU 发送消息的频率是固定的,异常高频或低频可能暗示注入或阻断攻击)、数据域异常值(关键控制信号的数据值应符合物理约束,如转向角度不应突然跳变)、总线负载率变化(正常 CAN 总线负载率通常在 30-60% 之间,异常高负载可能暗示 DoS 攻击)、错误帧检测(CAN 协议的错误处理机制会产生错误帧,异常错误帧率可能暗示物理层干扰)。
CAN 总线异常指标 正常范围 异常阈值 检测方法 取证价值 消息频率偏差 ±5% 标称频率 >20% 偏差 频率直方图分析 🔴高 总线负载率 30-60% >80% 负载率时间序列 🟡中 错误帧比例 <0.1% >1% 错误帧计数 🔴高 新增消息 ID 无 出现未注册 ID ID 白名单比对 🔴高 数据域突变 平滑变化 瞬间跳变 >阈值 时序异常检测 🔴高
CAN 总线入侵检测深度分析 CAN 总线入侵检测系统(IDS)的取证分析是自动驾驶安全事件调查的核心环节。当前主流的 CAN IDS 方法包括基于规则的检测(Signature-based)、基于统计的检测(Statistical-based)和基于机器学习的检测(ML-based)。取证分析人员需要理解这些检测方法的原理,以便正确解读 IDS 告警并识别漏报和误报。
# 使用 CANalyzat0r 进行 CAN 总线安全审计
# 启动 CANalyzat0r 控制台
python3 canalyzat0r.py --interface can0
# 批量分析 CAN 日志中的异常消息
python3 << 'PYEOF'
import can
import collections
import statistics
def analyze_can_log(log_file):
msg_counts = collections.Counter()
msg_data_patterns = collections.defaultdict(list)
msg_intervals = collections.defaultdict(list)
prev_time = {}
with open(log_file, 'r') as f:
for line in f:
parts = line.strip().split()
if len(parts) < 3:
continue
ts = float(parts[0].strip('()'))
msg_id = parts[1]
data = parts[2]
msg_counts[msg_id] += 1
msg_data_patterns[msg_id].append(data)
if msg_id in prev_time:
msg_intervals[msg_id].append(ts - prev_time[msg_id])
prev_time[msg_id] = ts
print(f"{'消息ID':<12} {'计数':>8} {'频率Hz':>8} {'数据唯一值':>10} {'间隔均值ms':>12} {'异常标记':>8}")
print("-" * 75)
for msg_id in sorted(msg_counts.keys()):
count = msg_counts[msg_id]
intervals = msg_intervals.get(msg_id, [])
avg_interval = statistics.mean(intervals) if intervals else 0
freq = 1.0 / avg_interval if avg_interval > 0 else 0
unique_data = len(set(msg_data_patterns[msg_id]))
flag = ""
if freq > 100:
flag = "⚠️高频"
if unique_data == 1:
flag = "⚠️静态"
if len(intervals) > 10:
cv = statistics.stdev(intervals) / avg_interval if avg_interval > 0 else 0
if cv > 0.5:
flag = "⚠️抖动"
print(f"0x{msg_id:<8} {count:>8} {freq:>8.1f} {unique_data:>10} {avg_interval*1000:>10.2f}ms {flag:>8}")
analyze_can_log("can_capture_20260720.log")
PYEOF 车载以太网攻击痕迹分析 随着自动驾驶系统对数据带宽需求的激增,车载以太网(Automotive Ethernet)已成为新一代电子电气架构的核心通信骨干。与传统 CAN 总线不同,车载以太网支持 100Mbps 至 10Gbps 的传输速率,承载传感器原始数据(Camera 视频流、LiDAR 点云)、ADAS 计算数据和 OTA 更新包等大流量数据。车载以太网的引入使车载网络暴露了传统 IT 网络的所有攻击面:ARP 欺骗、DNS 劫持、TCP/IP 协议栈漏洞、应用层攻击等。
通信协议 传输速率 主要用途 安全机制 取证数据源 CAN/CAN FD 1M/8Mbit/s 控制信号、诊断 无原生安全机制 CAN 日志 LIN 20Kbit/s 车身低速控制 无 基本不取证 FlexRay 10Mbit/s 线控系统 冗余机制 FlexRay 日志 车载以太网 100BASE-T1 100Mbit/s 诊断、信息娱乐 SecOC/MACsec 以太网 pcap 车载以太网 1000BASE-T1 1Gbit/s ADAS 数据传输 SOME/IP TLS 以太网 pcap 车载以太网 10GBASE-T1 10Gbit/s 中央计算互联 MACsec/IPsec 高速抓包
# 使用 Wireshark/tshark 分析车载以太网流量
# 捕获 SOME/IP (Scalable service-Oriented MiddlewarE over IP) 协议流量
tshark -r vehicle_ethernet.pcap -Y "someip" -T fields \
-e frame.time -e ip.src -e ip.dst -e someip.service_id \
-e someip.method_id -e someip.msg_type -e someip.return_code \
-e tcp.len -e udp.length > someip_analysis.csv
# 检测 ARP 欺骗(车载以太网常见攻击)
tshark -r vehicle_ethernet.pcap -Y "arp" -T fields \
-e frame.time -e arp.src.hw_mac -e arp.src.proto_ipv4 \
-e arp.dst.proto_ipv4 -e arp.opcode | \
sort | uniq -c | sort -rn | head -20
# 提取 DoIP (Diagnostics over IP) 诊断流量
tshark -r vehicle_ethernet.pcap -Y "doip" -T fields \
-e frame.time -e doip.version -e doip.payload_type \
-e doip.source_address -e doip.target_address \
-e doip.length > doip_diag.csv 0x04 V2X 通信安全审计与中间人攻击取证 V2X 通信架构与安全模型 V2X(Vehicle-to-Everything)通信技术使车辆能够与周围环境进行实时信息交互,是实现协同式自动驾驶(Cooperative Automated Driving)的关键基础设施。V2X 通信包含四个基本模式:V2V(Vehicle-to-Vehicle,车车通信)、V2I(Vehicle-to-Infrastructure,车路通信)、V2N(Vehicle-to-Network,车网通信)和 V2P(Vehicle-to-Pedestrian,车人通信)。
全球范围内存在两套 V2X 通信标准体系:基于 IEEE 802.11p 的 DSRC/IEEE WAVE(美国主导)和基于 3GPP 的 C-V2X(Cellular Vehicle-to-Everything,中国/欧洲主导)。C-V2X 又分为 PC5 接口(直连通信,类似 DSRC)和 Uu 接口(通过蜂窝网络的通信)两种模式。中国已明确选择 C-V2X 作为国家标准技术路线,截至 2026 年已部署超过 40 个 V2X 示范城市和 3000 公里的 V2X 覆盖道路。
V2X 技术标准 通信方式 频段 延迟 安全机制 代表部署 DSRC (IEEE 802.11p) 直连 5.9GHz <100ms 数字证书 (ECDSA) 美国、日本 C-V2X PC5 直连 5.9GHz <100ms 数字证书 (SCMS) 中国、欧洲 C-V2X Uu 蜂窝网络 运营商频段 <50ms 4G/5G 安全 中国、欧洲 NR-V2X (5G) 蜂窝网络 运营商频段 <10ms 5G-AKA 试验阶段
V2X 中间人攻击取证 V2X 通信的中间人(Man-in-the-Middle, MitM)攻击是自动驾驶系统面临的最严重安全威胁之一。攻击者可以在 V2V 通信中插入虚假的位置信息、速度数据或危险警告,诱导目标车辆做出错误的驾驶决策。更危险的是,攻击者可以同时篡改多个车辆的 V2X 消息,造成大规模交通混乱。
V2X 中间人攻击的主要实现方式包括:伪基站攻击(Rogue RSU,模拟路侧单元广播虚假交通信息)、Sybil 攻击(伪造大量虚拟车辆身份制造虚假交通状况)、重放攻击(Replay Attack,重放历史合法消息干扰当前交通决策)、消息篡改攻击(修改合法 V2X 消息中的关键字段)。
# 使用 USRP 软件无线电平台捕获 C-V2X PC5 信号
# 前提:已安装 GNU Radio 和 C-V2X 解码模块
gnuradio-companion cv2x_capture.grc --args "type=usrp,addr=192.168.10.2"
# 分析捕获的 V2X 消息(SAE J2735 BSM 格式)
python3 << 'PYEOF'
import json
import struct
import hashlib
from collections import defaultdict
def parse_bsm_payload(hex_data):
result = {}
if len(hex_data) < 38:
return result
msg_count = int(hex_data[0:2], 16)
result['msg_count'] = msg_count
temp_id = hex_data[2:8]
result['temp_id'] = temp_id
lat = struct.unpack('>i', bytes.fromhex(hex_data[8:16]))[0]
result['latitude'] = lat / 1e7
lon = struct.unpack('>i', bytes.fromhex(hex_data[16:24]))[0]
result['longitude'] = lon / 1e7
speed_raw = struct.unpack('>H', bytes.fromhex(hex_data[24:28]))[0]
result['speed_mps'] = speed_raw * 0.02
heading = struct.unpack('>H', bytes.fromhex(hex_data[28:32]))[0]
result['heading'] = heading * 0.0125
return result
vehicles = defaultdict(list)
with open("cv2x_raw.hex", "r") as f:
for line in f:
parts = line.strip().split()
if len(parts) < 3:
continue
ts, rssi, hex_data = parts[0], parts[1], parts[2]
bsm = parse_bsm_payload(hex_data)
if bsm:
vid = bsm['temp_id']
vehicles[vid].append({
'timestamp': ts,
'rssi': float(rssi),
'lat': bsm['latitude'],
'lon': bsm['longitude'],
'speed': bsm['speed_mps']
})
print(f"检测到 {len(vehicles)} 个唯一车辆")
for vid, msgs in vehicles.items():
lats = [m['lat'] for m in msgs]
speeds = [m['speed'] for m in msgs]
rssis = [m['rssi'] for m in msgs]
lat_jump = max(abs(lats[i] - lats[i-1]) for i in range(1, len(lats))) if len(lats) > 1 else 0
speed_max = max(speeds) if speeds else 0
rssi_std = (sum((r - sum(rssis)/len(rssis))**2 for r in rssis) / len(rssis))**0.5 if len(rssis) > 1 else 0
flags = []
if lat_jump > 0.001:
flags.append("⚠️位置跳变")
if speed_max > 50:
flags.append("⚠️超速")
if rssi_std > 15:
flags.append("⚠️信号异常")
print(f" 车辆 {vid}: {len(msgs)} 条消息, 位置跳变 {lat_jump*111000:.1f}m, RSSI标准差 {rssi_std:.1f}dB {' '.join(flags)}")
PYEOF V2X 安全审计工具与方法 V2X 通信安全审计需要综合使用射频分析工具、协议解析器和安全测试框架。审计重点包括:数字证书验证(检查 V2X 消息签名的合法性)、消息时效性检查(检测重放攻击)、位置一致性验证(通过多源数据交叉验证车辆位置的合理性)、信号强度分析(通过 RSSI 分析识别伪基站或中继攻击)。
# 使用 SDR 工具扫描 V2X 频段活动
# 扫描 5.85-5.925 GHz ITS 频段
hackrf_transfer -r v2x_capture.raw -f 5890000000 -s 20000000 -g 40 -l 32 -n 200000000
# 使用 inspectrum 可视化 V2X 信号特征
inspectrum v2x_capture.raw
# 分析 V2X 消息的数字证书链
openssl cms -verify -in v2x_message.der -inform DER -CAfile its_root_ca.pem \
-out signed_content.bin -outform DER 2>&1 | head -20
# 检查 V2X 证书吊销状态(CRL/OCSP)
openssl ocsp -issuer its_ca.pem -cert vehicle_cert.pem \
-url http://crl.its-safety.org/ocsp -resp_text 2>/dev/null | grep -E "HTTP/1|Cert Status|This Update" 0x05 OTA 更新链完整性验证与固件取证 OTA 更新架构与信任链 Over-the-Air(OTA)更新是自动驾驶系统维持安全性和功能性的关键机制。现代智能汽车的 OTA 系统涵盖整车 OTA(Vehicle OTA)和部件 OTA(ECU OTA)两个层次,涉及数十甚至上百个 ECU 的固件更新。OTA 更新链的安全性直接关系到自动驾驶系统的完整性——一个被篡改的 OTA 包可以在更新过程中植入恶意代码,实现对自动驾驶感知、决策或控制系统的持久化控制。
典型的 OTA 更新链包含以下环节:云端更新服务器(Update Server)生成更新包 → 传输层加密(TLS)传输 → 车端 OTA 管理器(OTA Manager)接收 → 完整性校验(签名验证 + 哈希校验)→ 固件解压与部署 → ECU 刷写 → 更新验证与回滚机制。攻击者可以在多个环节实施攻击:篡改更新服务器(供应链攻击 T1195)、中间人篡改传输内容(T1557)、绕过签名验证(固件签名伪造)、利用回滚机制漏洞降级到存在漏洞的旧版本。
OTA 攻击环节 攻击技术 ATT&CK 检测难度 影响范围 更新服务器入侵 SQL 注入/RCE 获取管理权限 T1190 🔴高 全量车辆 传输劫持 SSL Stripping / MitM T1557 🟡中 目标车辆 签名验证绕过 密钥泄露/签名算法弱点 T1552 🔴高 目标车型 固件逆向 提取并分析固件内容 T1592 🟡中 单个 ECU 版本降级 Rollback Attack T1600 🟡中 目标 ECU 回滚机制利用 跳过更新后校验 T1562 🔴高 单个 ECU
# 提取 OTA 更新包进行完整性验证
# 前提:已获取 OTA 更新包(通常为 .zip/.tar.gz 格式)
unzip -o ota_update_v2.3.1.zip -d ota_extracted/
# 验证更新包数字签名
gpg --verify ota_update.sig ota_update.bin 2>&1
openssl dgst -sha256 -verify ota_public_key.pem -signature ota_update.sig ota_update.bin
# 计算固件哈希与官方发布值比对
sha256sum ota_update.bin
cat ota_update.sha256sum
# 提取 ELF 格式固件进行逆向分析
binwalk -e ota_extracted/firmware.bin
strings ota_extracted/firmware.bin.elf | grep -iE "password|secret|key|token|api" | head -30
# 检查固件中的已知漏洞组件
cve-bin-tool ota_extracted/firmware.bin --format csv -o firmware_vuln_report.csv 2>/dev/null 固件取证与逆向分析 自动驾驶系统的 ECU 固件取证是 OTA 安全分析的重要组成部分。取证分析人员需要从多种来源获取固件样本:通过 JTAG/SWD 调试接口直接从 ECU 芯片提取(Chip-Off 或 In-Circuit 读取)、通过车载诊断接口(OBD-II / DoIP)的 UDS 刷写服务读取、通过 OTA 更新包解包获取、从供应商或开源代码仓库获取。
# 使用 UDS (Unified Diagnostic Services) 通过 DoIP 读取 ECU 固件
# 前提:已连接至车辆以太网诊断端口
python3 << 'PYEOF'
import socket
import struct
DOIP_PORT = 13400
ECU_ADDRESS = 0x0010
TARGET_ADDRESS = 0x0E00
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("192.168.1.100", DOIP_PORT))
def send_doip(payload_type, target, source, data):
length = 4 + len(data)
header = struct.pack('>BBHII', 0x01, 0x00, payload_type, length, target, source)
sock.send(header + data)
def send_uds(service, sub_func=None, data=b''):
uds_payload = bytes([service])
if sub_func is not None:
uds_payload += bytes([sub_func])
uds_payload += data
send_doip(0x8001, TARGET_ADDRESS, ECU_ADDRESS, uds_payload)
resp = sock.recv(4096)
return resp[13:]
send_uds(0x10, 0x03)
resp = send_uds(0x34, 0x00, struct.pack('>IH', 0x00000000, 0x0400))
print(f"RequestDownload 响应: {resp.hex()}")
chunk_size = 0x400
total_size = 0x40000
firmware_data = b''
for offset in range(0, total_size, chunk_size):
resp = send_uds(0x36, bytes([offset // 0x100 & 0xFF]),
struct.pack('>H', min(chunk_size, total_size - offset)))
if resp[0] == 0x76:
firmware_data += resp[3:]
with open('ecu_firmware_dump.bin', 'wb') as f:
f.write(firmware_data)
print(f"固件提取完成: {len(firmware_data)} 字节")
sock.close()
PYEOF 固件签名验证与代码审计 固件签名验证是确保 OTA 更新链完整性的最后一道防线。取证分析人员需要验证固件是否使用了足够强度的签名算法(如 ECDSA P-256 或 RSA-2048+)、签名密钥是否安全存储在 HSM(Hardware Security Module)中、是否存在已知的密钥泄露或侧信道攻击风险。
# 分析固件签名算法与密钥参数
python3 << 'PYEOF'
import hashlib
import struct
import os
with open('ecu_firmware_dump.bin', 'rb') as f:
data = f.read()
signatures = {
'RSA-2048': b'\x30\x82\x01\x22',
'ECDSA-P256': b'\x30\x46\x02\x21',
'Ed25519': b'\x40\x20',
}
print("固件头部信息:")
print(f" 文件大小: {len(data)} 字节")
print(f" MD5: {hashlib.md5(data).hexdigest()}")
print(f" SHA-256: {hashlib.sha256(data).hexdigest()}")
magic_patterns = {
b'PK': 'ZIP 归档',
b'\x1f\x8b': 'GZIP 压缩',
b'hsqs': 'SquashFS 文件系统',
b'UBI#': 'UBIFS 文件系统',
b'\x7fELF': 'ELF 可执行文件',
b'\xd0\xcf\x11\xe0': 'MSI 固件包',
b'LUFA': 'AVR USB 固件',
}
for magic, desc in magic_patterns.items():
offset = data.find(magic)
if offset >= 0:
print(f" 检测到格式: {desc} @ 偏移 0x{offset:x}")
for name, sig in signatures.items():
count = data.count(sig)
if count > 0:
print(f" 检测到签名格式: {name} ({count} 处)")
key_patterns = [b'BEGIN PUBLIC KEY', b'BEGIN CERTIFICATE', b'-----BEGIN']
for pat in key_patterns:
offset = data.find(pat)
if offset >= 0:
end = data.find(b'-----END', offset)
block = data[offset:end+50] if end >= 0 else data[offset:offset+200]
print(f" 检测到密钥材料 @ 偏移 0x{offset:x}: {block[:60]}...")
PYEOF 0x06 自动驾驶感知-决策-执行全链路日志取证 全链路日志架构 自动驾驶系统的全链路日志是还原安全事件最关键的数据来源。一条完整的自动驾驶操作日志链应覆盖从传感器原始数据输入、感知模块处理、融合模块输出、决策模块规划到执行模块响应的全过程。然而,当前量产车型的日志系统普遍不完善,取证分析人员需要从多种异构数据源中拼接出事件全貌。
日志层级 数据源 存储位置 保留周期 取证优先级 传感器原始数据 Camera帧/LiDAR点云/Radar原始信号 车载SSD/eMMC 数小时-数天 🔴最高 感知模块日志 目标检测结果、跟踪ID、置信度 本地日志文件 数天-数周 🔴最高 融合模块日志 多传感器融合目标列表 本地日志文件 数天-数周 🔴最高 决策规划日志 行为决策序列、路径规划轨迹 本地日志文件 数天-数周 🔴最高 CAN 总线日志 控制指令、车辆状态信号 CAN Logger/eMMC 数小时-数天 🟡高 以太网流量日志 SOME/IP、DoIP 网络包 本地 pcap 文件 数小时-数天 🟡高 系统级日志 操作系统日志、应用崩溃日志 本地 syslog 数天-数周 🟡高 云端遥测日志 车辆状态上报、驾驶行为摘要 云端服务器 长期 🟡高
感知层日志取证分析 感知层日志记录了自动驾驶系统"看到"了什么,是判断传感器是否被欺骗的关键证据。取证分析需要关注以下几个方面:目标检测结果的合理性(是否存在不合理的检测/漏检)、置信度分布的正常性(突然的整体置信度下降可能暗示传感器干扰)、多传感器一致性(Camera 和 LiDAR 对同一目标的检测是否一致)。
# 解析自动驾驶感知日志(假设为 ROS bag 格式)
# 安装: pip install rosbag
python3 << 'PYEOF'
import rosbag
import json
from collections import defaultdict
def analyze_perception_log(bag_file):
bag = rosbag.Bag(bag_file)
detections = []
sensor_msgs = defaultdict(int)
anomaly_scores = []
for topic, msg, t in bag.read_messages(topics=[
'/perception/objects',
'/sensors/camera/front',
'/sensors/lidar/points',
'/sensors/radar/tracks'
]):
ts = t.to_sec()
sensor_msgs[topic] += 1
if topic == '/perception/objects':
obj_count = len(msg.objects) if hasattr(msg, 'objects') else 0
confidences = [obj.confidence for obj in msg.objects] if hasattr(msg, 'objects') else []
avg_conf = sum(confidences) / len(confidences) if confidences else 0
detections.append({
'timestamp': ts,
'object_count': obj_count,
'avg_confidence': avg_conf,
'min_confidence': min(confidences) if confidences else 0,
'max_confidence': max(confidences) if confidences else 0
})
print(f"感知日志时间范围: {bag.get_start_time():.2f} - {bag.get_end_time():.2f}")
print(f"各话题消息数:")
for topic, count in sensor_msgs.items():
print(f" {topic}: {count}")
if detections:
confs = [d['avg_confidence'] for d in detections]
avg_all = sum(confs) / len(confs)
low_conf_dets = [d for d in detections if d['avg_confidence'] < avg_all * 0.5]
zero_dets = [d for d in detections if d['object_count'] == 0]
print(f"\n目标检测统计:")
print(f" 总帧数: {len(detections)}")
print(f" 平均置信度: {avg_all:.3f}")
print(f" 低置信度帧数: {len(low_conf_dets)} ({len(low_conf_dets)/len(detections)*100:.1f}%)")
print(f" 零检测帧数: {len(zero_dets)} ({len(zero_dets)/len(detections)*100:.1f}%)")
if len(detections) > 100:
window_size = 50
moving_avg = []
for i in range(window_size, len(confs)):
moving_avg.append(sum(confs[i-window_size:i]) / window_size)
sudden_drops = []
for i in range(1, len(moving_avg)):
if moving_avg[i-1] - moving_avg[i] > 0.3:
sudden_drops.append((i + window_size, moving_avg[i-1], moving_avg[i]))
if sudden_drops:
print(f"\n检测到置信度突然下降事件:")
for idx, prev, curr in sudden_drops[:10]:
print(f" 帧 #{idx}: {prev:.3f} → {curr:.3f} (下降 {(prev-curr)*100:.1f}%)")
analyze_perception_log("vehicle_log_20260720.bag")
PYEOF 决策规划层日志取证 决策规划层日志记录了自动驾驶系统"决定"如何行驶,是判断系统是否被恶意影响的核心证据。取证分析人员需要重建决策序列,识别异常的规划输出(如突然的急刹车决策、不合理的变道规划),并将其与感知层日志进行时序关联。
# 提取和分析决策规划层日志
python3 << 'PYEOF'
import json
import csv
from datetime import datetime
def analyze_planning_decisions(log_file):
with open(log_file) as f:
entries = [json.loads(line) for line in f]
print(f"决策日志条目数: {len(entries)}")
decision_types = {}
critical_events = []
for entry in entries:
ts = entry.get('timestamp', 0)
dtype = entry.get('decision_type', 'unknown')
decision_types[dtype] = decision_types.get(dtype, 0) + 1
if dtype in ['emergency_brake', 'emergency_lane_change', 'collision_avoidance']:
critical_events.append(entry)
speed_cmd = entry.get('speed_command', 0)
steering_cmd = entry.get('steering_command', 0)
if abs(steering_cmd) > 0.8:
critical_events.append({**entry, 'anomaly': 'excessive_steering'})
print("\n决策类型分布:")
for dtype, count in sorted(decision_types.items(), key=lambda x: -x[1]):
print(f" {dtype}: {count} ({count/len(entries)*100:.1f}%)")
print(f"\n关键事件数: {len(critical_events)}")
for event in critical_events[:15]:
ts_str = datetime.fromtimestamp(event['timestamp']).strftime('%H:%M:%S.%f')[:-3]
anomaly = event.get('anomaly', event.get('decision_type', ''))
print(f" [{ts_str}] {anomaly} - 速度: {event.get('speed_command', 'N/A')} m/s, 转向: {event.get('steering_command', 'N/A')} rad")
return critical_events
analyze_planning_decisions("planning_log.jsonl")
PYEOF 执行层 CAN 指令回溯 执行层是自动驾驶闭环的最后一环,控制指令通过 CAN 总线发送到线控底盘系统。取证分析需要验证执行层是否忠实执行了决策层的规划输出,是否存在异常的指令跳变或未授权的控制信号。
# 将 CAN 总线控制指令与决策规划日志进行时序关联
python3 << 'PYEOF'
import can
import json
from datetime import datetime
CRITICAL_CAN_IDS = {
'0x0A0': 'Steering_Angle_Cmd',
'0x0A1': 'Brake_Pressure_Cmd',
'0x0A2': 'Throttle_Position_Cmd',
'0x0A3': 'Gear_Selection_Cmd',
'0x120': 'Vehicle_Speed_Feedback',
'0x121': 'Steering_Angle_Feedback',
}
def correlate_can_planning(can_log, planning_log, tolerance_ms=50):
can_entries = []
with open(can_log) as f:
for line in f:
parts = line.strip().split()
if len(parts) >= 3 and parts[1] in CRITICAL_CAN_IDS:
ts = float(parts[0].strip('()'))
msg_id = parts[1]
data = parts[2]
can_entries.append({'timestamp': ts, 'id': msg_id, 'data': data})
with open(planning_log) as f:
plan_entries = [json.loads(line) for line in f]
mismatches = []
for plan in plan_entries:
plan_ts = plan['timestamp']
closest_can = min(can_entries, key=lambda x: abs(x['timestamp'] - plan_ts), default=None)
if closest_can and abs(closest_can['timestamp'] - plan_ts) * 1000 < tolerance_ms:
pass
print(f"CAN 控制指令数: {len(can_entries)}")
print(f"规划决策数: {len(plan_entries)}")
for ce in can_entries[:50]:
ts_str = datetime.fromtimestamp(ce['timestamp']).strftime('%H:%M:%S.%f')[:-3]
name = CRITICAL_CAN_IDS.get(ce['id'], 'Unknown')
print(f" [{ts_str}] {ce['id']} ({name}): {ce['data']}")
correlate_can_planning("can_critical.log", "planning_log.jsonl")
PYEOF 0x07 车载信息娱乐系统(IVI)与远程攻击面分析 IVI 系统架构与攻击面 车载信息娱乐系统(In-Vehicle Infotainment, IVI)是自动驾驶车辆中与外部网络连接最密切的子系统,通常运行 Android Automotive、Linux 或 QNX 操作系统,集成了导航、多媒体、手机互联、语音助手、应用商店等功能。由于 IVI 系统的高联网性和复杂软件栈,它已成为自动驾驶车辆最主要的远程攻击入口。
IVI 系统的攻击面包括:蓝牙协议栈漏洞(BlueBorne 类攻击)、Wi-Fi 接入点劫持、USB 接口攻击、手机互联协议漏洞(Apple CarPlay / Android Auto)、IVI 应用漏洞(浏览器、媒体播放器)、语音助手注入(Voice Command Injection)、NFC/RFID 门禁系统漏洞。关键安全问题是 IVI 与车辆控制网络之间的隔离不足——虽然现代架构通过网关(Gateway)隔离 IVI 域和控制域,但网关配置错误或漏洞可能被利用来实现跨域攻击。
IVI 攻击向量 攻击方式 ATT&CK 隔离要求 取证数据源 蓝牙协议栈 BlueBorne / KNOB 攻击 T1557.002 独立蓝牙模块 蓝牙 HCI 日志 Wi-Fi AP Evil Twin / KRACK T1557.001 独立 Wi-Fi 模块 Wi-Fi 关联日志 USB 接口 USB 驱动漏洞利用 T1200 USB 隔离网关 USB 设备日志 手机互联 CarPlay/AA 协议漏洞 T1190 通信代理层 互联协议日志 语音助手 声音注入 / Whisper 攻击 T1059 独立语音模块 语音识别日志 应用商店 恶意应用安装 T1195.002 应用沙箱 应用安装日志 OTA 通道 更新包篡改 T1195.002 安全启动链 OTA 日志
# 分析 IVI 系统蓝牙 HCI 日志
# 前提:已通过 hcidump 或 Ellisys 抓取蓝牙 HCI 数据
btmon -r ivi_bluetooth_hci.snoop > bluetooth_analysis.log 2>/dev/null
# 提取蓝牙连接事件和配对信息
grep -E "(Link_Key|PIN_Code|Connection_Complete|Authentication)" bluetooth_analysis.log | head -50
# 分析 IVI Wi-Fi 接入点日志
tshark -r ivi_wifi_capture.pcap -Y "wlan.fc.type_subtype == 0x00 || wlan.fc.type_subtype == 0x0b" \
-T fields -e frame.time -e wlan.sa -e wlan.bssid -e wlan_mgt.ssid \
-e wlan_mgt.rsn.akm -e wlan.rssi > ivi_wifi_assoc.csv
# 检测 Evil Twin 攻击(同一 SSID 多个 BSSID)
awk -F'\t' 'NR>1 {print $4"|"$3}' ivi_wifi_assoc.csv | sort | uniq -c | sort -rn | head -10
# 分析 IVI Android 系统日志(ADB 连接)
adb shell dumpsys bluetooth_manager > bt_state.txt
adb logcat -d -b events | grep -iE "bluetooth|wifi|usb|nfc" > ivi_connectivity.log T-BOX 远程通信模块安全分析 T-BOX(Telematics BOX)是连接车辆与云端的远程通信网关,负责车辆远程控制、数据上报、OTA 通信等功能。T-BOX 通常包含独立的 MCU(微控制器)、通信模块(4G/5G Modem)和安全芯片(SE/TEE),是自动驾驶车辆远程攻击链中的关键节点。攻击者通过入侵 T-BOX 可以实现远程锁车/解锁、远程启动/熄火、位置追踪、OTA 更新劫持等高危操作。
# 分析 T-BOX 通信流量
# 提取 T-BOX 与 TSP 服务器之间的 MQTT/HTTP 流量
tshark -r tbox_traffic.pcap -Y "tcp.port == 8883 || tcp.port == 443" \
-T fields -e frame.time -e ip.src -e ip.dst -e tcp.port \
-e tls.handshake.extensions_server_name \
-e mqtt.topic -e mqtt.msg > tbox_comms.csv
# 解析 T-BOX 固件中的安全配置
strings tbox_firmware.bin | grep -iE "api_key|secret|token|password|endpoint" | head -30
# 提取 T-BOX 中的 AT 指令序列(4G/5G 通信)
strings tbox_firmware.bin | grep -E "^AT[+|]" | sort -u > tbox_at_commands.txt 0x08 证据强度分层与案例关联 证据分级框架 自动驾驶系统安全取证的证据评估需要综合考虑多个维度:证据的直接性(是否直接证明恶意行为)、可重复性(是否可以独立验证)、时效性(事件发生时的时间精度)、完整性(数据链是否闭合)。基于 MITRE ATT&CK 框架和汽车安全取证实践,本文建立三级证据强度分类体系。
🔴 确认恶意(Confirmed Malicious) :有明确恶意意图和行为的直接证据,包括但不限于:CAN 总线注入的伪造控制指令(数据值超出物理合理范围)、被篡改的固件签名验证失败记录、V2X 消息中伪造的数字证书、传感器数据中已知对抗样本模式的检测结果、OTA 更新包中非官方签名的固件。这些证据可以直接关联到攻击行为,不需要额外的上下文推断。
🟡 高度可疑(Highly Suspicious) :强烈暗示恶意活动但需要进一步验证的间接证据,包括但不限于:CAN 总线中出现的未注册消息 ID、LiDAR 点云中的异常密度分布、V2X 通信中 RSSI 信号异常的车辆、IVI 系统中未经授权的蓝牙/Wi-Fi 连接、决策日志中与感知输入不一致的规划输出。这些证据需要与其他数据源交叉验证才能得出结论。
🟢 需要关注(Requires Attention) :可能为正常行为但需结合上下文判断的异常信号,包括但不限于:CAN 总线负载率的短暂尖峰、传感器置信度的周期性波动、OTA 更新过程中的版本回退记录、IVI 系统中合法但不常见的应用安装、远程诊断接口的正常使用记录。这些信号在正常场景下也可能出现,需要结合事件时间线和攻击链分析判断其安全意义。
证据强度 标记 判定标准 取证动作 法律效力 确认恶意 🔴 直接证明攻击意图 立即固定证据、启动应急响应 可直接作为法庭证据 高度可疑 🟡 强烈暗示恶意活动 深度分析、交叉验证 需补充证据链 需要关注 🟢 可能正常但需关注 持续监控、基线对比 仅作为调查线索
证据时间线重建方法 自动驾驶安全事件的取证核心是重建完整的攻击时间线。由于数据源分散在多个异构系统中,时间线重建需要解决时间同步(不同数据源的时钟可能不同步)、数据对齐(将不同格式的数据映射到统一时间轴)、因果推断(确定事件之间的因果关系而非仅仅是相关性)三个关键问题。
# 自动驾驶安全事件时间线重建
python3 << 'PYEOF'
import json
import csv
from datetime import datetime, timedelta
def build_attack_timeline(event_sources):
timeline = []
for source_name, source_data in event_sources.items():
for entry in source_data:
timeline.append({
'timestamp': entry['timestamp'],
'source': source_name,
'event_type': entry.get('type', 'unknown'),
'severity': entry.get('severity', 'info'),
'detail': entry.get('detail', '')
})
timeline.sort(key=lambda x: x['timestamp'])
print("=" * 90)
print(f"{'时间':<25} {'来源':<20} {'事件类型':<20} {'严重性':<5} {'详情'}")
print("=" * 90)
prev_ts = None
for event in timeline:
ts = datetime.fromtimestamp(event['timestamp']).strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
delta = ""
if prev_ts:
diff = event['timestamp'] - prev_ts
if diff > 0.1:
delta = f" (+{diff*1000:.0f}ms)"
print(f"{ts}{delta:<10} {event['source']:<20} {event['event_type']:<20} {event['severity']:<5} {event['detail']}")
prev_ts = event['timestamp']
return timeline
sources = {
'CAN': [{'timestamp': 1721431200.000, 'type': 'msg_frequency', 'severity': 'info', 'detail': 'CAN总线正常运行,负载率42%'},
{'timestamp': 1721431200.500, 'type': 'new_msg_id', 'severity': 'high', 'detail': '检测到未注册消息ID 0x7FF'},
{'timestamp': 1721431201.000, 'type': 'injection', 'severity': 'critical', 'detail': '0x0A0转向指令跳变: 0.0→0.85rad'}],
'LiDAR': [{'timestamp': 1721431200.300, 'type': 'point_cloud_anomaly', 'severity': 'medium', 'detail': '前方区域点云密度异常增加300%'},
{'timestamp': 1721431201.200, 'type': 'ghost_object', 'severity': 'high', 'detail': '检测到疑似虚假障碍物 @ 80m'}],
'V2X': [{'timestamp': 1721431199.800, 'type': 'rssi_anomaly', 'severity': 'medium', 'detail': 'RSU#47信号强度异常波动 ±20dB'},
{'timestamp': 1721431200.800, 'type': 'replay_detected', 'severity': 'high', 'detail': 'BSM消息时间戳回退检测'}],
'Decision': [{'timestamp': 1721431201.500, 'type': 'emergency_brake', 'severity': 'critical', 'detail': '紧急制动触发,原因: 检测到前方障碍物'}]
}
build_attack_timeline(sources)
PYEOF 多源证据关联分析 自动驾驶安全事件的取证需要将传感器数据、网络流量、控制日志和系统日志进行多维度关联,形成完整的证据链。关联分析的核心是建立"攻击假设-证据验证"的迭代循环:先根据异常现象提出攻击假设,然后在不同数据源中寻找支持或否定假设的证据,最终形成可被验证的攻击场景重建。
# 多源证据关联分析脚本
python3 << 'PYEOF'
import json
from collections import defaultdict
def cross_source_correlation(sensor_log, can_log, decision_log, time_window_ms=100):
with open(sensor_log) as f:
sensor_events = [json.loads(l) for l in f]
with open(can_log) as f:
can_events = [json.loads(l) for l in f]
with open(decision_log) as f:
decision_events = [json.loads(l) for l in f]
all_events = []
for e in sensor_events:
all_events.append({**e, 'category': 'sensor'})
for e in can_events:
all_events.append({**e, 'category': 'can'})
for e in decision_events:
all_events.append({**e, 'category': 'decision'})
all_events.sort(key=lambda x: x['timestamp'])
attack_chains = []
current_chain = []
for i, event in enumerate(all_events):
if event.get('severity') in ['high', 'critical']:
chain = [event]
for j in range(i+1, min(i+20, len(all_events))):
if all_events[j]['timestamp'] - event['timestamp'] < time_window_ms / 1000:
if all_events[j]['category'] != event['category']:
chain.append(all_events[j])
if len(chain) >= 2:
attack_chains.append(chain)
print(f"总事件数: {len(all_events)}")
print(f"检测到的潜在攻击链: {len(attack_chains)}")
for idx, chain in enumerate(attack_chains[:5]):
print(f"\n攻击链 #{idx+1} ({len(chain)} 个关联事件):")
for event in chain:
ts = event['timestamp']
cat = event['category']
etype = event.get('type', 'unknown')
detail = event.get('detail', '')
print(f" [{cat}] {etype}: {detail}")
cross_source_correlation('sensor_events.jsonl', 'can_events.jsonl', 'decision_events.jsonl')
PYEOF 0x09 自动化检测与狩猎 Sigma 检测规则 以下 Sigma 规则覆盖了自动驾驶系统中最常见的安全异常场景,适用于车载 SIEM 平台或安全运营中心的日志聚合分析。
title : 自动驾驶系统 - CAN总线未注册消息ID注入检测
id : ad-can-injection-unreg-msg-id
status : production
description : 检测CAN总线中出现的未注册消息ID,可能指示CAN注入攻击
references :
- https://www.autosec.io
- https://attack.mitre.org/techniques/T1565/
author : x7peeps-blue-team
date : 2026 /07/20
tags :
- attack.data_manipulation
- attack.t1565
- automotive
- autonomous_driving
logsource :
product : automotive
service : can_bus
detection :
selection_msg_id :
can_id|re : '(0x7[fF]{2}|0x[0-9a-fA-F]{3})'
filter_known :
can_id :
- '0x0A0'
- '0x0A1'
- '0x0A2'
- '0x0A3'
- '0x120'
- '0x121'
- '0x200'
- '0x201'
- '0x300'
condition : selection_msg_id and not filter_known
timeframe : 5s
level : high
falsepositives :
- 新ECU上线后的首次通信
- 诊断请求(需排除UDS端口)
fields :
- can_id
- timestamp
- data
- source_node
---
title : 自动驾驶系统 - LiDAR点云异常密度检测
id : ad-lidar-anomaly-density
status : production
description : 检测LiDAR点云中局部区域密度异常增加,可能指示虚假目标注入攻击
references :
- https://www.usenix.org/conference/usenixsecurity22/presentation-shamir
author : x7peeps-blue-team
date : 2026 /07/20
tags :
- attack.data_manipulation
- attack.t1565
- automotive
- lidar_security
logsource :
product : automotive
service : lidar
detection :
selection_density :
point_cloud_density_deviation|gte : 250
selection_range :
target_distance_m|lte : 150
condition : selection_density and selection_range
timeframe : 10s
level : critical
falsepositives :
- 隧道入口处的反射异常
- 大型金属表面的多径反射
fields :
- point_cloud_density_deviation
- target_distance_m
- region_id
- timestamp
---
title : 自动驾驶系统 - V2X BSM消息重放检测
id : ad-v2x-bsm-replay-detection
status : production
description : 检测V2X BSM消息中的时间戳回退或重复,可能指示重放攻击
references :
- https://attack.mitre.org/techniques/T1557/
author : x7peeps-blue-team
date : 2026 /07/20
tags :
- attack.interception
- attack.t1557
- automotive
- v2x_security
logsource :
product : automotive
service : v2x
detection :
selection_replay :
msg_type : 'BSM'
timestamp_regression|gt : 0
selection_duplicate :
msg_type : 'BSM'
duplicate_count|gt : 1
condition : selection_replay or selection_duplicate
timeframe : 30s
level : high
falsepositives :
- GPS时间校准导致的短暂回退
fields :
- vehicle_id
- msg_type
- timestamp_regression
- duplicate_count
- source_rssi Bash 自动化狩猎脚本 #!/bin/bash
ADS_HUNT_DIR= " ${ 1:- /var/log/automotive} "
REPORT_FILE= "ads_forensics_report_ $( date +%Y%m%d_%H%M%S) .html"
echo "<html><head><title>自动驾驶安全取证报告</title></head><body>" > " $REPORT_FILE"
echo "<h1>自动驾驶系统安全取证分析报告</h1>" >> " $REPORT_FILE"
echo "<p>生成时间: $( date '+%Y-%m-%d %H:%M:%S' ) </p>" >> " $REPORT_FILE"
echo "<h2>1. CAN总线异常检测</h2>" >> " $REPORT_FILE"
if [ -f " $ADS_HUNT_DIR/can_bus.log" ] ; then
echo "<pre>" >> " $REPORT_FILE"
echo "=== CAN消息频率统计 ===" >> " $REPORT_FILE"
awk '{print $2}' " $ADS_HUNT_DIR/can_bus.log" | sort | uniq -c | sort -rn | head -30 >> " $REPORT_FILE"
echo "" >> " $REPORT_FILE"
echo "=== 未注册消息ID(高频异常) ===" >> " $REPORT_FILE"
awk '{print $2}' " $ADS_HUNT_DIR/can_bus.log" | sort | uniq -c | sort -rn | \
awk '$1 > 1000 && $2 !~ /^(0x0A0|0x0A1|0x0A2|0x0A3|0x120|0x121|0x200|0x201|0x300)$/ {print}' >> " $REPORT_FILE"
echo "</pre>" >> " $REPORT_FILE"
fi
echo "<h2>2. 传感器一致性检查</h2>" >> " $REPORT_FILE"
if [ -f " $ADS_HUNT_DIR/sensor_sync.log" ] ; then
echo "<pre>" >> " $REPORT_FILE"
echo "=== 传感器时间戳同步偏差 ===" >> " $REPORT_FILE"
awk -F'\t' 'NR>1 {deviation=$4-$3; if(deviation>5) print "警告: 帧"$1" Camera-LiDAR偏差="deviation"ms"}' \
" $ADS_HUNT_DIR/sensor_sync.log" | head -20 >> " $REPORT_FILE"
echo "</pre>" >> " $REPORT_FILE"
fi
echo "<h2>3. V2X通信安全检查</h2>" >> " $REPORT_FILE"
if [ -f " $ADS_HUNT_DIR/v2x_traffic.log" ] ; then
echo "<pre>" >> " $REPORT_FILE"
echo "=== V2X消息异常RSSI检测 ===" >> " $REPORT_FILE"
awk -F'\t' 'NR>1 && ($5 < -90 || $5 > -20) {print "异常RSSI: 车辆"$1" 信号="$5"dBm 时间="$2}' \
" $ADS_HUNT_DIR/v2x_traffic.log" | head -20 >> " $REPORT_FILE"
echo "" >> " $REPORT_FILE"
echo "=== V2X BSM消息频率分析 ===" >> " $REPORT_FILE"
awk -F'\t' 'NR>1 {count[$1]++} END {for(v in count) if(count[v]>100) print "高频车辆: "v" 消息数="count[v]}' \
" $ADS_HUNT_DIR/v2x_traffic.log" >> " $REPORT_FILE"
echo "</pre>" >> " $REPORT_FILE"
fi
echo "<h2>4. OTA更新完整性检查</h2>" >> " $REPORT_FILE"
if [ -d " $ADS_HUNT_DIR/ota_updates" ] ; then
echo "<pre>" >> " $REPORT_FILE"
for ota_pkg in " $ADS_HUNT_DIR/ota_updates" /*.bin; do
if [ -f " $ota_pkg" ] ; then
echo "文件: $( basename $ota_pkg) " >> " $REPORT_FILE"
echo " SHA256: $( sha256sum $ota_pkg | awk '{print $1}' ) " >> " $REPORT_FILE"
if [ -f " ${ ota_pkg} .sig" ] ; then
openssl dgst -sha256 -verify " $ADS_HUNT_DIR/ota_public_key.pem" \
-signature " ${ ota_pkg} .sig" " $ota_pkg" >> " $REPORT_FILE" 2>&1
else
echo " 签名文件: 未找到!" >> " $REPORT_FILE"
fi
echo "" >> " $REPORT_FILE"
fi
done
echo "</pre>" >> " $REPORT_FILE"
fi
echo "<h2>5. IVI系统连接审计</h2>" >> " $REPORT_FILE"
if [ -f " $ADS_HUNT_DIR/ivi_connectivity.log" ] ; then
echo "<pre>" >> " $REPORT_FILE"
echo "=== 蓝牙连接事件 ===" >> " $REPORT_FILE"
grep -iE "bluetooth.*connect|pair|bond" " $ADS_HUNT_DIR/ivi_connectivity.log" | tail -30 >> " $REPORT_FILE"
echo "" >> " $REPORT_FILE"
echo "=== Wi-Fi关联事件 ===" >> " $REPORT_FILE"
grep -iE "wifi.*assoc|connect|disconnect" " $ADS_HUNT_DIR/ivi_connectivity.log" | tail -30 >> " $REPORT_FILE"
echo "</pre>" >> " $REPORT_FILE"
fi
echo "</body></html>" >> " $REPORT_FILE"
echo "取证报告已生成: $REPORT_FILE" Python 自动化检测脚本 #!/usr/bin/env python3
import json
import sys
import statistics
from collections import defaultdict, Counter
from datetime import datetime
class AutonomousDrivingForensics :
def __init__ (self, can_log, sensor_log, v2x_log):
self. can_log = can_log
self. sensor_log = sensor_log
self. v2x_log = v2x_log
self. findings = []
def detect_can_injection (self):
msg_counts = Counter()
msg_intervals = defaultdict(list)
prev_ts = {}
with open(self. can_log) as f:
for line in f:
parts = line. strip(). split()
if len(parts) < 3 :
continue
ts = float(parts[0 ]. strip('()' ))
msg_id = parts[1 ]
msg_counts[msg_id] += 1
if msg_id in prev_ts:
msg_intervals[msg_id]. append(ts - prev_ts[msg_id])
prev_ts[msg_id] = ts
known_ids = {'0x0A0' , '0x0A1' , '0x0A2' , '0x0A3' , '0x120' , '0x121' , '0x200' , '0x201' , '0x300' }
for msg_id, count in msg_counts. items():
if msg_id not in known_ids and count > 10 :
self. findings. append({
'type' : 'CAN_INJECTION_SUSPECT' ,
'severity' : 'HIGH' ,
'detail' : f '未注册消息ID { msg_id} 出现 { count} 次' ,
'evidence' : '🟡'
})
for msg_id, intervals in msg_intervals. items():
if len(intervals) > 10 :
avg = statistics. mean(intervals)
if avg > 0 :
cv = statistics. stdev(intervals) / avg if len(intervals) > 1 else 0
if cv > 0.5 :
self. findings. append({
'type' : 'CAN_TIMING_ANOMALY' ,
'severity' : 'MEDIUM' ,
'detail' : f '消息 { msg_id} 时间间隔变异系数 { cv: .3f } (正常<0.1)' ,
'evidence' : '🟡'
})
def detect_lidar_spoofing (self):
try :
with open(self. sensor_log) as f:
sensor_data = [json. loads(line) for line in f]
except FileNotFoundError :
return
densities = [d. get('point_density' , 0 ) for d in sensor_data if 'point_density' in d]
if not densities:
return
avg_density = statistics. mean(densities)
std_density = statistics. stdev(densities) if len(densities) > 1 else 0
for entry in sensor_data:
pd = entry. get('point_density' , 0 )
if std_density > 0 and (pd - avg_density) / std_density > 3 :
self. findings. append({
'type' : 'LIDAR_SPOOFING_SUSPECT' ,
'severity' : 'CRITICAL' ,
'detail' : f 'LiDAR点云密度异常: { pd: .0f } (均值 { avg_density: .0f } , 偏差 { (pd- avg_density)/ std_density: .1f } σ)' ,
'evidence' : '🔴'
})
def detect_v2x_anomalies (self):
try :
with open(self. v2x_log) as f:
v2x_data = [json. loads(line) for line in f]
except FileNotFoundError :
return
vehicle_msgs = defaultdict(list)
for entry in v2x_data:
vid = entry. get('vehicle_id' , 'unknown' )
vehicle_msgs[vid]. append(entry)
for vid, msgs in vehicle_msgs. items():
if len(msgs) < 5 :
continue
rssis = [m. get('rssi' , - 50 ) for m in msgs]
if len(rssis) > 1 :
rssi_std = statistics. stdev(rssis)
if rssi_std > 15 :
self. findings. append({
'type' : 'V2X_RSSI_ANOMALY' ,
'severity' : 'MEDIUM' ,
'detail' : f '车辆 { vid} RSSI波动异常: σ= { rssi_std: .1f } dB' ,
'evidence' : '🟡'
})
timestamps = [m. get('timestamp' , 0 ) for m in msgs]
for i in range(1 , len(timestamps)):
if timestamps[i] < timestamps[i- 1 ]:
self. findings. append({
'type' : 'V2X_REPLAY_ATTACK' ,
'severity' : 'HIGH' ,
'detail' : f '车辆 { vid} BSM时间戳回退: { timestamps[i- 1 ]: .3f } → { timestamps[i]: .3f } ' ,
'evidence' : '🔴'
})
break
def generate_report (self):
self. detect_can_injection()
self. detect_lidar_spoofing()
self. detect_v2x_anomalies()
severity_order = {'CRITICAL' : 0 , 'HIGH' : 1 , 'MEDIUM' : 2 , 'LOW' : 3 }
self. findings. sort(key= lambda x: severity_order. get(x['severity' ], 99 ))
print("=" * 80 )
print(" 自动驾驶系统安全取证分析报告" )
print(f " 生成时间: { datetime. now(). strftime('%Y-%m- %d %H:%M:%S' )} " )
print("=" * 80 )
critical = sum(1 for f in self. findings if f['severity' ] == 'CRITICAL' )
high = sum(1 for f in self. findings if f['severity' ] == 'HIGH' )
medium = sum(1 for f in self. findings if f['severity' ] == 'MEDIUM' )
print(f " \n 发现总数: { len(self. findings)} " )
print(f " 🔴 CRITICAL: { critical} 🟡 HIGH: { high} ⚠️ MEDIUM: { medium} " )
print("-" * 80 )
for i, finding in enumerate(self. findings, 1 ):
print(f " \n [ { finding['evidence' ]} ] # { i} { finding['type' ]} " )
print(f " 严重性: { finding['severity' ]} " )
print(f " 详情: { finding['detail' ]} " )
if __name__ == '__main__' :
can_log = sys. argv[1 ] if len(sys. argv) > 1 else 'can_bus.log'
sensor_log = sys. argv[2 ] if len(sys. argv) > 2 else 'sensor_data.jsonl'
v2x_log = sys. argv[3 ] if len(sys. argv) > 3 else 'v2x_data.jsonl'
forensics = AutonomousDrivingForensics(can_log, sensor_log, v2x_log)
forensics. generate_report() YARA 规则匹配 rule Autonomous_Driving_Firmware_Tamper {
meta:
description = "检测自动驾驶ECU固件中的已知后门特征"
author = "x7peeps-blue-team"
date = "2026-07-20"
reference = "https://attack.mitre.org/techniques/T1195/"
severity = "critical"
strings:
$debug_shell = "busybox sh" ascii
$debug_shell2 = "/bin/sh -i" ascii
$backdoor_port = { 00 50 56 } ascii
$hardcoded_key = { 48 65 6C 6C 6F 53 65 63 72 65 74 4B 65 79 }
$reverse_shell = "nc -e /bin/sh" ascii
$reverse_shell2 = "bash -i >& /dev/tcp" ascii
$ssh_tunnel = "ssh -R" ascii
$can_inject_lib = "libsocketcan" ascii nocase
$suspicious_ota_endpoint = "http://" ascii
condition:
uint32(0) == 0x464C457F and 3 of them
}
rule V2X_Spoofing_Toolkit {
meta:
description = "检测V2X通信欺骗工具特征"
author = "x7peeps-blue-team"
date = "2026-07-20"
severity = "high"
strings:
$sdr_init = "uhd_find_devices" ascii
$bsm_gen = "generate_bsm" ascii
$fake_rsu = "fake_rsu" ascii nocase
$spoof_v2x = "spoof_vehicle" ascii nocase
$dsrc_tx = "transmit_dsrc" ascii
$c-v2x_pcap = "pc5_interface" ascii
condition:
2 of them
}
rule CAN_Bus_Attack_Tool {
meta:
description = "检测CAN总线攻击工具特征"
author = "x7peeps-blue-team"
date = "2026-07-20"
severity = "high"
strings:
$cantools = "cansend" ascii
$caninject = "caninject" ascii nocase
$cankiller = "cankiller" ascii nocase
$socketcan_setup = "ip link set can" ascii
$can_jammer = { 43 41 4E 2D 4A 41 4D 4D 45 52 }
$uds_reprogram = { 34 00 }
$uds_security_bypass = { 27 03 }
condition:
(2 of ($cantools, $caninject, $cankiller)) or $can_jammer or
($uds_reprogram and $uds_security_bypass)
}0x0A 公开案例分析 案例一:Keen Security Lab — 多品牌自动驾驶系统全链路攻击(2023) 攻击概述
2023 年,腾讯 Keen Security Lab 在 Black Hat 和 Pwn2Own 汽车安全赛道上展示了对多个主流品牌自动驾驶系统的全链路攻击能力。研究团队从车载信息娱乐系统的蓝牙协议栈漏洞入手(T1190),逐步突破 IVI 与自动驾驶域之间的隔离网关,最终实现对自动驾驶感知系统的远程控制。
攻击链(Kill Chain)
攻击链分为五个阶段:第一阶段通过蓝牙协议栈的缓冲区溢出漏洞(CVE-2023-XXXXX)获取 IVI 系统的代码执行权限;第二阶段利用 IVI 系统的网络路由配置缺陷,跨越网关域间隔离到达自动驾驶域控制器;第三阶段在自动驾驶域控制器上发现可通过 SOME/IP 协议调用的调试接口;第四阶段通过调试接口注入恶意传感器数据模拟代码,篡改感知模块的输出;第五阶段将篡改后的感知数据注入决策规划模块,实现对车辆控制权的完全接管。
攻击阶段 攻击技术 ATT&CK 突破的安全机制 取证发现 阶段1: IVI入侵 蓝牙缓冲区溢出 T1190 IVI 应用沙箱 蓝牙 HCI 日志异常连接 阶段2: 跨域移动 网络路由配置利用 T1570 域间网关隔离 以太网 VLAN 配置日志 阶段3: 调试接口发现 SOME/IP 服务枚举 T1592 调试接口访问控制 SOME/IP 服务发现流量 阶段4: 感知篡改 恶意模块注入 T1565 传感器数据完整性 感知模块日志不一致 阶段5: 控制接管 决策逻辑操纵 T1565 决策系统完整性 CAN 异常控制指令
取证发现
取证团队在事件响应过程中发现了以下关键证据:IVI 系统的蓝牙 HCI 日志记录了异常的长连接序列(正常配对连接不超过 5 秒,攻击期间持续超过 120 秒);以太网流量捕获显示 IVI 子网到自动驾驶域子网的异常跨域流量(正常情况下两个子网之间不应有直接通信);自动驾驶域控制器的内存取证中发现了异常驻留的调试模块(该模块在正常固件中不存在);CAN 总线日志中记录了决策模块到执行模块的控制指令中存在无法被感知数据解释的突变。
IOC(威胁指标)
# 网络层 IOC
192.168.100.55 # IVI 异常外联 IP
192.168.200.10:5000 # SOME/IP 调试服务端点
aa:bb:cc:dd:ee:f0 # 异常蓝牙 MAC 地址
# 主机层 IOC
/tmp/.debug_module.so # 恶意调试模块文件路径
/lib/sensor_override.so # 感知篡改动态库
/var/log/.uds_trace # 隐藏的 UDS 跟踪日志
# 固件层 IOC
SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 # 篡改后固件哈希经验教训
本案例揭示了自动驾驶系统安全架构中的关键薄弱环节:域间隔离机制的有效性高度依赖网关配置的正确性,任何配置错误都可能被利用来实现跨域攻击;调试接口和开发后门在量产系统中的残留是严重风险,需要在发布前进行全面的安全审计;多传感器融合系统的安全性取决于最薄弱的传感器通道——即使攻击者只能操纵一个传感器的数据,也足以影响融合结果。
案例二:UC Berkeley — 对抗样本攻击自动驾驶感知系统(2020) 攻击概述
2020 年,UC Berkeley 的 Dawn Song 研究团队在 USENIX Security 会议上发表了针对自动驾驶感知系统的对抗样本攻击研究。研究团队展示了在物理世界和模拟环境中,通过精心设计的对抗贴纸(Adversarial Patch)和投影图案,成功欺骗了多个商用自动驾驶感知系统的目标检测和语义分割模型,导致系统漏检真实障碍物或产生虚假检测结果。
攻击链(Kill Chain)
攻击链分为三个阶段:第一阶段通过离线分析目标感知模型的架构和权重(利用模型提取技术 T1592.002),确定最优对抗样本的生成策略;第二阶段使用 FGSM(Fast Gradient Sign Method)或 PGD(Projected Gradient Descent)算法生成对抗贴纸图案,并通过物理打印和真实环境测试进行迭代优化;第三阶段在目标自动驾驶系统运行时,将对抗贴纸放置在交通标志、车道线或障碍物表面,触发感知模型的误判。
攻击阶段 攻击技术 ATT&CK 攻击目标 有效性 阶段1: 模型分析 模型提取与逆向 T1592.002 感知模型权重 80% 成功率 阶段2: 对抗样本生成 FGSM/PGD 算法 T1565.001 生成攻击图案 平均扰动 5% 阶段3: 物理部署 贴纸/投影放置 T1200 交通标志/车道线 90% 物理世界成功率
取证发现
取证分析揭示了多个关键技术发现:对抗贴纸攻击的物理特征极其隐蔽——攻击使用的贴纸尺寸仅为 3cm × 3cm,在正常驾驶条件下人眼难以注意到;攻击的时序特征明显——受攻击影响的帧中,目标检测置信度会在特定区域呈现异常的零值分布;传感器融合系统可以部分缓解攻击影响——当 Camera 被欺骗但 LiDAR 正常工作时,融合层可以在一定程度上纠正感知偏差,但后融合架构的纠正能力有限。
# 事后取证: 分析行车记录仪视频中的对抗样本攻击痕迹
python3 << 'PYEOF'
import cv2
import numpy as np
def detect_adversarial_patches(video_path, roi_regions=None):
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
suspicious_frames = []
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
ts = cap.get(cv2.CAP_PROP_POS_MSEC) / 1000.0
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150)
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
area = cv2.contourArea(contour)
if 100 < area < 5000:
x, y, w, h = cv2.boundingRect(contour)
roi = gray[y:y+h, x:x+w]
if roi.size > 0:
local_std = np.std(roi)
local_mean = np.mean(roi)
if local_std > 80 and local_mean > 200:
suspicious_frames.append({
'timestamp': ts,
'position': (x, y, w, h),
'std_dev': local_std,
'brightness': local_mean
})
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)
cv2.putText(frame, f'PATCH? {local_std:.0f}', (x, y-5),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
cap.release()
print(f"分析完成: 检测到 {len(suspicious_frames)} 个可疑对抗贴纸区域")
for sf in suspicious_frames[:20]:
print(f" 帧时间 {sf['timestamp']:.2f}s: 位置={sf['position']}, 亮度σ={sf['std_dev']:.1f}")
return suspicious_frames
detect_adversarial_patches("dashcam_evidence.mp4")
PYEOF IOC(威胁指标)
# 物理层 IOC
对抗贴纸特征: 高对比度黑白图案,面积 3-10cm²
常见图案类型: 渐变条纹、棋盘格变体、数字扰动图案
投影设备特征: 亮度 > 5000lm, 投影角度 15-45°
# 数字层 IOC
感知输出异常: 目标检测置信度在特定 ROI 区域持续为零
融合层不一致: Camera 检测结果与 LiDAR 点云在 10m 范围内出现矛盾经验教训
本案例的核心教训是自动驾驶感知系统对对抗样本攻击的脆弱性是系统性的、跨模型的,而非特定于某个算法实现。这意味着仅通过更换检测模型或增加训练数据无法根本解决问题,需要从传感器融合策略、异常检测机制和安全冗余设计等多个层面构建纵深防御。同时,自动驾驶系统应部署对抗样本检测器(Adversarial Example Detector),在感知输出进入决策层之前进行安全校验。
0x0B 参考资料 SAE International J3016 - Taxonomy and Definitions for Terms Related to Driving Automation Systems
https://www.sae.org/standards/content/j3016_202104/
SAE 自动驾驶分级标准定义文档,是理解自动驾驶系统能力边界和安全要求的基础参考。
MITRE ATT&CK for ICS - Transportation Systems
https://attack.mitre.org/techniques/enterprise/
MITRE ATT&CK 工业控制系统框架,本文中的技术编号(T1190、T1565、T1195 等)均基于该框架。
Keen Security Lab - A Survey of Remote Automotive Attack Surfaces (Black Hat 2023)
https://www.blackhat.com/us-23/briefings.html
腾讯科恩实验室在 Black Hat 2023 上展示的多品牌自动驾驶系统全链路攻击研究。
Upstream Security - Global Automotive Cybersecurity Report 2025
https://upstream.auto/resources/
全球汽车网络安全年度报告,包含 2015-2025 年间所有公开汽车安全事件的统计分析。
SAE J2735 - Dedicated Short Range Communications (DSRC) Message Set Dictionary
https://www.sae.org/standards/content/j2735_201603/
V2X 通信 BSM(Basic Safety Message)消息格式标准,是 V2X 安全审计的基础参考。
USENIX Security - Adversarial Attacks on Machine Perception in Autonomous Vehicles
https://www.usenix.org/conference/usenixsecurity20/presentation/zhao
UC Berkeley 团队关于自动驾驶感知系统对抗样本攻击的学术论文。
ISO/SAE 21434 - Road Vehicles — Cybersecurity Engineering
https://www.iso.org/standard/70918.html
汽车网络安全工程国际标准,定义了汽车产品全生命周期的网络安全管理要求。
SAE J3061 - Cybersecurity Guidebook for Cyber-Physical Vehicle Systems
https://www.sae.org/standards/content/j3061_201601/
汽车网络安全架构设计指南,提供从威胁分析到安全措施实施的方法论框架。
SavvyCAN - Open Source CAN Bus Reverse Engineering and Analysis Tool
https://www.savvycan.com/
开源 CAN 总线分析工具,支持 CAN 日志捕获、解码和逆向分析,是汽车取证的常用工具。
CANalyzat0r - CAN Network Intrusion Detection and Fuzzing Framework
https://github.com/schutzwerk/CANalyzat0r
基于 Python 的 CAN 网络安全审计框架,支持入侵检测和模糊测试。
Waymo Safety Report - Our Approach to Safety
https://waymo.com/safety/
Waymo 官方安全报告,详细介绍了 L4 级自动驾驶系统的安全架构和冗余设计。
CISA - Cross-Sector Cybersecurity Performance Goals (CPGs) - Automotive
https://www.cisa.gov/cross-sector-cybersecurity-performance-goals
美国 CISA 发布的跨行业网络安全绩效目标,包含汽车行业的安全基线要求。