4、入侵检测基础:异常检测 vs 误用检测、基于签名的检测、基于行为的检测、基于机器学习的检测
各位同学,今天我们聊点实在的。入侵检测,说白了就是给车载网络装个「保安」。但这个保安怎么干活?是认脸还是看行为?这里头门道不少。我做了这么多年车载安全,踩过的坑能写本书。今天就把这些经验掰开揉碎了讲给你们听。
4.1 异常检测 vs 误用检测:两个流派
先问个问题:你抓小偷,是看他长得像不像通缉令上的照片,还是看他鬼鬼祟祟的行为?这就是误用检测和异常检测的本质区别。
误用检测,也叫基于签名的检测。它手里有本「黑名单」,里面全是已知攻击的特征。来了一个报文,跟黑名单对上号了,直接报警。我在一个T-Box项目里就吃过这个亏——攻击者稍微改了点报文格式,签名库没更新,直接漏报。所以啊,签名库得勤快更新,不然就是摆设。
异常检测,它先学一套「正常行为」的模板。比如CAN总线上,发动机转速报文每秒发100次,突然变成200次,那肯定有问题。它不关心攻击长啥样,只关心「跟平时不一样」。我有个同事在ADAS项目里用这个,效果不错,但误报率也高——急刹车时报文频率突变,系统以为是攻击,搞得测试工程师天天骂娘。
核心区别一句话:
- 误用检测:我知道坏人长啥样,来了就抓。
- 异常检测:我知道好人啥样,不像好人的都抓。
4.2 基于签名的检测:老派但管用
这是最传统的方法。说白了,就是维护一个攻击特征库。比如某个CAN ID在特定时间窗口内发了异常数据,或者某个UDS诊断请求的序列不对,都算特征。
我习惯把签名分成三类:
| 签名类型 | 例子 | 我的经验 |
|---|---|---|
| 内容签名 | 报文数据字段出现特定值(如0xDEAD) | 适合检测已知攻击,但容易被绕过 |
| 频率签名 | 某个ID的发送间隔突然缩短 | 我在网关项目里用过,对DoS攻击很有效 |
| 序列签名 | 诊断会话的跳转顺序异常 | UDS攻击的克星,但规则写起来很烦 |
优点很明显:实现简单,性能开销小。缺点也致命:只能检测已知攻击。你想想看,现在车载攻击花样翻新,签名库永远慢半拍。我曾经在一个量产项目里,签名库刚更新完,第二天就出了新变种——那叫一个尴尬。
避坑指南:签名规则别写太死。比如「CAN ID 0x123 每秒最多发10次」,如果车况特殊(比如拖车模式),这个规则就会误报。我建议加个白名单机制,把特殊工况排除掉。
4.3 基于行为的检测:看整体,不看局部
行为检测不盯着单个报文,而是看一段时间内的行为模式。比如:
- 某个ECU平时只发5种报文,突然开始发第6种
- 总线负载率从30%飙到80%
- 某个节点的响应时间从2ms变成20ms
我在一个OBD诊断项目里用过这个。当时发现某个ECU在凌晨3点突然开始大量发送诊断请求——这明显不正常,因为车都锁了。后来一查,是有人通过蓝牙模块在搞远程攻击。行为检测抓住了它,签名检测反而没发现,因为报文内容本身是合法的。
行为检测的难点在于「基线」怎么定。不同车型、不同工况,正常行为差异很大。我建议的做法是:先跑一个月的数据,把各种工况都覆盖到,然后取统计值(均值、方差、百分位数)。别偷懒,这个活必须做扎实。
注意:行为检测的误报率通常比签名检测高。我见过一个项目,因为没处理好冷启动时的行为波动,每天误报上千条。最后运维团队直接把检测功能关了——等于白做。
4.4 基于机器学习的检测:新武器,但别迷信
ML检测这两年很火。它不需要人写规则,让算法自己学。常见的方法有:
- 监督学习:拿标注好的攻击数据训练,让模型学会分类。适合已知攻击,但标注数据太难搞了。
- 无监督学习:只给正常数据,模型自己找异常。适合未知攻击,但解释性差——模型说「这个报文有问题」,你问它为什么,它说不清楚。
- 半监督学习:介于两者之间,少量标注+大量未标注。我个人比较推荐这个,性价比高。
我记得有个项目,用LSTM做时序异常检测。训练时一切正常,上线后第一天就崩了——模型把「空调开启」识别成了攻击,因为空调开启时总线负载会突然变化。后来加了特征工程,把空调状态作为输入特征,才算搞定。
ML检测的坑很多:
- 数据质量:垃圾进垃圾出。车载数据噪声大,预处理得花80%的时间。
- 模型部署:车载芯片算力有限,别指望跑大模型。我一般用轻量级的随机森林或轻量级神经网络。
- 模型更新:车卖出去后,模型怎么更新?OTA?还是等回厂?这个问题不解决,ML检测就是空中楼阁。
我的建议:别一上来就上ML。先做好签名检测和行为检测,把基础打牢。ML作为补充,专门对付那些规则搞不定的复杂攻击。我见过太多团队,ML模型没调好,基础检测也没做扎实,两头空。
4.5 四种方法的对比与选择
最后给个对比表,方便你们选型:
| 方法 | 检测能力 | 误报率 | 实现难度 | 维护成本 | 适用场景 |
|---|---|---|---|---|---|
| 签名检测 | 已知攻击 | 低 | 低 | 高(需频繁更新) | 已知攻击防护 |
| 行为检测 | 已知+部分未知 | 中 | 中 | 中 | 异常行为监控 |
| ML检测 | 未知攻击 | 高 | 高 | 高(需持续调优) | 复杂攻击检测 |
实际项目中,我习惯把三种方法结合起来。签名检测做第一道防线,行为检测做第二道,ML检测做最后兜底。这样既保证了实时性,又覆盖了未知攻击。嗯,这个架构我在三个量产项目里验证过,效果都不错。
好了,今天就聊到这。下一节我们讲具体的检测算法实现,到时候带你们手写一个简单的CAN总线异常检测器。