当前位置: 首页 > 图灵资讯 > 技术篇> Android UI 中使用时间竞争条件检查的部分时间需要记住的边缘情况

Android UI 中使用时间竞争条件检查的部分时间需要记住的边缘情况

来源:图灵教育
时间:2024-08-14 11:16:06

本文将展示竞争条件如何影响竞争条件? android 运行时的权限系统。

如果你是开发人员,你可能听说过竞争条件。它们通常与几分之一秒内的并发背景操作有关。然而,一些竞争条件也可能出现 ui 并持续无限时间。在本文中,我们将展示如何影响竞争条件 android 运行时的权限系统。

从竞态条件和检查时间到使用时间-这是什么意思?

首先,我们需要解释一些基本术语。

如果竞争条件同时发生多个操作,其顺序影响结果,则会出现竞争条件

。一本教科书的例子是两个线程增加相同的变量。这看起来很简单,但我们通常需要使用特殊的线程安全元素来正确实现它。

检查时间到使用时间(tocttou 或 toctou,也发音为tock)这是一种特定类型的竞争条件,在执行前进行状态检查,并在检查和执行之间的时间内修改实际执行状态

。通常只在登录时检查用户权限。例如,如果您在登录时是管理员,您可以使用您的权限,直到您被取消,即使您的管理员访问权限同时被取消。 运行时android的权限

让我们总结一下 android 运行时权限基础知识。

从 android 6.0(api 级别 从23开始,最危险的权限必须由用户在运行过程中明确授予,而不是在应用程序安装过程中一次性授予。这里最引人注目的元素是 deny 和 allow 按钮的系统对话,如图所示 1 所示。

Android UI 中使用时间竞争条件检查的部分时间需要记住的边缘情况 图1.运行时权限对话框

点击 deny 按下按钮后,我们在那里 onrequestpermissionsresult 回调中收到 permission_denied,我们应该禁止依赖于此权限的功能

。根据官方片段。

此外,用户还可以在应用程序设置中使用应用程序权限

授予或拒绝屏幕权限。您可以在图中看到。 2 看到屏幕。

Android UI 中使用时间竞争条件检查的部分时间需要记住的边缘情况 图 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 -&gt; "granted"
        PERMISSION_DENIED -&gt; "denied"
        else -&gt; "unknown"
    }
}
</textview></textview></out>

现在我们可以测试了。因此,我们需要配备它 android 6.0 (api 23) 或更高版本的设备或 avd。测试结果如图3所示。

Android UI 中使用时间竞争条件检查的部分时间需要记住的边缘情况 图3.捕获的tocttouu

我们可以看到结果不同。 onrequestpermissionsresult 参数无效。因此,“拒绝”按钮并不否认任何事情!它只是将拒绝的结果返还给应用程序,而不是执行任何权限状态的操作。 包起来

考虑时间对于检查代码中的各种内容非常重要。缓存检查结果可能会导致错误和奇怪的效果。 tocttou 漏洞不依赖于平台或编程语言,因此被归类为 cwe-367。

您可以在 github 查看完整的源代码。

该项目还包括演示该问题的自动化 ui 测试。

最初于2017年12月14日发布于www.thedroidsonroids.com。

?

以上是Android UI 使用时间竞争条件检查部分时间需要记住边缘情况的详细内容,请更多关注图灵教育的其他相关文章!