本文作者:VisualThreat 车联网安全公司 CEO 严威
参考来源:GeekCar
1.汽车安全漏洞分类总结
汽车应用中最常见安全漏洞排名前三的是通信不安全,代码无混淆,和中间人攻击。
如果我们要细分,下表是按照应用的不同分类总结出来的安全数据,最后一行是车厂定制类。
Vulnerability | URI | URL | Component | Exposed Access | Repackage | Code | Unsecured | Man-in-the-Middle |
Exposure | Exposure | Exposure | Privilege | Confusion | Communication | Attack | ||
Number Of | 160 | 217 | 168 | 124 | 124 | 215 | 226 | 176 |
Vulnerabilities | ||||||||
OBD | 36.90% | 75.40% | 40.00% | 36.90% | 58.50% | 67.70% | 95.40% | 41.50% |
导航地图 | 60.60% | 63.60% | 66.70% | 51.50% | 30.30% | 69.70% | 66.70% | 66.70% |
租车 | 74.20% | 90.30% | 58.10% | 38.70% | 22.60% | 80.60% | 96.80% | 87.10% |
保养 | 67.90% | 60.70% | 67.90% | 53.60% | 42.90% | 67.90% | 67.90% | 46.40% |
汽车诊断 | 56.00% | 60.00% | 60.00% | 32.00% | 64.00% | 88.00% | 88.00% | 56.00% |
汽车资讯 | 52.90% | 82.40% | 52.90% | 41.20% | 70.60% | 76.50% | 70.60% | 70.60% |
购车 | 52.90% | 52.90% | 58.80% | 35.30% | 17.60% | 88.20% | 41.20% | 52.90% |
驾驶习惯 | 37.50% | 37.50% | 56.30% | 50.00% | 68.80% | 81.30% | 81.30% | 37.50% |
违章 | 80.00% | 50.00% | 90.00% | 40.00% | 20.00% | 30.00% | 40.00% | 90.00% |
打车 | 90.00% | 100.00% | 70.00% | 30.00% | 20.00% | 60.00% | 80.00% | 80.00% |
车厂定制 | 33.30% | 100.00% | 66.70% | 33.30% | 33.30% | 66.70% | 100.00% |
2. VisualThreat 安全测试报告
2.1. 软件概况
应用名称 | 比亚迪云服务 | 版本号 | 2.5.0 | |
文件大小 | 12520.6KB | 提交时间 | 2015-06-08 22:19:52 | |
MD5 值 | 8369878A566CB65D355C80D8E3D46418 | 处理时间 | 2015-06-08 23:05:43 |
这款应用是 2015 年 6 月 8 号通过应用商店下载后进行分析。
2. 2 VisualThreat 汽车应用安全漏洞测试
2.2.1. 测试结论
分类 | 监测点 | 中高等级风险 |
代码安全 | 应用重打包 | 高 |
网络通信 | HTTPS 服务器未验证 | 高 |
网络通信 | HTTPS 证书未校验 | 高 |
网络通信 | WebView 远程代码攻击 | 高 |
数据存储 | 代码包含敏感信息 | 中 |
数据存储 | 程序数据任意备份 | 中 |
数据存储 | 资源文件包含敏感信息 | 中 |
功能安全 | 组件间通信中的隐式发送 | 中 |
代码安全 | Log 信息未清除 | 中 |
2.2.2 部分安全漏洞说明
漏洞1:HTTPS 服务器未验证
漏洞现象
以下信息存在有 HTTPS 通信服务器未校验的问题。这次攻击就利用了这点。
#1 [SDK]:cn.sharesdk.framework.network.i.a()Lorg/apache/http/client/HttpClient;||||sget-object v0, Lorg/apache/http/conn/ssl/SSLSocketFactory;->ALLOW_ALL_HOSTNAME_VERIFIER:Lorg/apache/http/conn/ssl/X509HostnameVerifier;||||invoke-virtual {v1, v0}, Lorg/apache/http/conn/ssl/SSLSocketFactory;->setHostnameVerifier(Lorg/apache/http/conn/ssl/X509HostnameVerifier;)V||||
#2 [SDK]:m.framework.network.NetworkHelper.getSSLHttpClient()Lorg/apache/http/client/HttpClient;||||sget-object v0, Lorg/apache/http/conn/ssl/SSLSocketFactory;->ALLOW_ALL_HOSTNAME_VERIFIER:Lorg/apache/http/conn/ssl/X509HostnameVerifier;||||invoke-virtual {v1, v0}, Lorg/apache/http/conn/ssl/SSLSocketFactory;->setHostnameVerifier(Lorg/apache/http/conn/ssl/X509HostnameVerifier;)V|||
漏洞风险
即使做了对证书有效性的判断,但是如果没有验证云端服务器本身是否可信,仍然会造成伪装云端服务器而发生的中间人攻击。例如,攻击者可以盗用云服务平台可信证书,伪装服务器建通信对话,解密客户端发送的敏感信息,比如车主的信息(姓名、车牌号、车架号、身份证号、第二联系人姓名、手机号等)和控制密码,获取这些信息后伪装成用户通过云平台对车辆进行非法控制。
解决方案
移动软件大多只和固定的云服务器通信,因此可以在代码中更精确地直接验证是否某信任的服务器。
漏洞2:HTTPS 证书未校验
漏洞现象
以下信息存在有证书未校验的问题
#1 [SDK]:cn.sharesdk.framework.network.m.checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V||||.method public checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V||||.locals 0||||return-void||||.end method||||
#2 [SDK]:cn.sharesdk.framework.network.m.checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V||||.method public checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V||||.locals 0||||return-void||||.end method||||
#3 [SDK]:com.amap.api.services.core.k$b.checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V||||.method public checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V||||.locals 0||||return-void||||.end method||||
#4 [SDK]:com.amap.api.services.core.k$b.checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V||||.method public checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V||||.locals 0||||return-void||||.end method||||
#5 [SDK]:m.framework.network.SSLSocketFactoryEx$1.checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V||||.method public checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V||||.locals 0||||return-void||||.end method||||
#6 [SDK]:m.framework.network.SSLSocketFactoryEx$1.checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V||||.method public checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V||||.locals 0||||return-void||||.end method||||
漏洞风险
客户端通过数字证书判断服务器是否可信,并采用证书中的公钥与服务器进行加密通信。开发者在代码中不检查服务器证书的有效性,或选择接受所有的证书,这种做法可能导致的问题是中间人攻击。
解决方案
移动软件大多只和固定的云服务器通信,因此可以在代码中更精确地直接验证是否某张特定的证书。
漏洞3:Log 信息未清除
漏洞现象
以下代码进行了 Log 输出
#1 com.byd.aeri.caranywhere.CarStateDetail.a()V||||invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I||||
#2 com.byd.aeri.caranywhere.CarStateDetail.onCreate(Landroid/os/Bundle;)V||||invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I||||
#3 com.byd.aeri.caranywhere.CarStateDetail.onDestroy()V||||invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I||||
#4 com.byd.aeri.caranywhere.CarStateDetail.onPause()V||||invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I||||
#5 com.byd.aeri.caranywhere.CarStateDetail.onResume()V||||invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I||||
#6 com.byd.aeri.caranywhere.CarStatus.a(Landroid/graphics/Bitmap;Ljava/lang/String;Ljava/lang/String;)V||||invoke-static {v0, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I||||
#7 com.byd.aeri.caranywhere.CarStatus.a(Landroid/graphics/Bitmap;Ljava/lang/String;Ljava/lang/String;)V||||invoke-static {v1, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I||||
#8 com.byd.aeri.caranywhere.CarStatus.j()V||||invoke-static {v0, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I||||
#9 com.byd.aeri.caranywhere.CarStatus.j()V||||invoke-static {v0, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I||||
#10 com.byd.aeri.caranywhere.CarStatus.j()V||||invoke-static {v0, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I||||
漏洞风险
应用程序中 Log 调试开关未关闭,可能会导致被黑客利用熟悉业务流程。由于核心业务逻辑通过 Log 方式泄露,大大降低了对智能汽车的攻击门槛。这种攻击方式经常会被用到。
解决方案
在产品应用最终打包和发布的过程中移除相关的 Log 函数,避免敏感信息被攻击者截获,进而利用来对车辆进行控制。
漏洞4:应用重打包
漏洞现象
移动应用被反编译并且成功二次打包。
漏洞风险
攻击者将应用反汇编,然后在其中添加、修改、删除等一些指令序列;最后,将这些指令重新汇编并打包成新的 APK 文件,再次签名,就可以给其他手机安装了。通过重打包,攻击者可以加入恶意代码、改变软件的数据或指令,而软件原有功能和界面基本不会受到影响,用户难以察觉。比如通过应用重打包进行控制车辆的提权指令,在有效的云服务器授权期间,执行开启发动机行为。
漏洞现象
以下组件间通信未指定接收方,为隐式发送。
#1 [SDK]:cn.sharesdk.framework.utils.e$b.b(ILjava/lang/String;)I||||invoke-direct {v0}, Landroid/content/Intent;-><init>()V||||invoke-virtual {v1, v0}, Landroid/content/Context;->sendBroadcast(Landroid/content/Intent;)V||||
漏洞风险
如果组件间通信为隐式调用,任何软件都可以响应这个调用请求。攻击者可以通过构造伪造的恶意组件,响应隐式调用的 Intent,可以读取请求组件间传输的数据,包括车主的信息和控制密码等,弹出虚假的用户界面以展开进一步钓鱼攻击。比如授权用户对车身的远程开关车门指令未到达执行组件,进而造成车身控制的失效。
漏洞6:WebView 远程代码攻击
漏洞现象
以下代码有被远程代码执行的可能
#1 com.byd.aeri.caranywhere.JoinEnergyCmpt.a()V||||invoke-virtual {v0, v1}, Landroid/webkit/WebSettings;->setJavaScriptEnabled(Z)V||||
#2 com.byd.aeri.caranywhere.Settings_Help.a()V||||invoke-virtual {v0, v1}, Landroid/webkit/WebSettings;->setJavaScriptEnabled(Z)V||||
#3 com.byd.aeri.caranywhere.Videoweb.onCreate(Landroid/os/Bundle;)V||||invoke-virtual {v0, v1}, Landroid/webkit/WebSettings;->setJavaScriptEnabled(Z)V||||
#4 com.byd.aeri.caranywhere.fz.run()V||||invoke-virtual {v0, v1}, Landroid/webkit/WebSettings;->setJavaScriptEnabled(Z)V||||
#5 [SDK]:cn.sharesdk.framework.authorize.g.b()Lcn/sharesdk/framework/authorize/RegisterView;||||invoke-virtual {v1, v4}, Landroid/webkit/WebSettings;->setJavaScriptEnabled(Z)V||||
漏洞风险
WebView 通过 JS 同服务器端交互在用户移动设备上展示页面,JS 可能包含恶意代码,造成恶意代码远程执行,实现对车辆的远程控制。