本文将展示竞争条件如何影响竞争条件? android 运行时的权限系统。
如果你是开发人员,你可能听说过竞争条件。它们通常与几分之一秒内的并发背景操作有关。然而,一些竞争条件也可能出现 ui 并持续无限时间。在本文中,我们将展示如何影响竞争条件 android 运行时的权限系统。
从竞态条件和检查时间到使用时间-这是什么意思?首先,我们需要解释一些基本术语。
如果竞争条件同时发生多个操作,其顺序影响结果,则会出现竞争条件
。一本教科书的例子是两个线程增加相同的变量。这看起来很简单,但我们通常需要使用特殊的线程安全元素来正确实现它。检查时间到使用时间(tocttou 或 toctou,也发音为tock)这是一种特定类型的竞争条件,在执行前进行状态检查,并在检查和执行之间的时间内修改实际执行状态
。通常只在登录时检查用户权限。例如,如果您在登录时是管理员,您可以使用您的权限,直到您被取消,即使您的管理员访问权限同时被取消。 运行时android的权限让我们总结一下 android 运行时权限基础知识。
从 android 6.0(api 级别 从23开始,最危险的权限必须由用户在运行过程中明确授予,而不是在应用程序安装过程中一次性授予。这里最引人注目的元素是 deny 和 allow 按钮的系统对话,如图所示 1 所示。
图1.运行时权限对话框
点击 deny 按下按钮后,我们在那里 onrequestpermissionsresult 回调中收到 permission_denied,我们应该禁止依赖于此权限的功能
。根据官方片段。此外,用户还可以在应用程序设置中使用应用程序权限
授予或拒绝屏幕权限。您可以在图中看到。 2 看到屏幕。图 2. 应用程序权限屏幕
边缘案例无处不在大多数人可能认为在运行过程中拒绝权限是一个超级简单的功能,没有任何元素可以被破坏。嗯,事实并非如此!
对话只有在未经许可的情况下才会发生。所以在显示对话之前,我们有检查时间。以及使用时间
单击“拒绝”按钮。它们之间可以持续一段时间 - 用户可以打开对话,然后按主页或最近的按钮将任务和应用程序移动到后台,然后随时返回。让我们检查一下运行时的权限对话是否容易 tocttou 的攻击。因此,在从对话框返回后,我们可以创建一个超级简单的活动来检查实际授予的权限。除标准外,请注意 onrequestpermissionsresult 除了参数检查,我们还将调用它 context#checkselfpermission() 来获取 current 授予权限的状态。不要忘记将 targetsdkversion 设置为 23 或更高。代码应如下:
class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) requestPermissions(arrayOf(WRITE_EXTERNAL_STORAGE), 1) } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out string>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) val checkResultTextView = findViewById<textview>(R.id.grantResultTextView) val grantResultTextView = findViewById<textview>(R.id.checkResultTextView) val checkPermissionResult = checkSelfPermission(WRITE_EXTERNAL_STORAGE).toPermissionResult() val grantPermissionResult = grantResults.firstOrNull()?.toPermissionResult() checkResultTextView.text = "checkSelfPermission: $checkPermissionResult" grantResultTextView.text = "onRequestPermissionsResult: $grantPermissionResult" } private fun Int.toPermissionResult() = when (this) { PERMISSION_GRANTED -> "granted" PERMISSION_DENIED -> "denied" else -> "unknown" } } </textview></textview></out>
现在我们可以测试了。因此,我们需要配备它 android 6.0 (api 23) 或更高版本的设备或 avd。测试结果如图3所示。
图3.捕获的tocttouu
我们可以看到结果不同。 onrequestpermissionsresult 参数无效。因此,“拒绝”按钮并不否认任何事情!它只是将拒绝的结果返还给应用程序,而不是执行任何权限状态的操作。 包起来
考虑时间对于检查代码中的各种内容非常重要。缓存检查结果可能会导致错误和奇怪的效果。 tocttou 漏洞不依赖于平台或编程语言,因此被归类为 cwe-367。
您可以在 github 查看完整的源代码。
该项目还包括演示该问题的自动化 ui 测试。最初于2017年12月14日发布于www.thedroidsonroids.com。
?以上是Android UI 使用时间竞争条件检查部分时间需要记住边缘情况的详细内容,请更多关注图灵教育的其他相关文章!