一个月前,在下一届
Droid Party上,高级开发人员Danila Fetisov详细研究了该服务的原理,该原理负责Android的可访问性功能。 您将学习如何使用它来改善项目的可访问性,以及一个名为clickjacking的危险漏洞。
-我叫Danila Fetisov,我来自Yandex的莫斯科办事处,更确切地说是出租车,更确切地说是出租车计价器。 今天,我们将讨论什么是Android辅助功能,以及为什么我决定将这种对残疾人来说微不足道的小东西称为披着羊皮的狼。

因此,报告的大纲。 首先,我们将了解如何使用,创建和定制该东西。 也许我会告诉你一些生活技巧,杂货店nishtyaks。 然后是最有趣的-关于为什么这件事很危险。

我们怎么可以应用呢? 一般来说,对不认识的人有什么帮助? 系统中发生任何事件,它们都属于我们的服务,我们将对其进行处理。
一旦遇到问题,我们可以从那里获取内容并使用相同的Yandex SpeechKit,Google Text-to-Speech或您喜欢的其他内容进行语音表达。 但是最有趣的是,我们不仅可以接收,而且可以引发系统事件。 你仍然可以说些什么。 他抛出事件,按下按钮,然后一切都很好,享受生活。
如果我们谈论这两点,实际上它们是默认的。 Google启用了此功能,以便残疾人可以使用您的应用程序。 但是众所周知,我们开发人员不想感到无聊:我们坐下来,看一下代码,然后思考:我们如何应用它? 然后我们走。
自动化,通过模拟用户操作进行测试,上下文广告。 您了解:由于我们从屏幕上获取内容,因此我们可以了解如何使该用户感到沮丧。
还有什么有趣的? 处理USSD请求。 不幸的是,普通的API仅在第26个SDK中出现,并且开发人员需要以某种方式生存。 您可以想象,他们正在认真地解析USSD请求,使用AccessibilityService来解析UI。
第六点是省略号。 怎么了 因为在完成此报告后,您将了解如何应用该报告以及该应用什么。 然后从字面上打开您的想象力,喝杯茶,咖啡,然后开车为它们的炫酷功能编写代码。
从哪里开始? 下一张幻灯片会很痛苦。

我们接受一项服务,从AccessibilityService继承并享受生活。
然后,我们将这项服务放在Manifest中,这里有什么有趣的地方? 本质上是常规服务记录。 但是要注意标签字段。 现在我不会告诉你它是什么。 请记住,这将在稍后。


在清单上,我们只有一个配置文件,也没有什么有趣的。

而且配置文件本身看起来更可怕。 根据您的需要,很有可能是传入事件的过滤器设置字段为85–90%。
假设在这里值得接收所有事件。 您只能对点击,更改内容或其他内容设置过滤器。
接下来是应用程序包的过滤器。 这是为了什么 您自己完全理解,从一个系统中的绝对所有应用程序接收事件对于一个应用程序来说太多了。 因此,谷歌决定以某种方式限制它。 添加了一个过滤器。
进一步说明。 有一个标签字段,现在使用描述。 实际上,他们创建了一个对,然后告诉用户为什么需要启用服务。
最后一点:当前打开的窗口中是否需要内容。 如果您只是想了解某个事件已发生,请将其设置为false,不要再次折磨用户。

包含服务。 不幸的是,要启用此功能,相对于您而言,您将不得不折磨用户并强迫他经过七个设置地狱。
首先,我们为他提供特殊的机会。 Cool AccessibilityService-这与清单中的标签完全相同,我在上一张幻灯片中已对您进行了介绍。

再远一点 用户需要选择您的服务,然后他开始阅读说明,为什么要启用该服务并对设备进行一些控制。

确定,包括。 但事实确实如此。 出现了一些可怕的对话,说:“伙计,如果您现在打开它,我们将完全控制您的应用程序,相对而言,一切都会令人恐惧。” 用户并不总是阅读所有这些内容,只需单击“确定”,我们就在他们后面。 所以我们活着。
那么,实际上我们得到的事件处理在哪里? 下一张幻灯片比关于该服务的第一张幻灯片要聪明一些,但是尽管如此。

这是我们的DummyAccessibilityService,然后在其中放置两个方法,在其中编写所有内容。 实际上,中断是一种您必须清除链接,停止订阅或进行其他操作的方法。
最有趣的是AccessibilityEvent类,它属于我们。 我们能从中得到什么?

首先,我们可以了解您的系统中实际发生了什么。 我们采用EventType,我们在这里得到什么?
我们得到的是,那里已经打开了某种活动,或者是对话框,弹出窗口,或者总的来说通知已经下降了。 一切都在window_state_changed上。
我们进一步了解到某些视图的内容已更改。 他们移动了它,在文本视图中画了一些线或类似的东西。
然后我们找出用户单击或选择视图的时间。 在我看来,这些事件类型涵盖的主要产品任务中,有百分之八十五甚至百分之九十八是可能的。
但是,如果您没有足够的文件,请转至文档,我将在报告结尾处显示一个链接,当然,您将下载该报告,然后继续。 这只是整个晚上的读物,有很多清单。 认真地说,您不会一次掌握它。

现在我们有一个问题:如何找到视图? 我们发现发生了什么事。 现在让我们了解发生在哪个视图,哪个组件上。
参加我们的AccessibilityEvent。
我们从他那里得到Source,瞧,我们已经有了视图元信息。
但是,如果您是一名核心开发人员,并且没有足够的关于一个视图的信息,您想了解屏幕上现在基本上发生了什么? SDK有一个限制,但很小。

我们使用AccessibilityService,实际上,我们获得了对当前屏幕上整个层次结构中根元素的引用。 只有这样,我们才能看到我们的元信息。

当然,这很酷,但是现在您脑子里应该有一个问题:好吧,我们有一个指向根元素的链接。 接下来我们要做什么?
如果您想安全行事,那么请选择第一个方法。 查看ID,然后只找到一种方法。
如果您觉得这有点无聊,而狩猎则更有趣,那么我们从视图中选取文本,然后从文本中找到它。
如果这对您来说还不够有趣-好的,伙计们,带着Child and Recursion,继续前进。 然后,您将确切了解正在发生的事情。
太好了 您和我想出了如何查找视图。 现在如何与她互动?
同样,我们使用AccessibilityNodeInfo,现在我们已经将Action放入其中。 我们可以在那里采取什么行动?

首先,我们可以抛出Click。 为什么最后我不仅在“点击”之后放置在这里,还点击“选择并放置”? 是的,因为有很多情况下,通常的Click不能拯救您。 假设用户选择了一个文本,然后单击视图将干净地从该文本中删除选择。 或者,原则上,在某些设备上,除非您在视图上调用“选择”,否则视图不可单击。 总的来说,有很多问题。 如果您只想洗个蒸汽澡,请选择,然后单击。 两个动作,就是这样,有幸福。
我们接下来要做什么? 然后,我们进行了文本安装。 在这里,一切都很简单。 使用Action_set_text,使用我们的行创建一个Bundle,然后进行直播。
第三点是文档。 同样,这是您第二个晚上。 我认为,直接采取的行动比事件还多。
万岁! 该报告最无聊的部分已经结束。 现在是时候进行各种nishtyachkov了。
假设您创建了一个服务,对其进行了配置,并进行了某种事件处理。 现在,您需要了解如何强制用户,如何要求用户仍然启用此服务。 要了解这一点,您需要找出原则上现在是否已开启服务。

一切都简单到平庸。 我们使用AccessibilityManager并要求它提供系统中当前包含的所有服务,然后在这里找到我们的服务。
但是,如果AccessibilityManager是一个正常的人,那么一切当然都会很酷,并且您不会问他:“伙计,请给我所有可用的服务,”他说:“对不起,我今天不在在心情。 这是您的空清单。” 而您却坐着并思考:“该死,我们的谈话正常。”

好吧,有很多老朋友-这些是Settings.Secure.getInt和getString。 首先,我们询问服务是否甚至包含在系统中。 如果包括在内,则所有内容都将放在一行中,并且我们已经在通过某种内容寻找我们的内容。
在这里,我们遇到了一个事实,那就是我们做得正确。 我们创建了配置,创建了所有事件的构造,并打开了服务。 我们可以肯定地看到我们已打开该服务,并且没有事件发生。 因此,它们要么到达,要么不到达。 那一刻,我以为我的生活中出现了某种黑色条纹。 没办法。
我以为,想着,重新设定,重新设定,然后宾果游戏,我意识到这是他们的MIUI的小米。 那只是家伙的痛苦! 太严重了
好,了解问题所在。 现在如何解决? 不幸的是,在MIUI中的某些固件上已完成了所有工作,因此,如果您的应用程序不在自动启动中,则系统原则上甚至不会启动您的服务。

但这是一种解决方案-我们要求用户将您的应用程序添加到自动启动中,我们将继续生活,享受生活。

然后是蛋糕上的樱桃。 为什么这项服务对残疾人如此好,穿羊皮的狼呢?
在我看来,你们中的许多人已经猜到了,如果用户打开此服务,那么我们可以轻松地从他的设备中窃取许多机密信息。 我们不仅可以窃取它,还可以将其放到某个地方,例如,如果使用PIN码锁定屏幕,则可以解锁屏幕。 好吧,解锁屏幕。 接下来是什么? 我们在做广告,我们会赚很多钱,我们会马上生活。 最后,我们基本上可以完全模仿用户的任何操作,例如,放置某种应用程序,授予其管理员权限,然后对用户说:“再见。 与您的设备说再见。”

好的,我们可以做所有的事情,但是现在您会说:“您当然做得很好。 他告诉我们如何窃取什么样的数据。 但是,如果应用程序是左撇子,您如何使用户打开AccessibilityService?” 好的,在我看来,用户似乎只是打开设置,就知道那里写了些废话,然后关闭,卸载应用程序并忘记了。 而且您知道,通过系统设置打开第一种方法是“ no”是正确的,因为您知道这是一种废话。 这里有一个漏洞可以帮助我们,从本质上讲,这称为点击劫持。 你们当中有多少人熟悉点击劫持? 太好了,这将很有趣。
因此,基于此漏洞,一些人(我提供了一个小小的参考,因为以下所有屏幕截图均来自这些人的资源)提出了名为Cloak和Dagger的攻击。 实际上,只有两个权限和最少的用户交互,您就可以直接从“完全”一词访问整个应用程序。
但是好吧,我们需要怎么做才能破解用户?
我们正在将应用程序投放到Google Play。 我们希望Android版本的用户少于8。
您了解一点-目前为95%。 就是这样,用户下载了我们的应用程序。

简而言之,该恶意软件告诉用户如何成为好人,并在最后显示视频。 现在,您将自己看到所有内容。

好的,让我们开始吧。 一点文字。 我们被告知:“如果您现在开始教程,您将成为一个好人。” 好的,我们当然要开始了。

其他一些文字。 此外,人们将以绿色男人的形式出现。 好吧,好的,让我们单击“下一步”。

另一个文字。 好吧,好 现在,我将结束阅读,并且一定会看到一个视频,他们将在该视频上告诉我如何成为一个好人。


我单击“确定”,然后开始播放视频。 这对我们来说并不重要。 当时设备上真正发生的事情很重要。 用户启动该应用程序,并且由于我们是从Google Play安装该应用程序的,因此我们会自动获得覆盖的权限。 瞧,我们打开辅助功能窗口,然后在其上方叠加。 用户单击“开始教程”,但实际上选择了我们的AccessibilityService。 好吧,您了解下一步。

接下来我们单击下一步,选择切换开关。

最后,我们打开AccessibilityService,用户甚至没有意识到这是发生了。
你知道是什么问题吗? 重叠式广告的排列方式是,它们要么完全吸收所有事件,要么所有触摸都已经很远,要么就完全错过了。 这种特殊攻击的重点是我们填充了覆盖层,除了一个空格外,整个屏幕都被覆盖了。 在这种情况下,这是“确定”按钮。 此按钮确实来自对话。 当我们单击它时,我们得到一个事件,表明发生了外部接触,一切都很好。
Google如何应对所有这些问题? 您知道,这是一个相当残酷的漏洞。

这一切都非常有趣地开始了-都保持了八年的沉默。 谷歌揭开了这个小东西的面纱:“伙计们,请使用它。 很安全 我可以肯定地说。” 好吧,好 谷歌扔了。 Cloak和Dagger发明了相同的家伙,他们提供了支持,问题跟踪程序和Bug跟踪程序。
然后Google说:“好的,伙计们,冷静一下。 我将在Oreo中关闭点击劫持。” 好吧,关闭它。 他们仍然坐在那里,他们认为:“好吧,该死,伙计们,都是一样的,如果攻击者强迫用户启用可访问性,那就不好了。 让我们来嘲笑开发人员。
然后他们发送了一封信:“这样做,我不知道怎么办,否则您的应用程序将从Google Play中删除。” 简而言之,这封信如下:“伙计们,告诉我们和用户为什么需要AccessibiiltyService。” 怎么说呢? 以什么格式? 在哪 一般没有了解。 而且,在信中,当然没有指出。
好吧,好 在reddit上有大量线程,要支持的一堆字母。 然后,一些开发人员在reddit上写了一封信,上面写着:“是的,没什么复杂的。 将其放在我给您展示的说明中,以清单形式放在Google Play的说明中,一切都会好起来的,我会让您一个人。”
当时我想:好吧,我在Reddit的一些旁注中找到了这封信。 但是,如果我是一名年轻的开发人员,那么我刚刚熟悉AccessibilityService,并希望与此一起发布应用程序怎么办? 如何确定我需要执行此类操作,是否需要在Google Play的说明中将其删除等? 我以为,以为,搜寻,搜寻,而且,伙计们,我什么也没找到,只是从单词上根本找不到。
好吧,真的,什么都没有。 主要文档中只有一个描述:“伙计,这纯粹是针对残疾人,这就是重点。 您不能再使用它。” 但事实证明,这是可能的。

好吧,你和我都结束了。 我们能和您谈什么? 我们讨论了如何使用它,了解了如何创建所有内容,对其进行配置,并了解了如何处理UI事件。 并且,当然,我们了解了这是可行的,但您无需与AccessibilityService进行交互。 当然,我不建议您这样做,这仅供参考。 以下是承诺的来源:
-developer.android.com/guide/topics/ui/accessibility/services-developer.android.com/reference/android/view/accessibility/AccessibilityEvent-developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo-cloak-and-dagger.org伙计们,非常感谢您的关注!