Gboard键盘取证分析:揭秘缓存中的用户输入数据

本文深入分析Gboard键盘应用的数据缓存机制,揭示其如何存储用户输入数据,包括已删除应用和消失消息的输入记录,为数字取证调查提供重要数据来源。

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的应用数据(沙盒)文件夹位于:

1
/data/data/com.google.android.inputmethod.latin/databases/

在这里您可能会看到许多以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)中看到一些这种情况。

缓存会定期删除(可能也有大小限制),因此您不应期望在这里找到所有用户输入的数据。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计