30、车载系统安全加固:系统漏洞扫描与修复、SELinux策略强化、应用签名与验证、数据安全与隐私保护

车载系统安全,说实话,是个“平时没人管,出事全怪你”的活儿。我入行那会儿,大家更关心功能能不能跑起来,至于安全?嗯,先上线再说。直到有一次,我们一台测试车被白帽子远程打开了车门……从那以后,安全就成了我每次提测前必须过的鬼门关。

今天这一章,咱们就聊聊车载Android系统安全加固的几个核心方向。说白了,就是四件事:漏洞怎么扫、SELinux怎么锁、应用怎么验、数据怎么藏

核心观点:车载安全不是加几把锁,而是构建一个从底层内核到上层应用的纵深防御体系。
车载系统安全加固体系 漏洞扫描与修复 CVE / 补丁管理 SELinux策略强化 TE规则 / 最小权限 应用签名与验证 APK签名 / 完整性 数据安全与隐私 加密 / 隔离 / 脱敏 扫描工具 • OpenVAS / Nessus • 内核CVE检查 • 依赖库扫描 策略要点 • neverallow规则 • 域隔离 • 文件上下文 验证机制 • v2/v3签名 • 签名链校验 • 运行时验证 保护措施 • 全盘加密 • 数据隔离 • 隐私脱敏 目标:纵深防御,纵深防御,还是纵深防御 知识体系图

一、系统漏洞扫描与修复

漏洞扫描这事儿,我个人的习惯是把它分成两个阶段:构建时扫描运行时监控

构建时扫描,说白了就是在你编译系统镜像之前,先把所有依赖的第三方库、内核模块、甚至你写的native服务,全部过一遍CVE数据库。我见过太多团队,辛辛苦苦把功能做完了,结果一扫描,OpenSSL版本还是三年前的,一堆高危漏洞。嗯,那种感觉就像你装修完房子才发现地基是豆腐渣。

我的经验:建议在CI/CD流水线中集成OpenVAS或Nessus的轻量级扫描脚本。每次构建前自动拉取最新CVE库,匹配你的依赖版本。别等到提测了再扫,那时候改起来成本太高。

运行时监控呢?主要是针对那些“零日漏洞”。你不可能预知所有攻击,但你可以监控异常行为。比如,一个原本只读文件的进程突然开始写系统分区,这肯定有问题。我曾在某款车型上遇到过,一个第三方地图应用试图读取/data/system下的敏感文件,被SELinux直接拦了——这就是运行时监控的价值。

修复策略上,我建议按优先级排序:

  • P0(紧急):远程代码执行、提权漏洞。必须立即合入补丁,重新构建系统。
  • P1(高):信息泄露、拒绝服务。可以在下一个OTA版本中修复。
  • P2(中):本地低风险漏洞。记录在案,随大版本更新。

二、SELinux策略强化

SELinux,很多人觉得它烦。动不动就avc: denied,日志刷屏。但说实话,它是车载系统最后一道防线。你想想看,如果应用层被攻破了,SELinux还能拦住它乱搞系统文件,这就是它的价值。

我在项目中遇到过最典型的问题:某个车载hal服务需要访问GPS数据,但SELinux策略没写对,结果GPS死活拿不到数据。调试了一整天,最后发现是hal_gps_default.te文件里少了一条allow规则。

强化SELinux策略,我总结了三个核心原则:

  1. 最小权限原则:只给进程它真正需要的权限。别图省事直接写allow domain domain:file read,那等于没开SELinux。
  2. neverallow规则:这是你的“安全底线”。比如,绝对不允许普通应用域访问system_data_file。写一条neverallow appdomain system_data_file:file write,编译时就能拦住违规行为。
  3. 域隔离:每个关键服务一个独立域。比如gpsdmediaserversurfaceflinger各玩各的,互不干扰。
避坑指南:我曾经因为一条SELinux策略写得太宽松,导致一个系统应用能读取所有应用的私有数据。那次的教训是:写完策略后,一定要用sesearch工具检查一下,看看有没有意外的权限泄露。

下面是一个典型的SELinux策略文件示例,用于限制一个车载导航服务的权限:

# 文件: hal_navigation_default.te
type hal_navigation, domain;
type hal_navigation_exec, exec_type, file_type;

# 只允许访问自己的数据目录
allow hal_navigation hal_navigation_data_file:dir rw_dir_perms;
allow hal_navigation hal_navigation_data_file:file create_file_perms;

# 允许读取GPS数据
allow hal_navigation gps_device:chr_file rw_file_perms;

# 绝对不允许写系统分区
neverallow hal_navigation system_file:file write;

三、应用签名与验证

应用签名,说白了就是给每个APK发一张“身份证”。车载系统里,这张身份证尤其重要。因为车机上的应用来源比手机复杂得多——有主机厂自研的、有供应商的、还有第三方市场的。

Android从7.0开始支持APK Signature Scheme v2,从9.0开始支持v3。我建议车载系统直接上v3签名,因为它支持签名轮换。什么意思呢?就是你的签名密钥过期了,可以在不破坏已有签名链的情况下换一把新钥匙。这对车机这种长生命周期设备来说,太重要了。

验证流程上,我习惯在PackageManagerService里加一道自定义校验:

  • 第一步:检查签名是否匹配白名单中的证书指纹。
  • 第二步:验证APK完整性,确保没有被二次打包。
  • 第三步:运行时定期重校验,防止运行时注入。
一个小技巧:把主机厂自研应用的签名证书硬编码到系统分区,只读挂载。这样即使root了,攻击者也改不了白名单。我在某款量产车型上就是这么做的,效果很好。

四、数据安全与隐私保护

数据安全这块,我把它拆成“存、传、用”三个环节。

存:全盘加密是标配。但要注意,车载系统的加密密钥不能像手机那样用用户密码派生。车机没有用户交互,所以密钥通常存储在安全芯片(SE)或TEE里。我建议使用dm-crypt + keymaster的组合,密钥由TEE管理,系统分区和用户数据分区分别加密。

传:车内外通信必须加密。车内用TLS 1.3,车外用mTLS(双向认证)。我曾经在某个项目里发现,OBD接口的数据竟然是明文传输的——随便一个蓝牙嗅探器就能读到发动机参数。嗯,那之后我们就把所有车内总线通信都加了TLS。

用:隐私保护的核心是“最小化采集”。比如,导航应用只需要你的位置,不需要你的通讯录。我建议在PermissionController里增加一个“隐私审计日志”,记录每个应用在什么时间、因为什么原因访问了敏感数据。这个日志只允许系统服务读取,普通应用看不到。

数据类别 存储要求 传输要求 使用要求
用户身份 加密存储,密钥在TEE mTLS双向认证 仅系统服务可访问
车辆位置 加密存储,定期清理 TLS 1.3 需用户授权,可撤销
驾驶行为 脱敏后存储 加密通道 仅用于本地分析
多媒体数据 应用隔离存储 不涉及 按需授权
总结一下:车载安全没有银弹。漏洞扫描是“体检”,SELinux是“免疫系统”,签名验证是“门禁”,数据保护是“保险柜”。四者缺一不可。我做了这么多年,最大的感受就是:安全不是功能,是习惯。把安全思维融入到每一个代码提交、每一次策略变更中,你的车机才能真正扛得住攻击。
公众号:蓝海资料掘金营,微信deep3321