摘要:当你发现自己误删了一份文件,然后使用恢复软件试图恢复文件,结果却从恢复的文件里发现了大量敏感的屏幕截图,包括你使用加密应用的截图,你的比特币钱包截图,这些图显然不是你截下的,那么究竟是谁做的呢?你可能感到很震惊,难道你被偷偷安装了间谍软件?仔...
以下为详细内容
作者:MICHAEL ALTFIELD
大约六个月前,我在智能手机上发现了一些让我感到恐惧的事情:我在DiskDigger中取消删除了一个文件,我偶然发现了大量意想不到的屏幕截图图片,但问题是这些图片并不是我截图的。包括我使用加密应用的截图、我的新闻Feed截图、在我的开源地图应用程序中显示我的GPS位置的屏幕截图、我的比特币钱包截图等。
我很困惑。我很惊讶。而且,说实话,我很害怕。这怎么发生的?它是LineageOS附带的漏洞吗?它可能是嵌入AOSP的恶意二进制文件吗?或者是在我不知情的情况下通过社交软件安装的那些该死的闭源应用程序中的一些漏洞利用(* cough * whatsapp)。
本周,我很荣幸能够在纽约布鲁克林的Recurse中心(原“黑客学校”)接受为期一周的 mini batch。最后,我决定卷起袖子,深入研究Android安全审计,最终目标是找出负责创建(然后删除)所有这些屏幕截图的内容。好吧,不用谢谢谷歌,我找到了源头。代码库已集成到AOSP中。但是(剧透),这不是一件令人沮丧的事情。虽然这是一个有趣的旅程
内容
我在运行LineageOS 15.1 = 8.1.0 Oreo = API 26的Nexus 5X(bullhead)上遇到了这个问题。这款手机已植根,并且没有安装gapps。
要清楚,我不是Android开发人员 - 虽然我曾经写过一个hello world app。
发现
正如大多数技术娴熟/有意识的读者都知道的那样:当文件被删除时,这些位不会丢失 - 它们只是标记为未使用。 删除文件的数据会一直存在,直到它被新文件的数据覆盖。 或直到执行安全擦除。
对于许多关心隐私的人来说,这可能被视为一件坏事 - 特别是当他们试图出售旧手机时(工厂重置不足以阻止新主人查看你的所有照片!)
但是,如果你像我一样偶然删除了一个珍贵的图像,这也可能是一件好事! 所以,在我意外删除了一张图片(哦拍!)后,我启动了DiskDigger-a app,它可以扫描你的磁盘以查找已删除文件的残余并恢复它们。 但是当DiskDigger正在扫描我的/ data /分区以查找已删除的图像文件时,我偶然发现了比我删除的图片更多的内容。
这是我从DiskDigger恢复的一些图像。
关于上面的图像有一些有趣的事情需要注意。 例如,
- 许多敏感的应用程序都没有幸免,例如加密的消息传递应用程序Wire
- 有些图片看似毫无用处 - 比如我主屏幕的截图(不限于应用)
- 当菜单项是半透明时,也会拍摄主屏幕截图,这对于屏幕捕获事件的时间安排很有意思
- 很多很多文件都是损坏的。 这可能是文件系统将它们标记为未使用并随后被部分覆盖的事实
审核尝试#1,通过SELinux
我在RC工作了一周,以确定这些截图的来源是什么。当我终于在星期一坐下来开始我的调查时,我想我会编写一些审计规则来捕获所有文件写入和文件删除,将selinux抛入许可模式,并花费大量时间搜索日志以查明负责的进程ID用于创建这些截图图像。
我在RHEL系统管理方面有很强的背景。 1998年,NSA与RHEL合作设计SELinux(安全增强型Linux)。 15年后,谷歌将selinux移植到Android 4.3版,Jelly Bean。
如果我试图在RHEL服务器上执行此操作,则选择工具将是auditctl和ausearch。所以,我想:“Android是linux。我只需要安装auditd工具集,我就可以在我的android shell上使用auditctl。“哦,小伙子,我多么无知......
事实是:Google竭尽全力阻止用户和开发人员操纵selinux规则。 Android的兼容性定义文档(CDD)中明确概述了此意图。版本9的第9.7节安全功能内容如下:
Device implementations MUST ensure compliance with security features in both the kernel and platform as described below.
The Android Sandbox includes features that use the Security-Enhanced Linux (SELinux) mandatory access control (MAC) system, seccomp sandboxing, and other security features in the Linux kernel. Device implementations:
…
[C-0-3] MUST NOT make SELinux or any other security features implemented below the Android framework configurable to the user or app developer.
所以,事实上,Android世界中没有auditctl命令。并且,似乎从来没有一个官方工具供用户或开发人员操纵selinux规则集用于安全审计目的。
但Android是一个充满黑客的社区,我不是第一个想要修改selinux规则集的人。事实上,有一个名为`sepolicy-inject`的工具(以及一个更新的fork),它就是为了这个目的而存在的。
虽然Android selinux文档花费了大量时间讨论如何制作selinux策略,但它是令人不满意的抽象。它们不会告诉您最终将策略存储在andorid设备上的哪个文件。并且(由于上面解释的原因),他们当然不会告诉您如何使用新规则修改该文件。
selinux策略被编译成存储在android文件系统根目录“/ sepolicy”中的二进制文件。在没有auditctl的情况下,sepolicy-inject存在将该二进制文件转换回可读/写的策略文件,重新编译它,并将其复制回android设备 - 有效地允许用户更新selinux策略。但是有一个问题:在撰写本文时,sepolicy-inject还没有在2年内更新,为了使用它,你必须下载40-100G的Android源代码,提供一个非常具体的操作系统构建环境,并希望不要花一个星期与头发拉动编译错误。
与其他人不同,我在这方面并不是那么成功,我完全放弃了使用selinux作为工具的尝试,以弄清楚我的手机屏幕截图是什么过程。
审核尝试#2,通过文件和元数据分析
有一些有趣的事实很容易跳出关于DiskDigger恢复的上述截图文件。即:
这些文件是JPG。 但是当我告诉android截取屏幕截图时,它会将图像存储为PNG。
与传统屏幕截图不同,这些图像不包括[a]顶部栏(电池/ wifi / etc图标所在的位置),[b]底栏(后面/家庭/最近的应用程序按钮所在的位置)或[c] 键盘。 在所有情况下,这些都被涂黑了。
我还检查了exif图像元数据中的线索,还有一件事突然出现在我面前:图像有一个名为“Profile Copyright”的属性,其值为“Google Inc. 2016”
1 2 3 | michael@amy: /tmp $ exiftool 8064090112.jpg ... Profile Copyright: Google Inc. 2016 |
另一条线索是删除这些图像之前存储这些图像的目录。 不幸的是,DiskDigger不提供此信息,并且它在任何元数据中都不可用。 所以,我只是在整个设备上搜索所有jpg图像。 排除摄像机DCIM目录中的文件,这里没有太多的目录。 突出的是位于名为/ data / system_ce / 0 / snapshots /的目录中文件列表的末尾。
这些信息至关重要。
1 2 3 4 5 6 | bullhead:/ $ find / -name *.jpg 1> /sdcard/findJpgs .txt bullhead:/ # tail /sdcard/findJpgs.txt ... /data/system_ce/0/snapshots/3419_reduced .jpg /data/system_ce/0/snapshots/3419 .jpg bullhead:/ # |
我将/ data / system_ce / 0 / snapshots /目录的内容复制到了/ sdcard /,通过adb将其复制到了我的笔记本电脑,并且-lo&behold-它是一堆屏幕截图。 这些图像与上述所有观察结果相符:格式为JPG,顶部和底部条形图为黑色,exif版权归Google所有,2016年。
根本原因
谷歌搜索/ data / system_ce / 0 / snapshots /目录会产生一些与我一样经历同样问题的人的结果,根本原因很明显:它是由android为“最近的应用程序”导航拍摄的持久图像。
在iOS中,还有一个“应用程序切换器”,用于缓存应用程序的图像,以便在应用程序之间快速切换。 实际上,这是我发现的“屏幕截图”图像 - 他们将最近的任务列表“快照”图像存储到磁盘,不需要顶部/底部栏,版权谷歌,不再需要时删除。
还值得注意的是,目录/ data / system_ce /是所谓的“Credential Encrypted”目录,其加密密钥包括用户专用密码。 大多数应用程序肯定无法访问这些文件,但我授予root访问权限的应用程序除外。
最后
在硬件/供应链问题之间,零日漏洞不负责任地持有网络战武库而不是负责任的披露,以及不断尝试后门关键安全软件,很容易产生偏执狂。 也就是说,记住并非一切都像看起来一样,总是好的,有时看似粗略的行为实际上是精心设计和良性的。
此外,虽然我知道Google不应该让用户非常容易修改他们的'/ sepolicy'文件,但我认为AOSP应该包含一个默认的默认工具,以便用户能够操纵他们的selinux政策 出于安全审计的目的。
而且,对于那里的Android开发者:如果您的应用程序以任何方式拥有敏感数据,请考虑设置FLAG_SECURE,这会阻止Android拍摄应用程序的快照。
本文来源于tech.michaelaltfield.net
由极限翻译