0

0

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

PHPz

PHPz

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

|

561人浏览过

|

来源于dev.to

转载

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

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

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

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

Flux AI
Flux AI

Flux AI,释放你的想象力,用文字生成图像

下载

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

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

检查时间到使用时间(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。

?

相关专题

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

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

481

2023.08.10

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

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

270

2023.08.14

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

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

1738

2023.08.22

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

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

2010

2023.09.19

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

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

267

2023.10.18

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

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

343

2024.03.01

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

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

28

2025.12.13

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

68

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

127

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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号