Android auto常见漏洞
安卓汽车(Android Auto)的应用程序编程接口(API)允许开发者与信息娱乐系统进行交互。通常,API 设计者会考虑特定的协议或 API 调用序列以确保系统的安全性和可靠性,而攻击者则将利用这些API进行攻击。
外部文件访问检测
Android的外部存储(如SD卡)对所有应用开放读写权限(除非设置特殊加密),这意味着:
-
任何应用都可以读取、修改、删除外部存储中的文件。
-
敏感数据(如用户隐私、配置信息、业务逻辑文件)若存储在外部存储,可能被恶意应用篡改、窃取或删除,导致数据泄露或功能异常。
示例(getDiskCacheDir方法):
|
|
使用 WORLD_WRITEABLE
当文件以 MODE_WORLD_WRITEABLE 模式创建时,其他应用(无论是否属于同一开发者)均可向该文件写入数据。默认情况下,Android 保护机制强制执行,只有创建内部存储文件的应用才能访问它。但是有些应用确实使用MODE_WORLD_WRITEABLE 或 MODE_WORLD_READABLE 模式来处理 IPC 文件,从而绕过这一限制。
示例:
|
|
密钥库风险
密钥可以存放在密钥库中,并使用密码保护。然而,这并不能保护在已遭 root 攻击的系统中被监控用户输入密码时的数据。
PasswordProtection()被污染: 攻击者可以修改此构造函数的行为,使其接受空密码或任意密码
getPrivateKey()被污染: 此方法本应返回KeyStore中存储的真实私钥。若被污染,可返回攻击者控制的伪造私钥
load()被污染: 若被污染,可加载包含恶意条目的密钥库或在加载过程中窃取密码
内容提供者
内容提供者是Android四大组件之一,用于在不同应用间共享数据(如数据库、文件等),是一种结构化存储机制。其默认行为由android:exported属性控制,决定是否允许其他应用访问。但是在一些场景中,该权限可以被动态添加:
|
|
WebView
WebView 是 Android/iOS 等移动操作系统中内置的浏览器组件,允许应用内嵌网页内容,实现混合开发(Hybrid App)。在 WebView 中,启用 JavaScript 意味着它现在容易受到 XSS 攻击。如果使用,则应仅向所有输入都值得信赖的网页暴露 addJavaScriptInterface()。
GPS 位置检测器
WebChromeClient.onGeolocationPermissionsShowPrompt()方法来获取向 JavaScript 披露用户位置的权限。
Android auto 静态分析器
使用抽象解释来分析和验证Java字节码
系统架构
具体流程:
1.应用获取与拆解:提取APK中的代码(JAR)和配置文件(Manifest)。
2.逆向工程:反编译代码生成结构化字节码,还原应用逻辑。
3.配置分析:解析Manifest获取权限、组件等安全敏感配置。
4.自动化分析:
-
Android Auto Analyzer提炼配置层风险(如过度声明的权限)。
-
污点分析结合代码逻辑,追踪敏感数据在程序中的流动路径。
5.漏洞判定:通过两者的分析结果,识别如“权限滥用+数据未脱敏”“组件暴露+敏感操作无校验”等复合安全问题。
入口点的定位逻辑
1. 静态分析入口点的普遍性与Android特殊性
普通Java应用的入口点:Julia库(通用静态分析工具)从main方法开始分析,因为Java程序通常有明确的程序入口。
Android应用的复杂性:
• Android程序通过事件处理器(如Activity、Service、BroadcastReceiver等)响应用户交互或系统事件,这些处理器可能被反射机制动态调用,无法通过单一固定的入口(如main方法)覆盖所有逻辑。
• 关键信息分散在AndroidManifest.xml(声明组件)和运行时展开的XML文件(如布局文件定义的UI事件)中,需结合两者确定入口点。
Android Auto的特殊需求:
• 聚焦媒体浏览(音频播放)和消息服务(通信功能),这两类是Android Auto的核心场景,需精准定位相关组件以避免分析遗漏。
2. 入口点定位的具体策略
(1)基于清单文件(AndroidManifest.xml)的全局扫描
所有Android组件(Activity、Service等)必须在清单文件中声明,分析器首先解析清单文件,提取以下信息:
-
MediaBrowser服务:搜索声明android.media.browse.MediaBrowserService服务的类(如图中“android.media.browse.MediaBrowserService”)。
-
消息服务:筛选继承自BroadcastReceiver的接收器类(因Android Auto规范要求消息发送/接收类必须扩展此类)。
(2)运行时XML文件的动态补充
布局文件(XML)中定义的UI控件(如按钮点击事件)可能关联事件处理器,需解析此类文件以补充反射调用或隐式注册的入口点。
示例图
漏洞检测的工作原理
具体流程:
-
开始(START)
流程起点,准备启动漏洞检测逻辑。 -
搜索中间代码(Search in the Intermediate Code)
第一步是在编译后的中间代码(如Java字节码、LLVM IR等)中扫描,寻找可能存在漏洞的代码片段(如不安全的函数调用、未验证的输入处理等)。 -
检测漏洞实现(Vulnerable implementation Detected?)
• NO:未检测到漏洞,返回“搜索中间代码”步骤,继续扫描剩余代码(形成循环,直到遍历所有代码)。• YES:检测到潜在漏洞实现,进入下一步分析。
-
访问JVM堆栈(Access JVM Stack)
获取当前漏洞代码在JVM运行时的调用栈信息,用于分析调用上下文(如调用参数、调用链路径等)。 -
判断调用参数类型(Called with constant arguments?)
检查漏洞函数是否使用常量参数调用:
• YES:漏洞触发条件明确(参数固定),可直接进入处理流程。• NO:参数可能动态变化(如用户输入、变量传递),需进一步分析所有可能的调用场景。
-
处理并抛出警告(Process and Throw Warning)
当漏洞以常量参数调用时,直接生成警告信息(如漏洞类型、位置、风险等级),输出给开发者或集成到开发工具中。 -
获取所有贡献者(Get all Contributors)
若参数非固定值,需收集所有可能导致漏洞的调用路径或代码模块(“贡献者”可能指代调用链中的相关函数、类或输入源),以便全面分析。 -
检查漏洞检查完成状态(All Possible Vulnerabilities Checked?)
• YES:所有可能的漏洞场景已分析完毕,流程结束。• NO:存在未覆盖的调用路径或潜在漏洞场景,返回“访问JVM堆栈”步骤,重新分析其他可能的调用上下文(形成循环,确保全面性)。