Gboard键盘缓存数据取证分析
Gboard是Google开发的键盘应用,在Pixel设备上是默认键盘,据Play商店统计安装量已超过10亿次。虽然大多数非Google品牌设备不预装此应用,但由于其对数十种亚洲和印度语言的良好支持和便捷使用,它在外语用户中非常流行。
作为键盘应用,Gboard会监控和分析用户的击键行为,提供拼写和语法建议、句子补全甚至表情符号建议。但更有趣的是,从2020年1月的版本(v8.3.x)开始,Gboard在其缓存中保留了大量数据(即用户击键记录!)。从数字取证和事件响应(DFIR)的角度来看,这简直是金矿。
对于取证调查员来说,这些数据可能显示用户在使用已删除应用时输入的数据,或显示已删除的消息,或来自启用消失消息功能的应用的消息!还包括在网页/在线应用字段中输入的数据(这些数据通常不会在本地存储)。对于某些不跟踪特定项目创建/修改时间的应用,这些数据可能很有用。
注意:我们未专门测试Signal应用的数据是否被保留,但基于现有发现,这些消息很可能也会出现在这里。所有测试均在运行最新Android 11的Pixel 3设备上进行,使用默认键盘和默认设置。这也在其他早期镜像上得到了验证。
我们还使用了Josh Hickman的Android 10 Pixel 3镜像,Josh能够验证Telegram和WhatsApp发送的消息确实出现在这里。研究的Gboard数据库具体版本包括:
- 8.3.6.250752527(在Android 10上)
- 8.8.10.277552084(在Android 10上)
- 10.0.02.338070508(在Android 11上)
数据位置
Gboard的应用数据(沙盒)文件夹位于:
|
|
在这里您可能会看到许多以trainingcache*开头的数据库文件。这些就是包含缓存的文件。
图1 - Gboard数据库文件夹内容(v10.0.02.338070508)
在不同版本的应用中,数据库格式和名称有所变化。其中,有用的数据可以在trainingcache2.db、trainingcache3.db和trainingcachev2.db中找到。现在让我们来检查其中一些数据库。
trainingcache2.db(v10.0.02.338070508)
training_input_events_table表包含有关焦点应用的信息、其字段名称(输入发送的位置)、事件时间戳以及存储在_payload字段中的protobuf BLOB,如下面的截图所示。
图2 - training_input_events_table(未显示所有列)
上面突出显示的条目来自一个已被删除的应用。_payload BLOB在下面的截图中被解码,突出显示了用户在电子邮件输入字段中输入的文本。该protobuf还包含表中其他列的所有数据。
图3 - 从_payload列解码的Protobuf
然而在大多数情况下,protobuf看起来像这样 - 见下面的截图,需要将输入重新组合在一起。在这里您可以看到用户输入的单词以及应用提供的建议。建议可能涉及拼写、语法、联系人姓名或其他内容。
图4 - 解码的protobuf - 重建用户输入
上面,您可以看到输入的单词和提供的建议。在Android设备上,输入时建议会如下所示显示。
图5 - Android键盘突出显示建议单词
trainingcache3.db(v10.0.02.338070508)
在8.x版本中,此相同数据库名为trainingcache2.db,并遵循完全相同的格式。s_table表看起来类似于之前看到的training_input_events_table。但是,_payload字段在这里不存储击键数据。
图6 - s_table
图7 - 从s_table解码的_payload protobuf
击键数据存储在tf_table表中。这里,大多数条目是单个按键,要读取这些数据,需要再次将它们重新组合在一起,如下所示。
图8 - tf_table条目
来自同一会话的所有击键具有相同的f1值(类似时间戳的字段但不作为时间戳使用)。按键的顺序存储在f4中。假设它们都是按顺序排列的,我们可以运行一个简短的查询来连接f3列的值以便阅读(如下所示)。这并不完美,因为group_concat()不保证连接顺序,但目前似乎有效!
图9 - 从tf_table读取击键会话
我们可以将此数据与s_table的数据结合(连接),以重新创建与之前从training_input_events_table获得的相同数据。
图10 - 连接的表
在上面显示的截图中,您甚至可以看到输入到Google文档中的数据,这些数据并未在本地保存。上面只显示了一个片段,但如果您想查看完整的解析数据,可以获取Josh的Android镜像和最新版本的ALEAPP(代码),它现在可以解析这些数据。下面是预览(来自我的学生可能认出的不同镜像)。
图11 - 显示trainingcache解析输出的ALEAPP输出
缓存的击键数据也可以从trainingcachev2.db中看到和重建,其格式略有不同(此处不讨论)。在trainingcache4或其他数据库中没有发现重要数据。
观察结果
正如预期的那样,密码字段的击键不会被存储或跟踪。在从tf_table重建的数据中,您可以看到用户输入时犯的所有拼写错误!在单词/句子中间进行的任何更正将在最后看到(因为我们按按键顺序获取原始击键)。因此可能难以阅读某些输入。此外,如果用户在字段中输入某些内容,然后删除一个或多个单词并重新输入,您将看不到最终编辑(干净)的版本,因为退格(删除)未被跟踪。您可以在上面的输出(图9)中看到一些这种情况。
缓存会定期删除(可能也有大小限制),因此您不应期望在这里找到所有用户输入的数据。