4. CAN总线攻击面分析:CAN总线脆弱性、常见攻击类型(重放、篡改、DoS、伪装)、攻击实例分析
大家好,我是老张,在汽车安全这行摸爬滚打了十几年。今天咱们聊点硬核的——CAN总线的攻击面。说实话,我刚入行那会儿,觉得CAN总线挺靠谱的,直到后来参与了一个安全测试项目,才发现这玩意儿在黑客眼里,简直像个不设防的“透明人”。
你想想看,一辆现代汽车里,少说有几十个ECU(电子控制单元),它们全靠CAN总线这根“神经”来传递指令。刹车、油门、转向,这些关乎性命的关键信号,都在上面跑。但问题是,CAN总线在设计之初,压根儿就没考虑过安全。它追求的是实时性和可靠性,结果把“身份认证”和“加密”这些安全要素全给丢了。
4.1 CAN总线的脆弱性:为什么它这么“脆”?
CAN总线的脆弱性,说白了就是“三无产品”:无认证、无加密、无访问控制。我给大家拆开来讲。
- 广播通信,人人可见:CAN总线上的所有消息,都是广播出去的。任何一个节点,只要挂在总线上,就能听到所有消息。这就像在办公室里喊话,隔壁工位的人听得一清二楚。攻击者只要接上OBD-II接口,或者黑掉一个不那么重要的ECU(比如车窗控制器),就能轻松“偷听”到刹车、油门这些关键信号。
- 无源地址,无法溯源:CAN消息里没有发送者的ID。你收到一条“刹车”指令,但你不知道它是来自刹车踏板,还是来自某个被篡改的恶意节点。我在项目中遇到过,测试团队模拟了一个假ECU,往总线上狂发“刹车”信号,结果真ECU根本分辨不出来,直接执行了。这就是典型的“伪装攻击”。
- 优先级仲裁,弱者为王:CAN总线用ID来决定消息优先级,ID越小优先级越高。攻击者只要发一个ID为0x000的消息,就能抢占总线,把其他正常消息全部“挤掉”。这招在DoS攻击里特别常见。
- 无完整性校验:CAN消息的CRC校验,只能检测随机错误,防不了人为篡改。攻击者可以抓包后,修改数据域,重新计算CRC,再发出去。接收方根本不知道这消息被动了手脚。
核心痛点:CAN总线是一个“信任一切”的网络。它假设所有节点都是善良的,但现实是,只要有一个节点被攻破,整个网络就沦陷了。
4.2 常见攻击类型:黑客的“四板斧”
基于上面的脆弱性,黑客对CAN总线的攻击,基本逃不出这四种套路。我管它们叫“四板斧”。
4.2.1 重放攻击(Replay Attack)
这是最“无脑”但也最有效的攻击方式。攻击者先监听总线,记录下一条合法的消息,比如“解锁车门”的指令。然后,等车主锁车离开后,把这条消息再发一遍。车门就开了。
你可能会问:“现在的车不是有滚动码吗?”没错,但很多老车型或者低端车型,压根儿没这功能。就算有,如果攻击者记录了一整段“钥匙靠近-解锁-启动”的完整序列,然后原封不动地重放,照样能骗过系统。我在一个渗透测试项目里,就靠这招成功“偷”了一辆测试车。
我的建议:对抗重放攻击,最有效的方法是引入时间戳或序列号。每条消息都带上一个递增的计数器,接收方只接受比上次大的序列号。这样,重放的老消息就会被丢弃。
4.2.2 篡改攻击(Falsification Attack)
重放是“照抄”,篡改是“改作业”。攻击者截获一条消息,比如“车速100km/h”,然后把它改成“车速0km/h”,再发出去。仪表盘上显示0,但实际车速是100。这会导致什么后果?嗯,你想想看,如果这个假信号被ESP(车身稳定系统)或AEB(自动紧急制动)用上了,后果不堪设想。
我记得有一次,我们测试一个ADAS功能,发现车辆在高速上突然急刹车。查了半天,原来是攻击者篡改了雷达的“目标距离”信号,让系统以为前方有障碍物。这种攻击,直接威胁到功能安全。
4.2.3 拒绝服务攻击(DoS Attack)
DoS攻击的目标是让总线“瘫痪”。攻击者持续发送高优先级消息(ID很小),霸占总线。其他ECU发不出消息,系统就“死机”了。
举个例子,攻击者往总线上狂发ID为0x000的消息,每毫秒发一条。CAN总线的带宽是有限的,高优先级消息会一直占用总线,导致刹车、转向这些低优先级消息发不出去。这时候,你踩刹车,车没反应;你打方向盘,车也不理你。这就是“物理层面的失控”。
注意:DoS攻击在CAN总线上特别容易实现,因为仲裁机制天然支持“高优先级抢占”。一个廉价的Arduino开发板,就能轻松瘫痪一辆车。我曾经用一块50块钱的板子,让一台测试车在5秒内“罢工”。
4.2.4 伪装攻击(Masquerade Attack)
伪装攻击是最高级的玩法。攻击者先分析总线上的消息,摸清哪个ECU负责什么功能。然后,他伪造一个ECU,冒充合法的节点,发送虚假指令。
比如,攻击者发现“刹车指令”来自ID为0x1A0的ECU。他就可以伪造一个ID为0x1A0的消息,内容是“刹车力度100%”。真正的刹车ECU收到后,会以为这是来自刹车踏板的指令,于是全力制动。而真正的刹车踏板发出的指令,反而被忽略了(因为优先级或时序问题)。
这种攻击最难防御,因为它完全模仿了合法节点的行为。唯一的办法,就是引入“消息认证码(MAC)”,让每条消息都带上一个只有发送方和接收方知道的密钥计算出的校验值。但问题是,CAN总线的带宽有限,加MAC会占用额外的字节,很多老车型根本跑不动。
4.3 攻击实例分析:从理论到实战
光说不练假把式。我给大家分享一个真实的攻击实例,是我当年参与的一个研究项目。
场景:一辆搭载了L2级ADAS的乘用车,具备ACC(自适应巡航)和AEB功能。
攻击目标:通过CAN总线攻击,让AEB在高速上误触发,或者让ACC无法响应前车减速。
攻击步骤:
- 信息收集:通过OBD-II接口接入CAN总线,用CANalyzer或PCAN工具监听。记录下所有消息的ID、数据长度和周期。重点关注与车速、制动、雷达相关的消息。
- 逆向分析:通过改变车辆状态(比如踩刹车、加速),观察哪些消息的数值会变化。我花了大概2小时,就锁定了“制动灯开关”和“制动主缸压力”这两个关键信号。
- 攻击实施:我写了一个脚本,周期性地发送伪造的“制动主缸压力”消息,数值设为最大值。同时,把真正的制动信号“淹没”掉(通过发送更高优先级的消息)。结果,AEB系统误以为驾驶员在全力刹车,于是也跟着全力制动。车辆在高速上突然急刹,后车差点追尾。
- 后果:这个攻击证明了,只要攻破了CAN总线,ADAS系统就是“瞎子”和“聋子”。它完全依赖总线上的数据,而这些数据可以被任意篡改。
教训:这个项目让我深刻认识到,ADAS系统的安全,不能只靠功能安全(ISO 26262),还必须引入信息安全(ISO 21434)。两者必须协同,才能构建真正的“安全”系统。
好了,关于CAN总线的攻击面,我就先讲这么多。下一章,我们会聊聊如何用入侵检测系统(IDS)来发现这些攻击。嗯,那才是真正的“攻防对抗”的开始。