Featured image of post Android auto

Android auto

暑假自律的开始

Android auto常见漏洞

安卓汽车(Android Auto)的应用程序编程接口(API)允许开发者与信息娱乐系统进行交互。通常,API 设计者会考虑特定的协议或 API 调用序列以确保系统的安全性和可靠性,而攻击者则将利用这些API进行攻击。

外部文件访问检测

Android的外部存储(如SD卡)对所有应用开放读写权限(除非设置特殊加密),这意味着:

  • 任何应用都可以读取、修改、删除外部存储中的文件。

  • 敏感数据(如用户隐私、配置信息、业务逻辑文件)若存储在外部存储,可能被恶意应用篡改、窃取或删除,导致数据泄露或功能异常。

示例(getDiskCacheDir方法):

1
2
3
4
5
public static File getDiskCacheDir(Context c) {
    File dir = c.getExternalCacheDir(); // 尝试获取外部缓存目录
    if (dir == null) { dir = c.getCacheDir(); } // 外部存储不可用时,回退到内部缓存
    return dir;
}

使用 WORLD_WRITEABLE

当文件以 MODE_WORLD_WRITEABLE 模式创建时,其他应用(无论是否属于同一开发者)均可向该文件写入数据。默认情况下,Android 保护机制强制执行,只有创建内部存储文件的应用才能访问它。但是有些应用确实使用MODE_WORLD_WRITEABLE 或 MODE_WORLD_READABLE 模式来处理 IPC 文件,从而绕过这一限制。

示例:

1
2
3
4
5
File f = new File(getFilesDir(), "filename.ext"); 
f.delete();
FileOutputStream fos = openFileOutput("filename.ext", Context.MODE_WORLD_WRITEABLE); // 以全局可写模式创建同名文件(高危操作)
fos.close();
File f = new File(getFilesDir(), "filename.ext");

密钥库风险

密钥可以存放在密钥库中,并使用密码保护。然而,这并不能保护在已遭 root 攻击的系统中被监控用户输入密码时的数据。

PasswordProtection()被污染: 攻击者可以修改此构造函数的行为,使其接受空密码或任意密码

getPrivateKey()被污染: 此方法本应返回KeyStore中存储的真实私钥。若被污染,可返回攻击者控制的伪造私钥

load()被污染: 若被污染,可加载包含恶意条目的密钥库或在加载过程中窃取密码

内容提供者

内容提供者是Android四大组件之一,用于在不同应用间共享数据(如数据库、文件等),是一种结构化存储机制。其默认行为由android:exported属性控制,决定是否允许其他应用访问。但是在一些场景中,该权限可以被动态添加:

1
2
3
4
5
6
7
PermissionInfo permissionInfo = new PermissionInfo();
permissionInfo.name = "com.example.plugin.MY_UNIQUE_PERMISSION"; // 权限唯一标识
permissionInfo.labelRes = R.string.permission_risk_warning; // 权限描述(必须清晰告知风险)
permissionInfo.protectionLevel = PermissionInfo.PROTECTION_SIGNATURE; // 保护级别设为签名级
permissionInfo.description = "允许插件访问宿主核心功能,仅限授权应用使用"; // 详细描述
PackageManager packageManager = getApplicationContext().getPackageManager();
packageManager.addPermission(permissionInfo)

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控件(如按钮点击事件)可能关联事件处理器,需解析此类文件以补充反射调用或隐式注册的入口点。

示例图

漏洞检测的工作原理

具体流程

  1. 开始(START)
    流程起点,准备启动漏洞检测逻辑。

  2. 搜索中间代码(Search in the Intermediate Code)
    第一步是在编译后的中间代码(如Java字节码、LLVM IR等)中扫描,寻找可能存在漏洞的代码片段(如不安全的函数调用、未验证的输入处理等)。

  3. 检测漏洞实现(Vulnerable implementation Detected?)
    • NO:未检测到漏洞,返回“搜索中间代码”步骤,继续扫描剩余代码(形成循环,直到遍历所有代码)。

    • YES:检测到潜在漏洞实现,进入下一步分析。

  4. 访问JVM堆栈(Access JVM Stack)
    获取当前漏洞代码在JVM运行时的调用栈信息,用于分析调用上下文(如调用参数、调用链路径等)。

  5. 判断调用参数类型(Called with constant arguments?)
    检查漏洞函数是否使用常量参数调用:
    • YES:漏洞触发条件明确(参数固定),可直接进入处理流程。

    • NO:参数可能动态变化(如用户输入、变量传递),需进一步分析所有可能的调用场景。

  6. 处理并抛出警告(Process and Throw Warning)
    当漏洞以常量参数调用时,直接生成警告信息(如漏洞类型、位置、风险等级),输出给开发者或集成到开发工具中。

  7. 获取所有贡献者(Get all Contributors)
    若参数非固定值,需收集所有可能导致漏洞的调用路径或代码模块(“贡献者”可能指代调用链中的相关函数、类或输入源),以便全面分析。

  8. 检查漏洞检查完成状态(All Possible Vulnerabilities Checked?)
    • YES:所有可能的漏洞场景已分析完毕,流程结束。

    • NO:存在未覆盖的调用路径或潜在漏洞场景,返回“访问JVM堆栈”步骤,重新分析其他可能的调用上下文(形成循环,确保全面性)。

生活由投入其中的每一天构成
使用 Hugo 构建
主题 StackJimmy 设计