0

0

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

PHPz

PHPz

发布时间:2024-08-09 22:18:59

|

561人浏览过

|

来源于dev.to

转载

在本文中,我们将展示竞争条件如何影响 android 运行时权限系统。

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

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

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

Mintlify
Mintlify

帮助开发者创建和维护文档

下载

竞争条件如果同时发生多个操作并且它们的顺序影响结果,就会出现竞争条件

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

检查时间到使用时间(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, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        val checkResultTextView = findViewById(R.id.grantResultTextView)
        val grantResultTextView = findViewById(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"
    }
}

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

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

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

包起来

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


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

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

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

?

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

24

2026.01.21

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

276

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

1743

2023.08.22

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2017

2023.09.19

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

270

2023.10.18

Android语音播放功能实现方法
Android语音播放功能实现方法

实现方法有使用MediaPlayer实现、使用SoundPool实现两种。可以根据具体的需求选择适合的方法进行实现。想了解更多语音播放的相关内容,可以阅读本专题下面的文章。

346

2024.03.01

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

31

2025.12.13

html编辑相关教程合集
html编辑相关教程合集

本专题整合了html编辑相关教程合集,阅读专题下面的文章了解更多详细内容。

16

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.8万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号