背景

Microsoft 在多个流行的 Android 应用程序中发现了与路径遍历相关的漏洞模式,该漏洞模式可能使恶意应用程序覆盖易受攻击应用程序主目录中的文件。此漏洞模式的影响包括任意代码执行和令牌盗窃,具体取决于应用程序的实现。任意代码执行可以为威胁参与者提供对应用程序行为的完全控制。同时,令牌盗窃可以为威胁行为者提供对用户帐户和敏感数据的访问权限。

“我们在 Google Play 商店中发现了几个易受攻击的应用程序,这些应用程序的安装量超过 40 亿次。我们预计该漏洞模式可以在其他应用程序中找到。我们分享这项研究,以便开发者和发行商可以检查他们的应用是否存在类似问题,酌情修复,并防止将此类漏洞引入新应用或版本。 随着所有平台的威胁不断演变,安全研究人员、安全供应商和更广泛的安全社区之间的行业协作对于提高所有人的安全性至关重要。Microsoft 仍然致力于与安全社区合作,共享漏洞发现和威胁情报,以跨平台保护用户。”

通过这段官方描述,我们可以知道,当前这个漏洞模式官方只验证了几个下载量数十亿次的APP是存在可利用性的。预计通过这个漏洞模式可以在其他APP应用中找到。

微软官方把这种漏洞模式称为Dirty Stream攻击,这是一种常见的通用的漏洞模式。

漏洞模式 (一个特定的,可被识别的软件或系统安全缺陷模型)

漏洞模式描述了在软件或系统安全中常见的、可预测的错误类型。这些模式可能由于设计不当、编码错误或配置失误而存在。识别这些模式有助于开发者和安全专家预测和防御潜在的安全威胁。在上下文中,讨论的是在多个流行的Android应用程序中发现的与路径遍历相关的漏洞模式,这种模式可能允许恶意应用程序滥用权限,从而危及数据安全。

漏洞危害

此漏洞模式的影响包括任意代码执行和令牌盗窃,具体取决于应用程序的实现。任意代码执行可以为攻击者提供对应用程序行为的完全控制。同时,令牌盗窃可以为攻击者提供对用户帐户和敏感数据的访问权限。

漏洞关键描述

描述1:
Android 操作系统通过为每个应用程序分配自己的专用数据和内存空间(/data/data/目录)来强制隔离。为了便于数据和文件共享,Android 提供了一个称为内容提供程序的组件(Content Provider),该组件充当接口,用于以安全的方式管理数据并将其公开给其他已安装的应用程序。如果使用得当,内容提供商可提供可靠的解决方案。但是,不正确的实现可能会引入漏洞,从而绕过应用程序主目录中的读/写限制。

描述2:

官方披露详情里面重点提到:Android share targets,因为他们最容易受到此类攻击

简单来说这个Android share targets是啥,我们使用过安卓手机的都知道,比如我们选中手机某个文件的时候,点击分享,这个时候触发识别到的APP就可以认为Android share targets相关。

简单来说,共享目标是一个 Android 应用,它声明自己处理其他应用发送的数据和文件。可以作为共享目标的常见应用程序类别包括邮件客户端、社交网络应用程序、消息传递应用程序、文件编辑器、浏览器等。在常见情况下,当用户单击文件时,Android 操作系统会触发共享表对话框,要求用户选择文件应发送到的组件:

虽然这种类型的引导式文件共享交互本身可能不会触发针对共享目标的成功攻击,但恶意 Android 应用程序可以创建自定义的明确意图,并在用户不知情或未经用户批准的情况下,使用恶意文件名将文件直接发送到共享目标。从本质上讲,恶意应用程序正在替换其自己的恶意 FileProvider 实现,并提供使用应用程序不当信任的文件名。

上面这段话,简单来讲,说的是一个什么样的具体危害呢?
我们知道,每个APP都有一个沙箱目录(data/data/),不同APP相互之间是隔离的,无法访问,只有APP自己能访问。不少APP会在各自的沙箱目录存储各种各样的用户敏感信息等。

因此,如果恶意APP利用share targets这个操作,传递的数据访问路径是目标APP的/data/data/目标APP报名/userinfo.xml 。 这个时候对于目标APP来说,具备相应的文件访问权限的,但是非目标APP本意想要加载的敏感文件(猜测这里这个操作就是Dirty Stream,控制让APP处理意料之外的敏感数据路径作为输入)。基于开发者的处理不当,没对加载的内容做任何校验和安全的存储,就可能导致用户的敏感信息被窃取等危害。

到此,官方披露以小米文件管理器为案例进行了展示,接下来我们通过另一个稍微简单一点的APP,利用此漏洞模式的思路,来观察一下漏洞的利用过程和危害

漏洞模式案例复现

这是一个手机笔记应用,支持添加附件等操作,案例安装包:

300.apk

安装APP到手机后,我们先随意选中手机中的某个文件触发分享操作。可以看到目标APP存在分享列表当中:

接下来怎么利用Dirty Stream攻击尝试去发现风险呢?通过前面的漏洞模式了解

我们需要通过share target为入口使用攻击者设置的内容作为数据去传递。因此需要构造恶意的输入。

1.  反编译目标APP

查看AndroidManifest文件中,是否配置了包含android.intent.action.SEND或ndroid.intent.action.SEND_MULTIPLE

的意图过滤器(这个意图过滤器的配置取决于APP是否会出现在share target列表中)

2.   接下来就是去分析SEND意图过滤器对应的代码是如何处理接收到的数据的

当接收到带有操作 android.intent.action.SEND 的 Intent 时,将在以下代码中执行方法 handleIntents

作为 EXTRA_STREAM 意图额外提供的 URI(或多个 URI)将传递给立即执行的 AttachmentTask。在 AttachmentTask.doInBackground 中,提供的 URI 被传递到 StorageHelper.createAttachmentFromUri

然后,提供的 URI 被传递到 createExternalStoragePrivateFile,这会将 URI 指向的文件移动到外部存储路径。

由此可见,外部提供的 URI(可能指向 Omni-Notes 内部存储目录)无需经过清理或验证即可将文件复制到外部存储目录,任何应用程序都可以在其中读取该文件具有读取外部存储的权限。

接下来我们看一下具体的显示效果,这个应用可以对笔记设置密码,并将密码存储在沙箱目录(/data/data/it.feio.android.omninotes.foss/)中

我们可以看到,存储在沙箱目录中的用户信息,其他应用是无法直接查看的

/data/data/it.feio.android.omninotes/shared_prefs/it.feio.android.omninotes_preferences.xml

因此,其他恶意``APP``可以接触``share target 实现对

it.feio.android.omninotes_preferences.xml 文件中的敏感内容进行查看。

这里通过``adb 工具来完成利用演示

adb shell am start -n it.feio.android.omninotes /it.feio.android.omninotes.MainActivity -t "text/plain" -a "android.intent.action.SEND" --eu "android.intent.extra.STREAM" "file:///data/data/it.feio.android.omninotes/shared_prefs/it.feio.android.omninotes_preferences.xml"