车联网安全入门——CAN总线模糊测试

车联网安全入门——CAN总线模糊测试

🚀🚀最近对于车联网安全非常有兴趣,但是不知道怎么入门,无意间发现了ICSim,可以用来简单模拟一下汽车,学习了一段时间后决定写一下笔记,怕自己学完就忘记了(仅供学习参考)。

介绍

🚀🚀ICSim 是一个用于模拟车辆仪表集群的工具,专门为 SocketCAN 设计。SocketCAN 是 Linux 内核中的一个模块,用于支持控制器局域网(CAN)接口。

主要特点

  1. 仪表集群模拟:ICSim 可以模拟车辆仪表盘,包括速度表、转速表、燃油表等。这对于开发和测试基于 CAN 总线的汽车电子系统非常有用。
  2. 与 SocketCAN 集成:ICSim 与 Linux 的 SocketCAN 接口集成,允许用户通过标准的 SocketCAN 工具与模拟器进行通信和调试。
  3. 教育和开发:它是汽车网络和协议学习的一个极佳工具,可以帮助工程师、研究人员和学生理解 CAN 总线的工作原理和应用。

使用场景

  • 软件开发:在开发车辆电子控制单元(ECU)时,可以使用 ICSim 进行初步测试,而无需实际的车辆硬件。
  • 教学和培训:提供一个虚拟的车辆环境,便于教学 CAN 总线通信。
  • 调试和验证:与实际车辆硬件的连接前,先在模拟环境中验证通信和功能。

🚀🚀项目地址如下所示:

zombieCraig/ICSim: Instrument Cluster Simulator (github.com)

🚀🚀安装教程如下:

车联网安全入门——ICSim模拟器使用-CSDN博客

模糊测试(Fuzz Testing)

🚀🚀模糊测试(Fuzz Testing)是一种用于发现软件漏洞和缺陷的自动化测试技术。其核心思想是通过向系统输入大量随机或半随机的数据,观察系统的响应,从而发现潜在的错误和安全漏洞。模糊测试常用于安全性测试和稳定性测试。

CAN 总线模糊测试(CAN Packet Fuzzing)

🚀🚀CAN Packet Fuzzing 是将模糊测试应用于控制器局域网(CAN)总线的一种技术。CAN 总线是现代汽车中用于电子控制单元(ECU)之间通信的关键协议。模糊测试在这个上下文中的主要目标是通过发送异常或无效的 CAN 数据帧,来发现车辆网络协议栈中的漏洞和缺陷。

主要步骤
  1. 定义测试范围:确定要测试的 CAN 网络的节点和消息类型。
  2. 生成模糊数据:使用随机或半随机的方法生成 CAN 数据帧。这些数据帧可以是完全随机的,也可以在现有合法数据的基础上进行变异。
  3. 发送模糊数据:将生成的模糊数据帧发送到 CAN 总线上,模拟正常通信环境。
  4. 监控系统行为:观察系统对这些模糊数据的响应,记录任何异常行为或系统崩溃。
  5. 分析和报告:分析捕获的异常行为,找出潜在的漏洞,并生成测试报告。
工具和软件
  • ICSim:虽然主要是用于模拟和测试,但也可以配置为进行初步的 CAN 模糊测试。
  • SavvyCAN:用于捕获和分析 CAN 数据,结合其他模糊测试工具一起使用。
  • 其他模糊测试工具:例如 Can-Hax,CANard、CANalyzat0r 以及定制的脚本和程序,可以生成和发送模糊数据帧。
主要目标
  • 安全性测试:发现并修复可能被恶意利用的漏洞。
  • 稳定性测试:确保系统在异常输入情况下的稳定性,避免意外崩溃或错误。
  • 协议验证:验证 CAN 协议实现的健壮性,确保其能正确处理所有类型的数据帧。

Can-Hax

🚀🚀这个工具是我刷视频的时候刷到的,是一个油管博主的开源工具,个人感觉还比较好用,就来介绍一下,当然了SavvyCAN是真的无敌!!!!!!

安装

🚀🚀我们直接从GitHub克隆下来就好了,这点比较的简单:

git clone https://github.com/rybolov/Can-Hax.git
cd Can-Hax
使用

🚀🚀Can-Hax是使用can-utils的指纹和模糊控制器区域网络(CAN)数据包/帧的实用程序,可用于大多数Linux。

🚀🚀CAN有效载荷模板有以下几种:0=在使用中未观察到,H=观察到的十六进制值,N=观察到的十进制值,所以它看起来像00NHHHHH。

获得指纹

🚀🚀我们使用如下命令来获得我们的指纹,xxxxxxx.log是我们使用candump存储下来的日志文件,xxxxxx.json是我们的指纹文件。

python ./can-hax.py --fingerprint --input xxxxxxx.log -d "ICSIM Vehicle Simulator" -o xxxxxx.json

🚀🚀比如我使用如下命令,便得到了以下输出:

python ./can-hax.py --fingerprint --input candump-2024-06-01_104423.log -d "ICSIM Vehicle Simulator" -o can_1_fingerprint.json

🚀🚀输出:

/  __ \                 | | | |           
| /  \/ __ _ _ __ ______| |_| | __ ___  __
| |    / _` | '_ \______|  _  |/ _` \ \/ /
| \__/\ (_| | | | |     | | | | (_| |>  < 
 \____/\__,_|_| |_|     \_| |_/\__,_/_/\_\
Can-Hax: Fingerprint and fuzz CAN traffic.

Testing if candump-2024-06-01_104423.log is a file.
candump-2024-06-01_104423.log is most definitely a file.

Found cansend. We can use this to send CAN packets.
First 3 lines read in as:
(1717253063.833375) vcan0 161#000005500108001C
(1717253063.833432) vcan0 191#010010A141000B
(1717253063.833439) vcan0 164#0000C01AA8000004

Date of last log line: 2024.06.01
Found 37 CAN IDs.
{
    "date": "2024.06.01",
    "description": "ICSIM Vehicle Simulator",
    "fingerprints": {
        "039": "00NH",
        "095": "N0000NHN000000NN",
        "133": "00000000HN",
        "136": "000N0000000000NH",
        "13A": "00000000000000NH",
        "13F": "0000000N000000NH",
        "143": "NHNH00HH",
        "158": "00000000000000NH",
        "161": "00000NN00N0N00NH",
        "164": "0000H0NHHN0000NN",
        "166": "H0NN00NN",
        "17C": "00000000N00000NN",
        "183": "000000NH0000N0NH",
        "188": "00000000",
        "18E": "0000NH",
        "191": "0N00N0HNNN00NH",
        "19B": "00000H000000",
        "1A4": "0000000N000000NH",
        "1AA": "NHHH00000000NNNH",
        "1B0": "000H0000000NNN",
        "1CF": "N00N000000NH",
        "1D0": "000000000000000H",
        "1DC": "0N0000NH",
        "21E": "0NHNNNNNNN0NNH",
        "244": "0000000NHH",
        "294": "0N0H000NHHNH00NH",
        "305": "N0NN",
        "309": "00000000000000HN",
        "320": "0000NN",
        "324": "NNNN000000000HNH",
        "333": "000000000000NH",
        "37C": "HH00HH000NNH00NH",
        "405": "00000N00000000NH",
        "40C": "0NNHNNNHNNNNNNNH",
        "428": "0N0N0000NNNHNH",
        "454": "NNHHNN",
        "5A1": "NN0000000000NNNH"
    },
    "version": "2"
}
Done. Total realtime was 0:00:01.

🚀🚀我们来简单介绍一下里面的数据大概是什么意思:

 "133": "00000000HN",

🚀🚀133代表的是can总线ID号,后面0代表的是从来没有变化,一直是0;H表示的是十六进制,也就是说,这一位出现过十六进制数;N代表十进制,也就是这一位没有出现过十六进制的数。

模糊测试

🚀🚀接下来我们开始进行模糊测试了,这个就是全部模糊(可能需要很长时间,可以缩短时延),会一个一个进行测试。

python ./can-hax.py --fuzz --input xxxxxx.json --can vcan0

 _____                   _   _            
/  __ \                 | | | |           
| /  \/ __ _ _ __ ______| |_| | __ ___  __
| |    / _` | '_ \______|  _  |/ _` \ \/ /
| \__/\ (_| | | | |     | | | | (_| |>  < 
 \____/\__,_|_| |_|     \_| |_/\__,_/_/\_\
Can-Hax: Fingerprint and fuzz CAN traffic.

Testing if can_1_fingerprint.json is a file.
can_1_fingerprint.json is most definitely a file.

Found cansend. We can use this to send CAN packets.
CANID 161 00000NN00N0N00NH complexity is 7
Sending CAN frame:  161#0000000000000000
Sending CAN frame:  161#0000000000000001

–input,–can可以使用-i和-c简化。

🚀🚀除了全部测试之外,我们还可以测试特定的CAN ID,我们可以指定–canid。

python ./can-hax.py --fuzz --canid 19B --input can_1_fingerprint.json --can vcan0
 _____                   _   _            
/  __ \                 | | | |           
| /  \/ __ _ _ __ ______| |_| | __ ___  __
| |    / _` | '_ \______|  _  |/ _` \ \/ /
| \__/\ (_| | | | |     | | | | (_| |>  < 
 \____/\__,_|_| |_|     \_| |_/\__,_/_/\_\
Can-Hax: Fingerprint and fuzz CAN traffic.

Testing if can_1_fingerprint.json is a file.
can_1_fingerprint.json is most definitely a file.

Found cansend. We can use this to send CAN packets.
CANID 19B 00000H000000 complexity is 2
Sending CAN frame:  19B#000000000000

-timing 1,表示的是时延,然后时延为一秒,使用命令如下所示

python ./can-hax.py --fuzz --canid 19B --input can_1_fingerprint.json --can vcan0 --timing 1

🚀🚀我们还可以使用–Quick或–Superquick快速指定一组简化的可能值。

python ./can-hax.py --fuzz --canid 19B --input can_1_fingerprint.json --can vcan0 --timing 1 --quick
 _____                   _   _            
/  __ \                 | | | |           
| /  \/ __ _ _ __ ______| |_| | __ ___  __
| |    / _` | '_ \______|  _  |/ _` \ \/ /
| \__/\ (_| | | | |     | | | | (_| |>  < 
 \____/\__,_|_| |_|     \_| |_/\__,_/_/\_\
Can-Hax: Fingerprint and fuzz CAN traffic.

Testing if can_1_fingerprint.json is a file.
can_1_fingerprint.json is most definitely a file.

Found cansend. We can use this to send CAN packets.
CANID 19B 00000H000000 complexity is 2
Sending CAN frame:  19B#000000000000
Sending CAN frame:  19B#000001000000
Sending CAN frame:  19B#000009000000
Sending CAN frame:  19B#00000A000000
Sending CAN frame:  19B#00000B000000
Sending CAN frame:  19B#00000F000000
Running zeroize now.

Quick是只有0,1,9,A,B,F这几个数,然后Superquick只有0,9,F这几个极端的值。

🚀🚀自适应测试计算有效负载模板复杂程度的指标,并使用一组简化的可能值。

python ./can-hax.py --fuzz --adaptive --input can_1_fingerprint.json --can vcan0

🚀🚀这个就是自适应,但是我一直是递增一,所以感觉不是很好用,我们搭配上面那些就能进行简单的模糊测试了。

SavvyCAN

🚀🚀这个就是直接模糊测试了,比较无脑,当然我们也可以自己设置一些规则,但是我在测试的时候就已经把我的车门给打开了,裂开,太强啦!!!

在这里插入图片描述

总结

🚀🚀CAN 总线模糊测试是一种强大的方法,用于发现和修复汽车网络系统中的安全漏洞和稳定性问题。通过系统地生成和发送异常 CAN 数据帧,测试人员可以识别出潜在的缺陷,从而增强车辆电子系统的安全性和可靠性。结合 ICSim, Can-Hax和 SavvyCAN 等工具,可以有效地进行 CAN 总线模糊测试,并为车辆网络安全提供坚实的保障。

参考

https://www.youtube.com/watch?v=fXTJ6TH32Vg

<think>我们正在讨论如何使用SavvyCAN执行CAN总线重放攻击。用户之前的问题是关于在特定种子和难度下使用ICSim模拟器和SavvyCAN分析关键帧,现在转向安全测试中的重放攻击。参考引用内容虽然不直接相关,但我们可以忽略它们,专注于用户的实际需求。 重放攻击是指捕获合法的CAN帧并重新发送,以观察系统反应。在汽车安全测试中,这常用于测试ECU的脆弱性。 步骤: 1. **捕获目标CAN帧**:使用SavvyCAN捕获与目标功能(如车门解锁)相关的CAN帧。 2. **过滤和保存**:过滤出关键帧并保存为日志文件(如.candump格式)。 3. **重放攻击**:使用SavvyCAN的重放功能发送保存的日志。 详细步骤: ### 步骤1: 捕获目标CAN帧 - 在SavvyCAN中连接CAN接口(如vcan0),开始捕获。 - 操作目标系统(例如,在ICSim模拟器中按下车门解锁按钮),捕获相关帧。 - 使用过滤器缩小范围(例如,过滤ID `0x2XX`范围的车门控制帧)。 ### 步骤2: 保存关键帧 - 在捕获的数据中,选择要重放的帧(例如,一个解锁车门的帧)。 - 右键点击选择"Save Selected Frames",保存为`.csv`或`.candump`格式。 ### 步骤3: 执行重放攻击 1. **加载日志文件**: - 在SavvyCAN中,打开"Replay"窗口(菜单:Replay → Replay Window)。 - 点击"Load Replay File",选择之前保存的日志文件。 2. **配置重放**: - **循环模式**:设置是否循环发送。 - **时间缩放**:调整发送速度(例如1.0倍速为原始时间间隔)。 - **目标接口**:选择要发送的CAN接口(如vcan0)。 3. **执行重放**: - 点击"Start Replaying"开始发送。 - 观察目标系统(如ICSim模拟器)的反应。如果重放的是解锁帧,车门应解锁。 ### 注意事项 - **干扰问题**:在难度2下,ICSim模拟器可能产生干扰帧,重放时需确保只发送纯净的目标帧。 - **时序问题**:某些ECU可能对帧的时序敏感,重放时需尽量保持原始间隔。 - **安全影响**:重放攻击可能使系统进入不安全状态,需在测试环境中进行[^2]。 ### 示例:重放车门解锁帧 假设捕获到解锁车门的帧为: ``` ID: 0x201, Data: 00 01 00 00, Interval: 0.1s ``` 重放此帧后,ICSim模拟器的车门应立即解锁。 §§相关问题§§ 1. 如何防御CAN总线上的重放攻击? 2. SavvyCAN能否同时捕获和重放数据? 3. 在重放攻击中如何处理CAN数据库(DBC)文件? 4. 如何自动化执行重放攻击(例如使用脚本)?</think>### 如何使用SavvyCAN执行CAN总线重放攻击 #### **重放攻击原理** 重放攻击指捕获合法CAN帧并重新发送以触发系统行为。在汽车安全测试中,这可用于验证ECU漏洞(如无身份验证的灯控/门控指令)[^2]。核心步骤包括:捕获目标帧 → 过滤关键帧 → 重放攻击 → 观察系统响应。 --- #### **步骤 1: 捕获目标CAN帧** 1. **连接CAN接口** - 启动SavvyCAN → `Connection` → 选择`SocketCAN`接口(如`vcan0`) - 点击`Start Capture`开始捕获数据 2. **触发目标操作** 在ICSim模拟器执行目标操作: - 灯控:按`L`(左转灯)、`H`(大灯) - 门控:按`D`(车门解锁) - 加速:按`↑`(油门) 3. **保存日志文件** - 捕获足够数据后 → `File` → `Save Log File As...` - 保存为`.csv`或`.candump`格式(推荐后者保留完整时间戳) --- #### **步骤 2: 过滤关键帧** 在SavvyCAN中加载日志文件: 1. **按ID过滤** ```python # 典型ID范围参考 light_control_ids = [0x100, 0x121, 0x122] # 灯控ID door_control_ids = [0x200, 0x201] # 门控ID throttle_ids = [0x300, 0x301] # 油门ID ``` - 在`Filter`面板添加ID过滤规则(如`ID >= 0x100 && ID <= 0x3FF`) 2. **按数据模式过滤** - 右键目标帧 → `View in Plotter` 观察信号模式 - 例如油门开度>50%的数据特征:`Data[2] > 0x80` 3. **导出攻击帧** 选择关键帧 → `Right Click` → `Save Selected Frames As...` → 保存为`.csv` --- #### **步骤 3: 执行重放攻击** 1. **加载攻击帧** - 打开`Replay`窗口 → `Load Replay File` → 选择保存的.csv文件 - 设置重放参数: - **Loop Mode**:循环次数(测试多次触发) - **Time Multiplier**:时间缩放(建议设为1.0保持原始时序) 2. **配置发送接口** ```bash # 确保虚拟CAN接口已启用 sudo ip link add dev vcan0 type vcan sudo ip link set up vcan0 ``` 3. **启动攻击** - 点击`Start Replaying`开始发送 - 观察ICSim模拟器响应(如车门意外解锁、灯光异常激活) --- #### **步骤 4: 验证攻击效果** 1. **成功指标** - 灯控:模拟器灯光状态与重放帧匹配 - 门控:车门状态变化(如`Locked` → `Unlocked`) - 加速:油门进度条同步增长 2. **干扰处理(难度2)** 若攻击失败,可能因难度2的干扰: - 在重放前启用SavvyCAN的`Noise Filter`(设置ID白名单) - 缩短帧间隔:修改.csv文件的时间戳列(如所有间隔减半) --- #### **防御建议与注意事项** 1. **安全防护机制** - 添加帧计数器(如每帧`Data[0]`自增)防止重放[^3] - 使用$E = K_{pub}(M + \text{Timestamp})$ 加密认证 2. **法律与伦理** - **仅限授权测试**:在封闭环境中操作 - **避免物理影响**:禁用制动/转向等危险ECU --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值