【问题标题】:Security issues when using Content Provider in BluetoothGattCallback在 BluetoothGattCallback 中使用 Content Provider 时的安全问题
【发布时间】:2014-03-11 04:08:54
【问题描述】:

我在调用 onCharacteristicChanged() 回调时观察到一个奇怪的权限相关问题。

我正在编写一个 Android 服务,该服务使用蓝牙 LE API 与外围角色的 LE(低能耗)传感器进行通信。我启用了关于传感器通知任何更改的特性的通知。

当调用 onCharacteristicChanged() 回调时,我的服务会检索特征值并将其存储在内容提供程序中。对该内容提供者的访问受到签名级别权​​限的限制。托管我的服务的应用程序具有这些权限。

这里是onCharacteristicChanged的简化代码:

@Override
public void onCharacteristicChanged(final BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic) {
    super.onCharacteristicChanged(gatt, characteristic);

    Log.v(TAG, "pid=" + android.os.Process.myPid() + " uid=" + android.os.Process.myUid());

    Uri uri = mContext.getContentResolver().insert(URI_VALUES, characteristic.getValue());
}

在上述回调中调用 insert() api 时,我获得了安全权限。

02-27 15:15:32.752: V/ProxyGattClient(10511): pid=10511 uid=10177
02-27 15:15:32.792: E/PersistenceUtil(10511): Error saving a reading into the database
02-27 15:15:32.792: E/PersistenceUtil(10511): java.lang.SecurityException: Permission Denial: writing com.example.content.MyContentProvider uri content://com.example/values from pid=1336, uid=1002 requires com.example.permission.ACCESS_CONTENT, or grantUriPermission()
02-27 15:15:32.792: E/PersistenceUtil(10511):   at android.content.ContentProvider$Transport.enforceWritePermissionInner(ContentProvider.java:445)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at android.content.ContentProvider$Transport.enforceWritePermission(ContentProvider.java:382)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at android.content.ContentProvider$Transport.insert(ContentProvider.java:210)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at android.content.ContentResolver.insert(ContentResolver.java:917)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at com.qcl.vh.ble.ProxyGattClient.onCharacteristicChanged(ProxyGattClient.java:101)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at android.bluetooth.BluetoothGatt$1.onNotify(BluetoothGatt.java:425)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:397)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at android.os.Binder.execTransact(Binder.java:388)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at dalvik.system.NativeStart.run(Native Method)

运行 'adb shell ps' 显示 pid=1336,uid=1002 是“com.android.bluetooth”进程的进程 ID。上面的堆栈跟踪显示,内容提供者的插入在蓝牙进程的上下文中被调用。当然这个进程没有权限写入内容提供者,因此这个例外。

当我在 onCharacteristicChanged() 中记录进程 ID 时,它显示 pid=10511 uid=10177,这是托管我的应用程序的进程的进程 ID。

有人可以解释上述行为吗?为什么在我的应用程序进程中运行回调本身时,在蓝牙进程的上下文中调用 insert()。

我在三星 Galaxy S3、Android 4.3 上运行。

谢谢

【问题讨论】:

  • 签名权限意味着它们都必须由同一个应用程序开发人员密钥签名......这对于系统蓝牙是不可能的?
  • 我遇到了同样的问题,于是求助于从 BluetoothGattCallback 调用服务。

标签: android bluetooth


【解决方案1】:

我相信答案就在你的错误中。

requires com.example.permission.ACCESS_CONTENT

您必须允许其他人从您的 contentProvider 中读取。阅读更多关于它的信息here

您能否说明您是如何知道主机应用程序具有这些权限的?我过去在这里问过一个非常相似的问题:

What's the difference between android:permission="packagename.permissions.BROWSER_PROVIDER" and android:grantUriPermissions?

【讨论】:

  • 这里是 manifest 中的相关声明
猜你喜欢
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 2020-06-19
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多