安卓取证教程-全-

安卓取证教程(全)

原文:zh.annas-archive.org/md5/CEAE4A4C2A963DFCD507E6E1C793EDA6

译者:飞龙

协议:CC BY-NC-SA 4.0

第一章

安卓和移动取证

本章信息

• 安卓平台

• Linux、开源软件和取证

• 安卓开源项目

• 国际化

• 安卓市场

• 安卓取证

引言

数字取证是一个激动人心、发展迅速的领域,可以在各种情况下产生强烈影响,包括内部企业调查、民事诉讼、刑事调查、情报收集以及涉及国家安全的事务。移动取证无疑是发展最快、变化最大的数字取证学科,提供了大量的机会以及挑战。虽然安卓取证有趣的部分涉及从设备获取和分析数据,但重要的是要广泛了解平台和调查中将要使用的工具。深入的了解将帮助取证检查员或安全工程师成功调查和分析安卓设备。

小贴士

书籍更正、更新和软件

本书的所有更正、更新以及软件样本都将在线维护,具体页面如下:

viaforensics.com/education/android-forensics-mobile-security-book/

请定期访问该网站,随着时间的推移,它会不断演进,为读者提供重要且日益增加的价值。除了更正和更新之外,书中提到的部分软件将可供下载。

安卓平台

安卓是一个基于 Linux 2.6 内核的开源移动设备平台,由开放手持设备联盟管理,该联盟由运营商、移动设备和组件制造商以及软件供应商组成。

安卓在智能手机市场产生了重大影响,因此在取证领域也产生了影响。第一款安卓设备推出两年一个月后(2008 年 10 月),安卓成为第二大智能手机平台,占据了 6150 万美国智能手机订阅用户的 26.0%(comScore 报告,未标明日期)。表 1.1 显示了根据 comScore 公司 2010 年 11 月的顶级智能手机平台。

表 1.1 2010 年 11 月美国智能手机订阅用户总数(13 岁以上)

平台 智能手机订阅用户的份额(%)
RIM 33.5%
谷歌 26.0%
苹果 25.0%
微软 9.0%
棕榈 3.9%

但安卓的影响力远远超出了美国市场。根据 Gartner 公司的数据,2010 年第三季度,安卓操作系统(OS)是第二大受欢迎的操作系统,占全球智能手机销量的 25.5%(Gartner 表示,未标明日期),如表 1.2 所示。

表 1.2 2009-2010 年第三季度全球按操作系统划分的终端用户智能手机销售量(以千为单位)

图像

根据谷歌投资者网站,谷歌 CEO 埃里克·施密特报告称,截至 2011 年 2 月,每天有超过 35 万台安卓设备被激活(谷歌投资者,未标明日期)。这些统计数据关注的是智能手机市场,而智能手机市场只是市场上众多安卓设备类型中的一种。

安卓的开源性质不仅为行业确立了新的方向,而且使开发者、懂代码的法医分析师,以及(不幸的是)高级犯罪分子能够在最基础的层面上理解设备。随着核心平台的快速成熟并继续免费提供,运营商和硬件供应商都可以将精力集中在旨在保留客户的定制化工作上。

安卓的历史

三十多年来,公司投入了大量资源研发手持计算设备,希望它们能开辟新市场。与传统计算机一样,构建这些设备的核心硬件组件已经取得了显著进步,现在提供了一个虽小但强大的移动平台,用于手持计算机。

安卓开发的核心人物是安迪·鲁宾,他的前雇主包括机器人公司、苹果、WebTV 和 Danger Inc.。他的前公司 Danger Inc.开发了一款智能手机及其支持操作系统,最为人熟知的是 T-Mobile Sidekick。这个移动操作系统 DangerOS 是用 Java 构建的。它提供了一个软件开发工具包,并具有当前智能手机的一些功能。2004 年,鲁宾离开 Danger 公司,开始着手几个新想法。他再次回到智能手机开发领域,并与前公司的几位工程师合作。鲁宾于 2003 年成立的公司名为 Android, Inc.

在团队开始开发时,鲁宾积极向潜在投资者和无线运营商推广安卓系统。他接触的公司之一就是谷歌,随后谷歌在 2005 年 7 月收购了安卓。这次收购,结合涉及移动的新专利和服务,以及大额的无线频谱竞标,引发了人们猜测谷歌正在开发自己的智能手机,甚至可能目标是成为全面的无线运营商。

然而,在 2007 年 11 月 5 日,安迪·鲁宾在谷歌官方博客上宣布了一个更为雄心勃勃的计划(官方谷歌博客,未标明日期):

Android 是第一个真正开放且全面的移动设备平台。它包括操作系统、用户界面和应用程序——所有运行移动电话所需的软件,但没有阻碍移动创新的专有障碍。我们与开放手机联盟合作开发了 Android,该联盟由包括摩托罗拉、高通、HTC 和 T-Mobile 在内的 30 多家技术和移动领导者组成。通过与运营商、设备制造商、开发人员和其他方面的深入合作,我们希望创建一个标准的、开放的移动软件平台,为移动世界启用一个开放生态系统。我们认为,最终结果将是一个更好、更快的创新步伐,为移动客户带来前所未有的应用程序和能力。

一周后,谷歌向开发者发布了一个早期的 Android 软件开发工具包(SDK)预览。这使得谷歌能够从 2008 年 1 月至 2008 年 4 月举办第一届 Android 开发者挑战赛。谷歌预留了 100 万美元奖励最具创新性的 Android 应用。前 50 个应用可以在code.google.com/android/adc/adc_gallery/进行查看。

2008 年 8 月,谷歌宣布推出 Android 市场,开发者可以在那里上传他们的应用,供移动设备所有者浏览和安装。最初的版本不支持付费应用。然而,在 2009 年初增加了这个功能。最后,2008 年 10 月标志着 Android 开源项目(AOSP)的正式发布(Bort, n.d.)以及首款公开可用的 Android 智能手机,T-Mobile G1 的发布。

自成立以来,Android 生态系统已经显著增长,并包含了多样化的贡献者群体。表 1.3 总结了 Android 平台的重要里程碑。

表 1.3 Android 里程碑

日期 事件
2005 年 7 月 1 日 谷歌收购了 Android 公司
2007 年 11 月 12 日 Android 发布
2008 年 8 月 28 日 宣布了 Android 市场
2008 年 9 月 23 日 发布了 Android 1.0 平台
2008 年 10 月 21 日 Android 作为开源软件发布
2009 年 2 月 13 日 Android 市场:美国接受付费应用
2009 年 3 月 12 日 Android 市场:英国接受付费应用
2009 年 4 月 15 日 发布了 Android 1.5(纸杯蛋糕)平台
2009 年 9 月 16 日 发布了 Android 1.6(甜甜圈)平台
2009 年 10 月 5 日 发布了 Android 2.0/2.1(闪电泡芙)平台
2010 年 5 月 20 日 发布了 Android 2.2(冻酸奶)平台
2010 年 5 月 23 日 发布了适用于 Nexus One 手机的 Android 2.2
2010 年 12 月 6 日 发布了 Android 2.3(姜饼)平台
2011 年 2 月 2 日 发布了 Android 3.0(蜂巢)预览版

开放手机联盟

开放手机联盟(OHA)是由移动技术公司组成的合作组织,包括无线运营商、手机和组件制造商、软件开发者以及其他支持和集成公司。该联盟成立于 2007 年 11 月 5 日,最初有 34 个成员。然而,到了 2011 年 1 月,成员数量已接近 80 个。

OHA 承诺“加快移动领域的创新,并为消费者提供更丰富、更便宜、更好的移动体验”([联盟常见问题解答,不详])的主要焦点是协调、开发和发布 Android 设备。谷歌是 OHA 和 AOSP 背后的推动力。有些人抱怨说,这个联盟只是一种营销手段,对成员或消费者几乎没有价值。然而,在 2010 年,新成员不断加入,OHA 无疑将在未来继续发展。截至 2011 年 2 月 3 日,表 1.4 中列出的成员按移动运营商、手机制造商、半导体公司、软件公司和商业化公司分类([联盟成员,不详])。

表 1.4 开放手机联盟成员

图像

图像

Android 功能特性

尽管我们在下一章中会更深入地探讨各种 Android 设备类型,但这里我们可以讨论大多数 Android 设备共有的几个特性。

首先,Android 从一开始就被设计为可以在线使用,无论是通过全球移动通信系统/码分多址(GSM/CDMA)这样的蜂窝网络,还是无线网络(Wi-Fi)。无论在何种场合,能够保持在线是任何 Android 设备的核心功能。实际上,许多设备都是智能手机,因此支持发送和接收电话、短信以及蜂窝网络上其他的服务。与设备的交互通常是通过触摸屏完成的,但许多设备也允许使用键盘或其他按钮,以便支持用户交互。

Android 设备的第二个核心功能是能够从 Android Market 下载并安装应用程序(app)。这对于许多用户来说是一个主要功能,因为它允许他们扩展设备的功能性。这些应用程序通常也是法医分析师丰富的信息来源。

最后一个核心功能是用户能够在设备上存储他们的数据。这当然是本书详细介绍的取证工作的基础。大多数 Android 设备都配备了一些使用闪存(NAND)内存的设备内存储,以及一个可移动的外部 SD 卡,用于存储更大的数据量。一些近期推出的 HTC 设备现在配备了模拟 SD 卡,这是一个单独的 USB 设备 ID,映射到 NAND,并呈现为 SD 卡。模拟 SD 卡通常使用微软的 FAT32 文件系统格式化。

支持的蜂窝网络

由于智能手机是安卓设备中最大的类别,因此了解安卓目前支持的多种蜂窝技术至关重要。

第一款安卓设备,HTC DREA100 或 T-Mobile G1,是一款全球移动通信系统(Global System for Mobile Communications,简称 GSM)的手机。GSM 是使用最广泛、支持最全面的蜂窝系统,在全球范围内都有很好的支持。在美国支持 GSM 的主要无线提供商包括 AT&T 和 T-Mobile。GSM 系统利用订阅者身份模块(SIM)或通用订阅者身份模块(USIM)来向蜂窝网络识别用户。

安卓支持的下一个蜂窝系统是码分多址(Code Division Multiple Access,简称 CDMA)。CDMA 是用于编码和发送 CDMA 手机使用的语音、数据和控制信号的技术。它在美国很受欢迎,但在世界范围内就不那么受欢迎了。在美国,主要使用的技术标准称为 CDMA2000。主要运营商包括 Verizon Wireless、Sprint、U.S. Cellular 和 Cricket Communications。

安卓支持的最后一个蜂窝系统是集成数字增强网络(Integrated Digital Enhanced Network,简称 iDEN),其主要的吸引力在于支持流行的对讲(push-to-talk,简称 PTT)功能。在美国,唯一支持 iDEN 的大型运营商是 Sprint Nextel(他们也拥有 Boost Mobile)。iDEN 的开发者摩托罗拉还开发了首款支持 iDEN 的安卓手机,摩托罗拉 i1。

谷歌的策略

安卓显然是一个强大的移动设备平台,其开发成本非常高昂。那么为什么谷歌要免费提供安卓呢?

这个问题的答案始于谷歌明确规定的使命 (企业信息:关于,n.d.):

谷歌的使命是组织世界的信息,使其普遍可访问并有用。

手机是最受欢迎的消费品,数量超过 40 亿部。因此,通过免费提供先进的移动技术栈,谷歌认为他们正在实现使命中普遍可访问的部分。但是,显然谷歌还是必须从中获得一些好处。当更多的人上网,更多的人使用搜索,这最终会推动广告收入——这是谷歌主要的收入来源。在 2009 年 3 月的采访中,安迪·鲁宾解释说:

谷歌围绕广告有着很好的商业模式,开源与广告商业模式之间有着自然的联系。开源基本上是一种分销策略,它完全消除了采用的入门障碍。

(Krazit, n.d.)

对 Android 的一项批评是,现在市场非常分散,有不同版本和变种的 Android,这是谷歌向制造商发布 Android 的直接结果。这与其他设备,如 iPhone 形成对比,苹果对硬件和操作系统拥有完全控制权,并对第三方应用程序产生重大影响。然而,鲁宾为这一模式辩护。在同一个采访中,鲁宾进一步评论了这一方面(Krazit, n.d.):

控制整个设备固然很好,(但是)我们要谈论的是 40 亿部手机。当你控制整个设备时,来自单一供应商的快速创新能力是相当有限的。你可以有创新的高峰。你可以在企业市场、某些界面技术或者手机上网业务方面取得成功,但你不能面面俱到。你总是会处于某个细分市场。我们所说的是走出一个细分市场,让人们以他们期望的方式访问互联网。我不想创造互联网的某种衍生物,我不想仅仅拿走互联网的一小部分,我不想在某个角落里用简化版的互联网,我想在真正的互联网上。

因此,通过创建一个既满足消费者需求又满足制造商和无线运营商需求的移动操作系统,谷歌为其盈利的搜索和广告业务提供了一个优秀的分发平台。

应用程序

Android 超越核心移动技术堆栈支持创新的一个重要方式,是允许第三方应用在 Android 上的开发和分发。截至 2011 年 1 月,已有超过 20 万个 Android 应用被开发出来。这当然与苹果的策略相似。然而,它们的做法有一些关键的区别。苹果对其应用商店保持着严格的控制,要求开发者提交到一个有时颇为漫长的审查过程,并由苹果最终批准应用。应用可能会因为多种标准而被拒绝,尤其是如果它们包含任何苹果认为令人反感的内容。另一方面,谷歌在 Android Market 发布应用时几乎不需要审查。尽管谷歌有能力禁止开发者、从 Android Market 移除应用,甚至远程从 Android 设备卸载应用,但总的来说,他们对应用管理的做法是不过多干预的。

Nexus 手机

2010 年 1 月,谷歌发布了自家智能手机,即图 1.1 所示的 Nexus One (N1)。N1 由 HTC 开发,在所有方面,它都是制造商应该如何开发手机的一个理想模型。处理器非常快(1 GHz),运行最新版本的 Android,并且有创新之处,如三个麦克风,用于监测背景噪音并将你的声音融合,以创造尽可能清晰的对话。

图像

图 1.1 由 HTC 制造的谷歌 Nexus One。

N1 由谷歌直接销售,且为解锁状态——许多分析师认为这是对运营商锁定模式的直接挑战,在这种模式下,客户必须签署为期两年的协议才能在设备上获得折扣。N1 也可以通过 T-Mobile 以较低价格获得,前提是用户签署长期合同。最终,N1 的销售并不令人印象深刻,有猜测认为谷歌在实施上失败了(图 1.1)。

然而,当时谷歌也在尝试展示他们认为安卓手机应该如何发布和维护。令许多人惊讶的是,一年后谷歌发布了由三星制造的 Nexus S,如图 1.2 所示。Nexus S 一个有趣的功能是它运行的是 Android 2.3 系统,允许使用 VoIP(语音通话)的本地功能。如果设备有数据连接,无论是Wi-Fi.com还是其他网络,那么它可以使用众多流行的 VoIP 服务来发送和接收电话。在美国,这部手机只在 Best Buy 商店销售,并通过 T-Mobile 提供服务(图 1.2)。

图像

图 1.2 由三星制造的谷歌 Nexus S。

目前尚不清楚谷歌推出 Nexus 系列智能手机的总体目标是什么。然而,很明显他们打算发布谷歌品牌的手机,并最终可能会为消费者提供购买和使用智能手机的新灵活性。

Linux、开源软件和取证

开源软件对数字取证领域产生了巨大影响。作为免费开源软件发布的取证工具比闭源解决方案具有巨大优势,包括以下方面:

• 审查源代码并了解确切步骤的能力

• 改进软件并将增强功能与整个社区共享的能力

• 价格

尽管许多免费的开源软件包不提供商业支持模式,但一些公司专门提供支持服务。例如,红帽公司建立了提供 Linux 操作系统支持和服务的重要业务。此外,许多免费开源软件包的维护者通常非常易于接触并对询问作出响应,并且由于他们直接维护软件,通常可以提供更优质的支持。

最重要和典型的免费开源软件就是 Linux 操作系统。Linux 不仅是 Android 的关键组成部分,还可以用作强大的取证工具。

Linux 简史

关于 Linux 的书籍已经有很多,而只将一个部分献给如此重要的操作系统是困难的。网上也有很多关于 Linux 的优秀资源,其中一些专注于将 Linux 作为取证工具。

1991 年,Linus Torvalds 是赫尔辛基大学的学生,他决定开发一个终端模拟器,以便连接到大学的系统。代码是为他的计算机特定开发的,该计算机配备了 Intel 386 处理器。完成初步开发后,他意识到这段代码实际上可以构成一个操作系统的基础,并在 Usenet newsgroup comp.os.minix 上发布了以下著名的消息(Torvalds, 1991):

image

阅读这篇文章,许多热衷于 Linux 用户的思维方式体现在了想要理解、修改、创建和 otherwise 钻研复杂系统(通常被称为黑客心态)的愿望中。Linus 发布消息的 newsgroup 是为 Minix OS,当时许多想要测试和开发类似 Unix 的 OS 的人选择的操作系统。然而,Minix 的许可限制以及技术局限性是 Linus 想要克服的。

在近 20 年的时间里,Linux 已经显著成熟,并用于许多个人电脑、服务器,现在也用于移动设备。有数千个强大的工具以及许多编程语言的完整开发环境可供使用。有许多针对不同需求(包括服务器、工作站、笔记本电脑、嵌入式设备、安全套件等)的发行版。

在 VirtualBox 中安装 Linux

Linux 是一个真正令人惊叹的操作系统,我们将在本书中以实例的形式利用它的力量,让读者跟随并完成。本书中的所有示例都是在运行虚拟机(VM)的 Ubuntu 10.10 64 位桌面安装上执行的。尽管来自多个供应商的虚拟机软件是兼容的(包括在 Mac OS X 上运行的 VMWare Fusion),但本书关注的是免费、开源或两者兼备的选项。在这种情况下,VirtualBox 既是开源软件,也是免费提供的。

注意

本书将广泛使用这个 Ubuntu VM 进行所有示例。后续章节将在此基础上增加更多工具和脚本。我们鼓励读者创建这个 Ubuntu VM,跟随所有示例以最大化知识吸收。Ubuntu VM 可以直接用于 Android 取证案例。

VirtualBox 现在归 Oracle 所有,并根据 GPLv2 许可进行分发。Oracle 的网站上有一个部分,专门解答关于许可的常见问题。

您可以从www.virtualbox.org/为许多操作系统下载 VirtualBox,包括 Microsoft Windows、Mac OS X 和 Linux(2.4 和 2.6)。安装 VirtualBox 后,您将看到 Oracle VM VirtualBox Manager,如图 1.3 所示,在这里您可以创建和管理新的虚拟机。

image

图 1.3 Oracle VM VirtualBox Manager for OS X。

当你创建新的虚拟机时,请确保你有足够的硬盘空间(至少推荐 20 GB)和尽可能多的可用 RAM。对于 Android 构建,谷歌建议至少有 1536 MB(1.5 GB)的 RAM(获取 Android 源代码,未确定日期)。

使用 VirtualBox 管理器的图形用户界面(GUI)设置新的虚拟机非常直接。但是,如果你可以访问 Ubuntu Linux 64 位工作站或服务器,但没有能力运行桌面应用程序,以下是你设置、配置和运行新虚拟机(VirtualBox 3.2.10)的步骤。

从 ssh 会话中,最好使用“screen”程序,这样如果你与服务器失去连接,你的虚拟机仍然保持活动状态。然后,按照以下步骤操作:

image

image

在这一点上,虚拟机将启动,你可以使用任何远程桌面协议(RDP)查看器访问安装,例如 Windows 上的远程桌面连接,Linux 上的 rdesktop,或者 Mac 上的 Microsoft 远程桌面连接客户端。要访问上述会话,你可以连接到<主机服务器的 IP:3392>。从那里,按照安装指导操作,直到需要重启。

如果您关闭或重新启动 VBoxHeadless 会话,会话将结束;你可以再次运行命令来启动服务器备份。然后,通过 RDP 重新进入机器并安装 openssh 服务器,这样我们可以使用效率更高的 ssh 而不是 RDP:

image

您可以通过运行 ifconfig 并查看 eth0 的“inet addr”来找到虚拟机的 IP 地址。你可以使用你喜欢的 ssh 程序(如果在 Windows 上,可以尝试出色的免费客户端 Putty)并通过 ssh 进入虚拟机。

The Sleuth Kit(TSK)

布莱恩·卡里尔有一个优秀的开源取证工具包,名为 The Sleuth Kit(TSK),本节将讨论这个工具。本书中的示例将广泛使用 TSK。布莱恩开发并继续维护 TSK,为我们的行业提供了巨大的服务。如果你不熟悉 TSK,请访问sleuthkit.org/的网站,并考虑使用这些程序。TSK 的网站上有很多信息,以及许多取证博客和书籍。如果你打算按照本书中的示例操作,你应该在 Linux 工作站上安装 TSK,命令如下:

image

希望其他人能跟随布莱恩的脚步,为取证社区提供如此重要的工具包和服务。

禁用自动挂载

关键是取证工作站不能启用自动挂载,正如其名称所暗示的,当在连接的设备上发现文件系统时,它会自动挂载。在 Ubuntu 中禁用自动挂载的选项是按用户进行的,因此如果工作站将拥有多个用户账户,请确保你更改每个账户:

image

然后导航到 apps > nautilus > preferences,并确保“media_automount”和“media_automount_open”选项未勾选,如图 图 1.4 所示。

图像

图 1.4 在 Ubuntu 上禁用自动挂载。

然后,你可以关闭 Gnome 配置编辑器。现在,自动挂载已禁用。对于普通用户来说,这需要更多的工作。然而,对于取证分析师来说,这是绝对必要的(使用硬件写保护器也是必要的)。

Linux 和取证—基本命令

在我们设置和配置 Linux 取证工作站之前,提供 Linux 与取证相关性的概述很有帮助。由于对许多文件系统的广泛支持、可用的先进工具以及开发和编译源代码的能力,Linux 工作站是取证调查的强大工具。然而,由于许多检查员不熟悉 Linux,以下部分提供了某些更常见 Linux 命令的分解,包括命令的描述、一般用法以及一个或多个如何应用该命令的示例。

man

“man”命令可以在终端窗口中拉起所请求命令的在线手册。手册将提供命令的详细描述以及其用法(包括该命令的所有选项或“标志”)。

图像

在以下示例中,第一个命令列出了“mount”命令手册页的开头,而第二个命令搜索包含“grep”字符的所有手册,这是一个强大的搜索工具。

图像

help

“help”命令会显示有关请求命令的信息,包括用法和示例,类似于“man”。一些命令使用--help 表示法,而其他命令则简单地使用-h 或-help。

图像

cd

此命令用于切换到另一个目录。在 Linux 中,特殊字符~用来表示当前用户的家目录。例如,用户 ahoog 在 Linux 系统上的家目录位于/home/ahoog。在文件系统的任何位置,你都可以使用来引用/home/ahoog。这对于文档编写来说很方便,因此在本书中我们都会提到,即使你设置了不同的用户名,命令仍然可以按预期工作。

图像

mkdir

“mkdir”命令在当前位置创建一个目录,除非另有指定。

图像

rmdir/rm

这个命令根据指定的标志删除现有目录或文件。"rmdir" 命令只删除空文件夹。如果目录中有文件,这些文件需要先被删除,然后才能运行“rmdir”命令。"rm" 命令可用于删除文件和文件夹,并在删除前提示用户。你可以使用 -f 选项覆盖提示,但需谨慎使用,因此有“rm minus rf”或 rm -rf 的说法。

image

nano

“nano”是一个基于终端的编辑器,允许创建和修改文本文件。要创建文件,只需输入命令。

image

输入“nano”将会在终端窗口或 ssh 会话中打开文本编辑器,允许用户输入他们希望的内容,如图 1.5 所示。

image

图 1.5 使用“nano”创建文件。

输入文本后,按下 Control X 将退出文本编辑器并提示你保存文件。在这种情况下,我们将文件名设置为 newfile.txt。

要修改现有文件,只需在 nano 命令后跟文件名或完整路径和文件名(如果文件在不同的目录中):

image

ls

这个命令列出文件和文件夹。"ls" 命令在没有指定任何选项的情况下,将只列出当前目录中的文件/文件夹名称。添加“-lh”选项将提供更详细的列表,包括权限、所有权、大小以及日期和时间戳。

image

tree

“tree”命令显示指定目录的文件夹层次结构。如果没有指定参数,将使用当前目录。在 Linux 中,当前目录被称为单个“.”,而上一层目录是双点“..”。在以下输出中,使用了当前目录,恰好是当前用户的主目录。用户可以使用“-L”标志指定他们希望查看的目录级别。在第一个示例中,显示了一个级别。而在第二个示例中,显示了源目录和文件的两个级别。别忘了:你可以通过查看手册页(man tree)或指定命令的帮助参数(tree --help)来了解命令的所有细节。

image

less

“less”命令一次显示一个指定的文件页面。这个命令通常与其他命令结合使用,以一次显示一个页面的输出。以下命令将在终端窗口中一次显示 sanitize-csv.sh 文件的内容一屏幕。一旦你进入了 less 工具,有几个关键命令需要记住:

• h: 访问帮助菜单

• q: 退出帮助菜单

• 空格键: 显示下一屏幕/页

• b: 显示上一屏幕/页

• /: 搜索一个模式

• Enter: 向下移动一行

• y: 向上移动一行

这个强大的实用工具还有更多的命令和技巧,所以请阅读帮助屏幕,手册页,或者直接在互联网上搜索更多有用的技巧。

image

cat

“cat”命令将文件内容输出到屏幕或如果指定了则输出到新文件(不保留文件的格式)。

image

此命令还可以用于将多个文件合并为一个(即,通常称为连接文件)。

image

find

“find”命令用于在目录层次结构中搜索文件。以下命令将列出指定用户主目录中包含的所有文件,包括完整路径。

image

“find”命令的输出也可以在另一个命令中使用。例如,以下命令将对“find”命令中的文件运行“md5sum”命令。指定了几个参数:

• find:该命令

• ∼:在当前用户的主目录中查找文件

• -type f:只列出普通文件(不列出目录)

• -exec:运行以下命令

• sha256sum:计算文件 sha256 哈希值的实用工具

• {} ;:疯狂的 shell 转义和符号!

image

如果你针对大量文件的运行命令,可能会遇到问题。在这种情况下,你应该研究将 file 命令的输出管道传输到一个名为 xargs 的实用工具。

对于大多数 Linux 命令,你还可以将命令的输出保存到文件中。例如,上面相同命令的输出可以保存在用户主目录中的名为 md5.txt 的文件中:

image

对 sha256sum 实用工具运行的 find 命令的输出被重定向到用户主目录中的 sha256sum.txt 文件。

chmod

“change mode”的缩写,这个命令用于改变文件或文件夹的权限。以下列表中提供了许多示例。请注意,这些命令必须在存储“textfile.txt”的目录中运行,或者提供文件的完整路径。

image

“chmod”命令也可以对一组文件或文件夹运行。

image

chown

“chown”命令用于更改指定文件或目录的所有者或组。在以下示例中,“textfile.txt”的原始所有者和组是 ahoog。chown 命令将所有者更改为“root”。此命令需要“sudo”。

image

sudo

在任何命令前加上“sudo”可以让用户获得提升的权限,使他们能够以超级用户或其他用户的身份运行命令。对于某些命令,例如 apt-get(安装软件)、chown(如果你不是所有者,更改所有权)、mount、访问原始磁盘设备等,需要 sudo 权限。要使用 sudo,只需在命令前加上“sudo”,然后系统会提示你输入密码。然后记录命令在 sudo 日志中:

image

apt-get

apt-get 命令中的“apt”部分代表高级包装工具,允许用户安装和卸载软件,升级现有软件,甚至执行系统更新。要运行此命令,需要 sudo 权限。

image

grep

“grep”命令可以在一个文件或一系列文件和文件夹中搜索一个特定的短语。这相当于打开一个文档并执行“查找”特定短语的操作。搜索是区分大小写的,所以如果你不确定一个字母是大写还是小写,你应该指定“-i”(不区分大小写)标志。这个选项可能会根据被搜索文件的大小花费更长时间。

常规用法是:

image

下面包含了一些“grep”用法示例。

image

下一个命令在用户桌面的所有文件内容中搜索单词“unnecessary”。结果显示这个单词在“textfile.txt”中被找到,并且在“WXP-PRO-OEM.iso”中也匹配到了这个单词。因为这是一个二进制文件,需要执行进一步的技术才能查看内容。

image

当你更广泛地使用 Linux 进行法医调查时,grep 将变成一个不可或缺的工具。

管道和重定向文件(| 和 >)

管道符“|”(在大多数键盘上位于“Enter”键上方)允许将一个命令的输出发送到另一个命令进行进一步处理。输出也可以使用“>”重定向到另一个文件中。

下面的命令将“cat file.txt”的结果传递给“less”命令,允许用户一次查看一页内容。

image

下一个命令使用 grep 命令在“ch1.xml”中搜索“android”,然后取该搜索的结果并执行另一个不区分大小写的“forensics”搜索。最终结果通过“less”管道显示,一次查看一页。

image

重定向命令的输出也可以很有帮助。下面的命令将“book.txt”的输出(使用“cat”命令)并复制到用户桌面上名为“newdocument.txt”的文件中。

image

在对特定文件甚至整个磁盘映像运行“strings”命令时,重定向可能非常有帮助,这将在第七章中进一步探讨。

安卓开源项目

安卓背后的开放策略自然导致了安卓源代码通过 AOSP 在 2008 年 10 月 21 日的发布。该网站称(获取安卓源代码,n.d.):

我们创建安卓是为了响应我们在发布移动应用时的自身经验。我们希望确保始终有一个开放的平台供运营商、OEM(原始设备制造商)和开发者使用,以实现他们的创新想法。我们希望确保没有中央故障点,一个行业参与者不能限制或控制其他任何人的创新。我们选择的解决方案是一个开放且开源的平台。

开发策略专注于旗舰设备(例如,Nexus 系列),这使得谷歌能够承担新平台的大部分风险。制造商可以在他们的设备上使用最新版本的安卓,而 AOSP 则开发下一个主要版本。

AOSP 许可证

AOSP 受两个主要软件许可证管理,分别是 Apache 软件许可证 2.0(Apache 2.0 或 ASL2.0)和 GNU 公共许可证 v2(GPLv2)。GPLv2 是一个限制性更强的许可证,它迫使贡献者以相同的许可证分发所有源代码。谷歌认为这将限制安卓的商业支持,因此 GPLv2 主要涵盖将 Linux 内核核心用于安卓的使用。

Apache 2.0 许可证更受商业实体接受,因为它限制较少,不会强迫公司开源所有相关软件。AOSP 解释了为何选择 Apache 2.0 许可证的问题(Licenses, n.d.):

有时有人问为何 Apache 软件许可证 2.0 是安卓首选的许可证。对于用户空间(即非内核)软件,我们确实更喜欢 ASL2.0(以及类似 BSD、MIT 等许可证)而不是其他许可证,如 LGPL。

安卓关于自由和选择。安卓的目的是在移动世界中推动开放,但我们认为不可能预测或规定人们将如何使用我们的软件。因此,尽管我们鼓励每个人制造开放且可修改的设备,但我们认为强迫他们这样做并非我们的职责。使用 LGPL 库通常会强迫他们这样做。

这里有一些我们具体的考虑:

  1. LGPL(简单来说)要求以下其一:向应用程序提供源代码;提供书面源代码要约;或者动态链接 LGPL-ed 库,并允许用户手动升级或替换库。由于 Android 软件通常以静态系统映像的形式发布,因此遵守这些要求最终会限制 OEM 的设计。(例如,用户很难在只读闪存存储上替换库。)

  2. LGPL 要求允许客户修改和逆向工程以调试这些修改。大多数设备制造商不想受到这些条款的约束,因此为了最小化这些公司负担,我们在用户空间最小化使用 LGPL 软件。

  3. 从历史上看,LGPL 库是下游设备制造商和应用程序开发人员合规问题的来源。不幸的是,教育工程师这些问题既困难又进展缓慢。对于设备制造商尽可能容易地遵守许可至关重要。鉴于过去遵守 LGPL 的困难,如果可以避免,最谨慎的做法是根本不使用 LGPL 库。

上文讨论的问题是我们在自己的代码中偏好 ASL2.0 的原因。这不是对 LGPL 或其他许可证的批评。我们对这个话题有强烈的看法,甚至到了我们特意确保尽可能多的代码使用 ASL2.0 的地步。然而,我们热爱所有自由和开源许可证,并尊重其他人的观点和偏好。我们只是决定 ASL2.0 符合我们目标的权利许可证。

开发过程

AOSP 是一个非常复杂且复杂的开源项目,需要全球许多开发者的协作。因此,AOSP 有一套定义明确的角色和流程,必须遵循这些角色和流程才能为项目做出贡献。这些角色包括以下:

• 贡献者/开发者:为项目贡献代码的个人和公司

• 验证人:测试代码更改的个人

• 审批者:决定更改是否被采纳或排除的有经验的开发者

• 项目负责人:通常是负责 AOSP 项目整体管理的谷歌员工

任何人都可以下载、编译和增强 AOSP 项目。图 1.6 展示了开发流程。

图像

图 1.6 AOSP 开发过程。

开源在取证中的价值

并非所有的法医鉴定人员都会或需要直接为 AOSP 做出贡献。然而,下载这个软件具有极大的价值。例如,在检查来自 Android 1.5 设备的 Yet Another Flash File System2(YAFFS2)物理镜像时,使用 strings 提取 ASCII 文本时,“silly old name”这个短语经常出现。对于大多数文件系统,鉴定人员可能只能猜测“silly old name”的相关性。但是,通过下载源代码,鉴定人员可以快速搜索这个短语,识别代码,并检查它以获取更多信息。在这种情况下,当更新 YAFFS2 对象的头部(例如,一个文件)时,在特定情况下,名称字段会被设置为“silly old name”。

在 AOSP 的文件 kernel/fs/yaffs2/yaffs_guts.c 中,有一个名为 yaffs_UpdateObjectHeader 的函数。代码中的注释和函数头如下所示:

image

创建一个名为“oldName”的变量,内容为“silly old name”:

image

当之前的“ChunkId”大于 0 时,对象头部的名称字段被更新为“oldName”:

image

代码还检查原始调用函数是否为对象传递了一个新名称。如果没有为函数提供新的名称值,则使用 oldName 的值(仍然是“silly old name”):

image

虽然不是每个鉴定人员都擅长解读程序员代码(在本例中是 C 语言),显然这些信息在法医鉴定中可能是有用的。当然,还有许多其他情况,比如短信如何被时间戳标记或地理标记如何实现,这些都可能为鉴定带来巨大的价值。

下载并编译 AOSP

希望在之前的 YAFFS2 示例中已经证明了参考 Android 源代码的价值。以下部分将介绍你应该遵循的步骤,以从 AOSP 下载并编译最新版本。虽然 Android 2.2 及更早版本可以在 32 位机器上编译,但 AOSP 的最新版本(Android 2.3)及以后的版本需要 64 位计算机。

使用我们之前构建的 Ubuntu 虚拟机,我们现在可以开始更新默认的 Ubuntu 安装,然后从源代码构建 Android。

image

image

恭喜你,你已经从源代码构建了 Android(或者开始了构建过程——这需要一段时间)。

现在,如果你遇到了需要更深入理解的 Android 方面,你可以搜索源代码并了解更多。表 1.5 列出了核心 Android 项目,你会发现这与 Android 源代码树中的目录大致对应。项目信息可以在 AOSP 网站找到,地址是sites.google.com/a/android.com/opensource/projects,该网站提供了每个项目功能的简要描述。

表 1.5 核心 Android 项目

项目 描述
bionic C 运行时:libc, libm, libdl, 动态链接器
bootloader/legacy 引导加载程序参考代码
build 构建系统
dalvik Dalvik 虚拟机
development 高级开发和调试工具
frameworks/base 核心 Android 应用框架库
frameworks/policies/base 框架配置策略
hardware/libhardware 硬件抽象库
hardware/ril 无线接口层
kernel Linux 内核
prebuilt 支持 Linux 和 Mac OS 构建的二进制文件
recovery 系统恢复环境
system/bluetooth 蓝牙工具
system/core 最小可启动环境
system/extras 低级调试/检查工具
system/wlan/ti TI 1251 WLAN 驱动和工具

国际化

Android 在整个平台对国际语言和地区设置有广泛支持。这不仅允许手机以多种语言显示菜单、网站和其他图形用户界面方面,还支持各种国际键盘格式的输入。

Unicode

Android 支持多种语言的能力的关键在于其对 Unicode 字符的编码和解码能力,Unicode 是行业标准编码方案,支持超过 600 种语言(Languages and scripts, n.d.)。

小贴士

楔形文字支持

对于那些好奇且勇于探索的读者,Unicode 确实支持楔形文字,尽管我们仍在等待有人将 Android 用户界面实现为苏美尔-阿卡德楔形文字。可以在unicode.org/repos/cldr-tmp/trunk/diff/supplemental/languages_and_scripts.html查看 Unicode 支持的语言和脚本的全列表。

键盘

Android 支持许多不同类型的键盘,有时被称为输入方法。例如,在运行 Android 虚拟设备(AVD)时,模拟器允许你更改键盘输入的语言,如图图 1.7 所示。

image

图 1.7 配有中文数字键盘的 Android 虚拟设备。

AVD 系统自带处理多种语言的能力。在法医调查中,这一点具有重要意义,分析人员必须保持警惕,考虑到一些数据可能以意想不到的语言编码。

ADV 的同一功能在物理 Android 设备上也同样可用。例如,在美国由 Verizon Wireless 分销的 HTC Incredible 手机上,有一个名为语言和键盘的设置。你可以为手机用户界面选择两种语言:英语和西班牙语。然后在文本设置下,你可以选择你的触摸输入设置。从这里,你可以指定键盘类型(QWERTY,电话键盘或紧凑型 QWERTY),从 20 多种国际键盘中选择,为中文文本输入选择特定选项(繁体中文或简体中文),以及许多其他选项。最新版本的 Android(姜饼,2.3)现在支持 57 种语言(Android 2.3 平台, n.d.)。

最后,Android 支持用户安装第三方键盘。一个越来越受欢迎的替代键盘叫做 Swype,它允许用户在键盘上连续拖动手指到每个字母。软件然后能够确定,你输入的单词的概率很高。该软件支持多种语言,是一个可插拔键盘输入的好例子。

定制分支

由于 Android 是作为开源发布的,任何人(包括你,在上面的步骤之后!)都可以下载并定制 Android 源代码。虽然许多最终将他们的更改反馈给 Google 以便纳入 Android 的人,但有些人完全分支了代码并发布了他们自己的 Android 版本。

市场后固件

定制 Android 分支(也称为 Mods,固件和 ROMs)最丰富的例子可能来自 Android 黑客和爱好者社区。这个社区是一个非常庞大且多元化的群体,他们有动力去开发、实验和黑客攻击 Android。他们的一些工作可能涉及在 Android 设备上获取 root 权限,启用新功能,或者仅仅吹嘘他们最新的定制成果。这个社区充满激情,成果丰富,是信息(以及误信息)的绝佳来源,并且他们回应了许多求助请求。如果认真的 Android 研究人员忽视了这个社区,那将是一个疏忽。然而,信息的庞大量使得这成为一个非常耗时的努力。

最受欢迎的社区之一名为 XDA Developers,其自述为“Android 和 Windows Mobile 平台的智能手机爱好者和开发者最大的互联网社区”(xda-developers, n.d.)。他们的网站拥有超过 320 万的注册用户,并运营着一个令人印象深刻的论坛。

许多定制 Mod 在 XDA 上发布,而且开发者本身也经常活跃在社区中。或许最受欢迎的售后固件就是 CyanogenMod。这个固件基于 AOSP,它增加了新功能,并尝试在基于 Android 的 ROM 上提高设备的性能和可靠性,这些 ROM 是由厂商和运营商直接发布的(CyanogenMod,未标明日期)。目前,CyanogenMod 支持来自六家制造商的 17 种不同的智能手机和平板设备:Commitva、Dell、HTC、Motorola、Samsung 和 Viewsonic。这些售后固件在设备上启用了 root 权限,正如我们将在第六章中讨论的,这是获取设备物理获取的关键。

OPhone OS

开放移动手机操作系统(OPhone OS)基于 Android,由中国的软件开发商 Borqs 开发。OPhone OS 是为中国政府的子公司中国移动设计的,中国移动是世界上最大的移动运营商,拥有超过 5 亿用户。2010 年 6 月,OPhone OS 2.0 在北京发布,尽管 Borqs/OPhone OS 在中国以外相对不知名,但它们显然在 Android 生态系统中的重要性和影响力正在增长。在中国内部,Borqs 的 CEO 表示他们只与一家运营商合作,即中国移动,因为在那个国家“你不能侍奉两个主人”(中国的 OPhone,未标明日期)。

因此,他们为中国移动软件保留了 OPhone OS 这个名字。然而,根据他们的网站,他们还开发了一个名为 Android+的 Android 软件分支(中国的 OPhone,未标明日期)。在他们的新闻稿中,Borqs 解释了 Dell Aero 配备了他们的 Android+软件,其中包括类似苹果的用户界面,并且他们的软件也通过 Dell 在巴西和墨西哥进行分发。

在 iPhone(及其他非 Android 设备)上运行 Android

或许最具有争议性的售后固件之一就是能让 Android 在 iPhone 上运行的固件。由于许多移动设备基于 ARM 处理器,因此移植过程是可行的。这使得 Android 能够运行在那些设计用来运行其他操作系统(如 Windows Mobile、Symbian、iOS 等)的设备上。向苹果粉丝展示你那运行着 Android 的漂亮 iPhone,感觉绝对独一无二!

Android 市场

安卓市场是第三方开发者向任何拥有安卓设备的用户发布应用程序的途径。安卓市场最早是在 2008 年 8 月 28 日在谷歌开发者博客上宣布的,作为“一个开放的 内容分发系统,帮助最终用户在他们的安卓设备上找到、购买、下载和安装各种类型的内容”(Android 开发者博客,n.d.)。市场在 2008 年 10 月首次推出时,并不支持付费应用程序。然而,到了 2009 年初,安卓市场在美国和英国都支持付费应用程序。到 2011 年 1 月,安卓市场在 29 个国家支持付费应用程序(支持地区,n.d.)。其他几个国家,尤其是印度,可以使用安卓市场,但目前无法安装付费应用程序。

谷歌对安卓市场的宽松管理方式与苹果对其应用商店的严格管理形成了鲜明对比。尽管安卓市场对用户有服务条款(Android Market 条款,n.d.)和针对开发者的安卓市场开发者分销协议(Android Market 开发者,n.d.),但应用程序发布到市场时无需经过审批过程。相反,谷歌认为应用程序评分将筛选出有缺陷或价值不高的应用程序。

要在安卓市场上发布应用程序,开发者必须注册,支付 25 美元的费用,并使用私钥签署他们的应用程序,这将唯一标识他们在市场上的身份。当用户购买应用程序时,开发者获得 70%的购买价格,剩余的 30%归谷歌所有(有时还包括涉及的运营商)。最初,用户有一个 48 小时的窗口期可以退回应用程序。然而,在 2010 年 12 月,谷歌将这个窗口期缩短到了 15 分钟。

谷歌不仅有能力从安卓市场远程删除应用程序,还可以直接从安卓设备上删除。远程应用程序移除功能是安卓拥有的一种安全控制措施,能够迅速且可扩展地移除危险应用程序,以防止用户进一步暴露于风险之中(Android 开发者博客:锻炼,n.d.)。这项安全控制措施首次在 2010 年 6 月实施,当时一名安全研究员发布了一款概念验证应用程序,该程序可以允许下载并在设备上安装另一个应用程序(Mills, n.d.)。

在安卓开放的精神下,谷歌并不阻止用户直接从开发者的网站在他们的手机上安装应用程序,也不阻止开发一个竞争的应用市场。除了安卓市场,还有几个较小的替代市场。此外,一些大型公司已经宣布或表示有意创建替代的应用商店,包括亚马逊、百思买和威瑞森。

安装应用程序

要从 Android 市场(如图 Fig. 1.8 所示)安装应用,用户首先必须运行市场应用并使用 Gmail 账户登录。该账户允许用户通过 Google Checkout 账户购买付费应用,并提供地址和信用卡信息。最近,谷歌与一些运营商合作,用户可以直接将应用购买费用计入月度无线运营商账单,而不使用 Google Checkout 的信用卡。

image

图 1.8 显示了运行 Android 2.2 的 HTC Incredible 上的 Android 市场。

市场应用允许用户搜索应用,并按主题或流行度浏览。选择一个应用后,会显示一个专门的应用页面,用户可以从该页面安装应用。专门页面还提供一般信息,如描述、下载次数、平均评分、详细评论、相关应用、开发者信息,最后还提供了反馈或标记应用不适当的机会。

正如我们将要讨论的,权限是 Android 安全性的核心组成部分。一旦用户决定安装应用,他们会看到显示应用请求的所有权限的屏幕,如图 Fig. 1.9 所示。此时,用户可以接受权限并继续安装,或返回上一个屏幕。

image

图 1.9 显示了 Android 应用权限。

应用随后会被下载并安装,结果会显示在设备顶部的通知栏中。从那里,用户可以运行应用,或随时从应用列表中访问。

要卸载应用,用户可以访问设备的设置,选择应用设置。从那里,他们可以管理应用(参见 Fig. 1.10),这将显示具有各种特征的应用列表,如已下载、正在运行和位于 SD 卡上。

image

图 1.10 管理应用。

用户选择一个应用后,可以看到应用信息屏幕,显示有关应用的各种信息,并允许用户进行强制停止、清除数据、清除缓存和卸载等操作,如图 Fig. 1.11 所示。

image

图 1.11 应用信息,包括卸载。

应用统计

Android 市场正在快速成长。发布六个月后,T-Mobile 的首席技术官 Cole Brodman 表示,用户需要更多过滤器才能从市场上近 2300 个应用中成功找到应用 (Lawson, n.d.)。到 2011 年 1 月,市场上已有超过 20 万个应用,仅 2010 年 11 月就增加了 27,227 个 (Android Market statistics, n.d.)。估计下载应用的数量已超过 25 亿。

显然,应用程序是安全和取证的关键关注领域。第四章中,我们将详细探讨应用程序如何将数据持久化到 Android 设备上,存储了哪些类型的信息,以及如何恢复和分析数据。

安卓取证

显然,我们需要安卓取证。智能手机通常是了解个人信息的唯一电子设备。对于大多数人来说,他们的智能手机在任何时候都很少离他们超过几英尺远,甚至包括睡觉时。该设备融合了个人和公司信息,并有能力存储大量数据,包括短信、电子邮件、GPS 位置、图片、视频等。人们倾向于对智能手机比对任何其他个人或设备更诚实。为什么?因为人们觉得设备是安全的,可以为他们提供问题的答案,这些问题他们可能选择不与任何人分享。不止一位取证检验员开玩笑说,“你搜索的东西代表了你”,这显然是亲眼看到人们如何诚实用手机的第一手经验。

挑战

当然,值得一做的事情都不容易,移动取证尤其是安卓取证面临着许多必须克服的挑战。

数字取证的一个基本目标是防止检验员对目标设备进行任何修改。然而,移动电话缺少可以关闭、连接写保护器并以取证方式镜像的传统硬盘。与智能手机的任何互动都会以某种方式改变设备。因此,检验员在检查移动设备时必须使用他们的判断力,如果设备被修改了,他们必须解释它是如何被修改的,以及为什么做出这样的选择,这同样重要。

一些取证检验员对此方法持有异议,并引发了争论。然而,可能改变针对取证目标的计算机的技术已经被使用了一段时间。例如,在恶意软件攻击的调查中,通常需要进行实时内存分析。同样,如果硬盘被加密,检验员必须在设备运行时进行镜像处理,否则他们可能永远无法访问硬盘上的数据。其他典型的例子是因复杂环境而必须保持在线的系统,这在涉及大型企业服务器的案件中很常见。尽管每位检验员都应努力不改变他们正在调查的设备,但在移动世界中这几乎是不可能的。因此,如果不能修改设备,那么唯一的选择就是不对设备进行检验。显然,这种选择是不可接受的,因为移动取证在许多调查中都是关键证据,甚至已经解决了很多犯罪案件。

进一步复杂化 Android 取证的是设备的多样性、Android 版本以及应用程序。仅设备和 Android 版本的排列组合就有数千种,每个设备加上平台都有其独特的特性。尽管可以对每部 Android 手机进行逻辑分析,但庞大的组合使得完全物理获取所有 Android 设备几乎不可能实现。即使是 Android 版本中的微小差异,在高风险案件中也可能需要广泛的测试和验证。

摘要

Android 是一个快速成长、功能丰富且令人兴奋的移动平台。特性、连接性和流行度的结合自然导致了 Android 取证需求的增长。尽管移动取证的难度在增加,但其价值也在提升。Android 的开源特性极大地帮助取证分析师掌握了所需的基础知识,使得 Android 成为一个理想的作业平台。

参考文献

开放手持设备联盟常见问题解答。(未注明日期)。2011 年 1 月 3 日检索。

开放手持设备联盟成员。(未注明日期)。开放手持设备联盟。2011 年 3 月 9 日检索自 www.openhandsetalliance.com/oha_members.html

Android 开发者博客:Android 市场:一个用户驱动的 content 分发系统。(未注明日期)。2011 年 1 月 9 日检索。

Android 开发者博客:锻炼我们的远程应用移除功能。(未注明日期)。2011 年 1 月 9 日检索。

Android Market 开发者分发协议。(未注明日期)。2011 年 1 月 9 日检索。

Android Market 服务条款。(未注明日期)。2011 年 1 月 9 日检索。

来自 AndroLib 的 Android Market 统计数据,Androlib,Android 应用和游戏目录。(未注明日期)。2011 年 1 月 9 日检索。

Android 2.3 平台和 Android 开发者。(未注明日期)。2011 年 1 月 8 日检索。

9. Bort, D.(未注明日期)Android 现在可以作为开源使用。Android 开源项目。2011 年 1 月 3 日检索自sites.google.com/a/android.com/opensource/posts/opensource

10. 中国的 OPhone 将作为 Android 进入美国市场+。(未注明日期)。2011 年 1 月 8 日检索自www.borqs.com/news.jsp

11. 公司信息:关于。(未注明日期)。谷歌。2011 年 1 月 4 日检索自www.google.com/corporate/

12. comScore 报告 2010 年 11 月美国移动用户市场份额。(未注明日期)。comScore 公司。2011 年 1 月 9 日检索自www.comscore.com/Press_Events/Press_Releases/2011/1/comScore_Reports_November

13. 关于 CyanogenMod 的 Rom,CyanogenMod。(未注明日期)。2011 年 1 月 8 日检索自www.cyanogenmod.com/about

14. 高德纳报告称,2010 年第三季度全球手机销量增长了 35%,智能手机销量增加了 96%。(未注明日期)技术研究和商业领袖洞察。高德纳公司。2011 年 3 月 9 日检索自www.gartner.com/it/page.jsp?id=1466313

15. 获取 Android 源代码,Android 开源。(未注明日期)。2011 年 3 月 9 日检索自source.android.com/source/download.html

16. 谷歌投资者:谷歌 Android 每天激活 350,000 个设备(数据可视化视频)“顶级全球智能手机平台”。(未注明日期)。2011 年 3 月 9 日检索自googinvestor.blogspot.com/2011/03/google-android-activations-350k-daily.html

17. Krazit, T.(未注明日期)谷歌的 Rubin:Android“一场革命”。数字媒体—CNET 新闻。技术新闻—CNET 新闻。2011 年 1 月 5 日检索自news.cnet.com/8301-1023_3-10245994-93.html

18. 许可证。(未注明日期)Android 开源。2011 年 1 月 5 日检索自source.android.com/source/licenses.html

19. 语言和脚本。(未注明日期)Unicode 联盟unicode.org/repos/cldr-tmp/trunk/diff/supplemental/languages_and_scripts.html

20. Lawson, S.(未注明日期)T-Mobile 表示 Android 市场需要更多过滤器。ITworld,IT 新闻,技术分析和操作资源。2011 年 1 月 9 日检索自www.itworld.com/personal-tech/64481/android-market-needs-more-filters-t-mobile-says

21. Mills, E.(未注明日期)。谷歌远程清除 Android 手机上的应用。InSecurity Complex—CNET 新闻。科技新闻—CNET 新闻。2011 年 1 月 9 日检索,来自 news.cnet.com/8301-27080_3-20008922-245.html

22. 官方谷歌博客:我的 Gphone 在哪里?(未注明日期)。2011 年 1 月 2 日检索,来自 googleblog.blogspot.com/2007/11/wheres-my-gphone.html

23. 商家支持的位置——Android Market 帮助。(未注明日期)。2011 年 1 月 9 日检索,来自 www.google.com/support/androidmarket/bin/answer.py?hl = en&answer = 150324。

24. Torvalds, L.(1991 年 10 月 5 日)。适用于 386-AT 的类似 Minix 的自由内核源代码——comp.os.minix。Google 群组。2011 年 3 月 3 日检索,来自 groups.google.com/group/comp.os.minix/msg/2194d253268b0a1b

25. xda-developers。(未注明日期)。2011 年 1 月 8 日检索,来自 www.xda-developers.com/

第二章

安卓硬件平台

本章信息

• 核心组件概述

• 不同设备类型概述

• 只读存储器和引导加载器

• 制造商

• 特定设备

引言

安卓被设计为与广泛的硬件兼容。这在很大程度上是通过 Linux 内核实现的,多年来它已经演变为支持各种硬件。这是平台的一个重要特点,因为它允许制造商在设计、采购或以其他方式整合理想的安卓设备组件时拥有自由。这一策略导致了强大的双核安卓设备的开发,这些设备具有显著的处理器性能,以及针对入门级无线计划的入门级设备。尽管硬件兼容性对制造商、无线运营商和最终消费者都有利,但多样性给法医分析师和安全工程师带来了挑战。了解安卓的硬件组件、设备类型和启动过程将有助于您全面了解安卓。

核心组件概述

安卓被开发出来以支持广泛的设备和制造商。因此,任何主要组件的列表可能一列出就过时了。然而,有一些在安卓设备中始终如一的组件是值得讨论的。以下组件构成了安卓设备的核心。

中央处理单元

中央处理单元(CPU)是大多数法医分析师相当熟悉的术语,在安卓设备上的作用也没有什么意外。CPU 负责执行操作系统(OS)和应用程序代码,并协调或控制其他核心组件,包括网络、存储、显示和输入设备。

从一开始,大多数(如果不是全部)的安卓设备都使用 ARM 处理器作为其 CPU,这些处理器对于移动平台来说足够强大,但设计上注重低功耗——这是最大化电池寿命的关键因素。

然而,企业和爱好者已经将安卓移植到其他平台上。在企业方面,英特尔已经将安卓移植到他们的 Atom 处理器上。同样,谷歌也在他们的 Google TV 产品中使用了安卓,该产品是基于安卓构建的。还有一些项目,如 Android-x86(Android-x86, n.d.),已经发布了运行在英特尔 x86 架构上的安卓移植版本。一些受支持的平台包括许多 Eee PC 型号和联想 ThinkPad x61 平板电脑。

基带调制解调器/无线电

基带调制解调器和无线电是提供安卓设备连接到蜂窝网络的硬件和软件系统。这使得设备可以进行语音和数据通信。

为了不让主 CPU 处理这些活动,设备设计师通常会利用一个专用的组件来管理蜂窝通信的复杂性。因此,尽管 CPU 可能指导设备的主要活动,但基带调制解调器负责管理蜂窝通信。

在整本书中,我们将交替使用基带基带调制解调器无线电这些术语。尽管这些系统很复杂,这个定义可能忽略了一些细微差别,但对于法医分析师来说,这些区别并不重要。

内存(随机存取存储器和 NAND 闪存)

由于 Android 设备在某种程度上只是计算机,因此需要各种类型的内存来运行。所需的两主要类型的内存是易失性(随机存取存储器[RAM])和非易失性(NAND 闪存)内存。

系统使用 RAM 来加载、执行和操作操作系统、应用程序或数据的关键部分。RAM 是易失性的,这意味着在没有电源的情况下它不会保持状态。

然而,NAND 闪存(我们简称这种内存为 NAND 闪存)是非易失性的,因此,在设备断电后数据仍然得以保存。NAND 闪存用于存储引导加载器、操作系统和用户数据。因此,它是任何法医调查的关键组成部分,类似于在笔记本电脑、台式机或服务器的法医调查中的硬盘。NAND 闪存还具有使其成为移动设备理想的独特属性,同时为程序员带来了一系列挑战(这通常为法医分析师提供了独特的机会)。这些特性将在第四章中详细探讨。

从硬件角度来看,移动设备显然在空间上有很大的限制。通常,RAM 和 NAND 闪存被制造成一个被称为多芯片组件(MCP)的简单部件。在检查 Android 设备组件时,通常 NAND 闪存和 RAM 会被封装成一个 MCP。

尽管图 2.1 是特定于内存制造商 Hynix(用于 Dell Streak 和其他 Android 设备),但这种整体架构是包括 NAND 闪存和 RAM 在内的 MCP 组件的一个很好的描述,还包括适合各种设备的封装选项。

image

图 2.1 MCP 架构(Mobile Memory, n.d.)。

全球定位系统

毫无疑问,自包含蜂窝通信以来,移动设备最重要的创新之一是将全球定位系统(GPS)集成到核心产品中。这个功能不仅使用 GPS 卫星网络确定设备的位置,还允许诸如点对点导航、位置感知应用程序等应用,毫无疑问,将来还会有更多有趣的使用方式。

无线(Wi-Fi.com和蓝牙)

除了蜂窝网络,大多数设备还支持额外的无线技术,如Wi-Fi.com提供的高速数据连接和用于连接外部设备(如耳机、键盘、打印机等)的蓝牙。实际上,一些设备可能会省略蜂窝网络连接,这不仅降低了设备的成本和复杂性,也消除了消费者每月的重复收费。这些设备可能仅设计用于家庭使用(例如,家用电话或多媒体设备),或在没有Wi-Fi.com连接时用于离线模式(即平板电脑或电子阅读器)。

安全数字卡

大多数 Android 设备都配备了可拆卸的存储卡,称为安全数字(SD)卡。与设备上的 NAND 闪存一样,SD 卡也是非易失性的,并使用 NAND 闪存技术。然而,由于 SD 卡被设计为便携,它们必须遵守各种物理和通信规范,以便与大多数设备互操作。

SD 卡是大多数 Android 设备与流行的苹果 iPhone 之间的一个明显设计差异。iPhone 设计有 4GB 至 32GB 的板载 NAND 闪存,并不支持 SD 卡。尽管成本更高,但这让设备制造商(在这个情况下是苹果)对设备拥有更多的控制权。在 Android 的情况下,较大的用户文件预期会存储在 SD 卡上。这不仅为消费者提供了一个成本更低且易于升级的存储选项,而且还可以便携,这样如果消费者购买了新手机,他们可以轻松使用现有的 SD 卡转移数据。

近期 HTC 手机(尤其是 HTC Incredible)提供了标准的 SD 卡接口,但并未随机附赠 SD 卡。相反,它们通过切割一部分板载 NAND 内存并模拟成 SD 卡来创建一个虚拟的 SD 卡。这为法医分析师增加了额外的复杂性。分析师首先需要确定是否存在 SD 卡、虚拟 SD 卡,或是其他用户数据存储方式(除了板载 NAND 闪存)。

屏幕

Android 设备上的屏幕显然是一个关键组件。它是用户交互的主要界面,不仅通过视觉显示,还通过响应用户的触摸。屏幕背后的技术是研发的重点。早期的迭代包括液晶显示屏和第二层屏幕,用于检测用户在屏幕上的输入。近期的改进包括更高的显示分辨率、更亮的屏幕、更敏感和复杂的用户触摸交互,以及降低的功耗。实际上,一些近期使用三星 Super AMOLED 技术的 Android 智能手机,因其屏幕性能而受到消费者的好评。

相机

最初,智能手机上的摄像头主要用于拍照。尽管这在当时是一个激动人心的发展,但在这个领域也出现了重大的创新。现在大多数设备还支持视频录制(有些支持高清)。当然,摄像头的质量也在提高,现在通常还包括一个集成的闪光灯。

近期,一些设备配备了两个摄像头。设备背面的第一个摄像头用于拍摄外部图片和视频。而面向前方的第二个摄像头使得像视频会议这样的新应用成为可能。

大多数安卓设备还将摄像头功能与 GPS 结合;因此,你可以记录照片的日期和时间,以及 GPS 坐标。然后你可以轻松地通过网络上传或分享照片,或者通过移动运营商的多媒体信息服务(MMS)发送。

这个领域一个有趣的发展是使用摄像头读取条形码。专业应用程序利用摄像头拍摄条形码的照片,然后分析数据。它可能查找产品评论,确定最佳价格,或者自动将你签到餐厅应用程序,以便你可以评价体验。也许在未来,这些应用程序甚至可能允许你支付你想购买的物品。

这个技术的一个早期实现是谷歌的一款名为 Goggles 的应用。用户可以拍摄任何物体,应用尝试识别该物体。谷歌提供的一个有趣的例子是,游客使用该应用识别他们正在参观的地标。

键盘

你可能会认为键盘的创新空间很小;然而,这绝非事实。大多数安卓设备都配备了触屏技术的屏幕键盘。一些设备还拥有基于硬件的键盘。

强大的软件键盘能适应屏幕方向(即,如果你将屏幕旋转 90 度,键盘也会跟着旋转),并且支持多种语言。

也有一些公司在开发更高效的文本输入方式。例如 Swype Inc. 就开发了一款键盘,用户不需要为每个字母单独选择按键。相反,对于每个词,他们只需从第一个字母开始,然后在不抬起手指的情况下在键盘上滑动到后续的每个字母,直到完成。Swype 键盘然后确定可能的词并完成它(或提供建议)。这种方法已被证明相当成功,我们预计将看到更多 Swype 技术(或类似创新)被整合到安卓键盘中。

电池

电池寿命一直是智能手机用户关注的主要问题。你可能爱你的手机,但不喜欢它的电池寿命。使用设备及其强大组件的人越多,消耗的电量也越多。在尽量减少功耗方面已经做了大量工作。然而,大多数人发现他们必须每天给手机充电。

随着时间的推移,硬件、软件和电池技术的改进可能导致充电频率降低。在这一领域有一些有趣的研究举措,比如无线充电手机,利用人体运动进行持续充电,或者简单地制造更强大的电池。无论改进如何,它们都将受到消费者的欢迎。

对于法医分析师来说,需要记住的一件事是,SD 卡通常位于电池后面。因此,要访问 SD 卡(以及确定确切的设备类型和标识),通常需要移除电池(从而关闭设备电源)。这里有许多需要考虑的因素,我们将在第六章中进行介绍。

通用串行总线

大多数安卓设备支持多个通用串行总线(USB)接口,可以从电脑进行访问。不同设备之间的电缆可能有所不同,但一般来说,USB 接口允许大多数现代操作系统与设备连接。以下是安卓设备公开的一些常见接口:

  1. 仅充电:设备可以通过 USB 电缆充电。

  2. 磁盘接口:设备的部分区域,包括 SD 卡、模拟 SD 卡和其他磁盘接口,作为大容量存储设备向操作系统呈现并可供访问。

  3. 厂商特定接口:这些包括自定义同步协议、用于软件安装的模拟 CD 只读存储器(ROM)驱动器,以及用于共享手机互联网连接的专业连接。

  4. 安卓调试桥(ADB):一个接口,它为用户提供访问设备上的 shell 提示符以及其他高级功能。

在第三章中,我们将探讨磁盘接口和 ADB 接口,这两个接口在安卓设备的法医调查中都是关键组成部分。

加速度计/陀螺仪

安卓可以检测并根据设备的持握或旋转方式来改变用户界面。这通常是通过检测设备加速(或定位)的大小和方向的加速度计来实现的。通常,这被用来在横屏和竖屏之间改变显示。

最新版本的安卓系统(截至本文写作时的 2.3 版本)现在支持陀螺仪,它比加速度计更敏感、更复杂。陀螺仪是对设备移动更灵敏、更准确的测量方式,这对于高级游戏开发至关重要。

扬声器/麦克风

最后,如果没有听或产生声音的能力,智能手机或平板电脑就没什么意思了。与其他组件一样,扬声器和麦克风也在每一代产品中不断成熟。例如,一些 Android 设备包含两个或三个麦克风,结合 Android 软件,它们能够检测并消除背景噪音,提供更好的音质。在本世纪最惊人的技术发展中,扬声器电话已经发展到可以实际用于真实对话的程度!

不同设备类型概览

从这些核心组件出发,设计师们已经创造出了各种各样的设备类型。回到 2008 年 10 月,T-Mobile G1(HTC Dream 100)刚刚发布,当时追踪 Android 设备和类型还相当简单。那时只有 G1,唯一的设备类型就是智能手机。当然,关于新型设备类型的博客文章已经满天飞,但这些都还只是猜测。

然而,到了 2010 年底,Android 设备不仅数量激增,设备类型也变得多样化。有许多网站试图追踪 Android 设备,但大多数都不完整。在准备检查新 Android 设备时,PDAdb.net是一个不错的参考资料,它追踪有关当前和未来设备的重要信息。目前,他们正在追踪超过 300 款运行 Android 的设备,您可以通过他们的 PDAmaster 页面进行搜索(Main Page, n.d.)。

主要的设备类型仍然是智能手机和平板电脑,但超便携式电脑(我们将它们称为上网本)以及电子阅读器的数量也在增长。在创新方面,运行 Android 的 Google TV 设备开始进入市场,一些媒体播放器已经存在,还有多家汽车公司宣布将使用 Android 作为其媒体和导航系统的一部分。最后,还有一整个类别属于“其他”,这些可能是独一无二的产品,或者也可能成为主流。例如家用电器、游戏设备、GPS 接收器、家用电话和音频设备、相框和打印机等。以下部分将详细介绍这些设备类型。

智能手机

智能手机是 Android 设备中最受欢迎的类型。它们几乎包含了上述所有组件,通常也是最为人熟知的。截至 2010 年 10 月,Android 设备在美国智能手机市场占有 22%的份额(Nielsen Wire, n.d.),并且增长迅速。人们普遍认为 Android 将超越 iPhone,或许最终会成为最受欢迎的智能手机平台。

平板电脑

尽管平板电脑已经存在了几十年,但看起来硬件、软件、移动网络和应用程序的融合最终可能产生一个可行的市场。市面上有许多 Android 平板电脑。然而,最新且被广泛宣传的设备是三星 Galaxy Tab™。这款 7 英寸的设备基本上拥有 Android 智能手机的所有组件,但体积更大。尽管平板电脑可能支持蜂窝数据连接(如 Galaxy Tab 所做的),但它们通常仅限于数据和短信/MMS 服务,并不支持蜂窝语音通话。然而,随着语音和数据融合,我们预计平板设备很快将支持 VoIP 电话和视频通话。

上网本

凭借低功耗和高度便携性,上网本成为了安装 Android 系统的良好选择。需要注意的是,Android 与谷歌的另一个项目 Chromium OS 不同,后者是一个开源项目,旨在构建一个操作系统,为那些大部分时间都在网上的人提供快速、简单且更安全的计算体验(Chromium OS, n.d.)。Android 先于 Chromium OS 开发,并且比它成熟得多。

现在市面上的许多 Android 上网本与平板电脑具有共同特征,不同之处在于上网本拥有完整的硬件键盘和通常更大的铰链式屏幕。上网本的主要数据存储介质通常是 NAND 闪存。然而,没有技术上的理由不能使用更传统的硬盘驱动器。

谷歌电视

谷歌像许多过去的公司一样,试图弥合观看广播电视和互联网内容之间的差距。这些设备从内置 Android 的完整电视套装到连接到现有电视的机顶盒不等。但关键在于利用 Android 作为基础操作系统,整合互联网和电视节目,并为开发者提供一个框架,以创造适合这一新媒体的新应用程序。

车载设备(内置)

一个充满激动人心可能性的领域是将 Android 设备集成到汽车中,通常作为导航/抬头显示或娱乐系统的一部分。迄今为止,这些系统通常是每个车辆制造商特定的,导致这些系统在功能、稳定性和有效性上有很大差异。如果制造商集成了不断发展的 Android 操作系统的全部功能,他们将能够专注于用户体验,而不是基础构建块。用户会发现在不同车辆之间以及 Android 设备上有一致性。而且开发者可以针对车辆的具体需求开发应用程序,并获得更广泛的市场分布。最后,可能会有许多其他感兴趣的参与者,如保险公司、律师、研究机构、法医分析师等,他们可以通过多种方式分析这些系统中的信息。

第一款投入生产的运行安卓的汽车是中国上海汽车工业公司开发和推广的荣威 350。此外,许多美国汽车制造商已经宣布支持安卓,从与智能手机的连接到将安卓操作系统完全集成到他们的车辆中。

全球定位系统

如前所述,大多数安卓设备在硬件中内置了 GPS。当 GPS 首次对消费者可用时,制造商创建了自定义操作系统来管理他们的设备。尽管大多数仍然利用他们的自定义系统,但有几个已经转向了安卓操作系统。因此,法医分析师可能会遇到运行安卓的专用 GPS 设备。

其他设备

随着越来越多的新型安卓设备上市,它们很快就会变得过时。安卓对制造商来说是一个太好的交易,不容错过。操作系统是免费的、成熟的,并允许专有开发。它还提供了应用程序开发的机制,无论是内部的还是通过第三方。因此,许多制造商放弃了昂贵的操作系统开发、维护和支持,而是在安卓的基础上进行构建。以下是一些额外的安卓设备类型的例子:

• 家用电器,如洗衣机和微波炉

• 如 Barnes and Noble 的 Nook 电子阅读器

• 媒体播放器

• 办公设备,如复印机

• 家用电话、音频和视频(例如相框)设备

• 专用游戏设备

• 打印机

如你所见,制造商将利用安卓的多种方式无疑会让法医分析师的工作变得有趣(好像它还不够有趣)。

ROM 和引导加载器

安卓设备与其他计算机一样,有一个相当标准的启动过程,允许设备将所需的固件、操作系统和用户数据加载到内存中,以支持全面运行。尽管启动过程本身定义明确,但固件和 ROM 因制造商和设备而异。本节的目的是提供一个关于安卓启动过程的高级概述,因为本书后面将介绍的技术将与设备在各个层面进行交互。本概述旨在高级别,因为对安卓或 Linux 启动过程的深入描述可能很容易就需要一整本书。

本节的大部分信息基于 Enea 公司安卓竞争力中心的 Mattias Björnheden 发表的一篇名为“从开机开始的安卓启动过程”的文章(Björnheden, n.d.)。在文章中,Mattias 确定了安卓启动过程的七个关键步骤:

  1. 开机和芯片上 Boot ROM 代码执行

  2. 引导加载器

  3. Linux 内核

  4. 初始化进程

  5. Zygote 和 Dalvik

  6. 系统服务器

  7. 启动完成

我们将详细研究这些步骤。

开机和芯片上 Boot ROM 代码执行

当 Android 设备首次开机时,与 CPU 配对的特殊启动 ROM 代码被执行以(1)初始化设备硬件和(2)定位启动媒体。ROM 代码特定于设备使用的 CPU。这个启动过程中的步骤类似于用于启动计算机的基本输入输出系统。

例如,硬件黑客社区中非常流行的一款 CPU 是德州仪器的 OMAP3530 ARM 兼容 CPU,它有一本 3444 页的技术参考手册公开可用(OMAP35xx 的公开版本,2010)。尽管阅读技术手册不是每个人都适合的,但它提供了巨大的细节和洞察力,了解 CPU 是如何初始化并加载操作系统的。在第 3373 页,手册提供了一个流程图,详细介绍了整个启动顺序。启动整个过程的 ROM 代码是硬编码在地址 0x00014000 的,这样当设备上电时,CPU 就知道确切的位置来查找启动 ROM,开始启动序列。

一旦设备硬件初始化,ROM 代码就会扫描,直到找到启动媒体(Android 设备将其存储在 NAND 闪存中),并将初始启动加载器复制到内部 RAM 中。然后执行从启动 ROM 跳转到 RAM 中刚加载的代码,如图 2.2 所示。

image

图 2.2 开启电源和芯片上的启动 ROM 代码。

启动加载器(初始程序加载/第二程序加载器)

启动加载器现在从启动媒体复制到内部 RAM 中执行。这一步骤类似于在启动 Windows、Mac 和 Linux 等计算机时找到的启动加载器。例如,Linux 的 GRUB 这样的典型计算机启动加载器允许用户选择他们想要启动的操作系统,并相应地加载它。

对于 Android 设备,启动加载器有两个不同的阶段:初始程序加载(IPL)和第二程序加载器(SPL)。IPL 负责检测和设置外部 RAM,这是启动和操作设备所必需的重要组件。一旦外部 RAM 准备就绪,IPL 将 SPL 复制到 RAM 中,然后将执行权转移到 SPL。

SPL 不仅负责加载 Android 操作系统,还提供了访问其他启动模式,如 fastboot、恢复模式或其他旨在更新、调试或服务设备的设计模式。SPL 通常由制造商提供。然而,Android 社区积极创建自己的 SPL(和其他自定义镜像),这些镜像启用了额外的功能和功能。在典型的启动场景中,SPL 将初始化硬件组件,如时钟、控制台、显示、键盘和基带调制解调器以及文件系统、虚拟内存和操作设备所需的其他功能。

然后,SPL 在启动媒体上定位 Linux 内核,将其复制到 RAM 中,加载启动参数,并最终将执行权转移到内核。图 2.3 展示了这个过程。

image

图 2.3 引导加载器。

Linux 内核

关于 Linux 内核已经有大量的文献,其中很多内容都可以在线找到。在这本书中,我们只需确认 Linux 内核现在正在控制设备。在设备上设置额外的特性后,将从 NAND 闪存中读取根文件系统,这将提供对系统和用户数据的访问,如图 2.4 所示。

image

图 2.4 Linux 内核。

初始化过程。

一旦内核可以访问系统分区,它就可以处理启动关键系统和用户进程的 init 脚本。这类似于在传统 Linux 设备上找到的 /etc/init.d 脚本。对于 Android,init.rc 通常位于根文件系统上,并提供内核启动核心服务的详细信息。

在运行 Android 2.2 的 HTC Incredible 上,init.rc 和 init.inc.rc 文件包含超过 650 行,为设备设置提供了大量的洞察。以下是 /init.rc 文件选定部分的内容:

image

image

从法医的角度来看,HTC Incredible 改变了启动过程完成后浏览器存储缓存的方式。/bootcomplete.inc.rc 文件的内容非常说明问题:

image

如您所见,一旦设备完成启动过程,浏览器缓存就会从存储在 NAND 闪存上的用户数据分区移动到位于 /app-cache 的临时 RAM 磁盘(tmpfs)。这意味着当设备关闭电源时,写入 /app-cache 的任何数据都会丢失,如图 2.5 所示。

image

图 2.5 初始化过程。

总结来说,init.rc 是设置 Android 设备的基本步骤,可以仔细研究它以了解特定 Android 设备的配置和操作方式。

Zygote 和 Dalvik

在第三章中,我们将详细介绍每个用户应用程序作为运行时沙箱提供的独立虚拟机。Dalvik 虚拟机是谷歌选择用来创建这个应用程序沙箱的技术。在启动时,Zygote 序列基本上设置了 Java 运行环境,并在系统中注册了一个套接字;因此,需要初始化的新应用程序可以请求一个新的 Dalvik 虚拟机。没有 Zygote 服务,Android 内核可以运行。然而,包括电话、浏览器和其他核心功能在内的应用程序都无法操作,如图 2.6 所示。

image

图 2.6 Zygote 和 Dalvik。

系统服务器

前一节提到的设备的核心功能是由系统服务器启动的。一旦 Java 运行时设置好,Zygote 进程开始监听,系统服务器就会被启动。它运行着设备和其他应用程序依赖的核心功能,如电话、网络和其他基本组件。图 2.7 展示了系统服务器是如何运行的。

图像

图 2.7 系统服务器。

系统最终会发送一个名为 ACTION_BOOT_COMPLETED 的标准广播动作,这会通知依赖进程引导过程已经完成。安卓系统现在已经完全运行起来,准备好与用户进行交互。

制造商

谷歌的安卓策略催生了一个多样化的安卓设备制造商群体。在安卓开发者网站上,维护了一份 USB 供应商 ID 列表,目前追踪了 15 家制造商(使用硬件设备,n.d.)。该列表包括以下内容:

• 宏碁

• 戴尔

• 富士康

• 佳明-华硕

• 宏达电

• 华为

• 京瓷

• LG

• 摩托罗拉

• 英伟达

• 帕泰克

• 三星

• 夏普

• 夏普

• 中兴

然而,一旦考虑到上述未列出的制造商和处于规划阶段的设备,安卓设备的制造商超过 50 家。

这当然为法医调查人员和公司安全管理人员带来了独特的挑战。大量的设备制造商、设备类型和设备导致了一系列复杂的策略、程序、技术和甚至是 USB 线缆。

安卓更新

安卓的更新模式是分散的、特定于设备的,并且由运营商或设备制造商负责,而不是谷歌。尽管主要由谷歌影响的开放手持设备联盟负责维护核心的安卓操作系统,但它们并不对特定设备行使控制权。这种分散的方法以多种方式影响设备的法医和安全程序。

首先,分析师永远无法确定一个设备将安装哪个版本的 Android。这在一定程度上是由企业追求尽可能高的利润率所驱动的。特别是在美国,如果消费者购买了一个带有两年合约的 Android 设备,运营商基本上已经锁定了消费者,因为提前终止合约的费用会不断上升。由于用户不太可能升级他们的服务或购买新手机,他们对于运营商来说是一笔固定的收入。升级现有 Android 设备的工程、开发、部署和支持成本相当高。因此,运营商可以选择投资新的 Android 设备,这会引发极大的兴趣并可能带来销售,或者维护现有设备,这几乎不会带来额外的收入。通常情况下,使用旧款 Android 手机的消费者将继续使用较旧、功能较少且安全性较低的 Android 版本。这是谷歌已经承认并声明正在努力解决的问题。

第二,获取 Android 设备的取证映像以及确保其安全性在不同 Android 版本和设备类型之间存在很大差异。例如,分析师针对运行 Android 1.5 和内核 2.6.30.4 或更早版本的 HTC Dream 100(T-Mobile G1)所采用的技术与同一设备运行 Android 1.6 或更高版本内核的技术截然不同。可以想象,超过 50 家制造商,300 多种 Android 设备,四个主要版本和数百个次要版本,可能的组合非常庞大。

第三,连接到不同 Android 设备时所使用的硬件、驱动程序和软件可能会有所不同。第三章讨论的 Android 软件开发工具包(SDK)确实提供了一定的一致性。然而,每个制造商可能都有自己特定的驱动程序和软件。例如,如果将三星 Galaxy S 连接到运行 Windows 的电脑,你需要先安装三星提供的特定软件。然而,许多其他设备通过谷歌的 SDK 提供了标准的 USB 驱动程序。

最后,每个制造商都有自己的启动过程,包括硬件、引导加载器和 ROM 固件。第六章中,我们将探讨一些针对不同制造商设备启动过程的利用技术。

定制用户界面

Android 的部分内容在 Apache 2.0 开源许可下授权,而不是完整的 GPLv2 开源许可。Apache 2.0 许可让制造商和开发者有能力定制 Android 系统的某些部分,同时免除他们向社区返回源代码的义务。Apache 2.0 许可主要涵盖特定设备的驱动程序,这些驱动程序可能包含制造商的知识产权,以及用户界面定制领域。

谷歌允许制造商定制面向目标受众的关键区域,从而使得 Android 设备能够与竞争对手区分开来。例如,一个 Android 设备可能针对青少年市场,专注于短信和社交应用,而另一个设备可能主要针对商务用户。从根本上说,这些设备运行方式非常相似。然而,用户界面定制(以及硬件设计实施)创造了独特的体验。表 2.1 描述了制造商定制的用户界面。

表 2.1 定制 Android 用户界面

制造商 定制用户界面
摩托罗拉 Motoblur
宏达电 Sense
三星 TouchWiz
索尼爱立信 Rachael, UX, Nexus
宏碁 Touch 3D
戴尔 Stage
优派 TapnTap

市场后 Android 设备

由于 Android 操作系统是开源的,已经创建了定制版本,可以在最初搭载其他操作系统的设备上运行。在一个著名的例子中,存在可以在 iPhone 上安装并运行的 Android 版本(Linux on the iPhone, n.d.)。当这样的壮举完成时,观看苹果粉丝的反应确实很有趣。更实际的是,Android 已经被移植到许多最初搭载 Windows Mobile 的宏达电手机上。还有更多涉及诺基亚等公司以及智能手机以外类别的设备例子。

尽管可能不会经常发生,但考虑到需要司法分析的 Windows 手机(或 iPhone)实际上可能运行的是 Android 系统,这一点很重要。

特定设备

本书将使用以下设备,并在此提供每个设备的简要概述以供参考。其中一些设备是首批商业可用的 Android 智能手机,人们对其非常了解。它们可以以相对合理的价格购买,并且是跟随本书示例进行实验和填充的绝佳设备。

T-Mobile G1

如图 2.8 所示的 T-Mobile G1 是由宏达电制造,并于 2008 年 10 月由 T-Mobile 在美国市场推出。像许多第一代设备一样,这款手机存在可用性问题。然而,在最初六个月内,它的销量超过了一百万台(Krazit, n.d.),作为参考手机非常出色。

image

图 2.8 T-Mobile G1 (DREA100)。

设备信息:

• 制造商:宏达电

• 型号:G1(又名:HTC Dream 100)

• 运营商:T-Mobile

• 发布日期:2008 年 10 月

摩托罗拉 Droid

如图 2.9 所示的摩托罗拉 Droid 由摩托罗拉制造,并于 2009 年 11 月由威瑞森在美国市场发布。在最初的 74 天内,售出了 105 万部 Droid 智能手机,比 2007 年 6 月发布的原始 iPhone 更受欢迎(第 74 天销售情况,不详)。Droid 是一款出色的参考手机,如果你在考虑购买测试设备,你应强烈考虑这款设备。

image

图 2.9 摩托罗拉 Droid (A855)。

设备信息:

• 制造商:摩托罗拉移动设备

• 型号:A855

• 运营商:威瑞森无线

• 发布日期:2009 年 11 月

HTC Incredible

如图 2.10 所示的 HTC Incredible 在威瑞森网络发布,在美国也非常受欢迎。本书广泛使用该设备作为参考手机。

image

图 2.10 HTC Incredible。

设备信息:

• 制造商:HTC

• 型号:ADR6300

• 运营商:威瑞森无线

• 发布日期:2010 年 4 月

谷歌 Nexus One

如第一章所述,谷歌在 2010 年 1 月推出了自己的智能手机,Nexus One(N1),如图 2.11 所示。N1 由 HTC 开发,在各方面都是制造商应该如何开发手机的理想典范。其处理器速度极快(1 GHz),运行的是最新版本的 Android 系统,并具有诸如三个麦克风监测背景噪音并将你的声音融合以创造尽可能清晰的对话等创新功能。

image

图 2.11 谷歌 Nexus One (N1)。

设备信息:

• 制造商:HTC

• 型号:HTC Passion

• 运营商:T-Mobile,威瑞森,沃达丰

• 发布日期:2010 年 1 月

概述

尽管设备组件各不相同,但大多数设备都有几个核心组件是共通的。在许多情况下,对这些组件的基本了解以及对各种设备类型的了解对法医分析师来说已经足够。然而,在调查中显然还有许多其他不同的因素需要考虑。启动过程的高级概述为更深入讨论这些过程奠定了基础,这些将在后续进行进一步探讨。最后,制造商和设备的概述使分析师能够洞察需要考虑的各种因素。Android 市场是分散和多样化的,法医分析师需要记住,在调查 Android 设备时,“一刀切”的策略是行不通的。

参考文献

1. Android-x86—将 Android 移植到 x86。(不详)。2011 年 3 月 9 日检索自www.android-x86.org/

2. Bjo¨rnheden, M.(未注明日期)。Enea Android Blog: 从开机分析 Android 启动过程。2010 年 12 月 17 日检索自Android 启动过程从开机分析

3. Chromium OS—Chromium 项目。(未注明日期)。2010 年 12 月 13 日检索自Chromium OS—Chromium 项目

4. 第 74 天销售:苹果 iPhone vs. 谷歌 Nexus One vs. 摩托罗拉 Droid。(未注明日期)。The Flurry Blog—移动应用分析 jiPhone 分析 jAndroid 分析。2010 年 12 月 18 日检索自第 74 天销售:苹果 iPhone vs. 谷歌 Nexus One vs. 摩托罗拉 Droid

5. Krazit, T.(未注明日期)。T-Mobile 已售出 100 万部 G1 Android 手机。《无线 dCNET 新闻》。技术新闻 dCNET 新闻。2010 年 12 月 18 日检索自T-Mobile 已售出 100 万部 G1 Android 手机

6. Linux 在 iPhone 上。(未注明日期)。2010 年 12 月 15 日检索自Linux 在 iPhone 上

7. 主页面 jPDAdb.net—智能手机、PDA、PDA 手机、PNA、上网本和移动设备规格的综合性数据库。(未注明日期)。2010 年 11 月 28 日检索自jPDAdb.net—智能手机、PDA、PDA 手机、PNA、上网本和移动设备规格的综合性数据库

8. 移动内存。(未注明日期)。Hynix。2011 年 3 月 9 日检索自Hynix 移动内存

9. Nielsen Wire。(未注明日期)。美国智能手机之战升温:哪个是“最想要的”操作系统?。2010 年 12 月 12 日检索自美国智能手机之战升温:哪个是“最想要的”操作系统?

10. OMAP35xx 的公共版本。(2010 年)。技术参考手册—版本 M (SPRUF98M)。德克萨斯州休斯顿:德州仪器公司。2010 年 12 月 17 日检索自OMAP3530 技术参考手册

11. 使用硬件设备。(未注明日期)。Android 开发者。2011 年 3 月 9 日检索自Android 开发者:使用硬件设备

第三章

Android 软件开发工具包和 Android 调试桥

本章信息

• Android 平台

• 软件开发工具包(SDK)

• Android 安全模型

• 取证与 SDK

引言

Android 软件开发工具包(SDK)不仅提供了在 Android 平台上运行的应用程序创建工具,还提供了文档和实用程序,这些在设备的法医或安全分析中可以提供很大帮助。尽管第二章中提到的 Android 硬件在设备能力中扮演了主要角色,但软件则利用这些功能最终创造了消费者寻求的体验和功能性。对 Android SDK 的彻底了解将为我们提供许多关于数据和设备以及我们将在调查中利用的重要实用程序的知识。

Android 平台

Android 在 2007 年 11 月正式发布,但从 2005 年起就一直在进行重大开发。结合大量多样的硬件,利用 Android,创造了一个多元化的生态系统,为法医分析师或安全工程师增加了显著的复杂性。

Android 的一个有趣特点是 Android 平台本身的版本。平台是决定设备可以支持哪些功能的重要因素。官方的 Android 平台每个都分配有一个应用程序编程接口(API)级别,所有较新的版本都会有一个代号。截至 2011 年 1 月,当前的发布版本是代号为 Gingerbread 的 Android 2.3。下一个主要版本有一个代号为 Honeycomb,似乎针对的是预期增长的平板设备。表 3.1 列出了包括 API 级别、代号和发布日期在内的所有 Android 平台(Android 时间线,未标明日期)。

表 3.1 Android 平台

图像

尽管存在许多 Android 版本,但每个版本在当前设备中的分布情况对法医分析师和安全工程师都有很大影响。图 3.1 展示了基于两周内访问 Android Market 的设备调查的 Google 关于 Android 版本分布的报告(平台版本,未标明日期)。

图像

图 3.1 2011 年 1 月 Android 设备平台分布情况。

为了让大家有一个直观的了解,表 3.2 展示了截至 2011 年 11 月,美国流通的各 Android 版本设备总数。这些数据基于大约 1599 万美国 Android 设备人口统计数据(comScore 报告,未标明日期)。

表 3.2 美国按平台划分的 Android 设备数量(近似值)

Android 版本 总设备数
Android 2.3 63,960 台
Android 2.2 8,282,820 台
Android 2.1 5,628,480 台
Android 1.6 1,263,210 台
Android 1.5 751,530 台

谷歌还发布了一张图表,显示了 2010 年 8 月至 2011 年 2 月 2 日七个月间 Android 版本的历史分布情况。数据同样基于访问 Android 市场的设备,并清晰地展示了 Android 更新随时间推移的进展,如图图 3.2 所示(Platform Versions, n.d.)。

图像

图 3.2 2001 年 8 月至 2011 年 2 月 2 日 Android 版本的历史分布情况。

尽管有些设备永远不会支持 Android 的最新版本,但许多设备最终会收到更新。未来的设备可能能够快速支持和升级到最新版本。然而,从法医和安全的角度来看,不能忽视这些较旧的异常值。

通过 2.3.3(姜饼)的 Android 平台亮点

Android 是一个复杂且高度发展的平台,任何尝试完全记录所有功能的努力都将占据本书的很大一部分。然而,简要概述每个主要版本可能对法医分析师有所帮助,使他们了解设备可能支持的功能。一般来说,功能是相互构建的,因此在 Android 1.5 中可用的功能在 Android 2.3.3 中可能得到改进并提供。

Android 1.5

Android 1.5 于 2009 年 4 月发布,其特点和更新内容在表 3.3 中列出(Android 1.5, n.d.)。

表 3.3 Android 1.5 功能和亮点

图像

Android 1.6

Android 1.6 于 2009 年 9 月发布,其特点和更新内容在表 3.4 中列出(Android 1.6, n.d.)。

表 3.4 Android 1.6 功能和亮点

图像

Androids 2.0 和 2.1

Android 2.0 和 2.1 分别于 2009 年 10 月和 2010 年 1 月发布,其特点和更新内容在表 3.5 中列出(Android 2.1, n.d.)。

表 3.5 Android 2.0/2.1 功能和亮点

图像

Android 2.2

Android 2.2 于 2010 年 5 月发布,其特点和更新内容在表 3.6 中列出。

表 3.6 Android 2.2 功能和亮点

图像

Android 2.3

Android 2.3 于 2010 年 12 月发布,其特点和更新内容在表 3.7 中列出。

表 3.7 Android 2.3 功能和亮点

图像

Android 2.3.3

Android 2.3.3 于 2011 年 2 月发布,其特点和更新内容在表 3.8 中列出。

表 3.8 Android 2.3.3 功能和亮点

图像

软件开发工具包(SDK)

Android 软件开发工具包(SDK)是开发 Android 应用程序所需的开发资源。它包括软件库和 API、参考资料、模拟器和其他工具。SDK 支持许多环境,包括 Linux、Windows 和 OS X,并且可以从developer.android.com免费下载。

SDK 还是一个强大的取证工具,分析师在许多情况下使用它来帮助调查 Android 设备。

SDK 发布历史

尽管 Android 平台标志着官方支持的 Android 发布版本,但 SDK 更新更为频繁。表 3.9 提供了完整的 SDK 发布历史,可以在这些情况下提供帮助(SDK Archives, n.d.)。

表 3.9 归档的 Android 平台发布

平台 API 级别 发布日期
Android 1.6 r1 4 2009 年 9 月
Android 1.5 r3 3 2009 年 7 月
Android 1.1 r1 2 2009 年 2 月
Android 1.0 r2 1 2008 年 11 月

安装 SDK

由于 SDK 在调查 Android 设备时至关重要,检查员应该有一个正常工作的安装环境。以下部分提供了在支持平台上安装 SDK 的分步指南。

Linux SDK 安装

这些步骤基于在第一章中用于下载和编译 Android 开源项目 (AOSP) 的 Ubuntu VM,该 VM 已经包括大多数先决条件,包括 Java 开发工具包。从终端窗口安装所需的 32 位库:

注意

32 位库

由于在第一章中构建的 Ubuntu VM 使用了 Ubuntu 的 64 位版本,因此我们必须安装 32 位库来安装 SDK。但是,如果你使用的是 32 位 Linux 工作站,则无需完成此步骤。虽然 32 位工作站可以运行 SDK,但它无法构建版本 2.2 之后的 AOSP。

image

然后,启动 Firefox 并导航至developer.android.com/sdk,下载 Linux i386 平台版本(截至 2011 年 1 月为 android-sdk_r08-linux_86.tgz)。默认操作将在归档管理器中打开归档,如图 3.3 所示。

image

图 3.3 下载 Linux 版本的 Android SDK。

然后右键点击并将归档提取到你的主目录中,如图 3.4 所示。

image

图 3.4 为 Linux 提取 Android SDK。

接下来,在终端窗口中:

image

这将运行 Android SDK 和 Android 虚拟设备 (AVD) 管理器,允许你下载和管理如图 3.5 所示的额外必要组件。

image

图 3.5 Linux 中的 Android SDK 和 AVD 管理器。

为了充分利用 Android SDK,需要安装额外的组件。至少,我们希望安装特定平台的 SDK 工具和至少一个 SDK 平台(在本例中为 Android 2.3),这样我们就可以运行模拟器。要完成安装,请从左侧导航窗格中选择可用包,然后选择如图 3.6 所示的两个附加包。

image

图 3.6 选择附加的 Android SDK 包。

然后选择安装选定内容。你将被提示批准所有软件包的许可,如图 3.7 所示。

image

图 3.7 接受并安装 Android SDK 软件包。

选择接受所有(如果你同意)然后安装。Android SDK 和 AVD 管理器将下载并安装组件。

可选地,你可能想要将二进制目录添加到你的操作系统(OS)执行路径中,这样每次就无需指定程序的完整路径。在 Linux 中,执行以下操作:

image

保存,退出,然后重新打开(Ctrl-O)一个新的 shell。

在 Ubuntu 中,你必须采取的最后一步是创建系统配置中每个 Android 设备制造商的 USB 配置文件,特别是 udev 规则。以 root 用户从终端会话中编辑/创建 udev 规则:

image

复制以下内容(供应商 ID 可以在developer.android.com/guide/developing/device.html#VendorIds找到):

image

然后保存文件。最后,使文件对所有用户可读:

image

你可以选择重启 udev 守护进程,或者直接重启。

Windows SDK 安装

Windows 的最新版 Android SDK,如图 3.8 所示,现在被打包成一个可执行的安装程序,该程序将检测你是否已经正确安装了必要的 Java 依赖项,如果没有,它将为你下载并安装它们。然而,安装程序只检测 32 位 JDK 的安装,并不会在 Windows 7 64 位安装上自动安装 JDK。如果你运行的是 32 位版本的 Windows(例如 Windows XP),那么安装程序可能是一个好的选择,你可以直接从developer.android.com/sdk/index.html下载安装包并运行安装程序。

image

图 3.8 Windows 的 Android SDK 安装程序。

然而,许多分析师和工程师已经转向 64 位操作系统。要在 Windows 上安装 Android SDK,首先通过下载java.sun.com/javase/downloads/来安装 Java SE SDK。确保你安装了完整的 SDK。

安装完 SDK 后,在developer.android.com/sdk/index.html下载 Windows 版 Android SDK 的压缩版本,并将其解压到你的硬盘上。在我们的示例中,我们将直接解压到 C:\,这将创建文件夹 C:\android-sdk-windows。

打开该目录,双击 SDK Manager.exe 开始更新过程。确保你至少选择 Android SDK Platform-tools,如图 3.9 所示,以及一个发布平台(在此示例中为 2.3)。

image

图 3.9 Windows 系统的 Android SDK 管理器。

在 Windows 中使用安卓设备时,你需要指定 USB 驱动程序。Android SDK 最近更新了 USB 驱动程序的安装方式。首先,确保你正在运行 SDK 管理器并选择可用包。展开第三方插件 → Google Inc.插件,最后选择如图 3.10 所示的 Google USB 驱动程序包。

image

图 3.10 Windows 系统的 Google USB 驱动程序包。

然后,接受许可协议并按照图 3.11 所示进行安装。

image

图 3.11 接受并安装许可协议。

安装完 USB 驱动后,你应该拥有所有必要的组件。然而,为了简化从 Android SDK 运行工具,你应该更新你的工作站的环境变量,特别是可执行文件的 PATH。为此,请进入你的控制面板并打开系统应用程序。然后选择可以更新环境变量的标签,其位置会根据你的 Windows 版本有所不同,如图 3.12 所示。最后,找到 Path 系统变量,选择编辑,并添加到你的 Android SDK platform-tools 目录的完整路径,在我们的示例中是;C:\android-sdk-windows\platform-tools

image

图 3.12 更新 PATH 环境变量(Windows 7 64 位)。

“;”很重要,因为它是路径位置的分隔符。完成此更新后,确保退出并等待命令提示符指示新设置已生效。

OS X SDK

在 OS X 上安装 Android SDK,首先从developer.android.com/sdk/index.html下载存档文件,OS X 会自动提取。

导航至图 3.13 所示的工具子目录,然后双击 Android 运行 Android SDK 和 AVD 管理器,如图 3.14 所示。

image

图 3.13 OS X 的提取 Android SDK。

image

图 3.14 在 OS X 上打开 Android。

当管理器运行时,选择可用包,展开安卓仓库,然后选择 Android SDK platform-tools 以及至少一个安卓平台,如图 3.15 所示。

image

图 3.15 在 OS X 上安装 Android SDK 组件。

接受许可协议并完成安装。最后,为了简化从 Android SDK 运行工具,你应该更新你的可执行文件 PATH。在 OS X 10.6 上,运行终端(应用程序 → 实用工具)并执行以下操作:

image

确保完全退出终端应用程序然后重新启动。在终端中,输入:

image

这应该会返回你的可执行路径,并附加了 platform-tools。

安卓虚拟设备(模拟器)

一旦你的工作站上安装了 Android SDK 并且至少下载了一个发布平台,你就可以创建一个 AVD,即虚拟移动设备或模拟器,它在你的电脑上运行。模拟器特别有助于开发者为创建定制应用程序。然而,对于取证分析师和安全工程师来说也具有很高的价值,因为你可以在设备上分析应用程序的执行情况。这在对调查结果进行验证或测试取证工具对 Android 设备的影响时可能很重要。

模拟器需要相当多的资源,因此理想的工作站应该配备较新的 CPU 和足够的 RAM。检查员可能还需要一些耐心。要创建 AVD,首先运行 Android SDK 和 AVD 管理应用程序,如图图 3.16 所示。如果你更新了操作系统的路径,使其包含 SDK 中的工具目录,你应该可以从 shell、终端或命令提示符运行 Android。

image

图 3.16 启动 Android SDK 和 AVD 管理器。

在左侧窗格中,选择虚拟设备,然后选择新建,如图图 3.17 所示。

确保填写以下字段

• 名称:为虚拟设备提供一个名称,例如,af23(Android Forensics 2.3)。

• 目标:选择目标平台,在本例中为 Android 2.3—API 级别 9。

• [可选] SD 卡:可选地为虚拟设备创建一个 SD 卡。

image

图 3.17 创建新的 AVD。

你可以设置其他属性。然而,现在我们将创建最基本的 AVD。另外,如果你遇到运行在较旧平台上的 Android 设备,你可以通过简单地使用 Android SDK 和 AVD 管理器下载 Android 平台来创建运行较旧版本的虚拟设备。当你点击创建 AVD 时,设备将被创建,你会看到一个类似于图 3.18 所示的确认屏幕。

image

图 3.18 AVD 创建确认。

确保新的 AVD 被选中,然后点击开始,此时你会看到如图图 3.19 所示的启动选项提示。

image

图 3.19 AVD 启动选项。

选择你希望启动的任何选项并点击启动。此时,AVD 将开始启动过程,可能需要几分钟或更长时间。在这段时间里,你会看到 Android 正在启动。这如图图 3.20 所示。

image

图 3.20 AVD 启动中。

最后,你会看到一个完全功能的 AVD,如图图 3.21 所示。

image

图 3.21 运行的 AVD。

AVD 非常强大且功能齐全。例如,你可以轻松地上网,如图 3.22 所示,浏览网站。你可以配置电子邮件账户,向其他 AVD 发送测试短信,如果你是开发者,当然还可以部署和测试你的应用程序。

image

图 3.22 运行浏览器的 AVD。

创建并启动 AVD 后,生成数据对于取证和安全研究非常有价值。这些文件在你的主目录中创建,根据平台不同而有所变化,在一个名为.android(注意文件名前的点前缀)的文件夹中。表 3.10 提供了特定的操作系统路径。

表 3.10 AVD 存储目录

工作站操作系统 AVD 存储目录 示例
Ubuntu Linux /home//.android /home/ahoog/.android
Mac OS X /Users//.android /Users/ahoog/.android
Windows 7 C:\Users<username>.android C:\Users\ahoog.android

在 AVD 的.android 目录中,你可以找到运行 AVD 所需的配置和数据文件。

image

特别值得注意的是以下具有取证和安全意义的文件

• cache.img:/cache 分区的磁盘映像

• sdcard.img:SD 卡的磁盘映像(如果在 AVD 设置过程中创建)

• userdata-qemu.img:/data 分区的磁盘映像

cache.img 和 userdata-qemu.img 是 YAFFS2 文件系统,目前取证软件不支持,我们将在第四章中介绍。但是,标准的取证工具在 sdcard.img 上工作得很好,因为它是 FAT32 文件系统。

image

取证分析师和安全工程师可以通过利用模拟器并检查网络、文件系统和数据痕迹来深入了解 Android 及其运行方式。

安卓操作系统架构

了解 Android 的高级架构非常重要,特别是对于安全程序和超越逻辑取证分析。

Android 基于 Linux 2.6 内核,提供了启动和管理硬件及 Android 应用程序所需的基本软件。虽然内核提供的功能非常广泛,但我们将关注图 3.23 中强调的核心区域。

image

图 3.23 安卓架构。

如图 3.23 所示,低级功能包括电源管理、Wi-Fi.com、显示、音频驱动等。从取证的角度来看,最重要的可能是闪存驱动,我们将在第四章中详细探讨。

在内核之后,一套库可供使用,这些库为开发者和设备所有者提供了所需的核心功能。这些包括用于在捆绑的浏览器和第三方应用中渲染 HTML 的 WebKit 库。其他库处理字体、显示、各种媒体,以及使用安全套接字层(SSLs)的安全通信。最后,SQLite 库为 Android 上的结构化数据存储提供了一种方法,这也是法医分析师和安全工程师关注的重点。

核心库随后与自定义的 Java 虚拟机(VM)捆绑在一起,以提供 Android 运行时环境,应用程序就在这里运行。

最后,SDK 通过 API 和一个应用程序框架提供对这些资源的访问。该框架是第三方开发者交互的主要层,它为他们提供了对应用程序所需关键资源的抽象访问。在我们探索逻辑取证技术时,应用程序框架的一个重要方面——内容提供者——将详细解释,因为它们是我们从 Android 设备提取数据的主要机制。

Dalvik VM

Dalvik 虚拟机(Dalvik VM)是由谷歌开发的,旨在创建一个高效且安全的移动应用环境。

为了实现所需的安全性,每个应用程序都在其自己的 Dalvik VM 上运行。因此,Dalvik VM 被编写成可以在 Android 设备上同时运行多个 VM。Dalvik VM 在很大程度上依赖于 Linux 操作系统,提供诸如访问核心库和硬件、威胁和安全管理、内存管理等低级功能。

为了提高效率,在 Dalvik VM 中运行的应用程序有一种特殊的格式,称为 Dalvik 可执行文件(.dex)。开发者使用 Sun 的 Java 开发工具包编写和编译他们的程序,然后生成的字节码被转换成.dex 文件,该文件提供了高效的存储,并针对在 Dalvik VM 中的执行进行了优化。由知名 Android 黑客 JesusFreke 开发的一个有趣的项目叫做 smali/baksmali。这个项目允许用户反编译.dex 文件,以确定应用程序的功能(smali, n.d.)。

Dalvik 是 Android 的一个独特方面,也是设备法医和安全分析的一个关键组件。

本地代码开发

尽管大多数 Android 应用程序是使用 SDK 用 Java 编写的,但谷歌提供了一个更底层的开发平台,即他们的本地开发工具包(NDK)。NDK 首次发布于 2009 年 6 月,并经历了五次修订,最新版本在 2010 年 11 月发布。

NDK 允许开发者在 C/C++中编写代码,并直接为 CPU 编译。虽然这增加了开发过程的复杂性,但一些开发者可以通过重用现有的 C/C++代码库或实现可以在 Dalvik VM 之外优化的某些功能来从中受益。NDK 不允许开发者创建完全在 Dalvik VM 之外运行的应用程序;相反,C/C++组件被打包在应用程序的.apk 文件中,并在 VM 内由应用程序调用。

目前,NDK 支持 ARMv5TE 和 ARMv7-A CPU,将来还会支持英特尔的 x86 CPU 架构。当开发者在一种平台(例如,Mac OS X)上编写代码,但为另一种 CPU 编译时,这种技术被称为交叉编译应用程序。NDK 极大地简化了这一过程,并提供了一套开发者可以使用的库。

从取证和安全的角度来看,交叉编译是研究和开发新技术和漏洞利用的重要部分。尽管大多数取证分析师和安全工程师不需要编译代码,但了解这个过程如何工作以及它在其中扮演的角色是很重要的。例如,最初的 Android 1.5 获取根权限的漏洞利用了 Linux 内核的一个错误(CVE-2009-2692)来获取权限。最初分发的代码是源代码,需要交叉编译。这种方法的一个显著优势是,检查员可以详细描述设备是如何被利用的,并在必要时提供源代码。

随着 Android 的成熟,预计会在 NDK 和本地编译代码方面看到更多的发展。

Android 安全模型

Android 平台通过一系列旨在保护用户的控制措施来实现安全性。

当一个应用程序首次安装时,Android 会检查.apk 文件,以确保它有一个有效的数字签名来识别开发者。与 SSL 不同,数字证书不需要由证书授权中心签署。然而,开发者必须妥善保管密钥;否则,有人可能会签署一个恶意应用程序并以该开发者的身份分发。例如,如果一个金融机构的数字签名被泄露,一个恶意的开发者可以发布一个银行应用程序的更新,窃取关键数据。

在验证了.apk 文件之后,Android 会检查开发者创建的特殊文件,该文件指定了应用程序需要系统权限的各个方面,例如,应用程序可能请求访问用户的联系人、短信和网络/互联网。如果这个应用程序为短信系统增加了功能,这些权限似乎是合理的。然而,如果应用程序只是更改你的背景图片,那么用户应该质疑这个权限,并可以选择不安装该应用程序。实际上,用户通常会快速同意所有权限和应用程序的请求,从而可能允许恶意应用程序安装。

在应用程序经过验证并且用户授予了请求的权限之后,应用程序现在可以在系统上安装。Android 安全模型的一个关键部分是,每个应用程序都会分配一个唯一的 Linux 用户和组 ID,并在自己的进程和 Dalvik VM 中运行。在安装过程中,系统会在设备上创建一个特定的目录来存储应用程序数据,并且只允许该应用程序通过 Linux 用户 ID 和组 ID 权限访问这些数据。此外,应用程序的 Dalvik VM 也会以特定的用户 ID 在其自己的进程中运行。这些关键机制在操作系统级别强制执行数据安全,因为应用程序不共享内存、权限或磁盘存储。应用程序只能访问其 Dalvik VM 内的内存和数据。

当然,这个过程有几个例外。首先,开发者可以使用相同的数字证书为多个应用程序签名,并指定它可以与他们的其他应用程序共享相同的用户 ID、进程、内存和数据存储。这种情况是例外的,通常用于开发者同时拥有免费和付费版本的情况。如果用户升级到付费版本,他们可以利用使用免费版本时积累的数据,因此不会丢失任何数据。

同时,大多数 Android 用户可以选择允许应用程序从非市场位置安装,并跳过数字签名检查。这个选项可以从设备设置中的应用程序菜单中访问,当选择时,会向用户显示一个警告,如图图 3.24 所示。

image(图片无需翻译,保留英文描述即可)

图 3.24 Android 设置允许从未知来源安装应用程序。

最常见的情况是用户现在可以直接从网站下载.apk 文件来安装应用程序,安装过程也会跳过数字签名检查。近期一款 AT&T 手机(摩托罗拉 Backflip)从 Android 中移除了这一选项,令许多用户感到不满(Android On Lockdown, n.d.)。然而,使用 Android SDK 的一个变通方法确实存在,我们将在第六章中进行讨论。

由于 Android 内置的安全架构,取证检查员无法简单从设备中提取核心用户数据。除了漏洞利用之外,安全架构在隔离和保护应用程序之间的数据方面是有效的。

取证与软件开发工具包(SDK)

那么 SDK 在取证中有多重要呢?SDK 不仅提供了一套工具和驱动程序,以便分析 Android 设备,而且对于应用程序剖析和其他取证研究也很有用。

将 Android 设备连接到工作站

重要的是要注意 Android 设备实际是如何连接到虚拟机的。截至目前,Android 设备有一个物理 USB 接口,允许它们连接、共享数据和资源,并且通常可以从计算机或工作站充电。如果你只运行一个操作系统,USB 设备应该能被检测到并可以访问。然而,如果运行虚拟机,你可能需要额外的配置或驱动程序。例如,如果你的宿主操作系统是 OS X 并且你正在运行 VMWare fusion,你可以选择菜单“虚拟机 → USB”,然后连接设备(在本例中是高 Android 手机),如图 3.25 所示。

image

图 3.25 在 VMWare Fusion 中连接 USB 设备到 Ubuntu VM。

同样,如果你的宿主操作系统是 Linux,并且你正在使用 Oracle 的 VirtualBox 运行虚拟机,首先需要确保你是 usbusers 组的成员。因此,从终端会话中执行以下命令:

image

接下来,进入虚拟机的设置,为设备添加 USB 过滤器,如图 3.26 所示。

image

图 3.26 在运行 Oracle VirtualBox 的 Linux 主机上添加 USB 过滤器。

最后,你可以像图 3.27 所示那样连接 USB 设备。

image

图 3.27 在运行 Oracle VirtualBox 的 Linux 主机上连接 USB 设备。

最后,如果你以无头模式运行虚拟机(如第一章所述的 VirtualBox 3.2.10),以下是你要执行的步骤。首先,需要安装 VBox 附加组件,这将启用共享文件夹、更好的视频、USB 支持(如果你下载/购买了 PUEL 版本)和其他功能。从宿主工作站开始:

image

现在 Ubuntu 虚拟机应该可以访问 DVD 了。再次远程桌面进入虚拟机(有关必要步骤请参阅第一章),然后双击桌面上的 VBOXADDITIONS_3.2.0_61806 DVD 以打开 DVD。接着双击 autorun.sh 并选择运行选项。输入密码后,安装将继续进行。图 3.28 展示了这一步骤。

image

图 3.28 通过 Ubuntu VM 远程桌面协议安装 VBox 附加组件。

既然你已经安装了 VBox Additions,那么你可以将 USB 设备连接到你的客户操作系统。但首先,你必须关闭虚拟机。然后,按照以下步骤操作:

image

使用此示例,USB 设备现在应该已经传递到虚拟机。

USB 接口

当你通过单个 USB 端口将 Android 设备连接到工作站或虚拟机时,硬件和 Android 本身通常会公开多个虚拟 USB 接口。例如,当你通过 USB 连接 HTC Incredible 时,你会看到一个包含四个选项的菜单:

  1. 仅充电—通过 USB 为手机充电

  2. HTC 同步—同步联系人和日历

  3. 磁盘驱动器—作为磁盘驱动器挂载

  4. 移动宽带连接—将智能手机的移动网络与 PC 连接

默认选择,如图 3.29 所示,是仅充电选项。HTC 同步和移动宽带连接选项是 HTC 以及有时无线运营商为设备提供的自定义选项和程序。

image

图 3.29 HTC Incredible 连接到 PC 的选项。

CD-ROM 接口

磁盘驱动器选项更通用。此选项将 Android 设备作为磁盘驱动器连接到工作站。这是设备向工作站公开多个 USB 设备的关键区域。当你首次将 HTC Incredible 插入计算机时,实际上注册了三种不同类型的驱动器:一个 CD-ROM 和两个 USB 大容量存储设备。以下列表是从 Linux 工作站的内核消息中获取的,使用了 dmesg 命令:

image

如你所见,在 4:0:0:0 和 4:0:0:1 处找到了两个直接访问驱动器,以及在 4:0:0:2 处找到了一个 CD-ROM。CD-ROM 包含 HTC 与设备捆绑在一起的自定义程序和驱动,以实现同步和宽带连接功能。显然,没有物理 CD-ROM。然而,设备的存储空间有一部分专用于 CD-ROM,并格式化为 ISO9660。宿主操作系统可以将其作为 CD-ROM 挂载,并且在 Windows 中,甚至可能支持自动运行功能。利用 TSK 的 fsstat 程序,我们可以看到有关分区的更多详细信息:

image

image

从卷名称可以看出,CD-ROM 包含由 Verizon 提供的软件,用于使用设备的附加功能。

SD 卡(可移动和虚拟)

从法医的角度来看,更重要的是通过设备可访问的 SD 卡。在 Android 中,将用户文件,尤其是如多媒体这样的大文件放置在 SD 卡上是关键策略。大多数 Android 设备有一个可拆卸的媒体插槽,可接受 micro-SD 卡。核心应用程序数据保留在设备上(位于 /data/data 下),但在调查中可能重要的文件也可能存在于 SD 卡上。

在上一节中,当通过 USB 连接 Android 设备时,Linux 工作站的内核信息显示了可用的各种 USB 设备。列出的两个 SCSI 可移动磁盘 sdb 和 sdc,代表 HTC Incredible 上的 SD 卡。如果您在“连接到电脑”下选择“作为磁盘驱动器挂载”选项,内核信息将显示以下附加消息:

image

现在您将看到有关 SD 卡的更多信息。驱动器 sdc 有一个分区 sdc1,其大小为 2 GB。我们可以通过运行 TSK 的 mmls 来查看附加的分区信息:

image

您会看到,SD 卡被格式化为 FAT16 文件系统,但通常您会遇到 FAT32,或者可能会遇到像 FAT32 和本地 Linux 文件系统 ext3 和 ext4 这样的多种文件系统。

近年来,设备还拥有一个模拟或虚拟的 SD 卡功能,该功能使用设备的 NAND 闪存创建一个不可拆卸的 SD 卡。这更接近于 iPhone 的模型,用户数据分区直接位于 NAND 闪存上,且无法移除。在上述示例中,sdb 设备提供了对模拟 SD 卡的访问。与物理 SD 卡不同,sdc 没有分区表,文件系统直接从开头开始。要查看重要信息,请运行 TSK 的 fsstat:

image

image

在这个特定情况下,文件系统实际上是 FAT32,您会注意到尽管卷没有标签,但 OEM 名称设置为 BSD 4.4。

警告

自动挂载 USB 设备

在第一章的 Ubuntu 虚拟机配置部分,禁用了自动挂载功能,以防止操作系统自动检测并挂载 USB 存储设备。取证分析师应采取极端谨慎的措施,防止在调查中的设备发生这种情况。除了禁用自动挂载外,通常应通过 USB 写保护器连接设备。

在 Ubuntu 中,如果您没有禁用 USB 设备的自动挂载(在几乎所有情况下都应该禁用),则 SD 卡会自动为您挂载。如果设备连接到硬件写保护器,以只读方式挂载,或者在不需要写保护的情况下(例如,研发情况),您可以在 Linux 中运行 df 命令来查看它们被挂载的位置:

image

物理 SD 卡被挂载在/media/E0FD-1813 上,而模拟 SD 卡被挂载在/media/C7F8-0810 上。

在 Android 设备本身上,两个 SD 卡以下列方式挂载:

image

USB 调试

最后一个重要的 USB 接口是 Android 调试桥(ADB),它允许开发人员、取证分析师或安全工程师通过 USB 与 Android 设备进行通信和控制。默认情况下,AVD(在模拟器中运行)将启用 USB 调试。然而,非模拟器设备必须明确启用 USB 调试。要启用,请从设备的设置中选择应用程序→开发,如图 3.30 所示。最后,勾选 USB 调试。

image

图 3.30 启用 USB 调试。

设置后,设备将在后台运行 adb 守护进程(adbd)并等待 USB 连接。守护进程将在非特权 shell 用户账户下运行,以限制其对数据的访问。启用了 root 访问权限的 AVD 和物理设备将作为 root 运行 adbd,从而提供对系统的完全访问。关于此主题的更多详细信息将在第六章中介绍。

在 Android 的新版本中,任何时候启用 USB 调试的设备通过 USB 连接,它都会显示一个安全警告,如图 3.31 所示。

image

图 3.31 USB 调试警告。

对于当前所有的逻辑 Android 取证工具,必须启用 USB 调试。如果设备未锁定,实现这一点是微不足道的,但如果设备有密码,则要困难得多。有一些技术可以绕过密码,这在第六章中有所讨论。然而,它们并不在所有平台上都有效。

Android 调试桥简介

在本书的其余部分,我们将广泛使用 adb,因此现在掌握基础知识很重要。在使用 adb 时,涉及到三个主要组件:

1. 运行在 Android 设备上的 adbd

2. 运行在工作站上的 adbd

3. 运行在工作站上的 adb 客户端程序

如前所述,当你在 Android 设备上启用 USB 调试时,守护进程将会运行并监听连接。设备上的 adbd 与工作站上的 adbd 之间的通信是通过 USB 连接之上的虚拟网络进行的。守护进程通过本地主机的端口 5555 至 5585 进行通信。当工作站的 adbd 检测到新的模拟器或设备时,它会创建两个连续的端口连接。偶数端口与设备的控制台通信,而奇数端口用于 adb 连接。本地 adb 客户端程序使用端口 5037 与本地 adbd 通信。

你可以发出的最基本的 adb 命令是 adb devices 命令,它提供了已连接设备的列表。

image

另一个重要的命令提供了杀死本地 adb 服务的能力。为此,请输入以下内容:

image

如你所见,如果工作站上的 adbd 没有运行,它将被自动启动。在 Ubuntu 上,如果你收到以下响应:

image

连接的 Android 设备很可能有一个新的供应商 ID,必须通过(sudo lsusb -v)识别并将其添加到“SDK 安装”部分讨论的 udev 规则中。在 Microsoft Windows 中,如果 Android 设备未被识别,你会收到警告,并且必须从 Google 或制造商处安装适当的 USB 驱动程序。

所有分析师和工程师都应该知道的一个强大的 adb 命令是“adb shell”,它允许你打开 Android 设备上的 shell 并与系统交互。这对于任何探索 Android 的人来说都是一个重要的功能。例如,启动一个 AVD 并按照以下步骤查看设备上的应用程序数据目录:

image

image

随着每个新 SDK 的发布,adb 的功能不断增强,是一个非常强大的工具。在第六章中,将详细探讨一些功能,包括:

  1. 在设备上运行 shell 命令

  2. 使用命令行安装应用程序

  3. 在你的工作站和设备之间转发端口

  4. 递归地将文件和文件夹复制到设备或从设备中复制出来

  5. 查看设备日志文件

关于 adb 命令的完整文档可以在 Android 开发者网站上找到:developer.android.com/guide/developing/tools/adb.html#commandsummary

在 Android 模拟器上测试各种命令是理解这个工具并在调查中利用它的一个很好的方法。

概述

Android SDK 不仅提供了对 Android 平台的深入洞察,而且还提供了强大的工具来从取证和安全的角度调查设备。一旦 SDK 安装在取证工作站上,检查员就可以通过 USB 连接与 Android 设备交互,前提是启用了 USB 调试功能。不仅可以从设备查询信息,还可以安装、运行应用程序,并最终从设备提取数据。Android SDK 是用于取证和安全分析的重要工具。

参考文献

  1. Android 时间线(n.d.)。Android 教程、新闻、观点和论坛,Android 学院。2011 年 3 月 12 日检索自:www.androidacademy.com/1-android-timeline

  2. 平台版本(n.d.)。Android 开发者。2011 年 3 月 12 日检索自:developer.android.com/resources/dashboard/platform-versions.html

3. comScore 报告 2010 年 11 月美国移动用户市场份额——comScore, Inc(未注明日期)。comScore, Inc.——衡量数字世界。2011 年 3 月 12 日检索自 www.comscore.com/Press_Events/Press_Releases/2011/1/comScore_Reports_November_2010_

4. 安卓 1.5 平台(未注明日期)。安卓开发者。2011 年 3 月 12 日检索自 developer.android.com/sdk/android-1.5.html

5. 安卓 1.6 平台(未注明日期)。安卓开发者。2011 年 3 月 12 日检索自 developer.android.com/sdk/android-1.6.html

6. 安卓 2.1 平台(未注明日期)。安卓开发者。2011 年 3 月 12 日检索自 developer.android.com/sdk/android-2.1.html

7. SDK 存档(未注明日期)。安卓开发者。2011 年 3 月 13 日检索自 developer.android.com/sdk/older_releases.html

8. smali-在 Google Code 上的项目托管(未注明日期)。Google code。2011 年 3 月 13 日检索自 code.google.com/p/smali/

9. 安卓系统受限:AT&T 从 Backflip 中移除了安卓的最佳功能(未注明日期)。AndroidGuys。一个值得信赖的安卓新闻和观点来源,成立于 2007 年。2011 年 3 月 13 日检索自 www.androidguys.com/2010/03/08/android-lockdown-att-removes-parts-android-backflip/

第四章

Android 文件系统和数据结构

本章信息

• 壳层中的数据

• 内存类型

• 文件系统

• 挂载的文件系统和目录结构

引言

虽然支持 Android 设备的底层硬件和软件非常吸引人,但法医分析师和安全工程师的主要关注点是获取、分析和理解设备上存储的数据。与讨论的其他主题一样,为了有效分析,了解存储的数据类型、存储位置、存储方式以及存储介质的物理特性等许多细微差别非常重要。所有这些因素在决定哪些数据可以恢复以及如何分析这些数据方面起着主要作用。

壳层中的数据

法医分析师主要关注可以从他们调查的设备中恢复的数据遗迹。Android 结合了在 Linux 中发现的众所周知的遗迹以及完全新的遗迹,例如 Dalvik VM 和 YAFFS2 文件系统。不同制造商采用的多种架构增加了复杂性。

尽管没有一本书或检查员能够彻底涵盖这个话题,但 Android 设备有一些共同的基本概念。文件系统、文件和其他遗迹是法医分析师为了使调查效果最大化必须了解的 Android 核心内容。

存储的数据类型

Android 设备存储大量数据,通常结合了个人和工作数据。应用程序是这些数据的主要来源,应用程序的来源包括:

• 随 Android 提供的应用程序

• 制造商安装的应用程序

• 由无线运营商安装的应用程序

• 额外的 Google/Android 应用

• 用户安装的应用程序,通常来自 Android 市场

第七章,Android 应用程序和法医分析,将详细研究这些应用程序中的许多,尽管本书的范围当然不可能涵盖所有可能性。在 Android 设备上找到的数据样本包括以下内容:

• 短信(SMS/MMS)

• 联系人

• 通话记录

• 电子邮件信息(Gmail、Yahoo、Exchange)

• 即时通讯/聊天

• GPS 坐标

• 照片/视频

• 网络历史

• 搜索历史

• 驾驶方向

• Facebook、Twitter 和其他社交媒体客户端

• 设备上存储的文件

• 音乐收藏

• 日程安排

• 财务信息

• 购物历史

• 文件共享

应用数据存储目录结构

Android 应用程序主要在两个位置存储数据:内部存储和外部存储,这两部分将在本章后面详细介绍。然而,对数据存储目录结构有一个高层次的了解是有帮助的。

在外部数据存储区域(SD 卡和模拟 SD 卡),应用程序可以按意愿在任何位置存储数据。然而,内部数据存储由 Android API 控制。当应用程序安装后(通过市场或直接提供给消费者的构建版本),内部数据存储在以包名命名的/data/data/子目录中。例如,默认的 Android 浏览器具有包名 com.android.browser,因此数据文件存储在/data/data/com.android.browser 中。尽管应用程序不要求存储数据文件,但大多数都会存储。

在应用程序的/data/data 子目录内部,有许多在许多应用程序中都能找到的标准目录以及开发者控制的目录。表 4.1 列出了最常见的标准子目录。

表 4.1 常见/data/data/子目录

shared_prefs 以 XML 格式存储共享偏好设置的目录
lib 应用程序所需的自定义库文件
files 开发者保存到内部存储的文件
cache 应用程序缓存的文件,通常是网页浏览器或其他使用 WebKit 引擎的应用程序的缓存文件
databases SQLite 数据库和日志文件

表 4.1 仅展示了应用程序的/data/data 文件中最常见的子目录。在本书的后续内容中,我们将详细列出许多额外的文件夹和数据文件。

数据存储方式

Android 为开发者提供了五种在设备上存储数据的方法。法医检查员至少可以在五种格式中的四种中找到数据。因此,详细理解每一种格式非常重要。

持久数据存储在 NAND 闪存、SD 卡或网络上。具体来说,五种方法包括:

  1. 共享偏好设置

  2. 内部存储

  3. 外部存储

  4. SQLite

  5. 网络

除了应用开发者存储的数据外,Linux 内核和 Android 堆栈还通过日志、调试和其他标准信息服务提供信息。

共享偏好设置

共享偏好设置允许开发者以轻量级的 XML 格式存储基本数据类型的键值对。可以在偏好设置文件中存储的基本数据类型包括以下几种:

  1. boolean: 真或假

  2. float: 单精度 32 位 IEEE 754 浮点数

  3. int: 32 位有符号二进制补码整数

  4. long: 64 位有符号二进制补码整数

  5. strings: 字符串值,通常为 UTF-8 编码

利用这些基本类型,开发者可以创建并保存为他们的应用程序提供动力的简单值。

共享偏好设置文件通常存储在应用程序数据目录的 shared_pref 文件夹中,并以.xml 结尾。在我们参考的 HTC Incredible Android 手机上,共享偏好设置目录包含五个 XML 文件:

图像

com.android.phone_preferences.xml 首选项文件包含了 int、boolean 和 string 首选项的示例:

图像

如你所见,XML 文件在文件开始处描述了字符串编码类型,在这种情况下是 UTF-8。有三个首选项保存了各种设置和特性。从法医的角度来看,最有趣的可能就是 updateAreaCode.xml 了。

图像

该文件查询了移动目录号码(MDN)并将设备的区号存储在此文件中,推测是为了在支持该功能的地区提供七位数字拨号选项。

由于许多应用程序利用轻量级的 Shared Preferences 方法来存储键值对,因此它可以成为丰富的法医数据来源。特别是当检查员可以恢复 XML 首选项文件的旧版本或已删除版本时,这一点尤其正确。

内部存储的文件

文件允许开发者存储更复杂的数据结构,并保存在文件内部存储的几个位置。这些文件存储在应用程序的/data/data 子目录中,开发者可以控制文件类型、名称和位置。默认情况下,只有应用程序可以读取这些文件,即使设备所有者没有 root 权限也无法查看这些文件。开发者可以覆盖安全设置,允许其他进程读取甚至更新文件。

提示

识别自定义文件

确定应用程序子目录中哪些文件属于这一类别的最佳方式是通过排除法。基本上,应用程序中/data/data/子目录下不属于 shared_prefs、lib、cache 或 databases 子目录的任何文件都是开发者创建和控制的文件。

让我们研究一下 com.google.android.apps.maps,它提供了保存于内部存储的文件的好例子:

图像

应用程序使用了大多数可用的存储机制,在内部存储的 app_ 和 files 目录中存储文件。app_ 目录有多个子目录和一个未知的 cache_r.m 文件格式:

图像

files 目录存储了应用程序显示和更新 Google Maps 所需的大量数据文件:

图像

图像

这些文件清楚地表明了可能对法医分析师或安全工程师感兴趣的数据。在第七章,Android 应用程序和法医分析中,将更详细地介绍应用程序及其存储数据的数据分析。

外部存储的文件

虽然存储在内部设备存储上的文件具有严格的安全性和位置参数,但各种外部存储设备上的文件限制要少得多。

首先,使用可移动 SD 卡的一个重要动机(除了成本之外)是数据可以在其他设备上使用,可能是升级后的 Android 设备。如果消费者购买了一部新的 Android 设备,插入之前包含他们所有家庭成员照片和视频的 SD 卡,却发现自己无法访问这些内容,他们将会非常沮丧。

为了便于在桌面计算机上挂载 SD 卡以共享文件,SD 卡通常使用微软的 FAT32 文件系统格式化。虽然该文件系统得到了广泛支持,但它缺少如 ext3、ext4、yaffs2、hfsplus 等文件系统内置的细粒度安全机制。因此,默认情况下,文件无法强制执行权限。

例如,前面提到的 com.google.android.apps.maps 应用程序也会在 Android/data 子目录下的 SD 卡上存储数据。以下是来自参考的 HTC Incredible SD 卡(挂载在 /mnt/sdcard)的文件和目录列表:

image

同样,HTC Incredible 配备了一个存储在 NAND 闪存上的模拟 SD 卡。模拟 SD 卡挂载在 /mnt/emmc 上。以下是存储相册 JFIF 缩略图的子目录列表:

image

如你所见,开发者对外部 SD 卡和模拟 SD 卡上的文件名称、格式和位置有着很大的控制权。

SQLite

另一个开发者可以利用的 NAND/SD 卡存储方式是一种特定类型的文件——SQLite 数据库。数据库用于结构化数据存储,而 SQLite 是一个在许多移动系统以及传统操作系统上广泛出现的流行数据库格式。

SQLite 因多种原因而受到欢迎。值得注意的是整个代码库质量高,开源,并且发布到公共领域。文件格式和程序本身非常紧凑,在不到几百千字节的空间内实现了显著的功能。与 Oracle、MySQL 和 Microsoft 的 SQL Server 等更传统的关系数据库管理系统(RDBMS)不同,SQLite 整个数据库包含在一个跨平台的单一文件中。

Android SDK 提供了专门的 API,允许开发者在他们的应用程序中使用 SQLite 数据库。SQLite 文件通常存储在内部存储的 /data/data//databases 目录下。然而,创建数据库在其他位置并没有限制。

SQLite 数据库是丰富的法医数据来源。基于 WebKit 开源项目(webkit.org/)的内置 Android 浏览器提供了一个很好的例子。在我们参考的 HTC Incredible 中,有 28 个 SQLite 数据库位于 /data/data/com.android.webkit 的子目录下。在这个例子中,五个子目录如下:

• app_icons:一个网页图标数据库

• app_cache:一个包含网页应用数据缓存的数据库

• app_geolocation: 与 GPS 位置和权限相关的 2 个数据库

• app_databases: 21 个数据库,为支持网站提供本地数据库存储

• databases: 浏览器和浏览器缓存的 3 个数据库

从这些文件中恢复具有取证价值的数据的可能性非常高。

网络

开发者可用的最后一种数据存储机制是网络,这是设计为网络感知设备的一个关键优势。最初,很少有应用程序利用网络作为存储选项。然而,随着 SDK、应用程序和设备的成熟,网络存储选项正在被更多地利用。

安卓开发者网站为那些对网络存储感兴趣的人提供了非常少的详细信息。他们的整个文档只有短短两句话长(Data storage, n.d.)。

当网络可用时,您可以使用网络来存储和检索您自己的基于网络服务的数据。要进行网络操作,请使用以下软件包中的类:

• java.net.^∗

• android.net.^∗

文档中提到的软件包基本上为开发者提供了与网络、网络服务器等交互所需的基础 API。利用网络的程序需要更多的自定义编码,而且并非所有具有取证价值的数据都存储在设备上,但通常可以恢复重要的配置和数据库文件。

例如(作为对第七章,Android 应用程序和取证分析的预览),Dropbox 是一个受欢迎的文件共享网站,它有适用于 Android、黑莓和 iOS 设备的移动应用。他们当前的 Android 应用程序(版本 1.0.3.0)在 Android Market 上的下载量已超过 25 万次,拥有超过 35,000 个用户评分,大多数评分都很高。安装应用后,您可以在/data/data/com.dropbox.android 找到应用程序文件夹,其中包括四个标准目录:

图像

log.txt 是活动详细日志,以下提供几行以供参考:

图像

在上述列表中强调了一些可能感兴趣的项,具体包括:

  1. 所有操作都有时间戳

  2. 成功认证用户,提供了用户名

  3. 从图库导入图片

  4. SD 卡上的特定文件已上传

  5. Dropbox 服务被电话中断

该应用还有一个共享偏好文件:

图像

使用 sqlite3 命令行程序快速检查 db.db,可以得到以下数据(您也可以使用图形化 SQLite 浏览器查看数据库):

图像

数据库提供了关于 Dropbox 应用程序、设备以及最终用户和可能交互的人的重要法医和安全数据。"Android intro.pdf"文件在安装并登录 Android 应用时,由 Dropbox 自动同步到 Dropbox 账户。当查看共享的 PDF 文件时,它被缓存在 SD 卡上。关于文件及其使用的额外元数据包含在数据库中。尽管 Dropbox 在其应用程序中广泛使用网络数据存储,我们仍然可以恢复有用的信息。

内核、系统和应用程序日志

在标准的 Linux 文件系统中,法医分析师和安全工程师还可以找到与调查或审计相关的文件和信息。不幸的是,这个范围相当广泛且令人望而却步,但我们可以至少提供一个查找相关信息起点的地方。

日志文件和调试是开发人员和系统管理员维护系统和应用程序的两种常见且有效的方法。它提供了对应用程序以及运行它们的系统的洞察。虽然并非在每种情况下都适用,但只需检查 Android 设备上的各种日志和调试文件,就可能获得重要信息。

Linux 内核日志

Linux 内核是 Linux 操作系统的底层抽象接口,它提供了访问设备硬件的能力。由于内核在设备上的所有功能中都起着核心作用,因此记录关键事件和活动的能力非常有价值。在 Linux(以及 Android)设备上,可以通过命令 dmesg 访问内核日志。这将把所有可用的内核信息打印到控制台,部分信息如下所示:

image

image

您可能会注意到,数据非常详细且属于低级别。然而,它可以提供重要时间戳和活动信息,以及关于设备启动的大量信息。但是,如果设备最近没有重启,那么启动时的初始日志将不再可用。

这个命令在设备上不需要任何特殊权限,只需启用 USB 调试即可。如果您在设备或模拟器上运行此命令,您会注意到屏幕上显示了过多的数据。您可以通过将 dmesg 的内容传递(或发送)到名为 wc(代表单词计数)的程序,并指示它计算日志中的行数来确定日志中的总行数:

image

因此,在参考的 HTC Incredible 上,我们有 1859 行内核日志。如果您需要更仔细地检查信息,或者将其包含在报告中,您可以使用以下命令将 dmesg 的输出重定向到文件中:

image

你现在可以通过在文本编辑器或显示程序中打开 dmesg.log 来检查可用内核日志的内容。

logcat

安卓有几个额外的调试技术可用。一个程序,logcat,显示一个持续更新的系统和应用程序调试信息列表。

image

image

快速浏览上述的小日志片段可以揭示

• 经度和纬度数据

• 日期/时间信息

• 应用程序详情

日志记录非常详细,这里提供的样本只是可用内容的一小部分。每个日志消息都以消息类型指示符开始,在表 4.2 中有描述。

表 4.2 日志方法类型

消息类型 描述
V 详细
D 调试
I 信息
W 警告
E 错误
F 致命
S 静默

logcat 程序还提供了完整的蜂窝无线调试日志,可以通过以下命令查看(仅包含部分无线日志):

image

尽管日志记录详细且通常难以理解,但扫描上述日志可以提供如下信息:

• 事件时间(以 Unix 纪元时间表示,例如,t=1296218163)

• 用于与蜂窝调制解调器通信的 AT 命令

• 接收者、大小、时间和编码的短信信息

• 设备的蜂窝 IP 地址、网络和位置信息

• 无线运营商信息

这些信息属于非常底层的。然而,如果恢复这些日志,它们可以揭示关于设备的重要信息。

注意事项

Unix 纪元时间

Unix 纪元时间是基于 Unix/Linux 系统的的时间戳常见格式。时间戳是一个整数值,表示自 1970 年 1 月 1 日以来的秒数(或毫秒数)。使用秒的时间戳通常有 10 位数字,而使用毫秒的时间戳将有 13 位数字。时间戳在第七章中有更详细的介绍。

logcat 最后一个特性是事件日志显示:

image

同样,这个日志非常详细。然而,随着系统内发生不同的事件,它们在这里记录了大量的信息。在之前的日志片段中,我们可以看到对 mmssms.db 的 INSERT 和 SELECT 语句,该数据库用于存储短信。

dumpsys

下一个日志机制是通过一个名为 dumpsys 的命令访问的。

Dumpsys 提供了有关服务、内存和其他系统详细信息的信息,这些信息可能很有帮助。提供的一些信息类型包括

• 当前正在运行的服务

• 每个服务的转储

• 当前活动管理器状态下的服务、广播、待定意图、活动和进程

• 包括内存、进程 ID(PIDs)、数据库等在内的进程信息

接下来列出了来自参考 HTC Incredible dumpsys 的样本部分,并简要解释了这些数据对法医分析师或安全工程师可能具有的价值。

首先,你按照如下方式运行 dumpsys 命令:

图像

涉及“account”服务详细信息的部分,包含了关于设备上使用的各种账户的宝贵信息。

图像

你不仅可以看到使用的程序,还可以看到特定于用户的账户名称。例如,上述信息透露了:

• 具有用户名 book@viaforensics.com 的 Google 账户

• 与用户名 book@viaforensics.com 的 Exchange ActiveSync (EAS) 账户(与上述 Google 账户分开)

• 安德鲁·胡格的 Facebook 账户

• viaforensics 的 Twitter 账户

• 为 personal@emailaddress.com 的 Google 账户(设备上的第二个)

在日志进一步内容中,同样提供了最后 10 次同步的实际时间戳:

图像

另一个服务被幽默地命名为“iphonesubinfo”,尽管名字相似,但显然与苹果的 iPhone 无关。

图像

从这一部分可以获取手机类型和设备 ID(已更改)。设备 ID 不是设备的序列号,而是移动设备标识符(MEID),在 CDMA 网络上唯一标识设备。

另一个重要的信息来源是位置服务,它显示最后已知的位置信息及时刻。

图像

安卓系统中的大多数时间戳是从 1970 年 1 月 1 日以来的毫秒数,这是 Unix 纪元时间——以毫秒为单位,而不是秒。由于大多数工具基于秒转换 Unix 纪元,你可以将数字除以 1000,然后使用标准公式。如果你构建了 Ubuntu 工作站,你可以使用以下命令行进行转换:

图像

这将在工作站时区输出。你可以使用命令行上的各种开关控制时区、格式和其他许多参数。要查看所有可能性,请运行“date --help”或“man date”。

检查上述三个缓存位置,我们可以看到系统从 GPS 卫星和蜂窝塔在以下时间缓存了位置信息:

  1. GPS:2011 年 1 月 27 日 13:51:13 CST

  2. 蜂窝:2011 年 1 月 28 日 09:56:48 CST

记录的位置信息是准确的,因此提供了设备位置的极佳历史信息。

网络状态部分提供了额外的信息,包括关于手机塔的更详细信息:

图像

图像

需要指出的是,尽管技术细节繁多,但内存信息部分对于每个进程 ID(PID)都会输出:

image

这不仅有助于确定哪些进程正在运行,还有助于确定它们访问的数据库。例如,在某些情况下,调查人员可能需要更好地了解收到电子邮件时更新了哪些信息。在上面的列表中,你可以看到电子邮件应用程序(com.htc.android.mail)不仅更新了 mail.db,还更新了与 people_db 相关联的两个与网络相关的数据库。在解释 Android 设备上的数据如何相互关联时,这些信息可能非常有用。

dumpstate

另一个调试命令是 dumpstate,它将之前的调试部分与系统信息结合在一起。与其他命令一样,你使用以下命令运行:

image

在运行 adbd 并以 root 权限的模拟器或设备上显示的第一个部分是应用程序的堆栈跟踪。然而,在参考的 HTC 设备上,dumpstate 命令返回权限被拒绝。紧接着是关于设备、构建版本、无线电、网络和内核详情的基本信息。剩余的日志包含了表 4.3 中概述的部分。

| 表 4.3 Dumpstate 部分 |

部分 文件或命令
堆栈跟踪 N/A
设备信息 N/A
系统 N/A
内存信息 /proc/meminfo
CPU 信息 top -n 1 -d 1 -m 30 -t
Procrank (procrank)
虚拟内存统计 /proc/vmstat
Vmalloc 信息 /proc/vmallocinfo
Slab 信息 /proc/slabinfo
Zoneinfo /proc/zoneinfo
系统日志 logcat -v time -d ^∗:v
事件日志 logcat -b events -v time -d ^∗:v
无线电日志 logcat -b radio -v time -d ^∗:v
网络接口 netcfg
网络路由 /proc/net/route
Arp 缓存 /proc/net/arp
转储 Wi-Fi 固件日志 su root dhdutil -i eth0 upload /data/local/tmp/wlan_crash.dump
系统属性 N/A
内核日志 dmesg
内核唤醒锁 /proc/wakelocks
内核 cpufreq /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state
Vold 转储 vdc dump
安全容器 vdc asec list
进程 ps -p
进程和线程 ps -t -p -p
Librank librank
Binder 失败事务日志 /proc/binder/failed_transaction_log
Binder 事务日志 /proc/binder/transaction_log
Binder 事务 /proc/binder/transactions
Binder 统计 /proc/binder/stats
Binder 进程状态 sh -c cat /proc/binder/proc/^∗ -p
文件系统和空闲空间 df
包设置 /data/system/packages.xml: 2011-01-26 09:18:02
包 UID 错误 /data/system/uiderrors.txt: 2010-11-14 22:52:26
最后的 kmsg /proc/last_kmsg
最后的无线电日志 parse_radio_log /proc/last_radio_log
最后的恐慌控制台 /data/dontpanic/apanic_console
最后的恐慌线程 /data/dontpanic/apanic_threads
被阻塞进程的等待通道 不适用
背光 不适用
dumpsys dumpsys
bugreport

最后一个调试命令在之前命令的基础上构建,并将logcatdumpsysdumpstate的调试输出组合在一个命令中,并在屏幕上显示,以便提交错误报告。该命令如下运行:

image

它首先运行dumpstate。在针对参考的 HTC Incredible 运行时,输出被保存到文件中,然后执行了行数统计:

image

如您所见,报告生成了超过 42,000 行的调试信息,其中包含时间戳、应用数据以及系统信息。解析这些数据将得到有用的信息。然而,如果手动处理这些数据,任务将非常艰巨。

内存类型

如第二章所述,Android 设备有两种主要类型的内存,易失性(RAM)和非易失性(NAND 闪存)内存。每种内存都能从不同角度了解设备数据。

RAM

系统使用 RAM 加载、执行和操作操作系统、应用程序或数据的关键部分,并在重启时不会保存。与传统计算机一样,RAM 可能包含非常重要的信息,应用程序使用这些信息来处理数据。以下是一些例子:

• 密码

• 加密密钥

• 用户名

• 应用数据

• 系统进程和服务的数据

最近,出现了用于检查 Android 内存的解决方案。其中一种技术由安全研究员 Thomas Cannon 在他的博客上记录,我们将详细逐步介绍(Android reverse engineering, n.d.)。

Android 提供了一个机制,通过向应用发送特殊信号(SIGUSR1)将应用的内存转储到文件中。要发送信号,你需要知道应用的 PID,你可以使用ps命令找到:

image

ps命令列出了所有系统和应用进程以及父进程 ID、内存信息以及名称。由于典型设备上有许多运行中的进程,上述列表仅显示输出的一部分。

接下来,我们需要在设备上以 root 权限运行交互式 shell,并设置/data/misc具有足够的权限来写入,然后读取内存转储:

image

警告

更改文件夹权限

chmod命令用于更改/data/misc文件夹的权限,授予系统上所有用户账户读、写和执行访问权限。进行此更改是为了成功进行内存转储。然而,这是法医分析师明显进行的系统更改。如果此类分析是合理的,应在报告中记录此更改,理想情况下,在内存转储后应将文件夹权限恢复到默认设置。

从这里,我们可以发送进行内存转储所需的信号,并显示目录内容:

image

文件 heap-dump-tm1296350817-pid1294.hprof 包含了内存转储,我们可以退出交互式 adb shell 并将文件拉取到本地工作站进行分析:

图像

从那里,使用你手头上的任何内存分析技术。例如,你可以使用 strings 命令提取 ASCII 字符串:

图像

然后查看文件内容。快速扫描 Gmail 的内存提供了有关应用程序引用的各种加密库以及 HTTP 流量的信息:

图像

使用名为 JSON 的文件格式的 Facebook 应用程序,产生了以下内容:

图像

在将以下示例包含在本书中之前,已经对其进行了清理。但是,你可以看到时间戳、资料更新、朋友信息、签到等信息。

对 Android 设备的内存分析可以深入了解设备的内部结构以及有关设备主人的关键信息。随着时间的推移,预计市场上会有更多解决方案来解决 Android 内存分析的问题。

NAND 闪存

与 RAM 不同,NAND 闪存是非易失性的,因此即使设备没有电源或重新启动,数据也能得到保留。NAND 闪存不仅用于存储系统文件,还用于存储用户数据的很大一部分。

NAND 闪存具有与现代硬盘中的磁性介质截然不同的特性。这些特性使 NAND 闪存成为移动设备的理想存储选择,同时也为程序员带来了许多挑战,为法医分析师提供了机会。

首先,NAND 闪存没有像传统磁性硬盘中的旋转盘片和机械臂那样的机械移动部件。这提高了耐用性,并减少了设备的大小和功耗。内存以一个或多个芯片的形式分布,这些芯片通常将 NAND 闪存和 RAM(MCP,请参阅第二章)集成在一起,并直接集成在设备的电路板上。

NAND 闪存还具有非常高的密度,并且制造起来成本效益高。这当然使其深受制造商的喜爱。一般而言,制造过程和技术的一个副作用是,NAND 闪存在出厂时实际上就带有坏块。制造商通常会在制造过程中测试内存,并在 NAND 闪存上的特定结构中标记坏块,这在他们的文档中有描述。直接与 NAND 闪存交互的软件可以读取制造商的坏块标记,并常常实现一个坏块表,该表可以在系统上逻辑跟踪坏块,并将其从运行中移除。这大大加快了坏块检测和管理的速度。因此,尽管 NAND 闪存在物理上比旋转盘片更耐用,但其错误率要高得多,在开发和使用过程中必须考虑这一点。

NAND 闪存的另一个重要限制是,在块(block)无法再存储数据之前,其写入/擦除的生命周期非常有限。这个生命周期因设备而异,在很大程度上受到每个 NAND 闪存单元存储的数据量影响,这是存储 1 或 0 位(bit)的核心构建块。如果单元仅存储单个位(单层单元或 SLC),则 NAND 闪存的评率为大约 10 万次写入/擦除周期,数据保持一年。然而,由于制造商(及消费者)要求在相似大小或更小的设备中存储更多的数据,NAND 闪存很少使用 SLC。该技术已经发展到多层单元(MLC),在这种单元中,每个单元可以存储两个、三个甚至更多的位。然而,这不仅使制造过程复杂化,减缓了写入/擦除周期,还显著降低了设备的耐用性。一个典型的存储每个单元两个位的 MLC NAND 闪存在耐久性(以一年数据保持期限衡量)上降低了 10 倍,大约为 1 万次写入/擦除周期。随着每个单元的位密度增加,耐久性继续下降,这显然必须由控制设备来解决。

与 RAM 和 NOR 闪存这类通常用于计算机基本输入输出系统或 BIOS 的闪存不同,NAND 闪存不能实现随机访问。相反,数据访问是通过一个分配单元来实现的,这个单元被称为页(page)或块(chunk),通常大小在 512 到 2048 字节之间,但随着 NAND 闪存整体大小的增加,这个数值通常会增大。尽管 NAND 闪存不能像 RAM 那样提供快速随机访问,但其访问时间仍然相当快,因为它不需要像传统旋转硬盘那样使用机械盘片和磁臂移动。

注意

页(page)与块(chunk)的区别

在整本书中,我们将把“页”和“块”同义地使用,以指代 NAND 闪存中提到的低级数据分配单元。虽然分配单元通常被称为页,但作为 Android 关键组件的 YAFFS2 文件系统通常将分配单元称为块。

然后,这些数据块被组织成一个更大的逻辑单元,称为块,它通常比传统的 512B 硬盘扇区大得多。在大多数 Android 设备中,NAND 闪存块包含 64 个数据块,每个块 2048 字节。64 × 2 KB 的块大小为 128 KB。当然,随着时间的推移,这可能会发生变化,由 NAND 闪存制造商控制。当一个块被分配用于写入时,块内的数据块会按顺序写入。

NAND 闪存的另一个非常重要的特性是可用于读取和写入的操作:

• 读取(页)

• 写入(页)

• 擦除(块)

虽然可以读取或写入单个数据块,但擦除操作只能在块级别进行。当一个块被擦除时,整个块会用 1 或 0xFF(十六进制)覆盖。

注意

NAND 闪存的擦除操作

擦除操作是 NAND 闪存中将 0 更改为 1 的唯一机制。这一点值得强调。在传统硬盘中,如果一个值从 0 更改为 1(或反之),程序只需在硬盘上找到该值并施加适当的电压以更改并存储新值。然而,NAND 闪存的基本架构只提供了一个机制来将 0 更改为 1,即通过在块级别应用的擦除功能,而不是单个页级别。因此,一个页只能写入一次,如果需要更改页的值,则必须擦除整个块,然后才能写入页。

这里举一个使用单个字节以简化说明的例子:假设这个特定的字节存储了十进制值 179,我们想要加上 39 得到总值为 218。对于那些不熟悉在十进制(base10)、十六进制(base16)和二进制(base2)之间转换数字的人来说,Windows、Mac OS X 和 Ubuntu Linux 的内置计算器程序提供了程序员模式,可以执行这些转换。对于上面的数字,我们在不同数制之间的转换如表 4.4 所示。

表 4.4 整数的十进制、十六进制和二进制表示

十进制(base10) 十六进制(base16) 二进制(base2)
179 0xB3 1011 0011
218 0xDA 1101 1010

因此,值 179 包含三个 0,其中两个需要改变为 1 以表示我们新的值 218。然而,NAND 闪存在没有擦除整个块的情况下无法进行这种改变。所以,如果这个单个字节在没有擦除的情况下尝试,结果将是 146,而不是 218。以下是这种情况发生的原因:

image

由于字节并不全是 1(0xFF),写入周期中唯一成功的是 1 保持为 1 或变为 0 的部分。每当写入功能遇到 0 并请求变为 1 时,它就会失败并保持 0 值。结果字节为 0x92 或 10 进制的 146——明显不是预期的值。另一种描述写入功能的方式是,它只将带电的 1 值按需改为 0,这相当于两个值的“逻辑与”。

总结来说,一个数据块只能写入一次,如果需要重写,必须先擦除整个块。

如你所见,NAND 闪存有其各种限制,因此开发人员和文件系统必须了解闪存特性,才能在限制内有效工作。与带有固件来管理设备(包括坏块)的传统硬盘不同,Android 设备中使用的 NAND 闪存没有配备控制器。所有内存的管理都必须在软件层面实现,并与 NAND 闪存进行接口。部署的两个重要技术是错误校正码(ECC)和磨损均衡。这两者对法医分析和数据恢复都有重大影响。

首先,ECC 是一种在读写操作中检测数据错误并即时纠正某些错误的算法。由于 NAND 闪存在使用过程中会逐渐退化,系统必须能够检测到页面或块何时出现问题并恢复存储在那里的数据。当错误次数或失败操作超过一定数量(通常是三次失败操作)时,页面或块将被标记为坏块,并添加到坏块表中。

在 Android 上有效管理 NAND 闪存的第二个重要算法是磨损均衡代码,它将数据的写入分散到整个 NAND 闪存中,以避免过度使用单一区域,从而更快地磨损这些块。

许多使用 NAND 闪存的硬件设备,如可移动的 USB 闪存驱动器和固态硬盘(SSD),都带有与设备捆绑的控制器逻辑,提供上述功能,包括坏块管理、磨损均衡和错误校正码。然而,Android 设备设计为直接集成 NAND 闪存组件,因此需要一个软件管理层来提供这些重要功能。选定的管理 NAND 闪存的层是 Memory Technology Device(MTD)系统。

MTD 是为了满足 NAND 闪存及其类似设备的需要而开发的。在 MTD 之前,Linux 主要支持字符设备和块设备。这两种设备类型都没有解决新型存储设备独特的特性。此外,虽然 NAND 闪存严格来说不是块设备(像传统硬盘那样),但向开发者暴露块设备特性有助于开发和支持。通过利用 MTD,Android 现在有了与 NAND 闪存有效交互所需的 Flash Transition Layer(FTL)。通过这种方式,Android 没有将制造商限制在只能使用少数 NAND 闪存供应商和相关控制器。相反,他们可以自由使用任何可用的 NAND 闪存,然后“简单”地与支持广泛 NAND 闪存的 MTD 集成。

在 Android 中,MTD 不仅为 NAND 闪存提供了块接口,还提供了 ECC、磨损均衡和其他关键功能。ECC 和其他块元数据存储在一个被称为 OOB(带外)或备用区域的保留空间中。OOB 位于 NAND 闪存上每个块的后面。虽然块、块和 OOB 布局是可配置的,但到目前为止,大多数 Android 设备都有一个 128 KB 的块,包含 64 个每块 2048 字节(2k)的块,每个块都有一个 64 字节的 OOB,如图 4.1 所示。

图像

图 4.1 块(128 KB = 64 × 2k 块 + OOB)。

OOB 不仅存储由 MTD 管理的相关信息,还可以存储对文件系统至关重要的元数据,前提是文件系统要能识别 NAND 闪存。虽然系统将块呈现为 128 KB,但加上 64 个大小为 64 字节的 OOB 后,额外的 4096 字节(4 KB)使得 NAND 闪存上总共使用的字节数达到了 132 KB。

在 Android 设备上,您可以通过查看/proc/mtd 文件来确定 MTD 分区。在我们的参考设备 HTC Incredible 上,我们有以下分区:

图像

有七个 MTD 分区,下一节将检查它们的挂载位置,并提供一个关于找到的目录和文件的高级概述。在之前的列表中,size 和 erasesize 都是十六进制值,提供了重要的 MTD/NAND 闪存属性。erasesize 指定了每个块的大小,即 0x20000 或 131,072 字节或 128 KB(128×1024)的十进制数。这与块图一致,特别是 64 页,每页 2048(2 KB)的大小。size 列指定了该分区的整体大小。因此,在这个实例中,我们有如表 4.5 所示的 MTD 分区。

表 4.5 MTD 分区大小转换

图像

表 4.5 中的值也可以使用 df(磁盘空闲)命令进行验证,该命令提供了已挂载文件系统及其总、已使用和可用空间的列表。以下是/system 的 df 数据:

图像

如你所见,/proc/mtd 中找到的大小在我们的转换和 df 命令显示中是一致的。

既然我们已经对 Android 中的 NAND 闪存和 MTD 有了基本的了解,我们将研究 Android 使用的各种文件系统。

文件系统

与大多数 Linux 系统一样,Android 中也使用了多个文件系统,其中许多用于启动和运行系统。虽然我们会提到多个文件系统,但主要关注的是存储用户数据的分区,特别是 EXT、FAT32 和 YAFFS2 文件系统。

要确定 Linux 内核(以及因此的 Android)支持哪些文件系统,你可以查看文件 /proc/filesytem 的内容。在我们参考的 HTC Incredible 上,它包含以下内容:

image

在 HTC Incredible 支持的 18 个文件系统中,只有五个是由物理设备(如 NAND 闪存或 SD 卡)支持的。其余的文件系统具有“nodev”属性,这意味着它们本质上是虚拟文件系统,不会写入任何物理设备。此外,实际上在设备上只使用了六个 nodev 文件系统:

  1. rootfs

  2. tmpfs

  3. cgroup

  4. proc

  5. sysfs

  6. devpts

有三个由设备支持的文件系统被使用:

  1. ext3

  2. yaffs2

  3. vfat

下面的部分提供了大多数文件系统的简要概述,以及对存储大量用户数据的 YAFFS2 的深入分析。

rootfs、devpts、sysfs 和 cgroup 文件系统

Linux 中的许多文件系统用于启动、操作或管理系统,通常不会包含在取证调查中有用的信息。然而,安全工程师和研究人员可能会仔细检查这些文件系统以及内核的内部工作,试图找出安全漏洞和其他弱点。我们将快速强调在 Android 中发现的四个与基础设施相关的文件系统。

首先,rootfs 是内核在启动时挂载根文件系统(目录树的顶部,用正斜杠表示)的位置。为了让内核完成启动过程,它需要访问核心文件和库,因此需要挂载根文件系统。随着内核完成启动过程,随后的文件系统作为根文件系统下的目录被挂载。例如(本章后面会详细介绍),根文件系统会被挂载在 / 并包含关键文件。然后一个更完整的系统目录会被挂载在 /system。你可以通过从 shell 运行“ls -l”命令或输入“mount”来查看已挂载的文件系统以及它们在根文件系统中的目录。

devpts 文件系统用于在 Android 设备上提供模拟的终端会话,类似于使用 telnet 或 ssh 连接到传统的 Unix 服务器。每次虚拟终端连接时,在/dev/pts 下都会创建一个新节点。例如,如果你有一个 adb shell 连接到 Android 设备,/dev/pts 将显示以下内容:

图像

然而,在下一个示例中,有两个 adb shell 连接和一个来自设备上安装的应用程序的终端应用连接:

图像

如你所见,原始的/dev/pts/0 连接存在。但是现在有两个额外的连接,并且来自终端应用的连接是在应用独特的用户 id(app_105)下运行的。

Sysfs 是另一个包含设备配置和控制文件的虚拟文件系统。在 HTC Incredible 上,存在以下顶级目录:

图像

出于好奇,你可以将/sys 目录下的文件通过 adb pull 命令拉取到你的取证工作站上,因为任何用户都可以读取这些文件。执行以下命令:

图像

如你所见,大量文件被拉取,你现在可以使用完整的 Linux 工具套件来检查数据。尽管这些信息的取证价值需要进一步研究,但它清楚地提供了关于设备的低级信息,有助于安全研究。例如,如果你想了解更多关于 NAND 设备的信息,你可以检查以下目录:

图像

然后是每个文件:

图像

详尽了解 NAND 设备显然是进行取证和安全分析的重要步骤。将近 3000 个文件,有大量数据需要检查。以下是一种快速查看文件名、路径和大小的方法,这将使你能够轻松检查相关文件(尝试在两个终端会话中列出文件,在一个终端中使用复制/粘贴来“cat”文件内容):

图像

图像

提示

附加 sysfs 分析

除了手动检查 sysfs 文件系统外,互联网上还有详细资源提供了额外的背景信息。这样一个资源是 Patrick Mochel 的一篇论文,提供了有用的背景信息(The sysfs filesystem, n.d.)。

最后一个虚拟文件系统被称为 cgroups,用于跟踪和汇总 Linux 文件系统中的任务。在 HTC Incredible 上,创建了两个 cgroup 文件系统:一个在/dev/cpuctl,另一个在/acct。尽管可能通过进一步分析得到结果,但会计数据在取证分析中通常并不证明是有用的。

proc

proc 文件系统在 /proc 目录下以结构化的方式提供了关于内核、进程和配置参数的详细信息。一些文件可以通过 shell 用户检查。然而,许多文件在你拥有 root 权限之前阻止访问。如前所述,探索 proc 文件系统的一种方法是将文件从 Android 设备拉到你的法医工作站上。这需要一些时间,并且在某些文件上可能会挂起,导致复制不完整。

image

在 HTC Incredible 上,上述过程在尝试复制进程 76 时挂起,不得不使用 Ctrl-C 取消:

image

在取消之前,我们成功提取了 25 MB 的数据和近 6000 个文件。与 sysfs 检查一样,你可以使用 find 命令手动检查数据,以定位并列出文件:

image

另外,你可以直接从 adb shell 检查 /proc 中的某些文件,如下所示:

image

设备的宝贵信息可以在 proc 文件系统中找到。检查员可以审计这些文件,并且应该从 /proc 目录中的文件开始,而不是子目录。

tmpfs

tmpfs 是一个文件系统,它将所有文件存储在由 RAM 支持的虚拟内存中,如果有的话,还包括设备的交换或缓存文件。目前大多数 Android 设备没有交换空间。然而,一些售后固件启用了这个功能。tmpfs 的优点是,通过使用 RAM,存储速度非常快,而且是非永久的,因此在重启时不会被保存。

当然,对于法医检查员来说,这是一个挑战。如果重要数据位于 tmpfs 挂载点上,必须在设备重启或断电之前收集这些数据。这也提供了一个独特的机会,因为 tmpfs 通常可以被 shell 用户读取,并且法医程序可以复制并在 tmpfs 中执行,而无需修改 NAND 闪存或 SD 卡。这可能允许检查员在完全不修改 NAND 闪存或 SD 卡的情况下从 Android 设备获取法医数据。

警告

调查 tmpfs

如果你对设备内存分析的主要兴趣在于,除非你首先拥有你感兴趣的内存部分的法医级副本,否则不建议对 tmpfs 进行更改。

在 HTC Incredible 上,标准安装有四个 tmpfs 挂载点:

• /dev

• /mnt/asec

• /app-cache

• /mnt/sdcard/.android_secure

/dev 目录包含设备文件,允许内核读取和写入连接的设备,如 NAND 闪存、SD 卡、字符设备等。/mnt/asec 和 /mnt/sdcard/.android_secure 目录是 Android 的新增功能,允许应用存储在 SD 卡上,而不是 /data/data,从而提供更多存储空间。

有趣的是,/app-cache 也是一个新增加的项,似乎提供了 tmpfs 空间,应用程序可以使用。在 HTC Incredible 上,网页浏览器(com.andrew.browser)在/app-cache 中创建了一个目录,并存储了网页浏览的缓存文件。

图像

从第一个列表中,我们可以看到 app-cache 目录对所有用户设置了读、写和浏览权限。此外,权限“rwxrwxrwt”中的最后一个“t”表示只有 root 或目录所有者才能删除或重命名目录。

第二个列表显示了 app-cache 内部的目录,其中只有 com.android.browser。但是,当我们深入到目录中时,我们发现我们最感兴趣的目录和文件只允许应用程序本身(com.android.browser,应用程序的用户 ID 为 app_12)或 root 访问文件。

图像

由于我们在设备上拥有 root 权限,以下是目录包含的内容:

• 1.4 MB 的数据

• 64 个文件

• 18 个 ASCII 文件(主要是 CSS 和 JavaScript)

• 1 个空文件

• 9 个 GIF 文件

• 5 个 HTML 文件

• 11 个 JPEG 文件

• 17 个 PNG 文件

• 3 个 UTF-8 文件

图像

如果你从 Ubuntu 工作站浏览 webviewCache 目录,你可以轻松预览图像和其他文件(图 4.2)。

图像

图 4.2 从 Ubuntu 工作站浏览的浏览器 webviewCache。

/app-cache tmpfs 目录包含的信息在法医调查中非常重要。这强调了教育前线响应人员以确保设备得到妥善处理,以最大化法医调查有效性的日益需求。

扩展文件系统(EXT)

扩展文件系统(EXT)是 Linux 的默认文件系统,专门为操作系统开发。正如你已经知道的,Linux 支持大量的文件系统。然而,默认的是 EXT。自从 1992 年开发出 EXT 的原始版本以来,已经推出了三个额外的版本:EXT2、EXT3 和 EXT4。

尽管 EXT 已经集成到大多数笔记本电脑、台式机和服务器 Linux 发行版中,但在早期的 Android 设备中并未发现 EXT。然而,到了 2010 年,EXT 开始出现在设备中,2010 年 12 月 9 日,谷歌在他们的 Android 开发者博客上宣布,越来越多的 Android 设备将从 YAFFS 转移到 EXT(Android 开发者博客,未标明日期)。从 YAFFS 转向 EXT 似乎是由在线讨论的几个因素推动的(Way,未标明日期),包括

• 越来越多的 Android 设备从原始 NAND 闪存转向常规块设备(eMMC)

• EXT4 是一个标准的 Linux 文件系统,支持完整的 Unix 权限和语义

• EXT4 稳定且性能高

• YAFFS 是单线程的,在即将到来的双核系统上会遇到瓶颈

第一款使用 EXT4 的 Android 设备是 Google Nexus S,预计许多运行 Android Honeycomb 版本的平板设备也将使用这个新的文件系统。目前,Nexus 在以下挂载点使用 EXT4:

• 系统镜像(只读,/system)

• 本地用户数据(读写,/data/data)

• 缓存分区(读写,/cache 及其他可能)

从取证的角度来看,EXT4 只是一个需要取证工具理解和支持的文件系统。当然,目前大多数取证工具并不完全(甚至只是名义上)支持 EXT4,这确实带来了一些问题。文件雕刻技术是有效的,预计随着时间的推移,将会有更多的取证软件开始支持这个文件系统。

FAT32/VFAT

Android 设备通常具有一个或多个 Microsoft FAT32 分区,通常位于 SD 卡和 eMMC 上。采用这种久经考验的文件系统并非因为其设计优越,而是因为其与其他操作系统的高度兼容性。FAT32 文件系统在大多数操作系统中都得到广泛支持,包括 Mac OS X、所有 Windows 版本(显然)、Linux 等等。这意味着,存储在 FAT32 分区上的 Android 数据可以轻松地在其他文件系统上被读取、修改甚至删除。

在 Linux 中,FAT32 分区的文件系统驱动被称为 VFAT,不要与微软早期桥接 FAT16 和 FAT32 实现的虚拟 FAT 文件系统混淆,后者增加了包括长文件名支持在内的其他功能。在 HTC Incredible 上,有 3 个使用 FAT32 的挂载点。

/mnt/sdcard

/mnt/secure/asec

/mnt/emmc

如您在第三章关于 USB 接口的部分所记得的,当 Android 设备连接到另一台计算机时,可以选择暴露设备的 USB 大容量存储(UMS)接口以实现文件共享。在 HTC Incredible 上,/mnt/sdcard/mnt/emmc分区可以通过 USB 连接作为 UMS 设备向其他操作系统呈现。

/mnt/secure/asec分区是 SD 卡上的一个加密分区,Android 设备可以在此存储应用程序。当引入了从 SD 卡运行应用程序的功能后,安全工程师们理所当然地担心应用程序数据可能会容易被损坏或泄露,因为 VFAT/FAT32 分区没有维护文件权限。因此,应用程序(.apk 文件)在物理设备上被加密,在使用时会被解密并临时存储在/mnt/asec或其他指定位置。

如前所述,可移动的 SD 卡被挂载在/mnt/sdcard 上,通常包含照片、视频、缩略图、下载的文件、文本语音临时文件以及 Google Maps 导航数据,还包括许多 Android Market 应用程序的数据。较新的/mnt/emmc 是一个 FAT32 分区,不可移动,位于设备架构的存储中。在迄今为止检查的设备中,eMMC 通常被格式化为 FAT32,这也是为了互操作性。

YAFFS2

当第一个 Android 设备发布时,许多人对一个相对不知名的文件系统在系统中扮演关键角色感到惊讶。YAFFS(Yet Another Flash File System 的缩写)是一个专门为 NAND 闪存开发的开放源代码文件系统,同时遵循 GNU 公共许可证(GPL)和商业许可协议,后者适用于那些不想严格遵守 GPL 指导方针的人(YAFFS licence FAQs, n.d.)。Android 设备使用 YAFFS 的最新版本(YAFFS2),该版本遵循更严格的 NAND 闪存指导方针,旨在提高 NAND 闪存的耐久性,同时针对低内存移动或嵌入式设备进行优化。

YAFFS2 由新西兰的 Aleph One Ltd 公司开发。应客户要求,Aleph One 于 2001 年 12 月开始了 YAFFS 的设计工作,并于 2002 年 5 月发布了首个公开可用的源代码。主要开发者(或至少是最知名的)是 Charles Manning,他被描述为“嵌入式清洁工”,在过去的 20 年里一直在开发和完善嵌入式系统(YAFFS: the NAND-specific flash, n.d.)。Charles 在 YAFFS 邮件列表上非常活跃,是 YAFFS 和 YAFFS2 方面的公认专家。

提示

附加的 YAFFS2 资源

对于内部结构感兴趣的 分析师和工程师们,鼓励他们阅读完整的 YAFFS2 文档(如果感兴趣,还可以阅读源代码),访问www.yaffs.net/并订阅邮件列表。

YAFFS2 是专门为日益增长的 NAND 闪存设备而构建的,它具有许多重要特性,满足这一介质严格的需求。YAFFS2 是

• 支持日志结构文件系统(即使在意外断电情况下也能保护数据)

• 提供内置的磨损均衡和错误校正

• 能够处理坏块

• 快速且在 RAM 中占用空间小

然而,由于在 Android 之前其使用受到限制,目前没有(商业或开源)取证工具支持该文件系统。这使得取证分析师除了下载 YAFFS2 源代码,获取分区的取证映像,用你喜欢的十六进制编辑器打开并开始挖掘之外,几乎别无选择。尽管随着时间的推移可能会开发出一些工具,但 Android 转向 EXT4 可能会降低商业取证公司开发此类支持的积极性。

如 NAND 闪存部分所述,YAFFS2 通过 MTD 子系统以块的形式处理内存,每个块包含一定数量的页面(在 YAFFS 文档和代码中称为数据块)。当 YAFFS2 准备好将数据写入 NAND 闪存时,它将数据和元数据结构都传递给 MTD。MTD 然后负责将(以及读取)数据和元数据写入 NAND 闪存。

对于大多数 Android 设备,MTD 子系统以块的形式处理 NAND 闪存,这些块被划分为 64 个数据块,每个数据块包含 2048 字节(因此块为 128K),加上一个 64 字节的带外/备用区域(OOB),各种标签和元数据都存储在这里。当为写入分配一个块时,它会被分配一个从 1 开始并随每个新块增加的序列号。

YAFFS2 中存储的所有数据结构都被视为对象,可以是文件、目录、符号链接和硬链接。每个数据块要么存储一个 yaffs_ObjectHeader(对象元数据),要么存储对象的数据。yaffs_ObjectHeader 跟踪各种信息,包括对象类型、父对象、用于加速搜索的名称校验和、对象名称、权限和所有权、MAC 信息,如果对象是文件,还包括对象的大小。

在 64 字节的 OOB/备用区域中,YAFFS2 不仅存储关于数据块的 critical 信息,还与 MTD 子系统共享该区域。关键的 YAFFS2 标签如下:

• 1 字节:块状态(0xFF 表示块良好,其他值表示坏块)

• 4 字节:32 位数据块 ID(0 表示数据块存储 yaffs_ObjectHeader,否则为数据)

• 4 字节:32 位对象 ID(类似于传统的 Unix i 节点)

• 2 字节:此数据块中的数据块数(最后一个数据块除外,其余都会被完全分配)

• 4 字节:此块的序列号

• 3 字节:标签的 ECC(在 Android 中,由 MTD 处理)

• 12 字节:数据的 ECC(在 Android 中,由 MTD 处理)

如果对象被更改,新的 yaffs_ObjectHeader 将被写入闪存,因为 NAND 内存只能在擦除前写入一次。旧数据和头部仍然存在,但通过检查序列号的值,在文件结构中被忽略。这个过程符合 NAND 闪存中的块永远不会被重写(只写入一次,然后在不再需要时擦除)的指导原则。当然,这对于数据恢复过程可能具有巨大的好处,因为除非块经历了用于擦除块并准备接受新数据的垃圾回收过程,否则修改或删除的数据仍然存在于 NAND 闪存上。

同样,在 YAFFS2 中删除文件时,ObjectHeader 的父目录会被移动到一个特殊的隐藏目录中,称为未链接目录。文件将保留在此目录中,直到文件中的所有块段被擦除。为了实现这一点,文件系统跟踪系统中文件的块段数量。当它达到 0 时,文件残留部分不再存在。在这一点上,它将不再在未链接目录中跟踪对象。

虽然文件系统结构可以从 OOB 区域和 ObjectHeader 信息完全重新生成,但这并不高效——特别是随着 NAND 闪存大小的增长。因此,结构被加载到 RAM 中并维护(根据需要写入 NAND 闪存),使用树节点结构(T 节点)来跟踪所有已分配的块段。T 节点是固定的 32 字节,在其最低级别(级别 0)存储一个索引,用于定位第一个块段 ID。随着文件大小的增长,会添加额外的级别,这些级别由指向其他 T 节点的八个指针组成。

YAFFS2 通过从块的分配顺序的末尾开始,逆向读取每个块段来重新生成,并在 RAM 中填充文件系统结构作为 T 节点。这需要扫描整个 NAND,这是一个耗时的操作。为了解决这个问题,YAFFS2 开发了检查点机制,当它正常卸载时,该机制更喜欢将 RAM 结构保存到 NAND 闪存(使用 10 个块)。

为了让你更全面地了解 YAFFS2,还需要掌握一些其他关键概念。首先,垃圾回收是排队进行的,并且每次写入系统时如有需要都会执行。如果一个块中的所有块段都不再被使用,那么这个块就成为了垃圾回收的候选对象。系统还能够找到“最脏”的块,将已分配的块段复制到新块中,从而使该块可以进行垃圾回收。为了再次使用这个块,会通过写入全 1(0xFF)来擦除它。

在 Android 设备上,我们可以通过检查 /proc/yaffs 文件来找到关于 YAFFS2 文件系统的详细信息:

图像

图像

我们可以看到许多有用的详细信息,例如,在挂载于 /data/data 的 “datadata” YAFFS2 分区上。通过检查该分区的 /proc/yaffs 列表,我们可以了解到以下内容:

  1. 有 1192 个块(从 0 到 1191),我们知道每个块有 64 个块段(2048 字节)。所以,128K × 1192 = 152,576K,你可以通过运行 df 命令或像我们上面那样检查 /proc/mtd 来确认。

  2. 显示了页面读取、页面写入和块擦除的数量。这将提供一个关于 NAND 闪存使用情况的总体概念。

  3. 垃圾回收过程中的一个策略是找到几乎空闲的块,将剩余数据复制出来,然后标记块为可收集。我们可以看到这个过程以很高的速率(323,313)发生。

  4. 我们可以看到没有检测到 ECC 错误。

  5. YAFFS2 元数据报告超过 63,000 个未链接的文件。

  6. YAFFS2 不使用软件 ECC,而是依赖于 MTD 或 NAND 闪存。

如果你比较没有高读写使用的 /data/data 目录的系统分区,你会注意到明显的差异。检查 /proc/yaffs 文件可能有助于提供解释错误纠正代码、碎片化数据等时的必要背景信息。

深入理解 YAFFS2 的最佳方式是直接创建、修改和检查文件系统。所有这些在本书其他练习中创建的 Ubuntu 工作站上都是可能的。由于我们已经安装了 Linux 虚拟机和 build-essential 软件包(包括必要的 C 编译器和支持软件包),我们现在需要安装 mtd-utils 软件包:

image

然后,我们下载最新的 YAFFS2 源代码:

image

然后解压 yaffs2.tar.gz 并编译,这样我们就可以使用内核模块了:

image

接下来,我们将加载必要的内核模块在 RAM 中模拟 MTD(除非你恰好有一些可以直接连接的 NAND 闪存)然后挂载 YAFFS2 分区。

首先,我们将在主目录中创建一个挂载文件系统的地方:

image

接下来,我们需要加载几个内核模块以启用 MTD 支持:

image

接下来,我们使用 nandsim 内核模块创建模拟的 NAND 闪存:

image

提示

关于 Linux MTD 的额外信息

Linux MTD 网页提供了关于 nandsim 的更多详细信息。该网站提供了 MTD 的深入背景信息和支持,请访问以获取完整详情。

这里提供了来自 Linux MTD 网站的关于 nandsim 的额外详细信息以供直接参考(NAND FAQ, n.d.):

“NAND 模拟器(nandsim)是一个极其有用的调试和开发工具,它可以在 RAM 或文件中模拟 NAND 闪存。要选择模拟的闪存类型,你应该指定你的闪存的 ID 字节——即通过“读取 ID”命令(0x90)返回的字节——请参阅闪存手册。以下是输入参数的示例:

• modprobe nandsim first_id_byte=0x20 second_id_byte=0x33—16MiB, 512 字节页”

• modprobe nandsim first_id_byte=0x20 second_id_byte=0x35—32MiB, 512 字节页;

• modprobe nandsim first_id_byte=0x20 second_id_byte=0x36—64MiB, 512 字节页;

• modprobe nandsim first_id_byte=0x20 second_id_byte=0x78—128MiB, 512 字节页;

• modprobe nandsim first_id_byte=0x20 second_id_byte=0x71—256MiB, 512 字节页;

• modprobe nandsim first_id_byte=0x20 second_id_byte=0xa2 third_id_byte=0x00 fourth_id_byte=0x15—64MiB, 2048 字节页;

• 使用modprobe nandsim first_id_byte=0xec second_id_byte=0xa1 third_id_byte=0x00 fourth_id_byte=0x15创建一个 128MiB 的模拟 NAND 闪存,每页 2048 字节;

• 使用modprobe nandsim first_id_byte=0x20 second_id_byte=0xaa third_id_byte=0x00 fourth_id_byte=0x15创建一个 256MiB 的模拟 NAND 闪存,每页 2048 字节;

• 首先使用modprobe nandsim first_id_byte=0x20 second_id_byte=0xac third_id_byte=0x00 fourth_id_byte=0x15创建一个 512MiB 的模拟 NAND 闪存,每页 2048 字节;

• 使用modprobe nandsim first_id_byte=0xec second_id_byte=0xd3 third_id_byte=0x51 fourth_id_byte=0x95创建一个 1GiB 的模拟 NAND 闪存,每页 2048 字节;

既然已经有了模拟的 NAND 闪存,我们可以像在 Android 设备上一样通过检查/proc/mtd来验证其大小和分区信息:

image

系统显示我们有一个 MTD 分区(mtd0),擦除大小为十六进制的 0x20000 字节(128 KB),总大小为十六进制的 0x4000000(65,536 KB 或 64 MB)。接下来,我们需要将 YAFFS2 内核模块加载到内存中:

image

在我们挂载 YAFFS2 文件系统之前,先在十六进制编辑器中查看未初始化的模拟 NAND 闪存。如果你尝试使用dd或仅仅是xxd这样的工具来查看 NAND 闪存设备,你将看不到 OOB 区域,因为它们对大多数工具是不可见的。这是为了防止那些不期望文件中有 OOB 的程序的混淆(想象一下尝试显示每个 2k 数据块后都有 64 字节二进制 OOB 数据的 PDF)。为了读取包括 OOB 在内的完整 NAND 闪存,我们使用之前安装的mtd-utils包中的nanddump程序。这将读取数据并以二进制形式返回它们。有几个选项可以考虑,可以很容易地查看:

image

对于我们的目的,我们想使用nanddump提取包含 OOB 的完整 NAND,并将输出管道到十六进制编辑器(xxd)进行查看:

image

注意,模拟的 NAND 闪存包含预期的 0xFF 值,这是空白或已擦除的 NAND 闪存应有的。上述命令将允许你检查在初始化和随后修改文件系统时,原始 NAND 闪存是如何被修改的。

因此,最后,我们准备挂载 YAFFS2 文件系统:

image

你可以验证文件系统是否已挂载并可访问:

image

因此,我们可以看到 YAFFS2 文件系统以读/写权限挂载在~/mnt/yaffs2目录下。尽管我们没有创建任何文件,但该目录包含一个lost+found虚拟目录,用于存放无法确定父目录的文件和目录。如果你再次使用xxd十六进制编辑器检查模拟的 NAND 闪存设备,它仍然会包含 0xFF。但是,如果你使用以下命令写入单个文件:

image

并在文件中放入“Android 取证与移动安全”的内容,然后当我们检查原始 NAND 闪存时,可以清楚地看到包括 ObjectHeaders、Objects 和文件内容的 YAFFS2 结构。以下是使用 nanddump 和稍微修改过的 xxd 命令(添加了-a 选项以跳过 0x00 行)的部分十六进制内容:

图像

从偏移量 0x0000000 开始,我们可以看到空白的 ObjectHeader,可以轻松地看到 ASCII 码中的文件名(book.txt)。从 0x0000800 到 0x000083F,我们可以看到由 YAFFS2 存储并由 MTD 作为打包二进制数据存储的 OOB 数据,必须进行解析。文件的实际内容被写入到 NAND 闪存的 0x0000840 位置。我们从 0x0001040 到 0x000107F 看到了另一个 OOB,然后在 0x0001080 位置再次写入 ObjectHeader 到 NAND 闪存,因为原始 ObjectHeader 表示的是空文件。一旦我们添加了内容并保存了文件,数据就被写入 NAND 闪存,并且一个新的 ObjectHeader 被写入到 NAND 闪存。新的 ObjectHeader 反映了关于对象的新元数据,包括哪些数据块保存了数据、MAC(修改、访问、更改)数据等。

需要理解的一个关键点是,YAFFS2 不能简单地将此信息更新到第一个 ObjectHeader,因为它首先需要擦除整个块。因此,它写入一个新的 ObjectHeader,为该头部生成一个高序列号,使其成为文件的最新 ObjectHeader。可以想象,旧的 ObjectHeader 和数据除非通过垃圾回收,否则会保留在 NAND 闪存上,从而为使用取证技术恢复文件元数据和内容提供了极大的机会。

YAFFS 示例

在关于 YAFFS2 的最后部分,提供了一个虚构的场景来说明 ObjectHeaders 和 Objects 是如何写入 NAND 闪存的。这个例子是由 Charles Manning 在他的“Yaffs 如何工作”(How YAFFS works, n.d.)中提出的。任何对 YAFFS 内部感兴趣的人都被鼓励打印、阅读或重新阅读这份文件。在示例中,我们使用了一个 NAND 闪存,为了简单起见,该闪存每个块有四个数据块,并且已被擦除(0xFF)。在描述每个更改后,一个表格将显示 NAND 闪存的内容。

首先,我们在 NAND 闪存上创建一个空文件,如表 4.6 所示。

表 4.6 创建空白文件

图像

ObjectHeader 指向一个空文件。接下来,我们向文件写入三个数据块,如表 4.7 所示。

表 4.7 写入三个数据块

图像

到目前为止,这可能看起来很简单。现在对象占据了第一个块的全部。

注意

虚构的 NAND 闪存

请记住,我们的虚构 NAND 闪存每个块有四个数据块,而不是我们在商用 NAND 闪存中常见的 64 个数据块。

接下来,我们将保存文件,这将导致新的 ObjectHeader 被写入 NAND 闪存,如表 4.8 所示。

表 4.8 保存文件的新 ObjectHeader

图像

这里需要理解的关键点是,YAFFS2 无法回过头来用新的大小、数据块和其他信息更新原始 ObjectHeader。相反,它必须写入一个新的 ObjectHeader,其中包含更新文件所需的元数据。在 YAFFS2 中,新的 ObjectHeader 被赋予更大的序列号,因此它成为当前的 ObjectHeader,YAFFS2 简单地忽略了之前的那个(然而,它仍然留在磁盘上)。

接下来,文件将以读写权限打开,并给第一个数据块赋予新值。最后,保存并关闭文件,这会导致额外的数据写入 NAND 闪存,如表 4.9 所示。

表 4.9 保存新数据和 ObjectHeader

图像

同样,由于我们不能简单更改文件中的原始第一个数据块,因此将新的数据块写入 NAND 闪存,并将之前的数据块标记为过时。这通过向 NAND 闪存写入另一个新的 ObjectHeader 来实现,该 ObjectHeader 指向文件的新的第一个数据块。接下来,我们将文件截断为零长度文件,表 4.10 展示了 NAND 闪存的变化。

表 4.10 截断文件并写入新的 ObjectHeader

图像

由于文件被截断,块 0 中的所有数据块都不再使用。这使得该块可用于垃圾回收,将在下一个写入周期发生。这被称为懒惰垃圾回收,因为它使用现有的写入周期来执行必要的垃圾回收。与之前一样,新的 ObjectHeader 被写入 NAND 闪存,以解释被截断的文件。

最后,我们重命名文件,NAND 闪存的结果如表 4.11 所示。

表 4.11 重命名文件并写入新的 ObjectHeader

图像

在这个周期中,块 0 进行了垃圾回收,现在可用于写入数据。由于文件被重命名,新的 ObjectHeader 被写入 NAND 闪存。块 1 中的所有数据块现在都过时了,它们可用于垃圾回收。然而,请记住,由于 NAND 闪存的有限耐久性,应避免写入/擦除周期。

对于法医调查来说,除非进行垃圾回收,否则 ObjectHeader 和 Object 数据块的整个历史都将保留在 NAND 闪存上。借助适当的软件,可以扫描 NAND 闪存,从而基本上重建文件系统的整个历史。时间线不仅会包含每次编辑的日期/时间,还有可能恢复文件的实际状态。实际上,YAFFS2 分区的状态并非这么简单。然而,这个基本原则仍然是相关的。

挂载的文件系统

我们已经详细介绍了 Android 内存系统的许多组成部分。我们不仅探讨了 RAM 和 NAND 闪存,还详细检查了许多文件系统。这些背景信息将帮助您对 Android 设备进行法医和安全性分析。为了更好地理解这些更学术的信息,我们现在将探讨在 Android 设备上找到的已挂载文件系统。

已挂载的文件系统

让我们从 HTC Incredible 上挂载的文件系统开始:

图像

当你运行不带参数的 mount 命令时,它会返回已挂载的文件系统及其选项的列表。表 4.12 是使用多个条目的输出描述。但是,请注意,上述每个条目都以“0 0”结尾,由于空间原因,在表中省略了这部分。“0 0”条目确定文件系统是否由 dump 命令归档以及确定文件系统检查器(fsck)在引导时检查设备/分区错误的顺序的传递编号。在大多数桌面或服务器 Linux 系统上,根文件系统具有 1 的传递编号,因此它会在其他文件系统之前被检查。

表 4.12 mount 命令输出概述

图像

/mnt/sdcard 有许多选项。这些选项包括:

1. rw:挂载以允许读写

2. dirsync:对目录的所有更新都是同步进行的

3. nosuid:不允许设置 setuid(这会允许其他用户使用文件所有者的权限执行程序)

4. nodev:不将任何文件解释为特殊的块设备

5. noexec:不允许从文件系统执行所有文件

6. relatime:如果文件访问时间早于修改时间,则更新文件访问时间

7. uid=1000:将所有文件的所有者设置为 1000

8. gid=1015:将所有文件的组设置为 1015

9. fmask=0702:仅对常规文件应用 umask(设置权限---rwxr-x,或者用户=无,组=读写执行,其他=读执行)

10. dmask=0702:仅对目录应用 umask(设置权限---rwxr-x,或者用户=无,组=读写执行,其他=读执行)

11. allow_utime=0020:控制 mtime/atime 的权限检查。

12. codepage=cp437:为 FAT 和 VFAT 文件系统转换短名称字符设置代码页。

13. iocharset=iso8859-1:用于在 8 位字符和 16 位 Unicode 字符之间转换的字符集。默认为 iso8859-1。长文件名以 Unicode 格式存储在磁盘上。

14. shortname=mixed:定义了符合 8.3 字符限制的文件名的创建和显示行为。如果文件存在长文件名,它将始终优先显示。Mixed 模式会按原样显示短名称,并在短名称不全为大写时存储长名称。

15. utf8:将 CD 上的 16 位 Unicode 字符转换为 UTF-8。

16. errors=remount-ro:定义遇到错误时的行为;在这种情况下,重新以只读方式挂载文件系统。

所有挂载命令的选项在手册页(man 8 mount)中都有解释。然而,在大多数情况下,快速浏览将揭示审查员需要的信息,包括文件系统上的挂载点、类型和权限。

df 命令将提供有关已挂载文件系统上可用空间的免费信息:

image

如你所见,当 shell 用户尝试确定可用磁盘空间量时,其中一个挂载点(/mnt/secure/asec)返回了权限被拒绝。通过查看父目录,我们可以看到只有 root 用户可以访问该目录:

image

有趣的是,当通过 USB 大容量存储(UMS)选项暴露这两个文件系统/目录时,目录的权限会发生变化。如果未启用 UMS 选项,正如你可以看到 /mnt/emmc 和 /mnt/sdcard 的情况,文件系统对 Android 设备是完全可访问的。

然而,当 UMS 激活并且两个文件系统对连接的工作站可用时,权限会发生变化:

image

如你所见,/mnt/emmc 和 /mnt/sdcard 上的所有权限都被移除了,因此 Android 设备不能直接从手机访问 /mnt/emmc 或 /mnt/sdcard(即它是与连接的工作站独占共享的)。

摘要

Android 设备上的物理内存、文件系统及数据结构是数据存储的基本构建块。对这些结构的深入理解不仅能够帮助你理解 Android 设备,而且当面对新的文件系统和数据结构时,还能进行自己的研究和开发。

参考文献

1. Android 开发者博客:安全保存数据。(未注明日期)。2011 年 2 月 2 日检索自 android-developers.blogspot.com/2010/12/saving-data-safely.html

2. Android 逆向工程。(未注明日期)。thomascannon.net。2011 年 1 月 29 日检索自 thomascannon.net/projects/android-reversing/

3. 数据存储。(未注明日期)。Android 开发者。2011 年 3 月 13 日检索自 developer.android.com/guide/topics/data/data-storage.html#netw

4. YAFFS 的工作原理:内部机制。(未注明日期)。YAFFS。2011 年 2 月 4 日检索自 www.yaffs.net/how-yaffs-works-internals

5. Nand Faq. (未注明日期)。Linux 的内存技术设备(MTD)子系统,2011 年 3 月 13 日检索自 www.linux-mtd.infradead.org/faq/nand.html

6. sysfs 文件系统。(未知日期),引自 2011 年 2 月 1 日,来自www.kernel.org/pub/linux/kernel/people/mochel/doc/papers/ols-2005/mochel.pdf

7. Way, T. (未知日期)。从姜饼开始,Android 将开始使用 ext4。Ted 的思考。欢迎来到 ce:italicthunk.org</ce:italic>,引自 2011 年 2 月 2 日,来自thunk.org/tytso/blog/2010/12/12/android-will-be-using-ext4-starting-with-gingerbread/

8. 许可证常见问题,Y. A. F. F. S. (未知日期)。YAFFS,引自 2011 年 2 月 4 日,来自YAFFS 许可证常见问题

9. YAFFS:NAND 专用闪存文件系统—介绍性文章。(未知日期)。引自 2011 年 2 月 2 日,来自YAFFS:NAND 专用闪存文件系统—介绍性文章

第五章

安卓设备、数据及应用安全

本章节的信息

• 数据盗窃目标和攻击向量

• 安全考虑

• 个人安全策略

• 企业安全策略

• 应用开发安全策略

引言

在法医分析师和隐私倡导者之间保持微妙的平衡。如果设备的安全性达到 100%,那么对设备的法医调查将无法返回任何信息。另一方面,如果设备的安全措施完全缺失,法医专业知识几乎不需要从设备中提取有意义的数据。

移动取证的主要消费者是执法和政府部门。他们在移动设备上使用和保护许多类型的敏感数据,并且他们有调查犯罪的授权和权力。他们不仅依赖数字法医分析,还可以通过搜查令和传票行使权力,并迫使大多数组织提供所需的信息,如财务记录、电子邮件、互联网服务提供商日志等。

同样,企业需要保护其敏感数据,有时还会进行内部调查以确保安全。尽管他们的权力范围不超出公司,但在美国,企业可以在其拥有的设备上进行广泛的搜索权限。

最终,个人有权访问自己的数据。无论他们是在民事诉讼中这样做,还是其他事项,他们都有权在他们拥有的设备上进行操作。

在个人和企业的情况下,各方通常没有必要恢复他们在有权调查的设备上的敏感信息,如信用卡、银行信息或密码。企业在内部调查中不会寻求个人的信用卡数据,并且他们有能力访问企业电子邮件系统并更改密码。在个人情况下,他们已经可以访问自己的财务记录、电子邮件以及其他敏感数据。在执法和政府部门的情况下,他们可以利用传票和搜查令的权力获取他们所需的数据。

因此,最终可能从移动设备上存储的不安全高度敏感数据中受益的只有网络犯罪分子。在许多针对移动设备的个人、企业和犯罪调查过程中,我们发现了一些与案件无关的高度敏感个人信息。然而,如果网络犯罪分子能够访问该设备——无论是物理占有还是通过远程攻击——他们能够收集的数据将给消费者带来重大风险。

同样,企业也成为商业间谍、金融盗窃、知识产权盗窃以及其他各种攻击的目标。随着许多企业转向员工自有设备,对设备的控制和监管进一步减少,使得企业数据面临极大的风险。

最后,执法和政府机构也受到移动安全问题的不利影响。这些机构由个人组成,他们面临与消费者相同的数据暴露风险。与公司一样,机构本身也可能成为攻击的目标,这些攻击不仅寻求可能危及调查或使机构尴尬的敏感数据,还可能包括与国际间谍活动一样严重的攻击。而执法和政府机构面临的独特挑战是,许多涉及移动设备的犯罪必须进行调查,这给已经超负荷的刑事侦查部门和数字取证实验室带来了压力。

由于这些原因,移动设备安全成为了个人、企业和执法政府机构日益关注的问题。

数据盗窃的目标和攻击向量

在这一点上,任何还在继续阅读的人都很清楚,智能手机,尤其是安卓设备,包含了大量的信息,常常是个人和企业数据的混合体。安卓设备不仅是数据盗窃的目标,也可能成为盗窃发生的手段(攻击向量)。了解各种威胁和场景将使安全工程师和开发人员能够设计适当的控制措施来降低风险。虽然这一章节无法对如此广泛的主题提供详尽的覆盖,但将讨论具体的威胁和缓解策略,并应作为安全专业人员的强大起点。

安卓设备作为目标

移动安全研究、漏洞利用和文章的主要关注点一直是智能手机作为数据盗窃的目标,这是有道理的。对消费者、企业和机构的威胁是真实存在的,大多数安全专家认为,针对移动设备的恶意软件正在上升,并将继续成为网络犯罪分子的关注焦点。

移动设备以高度集中和便携的形式包含了大量的个人和企业数据。犯罪分子通常是务实的,网络犯罪分子也不例外。如果他们能够利用一个不仅包含个人用户名、密码和个人敏感信息,还包含雇主相同类型信息的设备,他们显然会瞄准这个机会。此外,尽管一个移动应用程序的数据可能不足以让犯罪分子达到目的,但结合从众多已安装应用程序中发现的信息通常会形成一个关于设备主人的惊人完整的资料。

移动设备不仅容易丢失且相对容易被盗,而且在消费者想要最新型号之前,其使用场景也相对较短。这两种情况都导致通过 eBay 和 Craigslist 等平台购买的手机数量增多,许多设备没有正确擦除,留下了完整的个人数据。此外,恶意代码、恶意软件和远程攻击越来越多地针对移动设备,历史表明它们将导致重大的数据盗窃。这些攻击的有效性只有在时间推移中才能确定;但考虑到操作系统(在本例中为 Android)的快速发展以及移动应用的迅速普及,可以合理预期许多攻击将会成功。

静态数据

静态数据是指存储在非易失性内存中的数据,因此既不在 RAM 中也不通过网络(蜂窝、数据或其他网络)传输。静态数据一词常用于法律和规定中,定义了一个必须保护数据的关键状态。

在整本书中,我们强调了 Android 设备包含的不同数据示例。在这里,让我们考虑两个虚构的场景:一个关注企业客户,另一个关注个人用户。

对于个人用户而言,Android 设备用于个人通讯、个人理财、娱乐以及一般的信息浏览。检查手机可能会恢复以下内容:

• SMS/MMS:所有已分配(未删除)的 SMS 和 MMS 都可以恢复,以及大部分未分配(已删除但仍在 NAND 闪存上)的短信。恢复的信息将包括短信本身以及任何附件,如图片、视频、音频文件、手机联系人(.vcf 文件)、日历项目等。还有许多第三方 SMS/MMS 应用可能包括其他功能。

• 通话记录:尽管也可以从无线运营商那里获得,但完整的通话记录是可以恢复的。这些可能包括未能到达运营商的通话尝试以及我们可以与之相关联的其他元数据,如位置(这也可以根据蜂窝基站大致估计)以及通话拨打前设备上发生的其他活动。

• 语音邮件:在安装了语音邮件应用程序的情况下,如 Verizon 的可视语音邮件,通常可以恢复已分配的语音邮件消息作为音频文件(.OGG)。一些未分配的语音邮件消息也可能恢复。

• 金融应用:虽然它们各不相同,但大多数安装的金融应用会在本地存储一些数据或缓存网页。在某些情况下,可恢复的信息可能包括用户登录名、密码、账户号码和交易详情。例如,在我们的测试中,Mint.com 应用存储了用户名、访问本地应用的 PIN 码以及一些银行账户交易信息。

• 个人电子邮件:大多数安装的电子邮件应用以明文形式存储电子邮件消息的内容,包括电子邮件头(收/发电子邮件地址)。在某些情况下,还可以恢复包括用户登录名和密码在内的用户凭据。例如,标准的 Android 邮件应用在通过 POP3 连接到 Hotmail 时,被发现以明文形式存储密码。

• 网络历史:可恢复分配的网络历史记录,包括访问过的 URL、cookies 和缓存页面。未分配的空间可能包含额外的网络历史信息。

• 谷歌搜索历史:包括搜索词的谷歌 URL。

• YouTube:观看的视频的 URL。

• 图片和视频:用户拍摄的照片和视频,存储在设备上,与应用程序相关联以及其他内容。

• 地理位置信息:图片中的 GPS 坐标,其他遗迹。

• 游戏历史和互动记录。

在这个虚构的情况下,一个熟练的法医检查员可以恢复有关个人的大量信息。

在我们的企业示例中,它仅仅建立在个人之上,因为大多数设备将个人信息与企业信息混合在一起。以下是一些通常可以从企业设备上恢复的额外项目:

• 企业电子邮件和附件

• 通过电子邮件发送的语音邮件和传真

• 用户名、密码和域名信息

• Wi-Fi 接入点、信息及密码

• 日历项目

• 即时通讯或其他与员工的通信

• 为了方便存储在设备上的企业文件

如你所见,如果攻击者想要寻找有效的方法渗透企业,员工的设备(或更好几个员工的设备)可以提供许多洞察和攻击途径——更不用说直接从设备上恢复敏感的企业信息了。

一个可能引起企业安全经理高度警惕的具体例子是,Android 内置的电子邮件应用如何存储使用微软的 exchange ActiveSync(EAS)协议的电子邮件账户的凭据。用于对 EAS 进行身份验证的凭据是用户的活动目录域用户名和密码。许多企业将身份验证、授权和计费(AAA)服务集中到活动目录中,从而实现单点登录和简化管理。总的来说,简化带来了更有效的安全性。在 Android 邮件应用(com.android.mail)中,用户的 EAS 以明文形式存储在一个明确定义的位置。数据库存储在/data/data/com.android.email 中,以下是文件夹和文件的概览:

图像

密码位于 EmailProvider.db 中,在一个名为 HostAuth 的表中的 password 列中:

图像

除了账户的用户名、密码和域名外,电子邮件的全部主题和正文都存储在数据目录中,以及附件、偏好设置和其他信息。所有这些信息都以明文形式存储(这里想到了“银盘”一词)。

攻击者访问静止数据的主要技术有两种。第一种需要物理访问设备,并使用与法医检查员本质上相同的技术,这些技术将在第六章中进行探讨。虽然物理访问设备并不一定容易实现,但我们上面提到了一些可能的情况,包括丢失或被盗的手机以及更换新机型时没有安全擦除的手机。此外,国际旅行的人,尤其是公司高管,可能会发现他们在进入一个国家时,手机被海关官员暂时没收并检查。在这种情况下,官员可以无限制地物理访问设备。

攻击者访问静止数据的另一种主要技术是远程利用和恶意软件。在这些情况下,攻击者能够通过使用编程和社会工程学技术获得额外的权限。这些技术可能包括利用 Linux 内核和 Android 核心库中发现的漏洞、网络钓鱼攻击或利用应用程序中的漏洞。此外,用户可能会无意中安装应用程序并授予超出所需访问权限的权限,从而使恶意软件能够访问静止数据。最后,社会工程仍然是一种非常有效的系统破坏方式,移动设备对此并不免疫。用户习惯于安装各种应用程序,通常对应用程序提供商了解甚少,并且经常信任并在电子邮件和短信中随意点击呈现给他们的链接,从而为社会工程学攻击打开了途径。

在传输中的数据

在传输中的数据(有时称为动态数据)是指通过网络(蜂窝、Wi-Fi 或其他网络)传输的数据,或位于 RAM 中的数据。在法律和规定中经常使用数据在传输中的术语,并定义了必须保护数据的另一个关键状态。

通常,设备上存储的大多数信息(如上所述)在某个时刻都曾通过网络传输。除了数据本身,还有大量从未持久化到设备的信息需要传输和保护。以下是一些例子:

• 密码:许多应用程序不在设备上存储密码,并要求用户每次打开应用程序时都进行身份验证。因此,密码只是传输,并不存储。

• 双因素认证

• 密码重置安全响应

• 在应用程序中显示但未保存或缓存到非易失性存储的数据(例如,账户号码和余额)

展示数据在网络中传输的一个好方法是举例说明。在这个例子中,一台运行 BackTrack 4(基于 Linux 的渗透测试套件)的计算机连接到一个网络集线器,该集线器还连接了一个 Wi-Fi 接入点。计算机上的网络接口设置为混杂模式,这使得设备可以看到网络集线器上的所有流量,即使流量并非发往该接口。运行 urlsnarf 程序,它拦截网络接口(eth0)上的流量,并检查是否有 URL。如果找到 URL,就会将其打印到屏幕上。请记住,所有网络流量都被拦截,因此任何未加密的数据,如用户名或密码,也可能被类似地捕获和查看。

image

image

攻击者用来在传输过程中破坏数据的几种已知技术,以及安全研究人员自己发现或在实际环境中揭露的新技术。一些已知的技术包括:

• 中间人(MITM)攻击

• MITM 安全套接字层(SSL)攻击

• DNS 欺骗攻击(包括/etc/hosts)

• TMSI 溢出基带攻击

基带攻击是一种非常新的技术,专注于蜂窝调制解调器(基带)固件。在 2010 年 DeepSec 会议上展示其攻击手段的 Ralf-Philipp Weinmann 表示,基带固件是 20 世纪 90 年代编写的代码。直到最近,GSM 网络背后的技术还鲜为人知。然而,随着时间的推移,研究人员揭开了协议和硬件的秘密,如今使用现成的硬件和开源软件可以创建一个恶意的 GSM 基站。控制了 GSM 网络,攻击者可以执行 TMSI 溢出攻击,该攻击会在 iOS 4.2 之前的苹果 iOS 设备的 GSM 基带堆栈中引起堆溢出。这种攻击可能导致基带处理器上的远程代码执行(Ralf-Philipp Weinmann, n.d.)。

虽然基带攻击是尖端的安全工作,但 MITM 攻击已经存在了很长时间,并且被充分理解且相对容易执行。通常,这些技术需要攻击者完全控制位于移动设备和设备试图与之通信的最终目的地之间的计算机。此外,攻击者可能控制关键网络服务或设备,如网络交换机、Wi-Fi 接入点或 DNS 服务器,从而促进攻击的进行。

一旦攻击者能够将他们的计算机定位在 Android 设备与最终目的地之间,他们就可以发起攻击。在这个场景中,让我们假设一个 Android 设备连接到一个 Wi-Fi 网络,却不知道一个恶意的攻击者控制了这个网络。用户开始上网冲浪,并最终决定检查他们的 Twitter 账户。为了简化示例,让我们假设他们使用的 Twitter 应用没有实现 SSL——大多数都没有,尽管最近官方应用开始朝这个方向发展。

当用户启动该应用时,它将连接到 Twitter 网站,进行身份验证,并引导用户进入他们的账户。当然,在此过程中,攻击者捕获了网络流量,现在拥有了 Twitter 的用户名和密码。如果应用确实使用了 SSL,但没有正确验证 SSL 证书,那么它们将容易受到 MITM SSL 攻击,如图 5.1 所示。

image

图 5.1 中间人 SSL 攻击。

尽管这种攻击可能只捕获一个密码,但大多数用户会在许多不同的网站上重复使用用户名和密码。一旦攻击者拥有了一个用户名和密码,他们就可以开始研究关于消费者的更多信息,并且通常能够找到他们可以访问的其他系统。

另一个非常著名的攻击手段是利用拦截 HTTP 会话 Cookie 来劫持网站上另一个用户的认证会话,并开始作为该用户行事。Eric Butler 的 Firefox 浏览器扩展 Firesheep(codebutler.com/firesheep)展示了这种攻击可以多么容易。尽管使用 Wi-Fi 上的 WPA 和其他本地措施等强加密可以使事情变得更加困难,但只要网站不要求全程使用 HTTPS,这种攻击仍然是有可能的。

Android 设备作为攻击途径

尽管媒体和许多安全研究人员主要关注针对移动设备的攻击,但越来越令人担忧的是将 Android 设备作为攻击途径,特别是在存储敏感数据的环境中。最常见的场景是在拥有商业机密、知识产权或其他需要保护数据的公司中找到。公司通常实施复杂的系统,旨在防止或至少检测到数据被盗。这些系统不仅购买成本高昂,而且通常需要熟练的员工来维护、监控并根据它们提供的信息采取行动。

直到最近,大多数数据保护系统主要关注保护企业边界,以防止攻击者进入受保护区域。随着时间的推移,也开发出了旨在防止内部威胁的系统。最新的系统进一步深入到网络和基础设施中,试图挫败攻击。这些系统关注诸如数据丢失预防(DLP)、网络访问控制(NAC)和网络取证等领域。然而,目前可用的解决方案尚未完全解决移动设备带来的威胁。

智能手机显然很受欢迎,大多数人也是按照预期使用它们。它们通常是个人所有且使用频繁的设备,要求某人放弃他们的设备是一种侵扰性的请求。由于这些原因,Android 设备和其他智能手机最终会出现在存放敏感信息的地点,而没有人表示关注。相反,如果有人带入了数码相机、录音设备、摄像机、外接硬盘或他们自己的网络设备,可能会引起一些注意。当然,Android 设备实际上在一个紧凑且看似无害的设备中集成了所有这些功能及更多。

数据存储

也许是利用 Android 设备窃取信息的最简单例子就是将其作为 USB 大容量存储设备使用。直到最近,智能手机的数据存储空间还非常有限。然而,随着 NAND 闪存的成熟,制造商意识到他们可以成本效益地制造出可以存储许多吉字节数据的设备。现在的 Android 设备可以在 NAND 闪存上轻松存储 8 到 16 GB 的数据,并且许多设备还包括一个外部 SD 卡,可以存储额外的 16 GB 或更多数据。

录音设备

Android 设备也完全有能力记录它们周围几乎任何东西。它们可以轻松地拍摄敏感设备或文件的图片。它们还可以录制视频,捕捉穿越建筑物的路径,包括沿途的声音、安全站、窗户、楼梯井以及其他感兴趣的项目。最后,Android 设备还可以被动地录制音频。所有这些都可以在不引起任何注意的情况下完成。

绕过网络控制

也许甚至更危险的功能是 Android 设备能够为计算机或具有无线功能的设备提供单独的网络连接。实现这一功能的方法有多种。在一种场景中,攻击者(可能是心怀不满的员工)可以将他们的 Android 设备连接到工作站。从表面上看,这并不会引起任何警觉,因为许多人工作时都会这样做以充电。然而,在 Android 设备和计算机上安装一个小程序后,将为计算机提供一个全新的网络连接。在这种情况下,从计算机路由出去并通过 Android 设备传输的流量完全不受环境控制。这个连接完全绕过了公司的防火墙、网络访问控制、数据丢失防护和其他安全控制措施。

最新的 Android 设备无需上述场景中的 USB 线和软件包。相反,Android 设备变成了一个完全功能的无线接入点,计算机可以通过它连接。这个场景同样有效地绕过了现有的网络安全控制,并且可以在将设备放在手提箱或口袋中时执行。

真正狡猾的技术

如果有人认为网络犯罪分子或其他攻击者不聪明、不具创造性,那么他们是在严重地判断失误。因此,让我们运用上述一些技术,跳出思维定势。

在这个场景中,攻击者是一家拥有重要商业机密和知识产权的公司的员工。(攻击者不一定需要在那里工作;然而,这使例子更简单。)许多可以访问这些信息的执行官也携带笔记本电脑和智能手机。这些执行官中的许多人在一家提供免费 Wi-Fi 的热门咖啡店喝咖啡。咖啡店的无线接入点名为“indigo”,由于他们不要求输入密码,接入点是开放的且未加密的。当执行官在咖啡店喝咖啡、用餐或开会时,他们会将智能手机和笔记本电脑连接到 Wi-Fi。

当他们回到办公室时,他们没有关闭智能手机和笔记本电脑上的无线功能。心怀不满的员工当然知道咖啡店的无线接入点,并决定在 Android 设备上启用接入点功能。自然,他在设备上拥有 root 权限,因此他还安装并运行了允许他捕获网络流量的软件。当一位高管靠近他的 Android 设备时,智能手机或笔记本电脑就会与他设置的接入点关联。然后,他能够拦截流量,捕获敏感文件和通信内容,或者可能捕获他可以用来访问关键网络资源的凭据。

尽管攻击者要实现这一场景必须克服一些障碍,但这是非常可能的,并且说明了当 Android 设备作为攻击载体时所呈现的独特风险。

安全考虑事项

安全与开发一样,是一门艺术。可能有人不同意这个说法,但那些人很少会阅读法医与安全方面的书籍。安全是一个艺术过程,因为艺术是“人类创造力的产物”以及“通过学习、实践和观察可以获得的高级技能”(WordNet Search, n.d.)。那么,这一切为何相关?成功的安全策略需要正确混合和平衡经验、判断、风险评估、创造力、观察、技能,甚至可能还需要一点运气。本节旨在介绍与 Android 和安全相关的一些广泛概念。

安全理念

安全几乎总是需要权衡的,即在攻击风险与缓解该风险的成本(财务或其他成本)之间进行权衡。理论上,一个完全安全的系统是可能的,但实际上几乎不可能实现,特别是当社会工程学攻击是可行的时候。即使安全专家控制了对设备的访问,包括物理和远程访问,确保一个系统的安全也是非常困难的。

移动设备比传统系统更难以保护。企业安全工程师对计算机系统的大部分控制措施在 Android 设备上不可能实现。首先,设备由一个庞大、复杂且多元化的参与者群体组装和维护的硬件和软件组成,包括核心 Android 团队、制造商的软硬件以及无线运营商的软硬件。此外,设备所有者有能力安装自定义应用程序,如果权限足够,甚至可以显著修改设备。最后,设备会穿越许多网络,没有一个可以完全信任。是的,保护移动设备是一个巨大的挑战。

尽管面临这些挑战,我们仍然可以在设备中设计一些安全控制措施。以下这个梗有助于总结整体的策略和理念:

如果你保护好了它,他们就不会来。

这个概念源自 1989 年环球影业的电影“梦幻球场”,其中有一个声音鼓励主角在他的爱荷华农场建造一个棒球场。电影中,这个声音反复说,“如果你建造了它,他就会来”(Ten, n.d.)。最终,主角确实建造了球场,实际上,神秘的客人也确实出现了。但完整的情节你还需要观看电影。

那么,这对移动安全有何影响?在理想情况下加密安全的系统与一个将所有信息以明文形式存储在良好组织和已知结构中的系统之间,存在着很大的差距,正如前面 com.android.email 的例子所描述的。由于移动设备面临许多不同的风险,即使是加密的数据也可能被攻破。然而,提供一定程度的混淆或加密将使攻击者攻破数据的过程变得复杂。尽管这种方法不是 100%安全,但攻击者往往实际并倾向于攻击容易获取的数据。

反对这种方法的观点之一是,一旦混淆或加密可以被攻破,它就会提供一个虚假的安全感,导致用户在认为他们的数据安全无懈可击的情况下,更随意地处理设备。而如果数据以明文存储,用户意识到风险,他们将更加谨慎地使用设备。

最终,移动设备的个人和企业消费者将通过他们的购买决策,引导移动安全生态系统向他们所重视的方向发展。这必然取决于教育。消费者必须充分了解数据安全风险和可能的解决方案。

有许多潜在的解决方案,虽然它们不能提供一个加密上安全的系统,但通过增加成功攻击的复杂性,确实提高了数据的安全性。以下列表说明了一些概念:

  1. 要求用户在设备重启后首次运行应用程序时输入密码,并且只在内存中存储密码。在这种情况下,密码不会以明文形式存储在设备上。然而,它在内存中,拥有足够设备权限的攻击者可能会恢复密码。

  2. 进一步,通过基于时间、伪随机数据等加密存储在内存中的密码,来加强上述概念。这样,攻击者现在必须拥有设备的 root 权限,而不仅仅是转储进程的内存,他们还必须找到加密密钥、加密密码以及组成密码的算法。

  3. 进一步地,内存密码可能会在一定时间后过期,或者内存中使用的加密密钥可能会更改。

  4. 如果密码存储在 NAND 闪存上,使用一个在设备重启后输入的密码短语对其进行加密。

尽管这些想法并不能提供一个完全安全的系统,但是要攻破数据所需付出的努力和权限比攻破以明文存储的敏感数据要高好几个数量级,因此这阻止了大多数攻击者。

美国联邦计算机犯罪法律和规定

美国有许多与静止数据和传输数据安全相关的联邦法律。本节的目标是简单列举几项较为相关的法律,并简要介绍它们。总共有超过 40 项联邦法规可用于起诉与计算机相关的犯罪行为([国家,不详])。此外,每个州通常都有针对计算机犯罪的法律和规定。

在联邦层面,美国司法部(DoJ)将计算机犯罪划分为三个不同的领域,其中两个领域与破坏移动设备时涉及的犯罪类型有广泛的应用。这两个领域是([国家,不详]):

  1. 直接针对计算机网络或设备的犯罪,包括黑客攻击、病毒、蠕虫、恶意软件、嗅探器等。

  2. 利用计算机网络或设备实施的犯罪,如欺诈、身份盗窃、企业间谍活动等。

计算机欺诈和滥用法(CFAA)专注于针对政府金融机构计算机或涉及州际或国际商务的计算机的攻击。该法案涵盖了狭窄的领域,如未经适当授权访问计算机以获取与国家安全问题相关的数据,以及更广泛的领域,如未经适当授权访问计算机以进行欺诈或获取有价值的东西。CFAA 经过国家信息基础设施保护法的修订,涵盖了新的滥用行为,并包括了那些打算犯罪的人。

电子通信隐私法(ECPA)是另一项涵盖计算机犯罪的法律,它规定未经授权截取存储或传输的电子通信是非法的。ECPA 包含几个关键领域:

• 在传输过程中的通信,包括口头、有线或电子通信(窃听)。

• 静止数据(存储通信法)保护存储在非易失性内存上的数据。

• 收集通信元数据,如电话号码、IP 地址以及其他用于路由通信(但不是消息本身)的数据。这被称为“笔式记录器和追踪设备”,指的是用于捕获信息的实际设备和技巧。

值得指出的是最后一项法律,即经济间谍法,该法于 1996 年通过,专注于商业秘密的盗窃。在法律实施之前,很难起诉经济或企业间谍活动。然而,通过定义商业秘密并要求信息所有者采取合理措施保护秘密,现在可以刑事化知识产权的盗窃。

本节只是简要触及了可以用于起诉计算机犯罪的大量法律工作。然而,应该清楚的是,有旨在保护传输中和静止状态下的数据的法律。

除了将计算机犯罪刑事化的联邦和州法律之外,许多监管机构还管理着在涉及敏感数据的行业中运营的公司。许多规定不仅提供了公司必须遵守的具体指导方针和要求,而且还规定了民事和刑事条款,包括经济处罚,在最为严重的情况下,甚至可能涉及监禁。一些较为知名的规定包括以下内容:

• 支付卡行业数据安全标准(PCI)

• 健康保险便携性与责任法案(HIPAA)

•HITECH 法案执行暂行最终规则(对 HIPAA 的补充)

• 联邦信息安全管理法案(FISMA)

• 1974 年家庭教育权利与隐私法案(FERPA)

• 1999 年 Gramm-Leach-Bliley 金融服务现代化法案(GLBA)

•萨班斯-奥克斯利法案(SOX)

显然,美国国会认识到了数据和计算机安全的重要性,并提供了一系列法律、法规和其他资源,以促使和强制执行成功运营对商业至关重要的系统所需的安全措施。

开源与闭源

网络上经常活跃地讨论开源软件是否比闭源软件更安全的问题。像许多长期存在的争论一样,每一方的坚定支持者都致力于他们的结论,争论仍在继续。

认为开源软件更安全的根本原因在于,可以检查代码中的缺陷并迅速修复。这种信念中隐含着两个假设:

  1. 开发人员将对开源项目进行安全代码审查。

  2. 软件的维护者将迅速修补安全漏洞。

当然,如果这两个步骤都没有采取,那么开源软件显然会包含安全漏洞,而且如果没有补丁,攻击者将准确获得他们利用漏洞所需的信息。然而,如果这两个步骤都得到了执行,那么代码的安全性将在众多人士检查代码及产生的补丁的好处下得到提升。

相比之下,闭源模式依赖于一个公司开发安全代码,彻底审查其代码中的安全漏洞,修补这些漏洞,并及时将更新分发给订阅者。对于任何负责保护运行微软 Windows 平台桌面的安全的人来说,他们都非常清楚每个月第二个星期二发布的连续不断的补丁流,这被称为“补丁星期二”。微软还会在预定补丁星期二之外发布针对严重漏洞的补丁。

在一个相当高调的发现中,微软承认(微软安全公告,未标明日期),安全研究员 Tavis Ormandy 在自 1993 年以来的每个 32 位版本的 Microsoft Windows 中都发现了一个 17 岁的安全漏洞(从 Windows NT 到 Windows 7。Johnston,未标明日期)。Ormandy 在通知微软该漏洞的六个月后,于 2009 年 6 月 12 日将漏洞利用的详细信息发布到了 Full Disclosure 邮件列表中([Full-disclosure] Microsoft,未标明日期)。值得注意的是,在 Ormandy 发布披露信息之后,微软才向客户发布了官方公告,并在那之后的一天内承认了这一安全漏洞。

在另一个最近的例子中,安全公司 Matta Consulting 在 Cisco System 的统一视频会议平台上发现了许多关键安全漏洞。这些漏洞使得恶意第三方能够完全控制设备,获取用户密码,并可能对目标基础设施的其他部分发起攻击(Cisco Unified Video,未标明日期)。Cisco 在其公告中承认了这些漏洞,其中硬编码的密码代表了最令人担忧的漏洞:

Linux 阴影密码文件包含三个硬编码的用户名和密码。这些密码无法更改,账户也无法删除。攻击者可以利用这些账户通过允许的远程访问协议远程访问设备。

(Cisco 安全公告,未标明日期)

最终,软件开发是一项创造性的事业,尽管尽最大的努力和意图,软件或系统很可能仍会存在缺陷。软件或系统的整体安全性直接与发现和解决缺陷的速度相关。尽管大卫·A·惠勒的“Linux 和 Unix 安全编程指南”已有八年之久(从安全的角度来看这是一段很长的时间),但它对这场辩论的概述非常出色,并代表了双方的观点。他引用了 Elias Levy(又名 Aleph One,Bugtraq 完全披露列表的版主,同时也是 SecurityFocus 的首席技术官和联合创始人)的话说:

那么,所有这一切是否意味着开源软件在安全漏洞方面并不比闭源软件好呢?不是的。开源软件确实有可能比其闭源对手更安全。但不要误以为,仅仅因为是开源就能保证安全。

(安全编程,未标明日期)

在他的 HOWTO 的最后,惠勒总结说,如果以下情况发生,开源软件可以更加安全:

如果代码先闭源后开源,它起初的安全性可能会较低,但随着时间的推移将会得到改善。

• 人们必须审阅代码。

• 审阅者和开发者必须知道如何编写安全的代码。

• 一旦发现缺陷,就必须迅速修复并分发。

最终,每个人将不得不决定他们认为开源软件还是闭源软件更安全。由于 Android 系统的很大一部分确实是开源的,因此该软件最初可能会发现许多缺陷,但随着时间的推移,它们将被解决,从而使得系统更加安全。

加密 NAND 闪存

通常来说,用于保护传输中数据的技术和策略比用于保护静止存储数据的技术更为成熟、经过验证且安全。数据在传输中更容易得到保护的原因是因为必须保护信息的时间是短且明确的。数据在传输完成后,保护数据的密钥可以被丢弃。相比之下,静止数据是非易失性的,且必须随时可供用户访问。这意味着解密密钥必须在设备上可用(或者用户每次都必须输入,这实际上是不切实际的),因此它们可以被攻击者访问。

受尊敬的安全技术专家、密码学家和作家布鲁斯·施奈尔总结了使用加密保护静止数据的困难:

密码学是为了保护通信而发明的:即运动中的数据。这是密码学在历史上大部分时间内的使用方式,也是世界各国的军队发展该科学的方式。Alice 是发送者,Bob 是接收者,Eve 是窃听者。即使当密码学被用于保护存储的数据——静止数据时,它也被视为一种通信形式。在我的《应用密码学》一书中,我这样描述加密存储数据:“存储的消息是某人通过时间与自己通信的一种方式。”数据存储只是数据通信的一个子集。

在现代网络中,这种差异更为深刻。通信是即时和瞬时的。加密密钥可以是短暂的,像 STU-III 电话这样的系统可以设计成在通话开始时创建加密密钥,并在通话结束后立即销毁。而数据存储则是随时间发生的。任何加密密钥都必须与加密数据一样长存。存储这些密钥变得与存储未加密数据一样重要。在某种程度上,加密并没有减少必须安全存储的秘密数量;它只是使它们变得更小。

历史上,之所以能够对存储的数据进行密钥管理,是因为密钥可以被存储在一个安全的地方:人类的大脑。人们会记住密钥,除非人们本身受到物理和情感攻击,否则不会泄露密钥。在某种意义上,这些密钥被存储在一个未连接到任何网络的“计算机”中。在那里它们是安全的。

这个整个模型在互联网上崩溃了。互联网上存储的大部分数据只是间接打算供人使用;它主要是供其他计算机使用的。问题就在这里。密钥不能再存储在人们的大脑中。它们需要存储在存储数据的同一台计算机上,或者至少是网络上。这样风险要大得多。

(Schneier on, n.d.)

其他几个平台,特别是苹果 iPhone 的后期型号,在 NAND 闪存的用户部分实施了加密。然而,在苹果 iOS 3.x 版本的情况下,由于前面提到的原因,加密很快就被突破了。截至 2011 年 3 月,iOS 4.x 的加密尚未被破解。然而,随着时间的推移,这种情况很可能会发生。

针对加密 NAND 闪存的取证策略与未加密的有所不同。如果 NAND 闪存未加密,内存可以通过芯片脱焊或 JTAG 过程物理读取,然后再解码。然而,对于加密的 NAND 闪存,这种技术将不再有效。相反,要在设备运行时提取未加密数据,这个过程在设备上执行。在取证中,这被称为活体获取,并用于其他场景,例如加密硬盘或其他存储设备内容的工作站或服务器。

加密将在保护传输中和静止状态下的数据方面发挥越来越重要的作用。然而,静止状态下的数据几乎总是容易受到攻击。在这种情况下,安全设计师必须在加密安全系统与提供很少保护的系统之间找到平衡。这种妥协将导致一个在不妨碍用户使用设备的前提下,提供合理保护静止和传输中数据的系统。

个体安全策略

尽管这一章的大部分内容集中在移动设备和数据安全问题上,但用户的一些做法可以最小化被破坏的风险。像以前一样,这个列表并不是打算做到面面俱到。相反,它提供了一个保护设备安全的基础。

  1. 始终使用您信任的数据网络。对于移动设备来说,这可能包括您的无线运营商的数据网络或在工作、家庭或其他可信任地点的 Wi-Fi 接入点。这确保了用于传输敏感数据的网络不是恶意的,也不会被攻击者用来损害您的敏感数据。尽管运营商的网络可能被攻破,但在大型公司中的安全性要远高于小型数据网络。此外,虽然建立一个恶意的 Wi-Fi 接入点很容易,但实施恶意的蜂窝数据连接要困难得多。因此,总的来说,无线运营商提供的蜂窝数据连接降低了遭受攻击的风险。

  2. 应始终在 Android 设备上设置密码,以阻止随意攻击者获取你敏感数据的访问权限。理想情况下,如果输入的密码错误次数超过设定值,Android 设备应执行用户数据的完全擦除。这样攻击者就无法通过暴力破解来破解你的密码。此外,如果可能,使用字母数字密码选项而不要使用四位数的数字 PIN 码或图案锁。字母数字密码通过允许更复杂的密码提供了更高的安全性。将设备上的密码视为类似于你电脑上的密码。很难想象(或许仅对于安全研究人员来说)会有人拥有没有密码的电脑。

  3. 访问viaforensics.com/appwatchdog/检查免费的 appWatchdog 服务,以确定你使用的应用程序是否通过了基本的安全测试。appWatchdog 审计移动应用,以确定它们是否安全地存储了你的用户名、密码和敏感的应用数据。该网站为每个测试区域提供通过、警告或失败的检测结果以及恢复的信息详情。目前,正在开发一个可以直接安装在 Android(或 iPhone)设备上的 appWatchdog 移动应用版本,以确定已安装应用的审计状态。它还将允许用户直接联系应用开发者,请求解决审计问题以及其他通知选项。

  4. 绝不要点击短信中的链接,理想情况下也应避免点击电子邮件中的链接,尤其是像 bit.ly 或 goo.gl 这样的缩短链接。根据安全公司 Trusteer 的研究,智能手机和平板电脑用户比传统 PC 和笔记本电脑用户更容易受到电子邮件网络钓鱼诈骗的影响三倍(Donohue, n.d.)。研究发现,由于屏幕尺寸较小和缺乏保护用户免受钓鱼诈骗的软件,从智能手机上识别欺诈网站更加困难。确保访问有效网站的最佳方法是手动输入,或者(或许更好的方法)允许一个可信赖的搜索引擎代表你找到网站。这样用户可以输入(或误输)公司名称,并允许搜索引擎找到适当的网站。一些搜索引擎,如谷歌,现在试图阻止恶意或受损的网站,这为智能手机用户提供了额外的保护层。

  5. 考虑在你的 Android 设备上使用替代的网页浏览器。如前所述,网络犯罪分子是务实的,这就是为什么多年来他们一直专注于攻击 Microsoft Windows,而基本忽略了像 Linux 和 Mac 这样的操作系统。在移动环境中,许多捆绑的浏览器基于开源的 WebKit 项目。因此,针对 Android 和其他智能手机设备的初始网络攻击可能会集中在使用 WebKit 的浏览器上。通过使用替代浏览器,你可能会发现针对你平台的攻击少得多。然而,这可能只提供名义上和暂时的安全性提升。

  6. 从 Android Market 安装应用程序时,请确保应用程序只被授予其运行所必需的权限。如果你在安装一个增强型闹钟应用,而它请求访问你的短信和网页历史数据,你不应该授予它权限。尽管这不能保护你免受所有恶意应用程序的影响,但这对于 Android 的安全来说是一个重要的层次,用户必须承担起这个责任。

随着时间的推移,这个列表不仅会增长和演变,而且希望会引入新的安全控制措施,这将有助于保护移动设备和敏感数据。

企业安全策略

企业通常具有比个人更复杂的安全要求,因为它们需要保护整个公司免受内部和外部攻击的影响。此外,它们可能属于受监管的行业,需要按照本章前面列出的一些指导方针进行操作。基于这些原因,需要对资产进行更细致的控制,包括移动设备。

政策

在企业中,移动设备管理的一个重要方面是仔细评估现有政策,并确保针对移动设备带来的新情况对它们进行更新。大多数政策没有考虑到智能手机和平板电脑以及通过它们使用可能出现的状况。尽管需要对公司政策进行全面审查,但至少有几个政策肯定需要关注。它们包括以下内容:

• 可接受的使用(对公司资源,现在包括移动设备)

• 数据安全(显然需要围绕移动设备制定政策)

• 备份和数据保留(可能会受到影响,尤其是在电子发现的角度)

虽然更新政策并不能直接通过信息技术提高安全性,但它为员工、安全架构师以及参与内部调查和纪律的人员提供了关键指导。如果你有一项过时的政策,它可能会被用来对你不利。例如,如果你的可接受使用政策只是在受保护资源的描述中简单加入了移动设备,那么所有允许公司调查他们所拥有设备的规定现在都被明确规定了。否则,在激烈的法庭斗争中,对方律师很可能会主张移动设备并未被政策覆盖,因此设备上发现的证据(例如公司机密文件)不可采纳。虽然你的法律团队可能会反驳这一论点,但简单地更新政策以包括移动设备要便宜得多且更有效。

密码/图案/PIN 锁

安卓设备上的密码、图案和 PIN 锁并未得到一致且有效的实施,但它们确实提供了一定程度的保护。这些功能自首次出现以来已经有所改进,并且预计随着时间的推移将继续得到改进。随着处理能力的指数级增长和成本的同步降低,使用暴力破解技术来破解保护机制变得可行且每年越来越常见。然而,如果设备丢失或被盗,这些基本保护措施对于非技术型犯罪分子是有效的。

并非所有的密码都是平等的。最有效的密码是允许或要求使用字母数字组合的密码。尽管用户输入这些密码要麻烦得多,但它大大增加了破解密码所需的努力。接下来最有效的密码是在第一部安卓设备中出现并在许多后续设备中继续使用的图案锁。图案技术引入了一种新的锁定设备的方法,因此要求用户学习新技术,从而实现了更有效的锁定。用户不得不放弃重用旧方法(如 PIN),而想出一个新图案,因此攻击者很难利用个人信息来猜测图案锁。或许因为熟悉,许多安卓设备也包含了久经考验的 PIN 锁。虽然使用 PIN 锁比不锁手机要好,但 PIN 锁可能是最容易被破解的锁。它们通常有有限的数字位数(四个是最常见的),这危险地限制了总的组合数量。此外,PIN 锁已被用于保护许多其他系统,最著名的是自动柜员机(ATM)卡。人们倾向于重复使用 PIN 码,并且基于容易发现的个人信息来设置 PIN 码。

如前一部分个人策略所建议的,密码锁应该设置一个最大尝试次数,超过该次数后设备应执行工厂重置并对用户数据分区进行完全擦除。这将防止对更容易被破解的密码(例如,四位数的 PIN 码)进行暴力破解攻击,并提供额外的安全层。

设备的远程擦除

企业安全经理们最希望智能手机具备的安全功能之一是远程擦除设备的能力。毫无疑问,这一功能极其重要且强大。然而,这是一个非常脆弱的功能,它给安全经理们带来的信心可能过于高估了。

远程擦除背后的基本原理是公司可以向设备发出命令,使其擦除所有数据并执行工厂重置。许多智能手机平台正在其系统中构建钩子以允许这种控制。然而,这些功能并非从一开始就设计好,目前还不足以确保高安全性。

即使远程擦除钩子存在且有效,只需使用飞行模式、移除 SIM 卡或其他类似技巧,就可以轻松阻止远程擦除命令。实际上,一些公司可能首先禁用被解雇员工的手机账户,然后发送远程擦除命令。在大多数情况下,他们可能无意中移除了远程擦除设备的能力。尽管设备不再连接到网络,但仍然可以完全访问数据。对于有 root 权限的设备所有者来说,他们也可能研究过滤此类请求,简单地忽略它们。然而,最大的问题仅仅是远程擦除功能还不够成熟。

在摩托罗拉 Droid 手机的 Android 2.1 版本中,使用微软的 Exchange ActiveSync 触发的远程擦除功能并没有导致设备擦除数据。然而,在同样的功能在 Android 2.2 版本中测试时,远程擦除确实发生了。如果你依赖远程擦除功能来保障数据安全,你需要确保该远程擦除功能在安装了每个 Android 版本的每个 Android 硬件平台上都能正常工作。不幸的是,对于大多数 IT 部门来说,这是一项艰巨的任务,因为设备分布广泛且没有一个良好的中央管理工具(关于这一点稍后会详述)。

一种相当简单的技术,可以克服远程擦除的限制,就是在设备上安装一个应用程序,如果设备在特定时间后无法与企业系统检查联系,该程序将自动擦除设备。使用这种技术(通常称为看门狗或倒计时应用程序),可以显著提高数据安全性,因为如果设备在多次尝试后仍无法连接到企业系统,它将自动擦除。因此,即使设备离线,安全管理人员也可以确保所有企业数据在特定时间框架内被擦除。当然,如果用户因正当理由长时间将手机从网络中断开,这将导致手机被擦除,因此对这一功能进行用户教育非常重要。目前,支持此功能的应用程序非常少(如果有的话)。

另外还有一种技术,针对的是 NAND 闪存上的数据。可以开发一个应用程序(实际上已经有一些存在),定期擦除设备用户数据存储分区中未使用(未分配)的空间。这样做的好处是,(大多数)删除的数据将不再可恢复,即使进行物理镜像也是如此。这种擦除可以通过让应用程序简单地写入一个充满 0xFF 的文件,直到分区填满来实现。在那时,删除文件,从而覆盖了分配的空间。当然,这样的程序可能会带来很多副作用,包括缩短 NAND 闪存的寿命,在写入文件时导致设备响应缓慢,耗尽电池,或者如果其他应用程序在分区完全填满时尝试访问分区,可能会导致这些应用程序崩溃或丢失数据。

升级到最新软件

尽管智能手机市场创新迅速,但企业升级核心基础设施(如 Microsoft Exchange 环境)要困难得多。然而,最后两个版本的 Microsoft Exchange 提供了增强的移动管理和安全机制。当 Exchange 升级到最新版本(目前是 Exchange 2010)时,会有更多选项来安全地管理您的设备。确保企业基础设施保持最新,不仅会提高可管理性,也会提升连接的移动设备整体的安全性。

同样,移动设备本身也应该在可用时应用更新。虽然在某些情况下可能会引入新的错误或安全漏洞,但总体而言,更新后的软件不仅会修补之前发现的缺陷,还会增加额外的管理和安全功能。上面远程擦除部分提到的例子就很好地说明了这一点,因为摩托罗拉 Droid 上的 Android 2.1 并没有正确执行远程擦除命令,而 Android 2.2 则可以。

远程设备管理功能

企业客户对于管理连接到其基础设施的移动设备的需求日益增长。尽管不同公司的功能列表会有所不同,但一个通用的需求列表可能包括以下内容:

• 远程配置设备

• 远程擦除设备

• 强制执行 IT 政策,如密码、加密、最低操作系统版本、升级政策、允许/禁止的应用程序等

• 远程安装/升级应用

自从 Android 2.2 开始,引入了新的设备管理应用程序编程接口(API)。它们包括应用程序整合前面提到的策略管理类型的能力。具体来说,它们支持(设备管理,n.d.)以下能力。

• 启用密码:要求设备请求 PIN 码或密码。

• 最小密码长度:设置密码所需字符数。例如,你可以要求 PIN 码或密码至少有六个字符。

• 需要字母数字密码:要求密码必须包含字母和数字的组合。可能包括符号字符。

• 最大失败密码尝试次数:指定用户在设备擦除数据前可以输入错误密码的次数。设备管理 API 还允许管理员远程将设备重置为出厂设置。这样可以在设备丢失或被盗的情况下保护数据。

• 最大不活动时间锁定:设置用户上次触摸屏幕或按下按钮后,设备锁定屏幕的时间长度。发生这种情况时,用户需要再次输入他们的 PIN 码或密码才能使用设备并访问数据。该值可以在 1 到 60 分钟之间。

• 提示用户设置新密码。

• 立即锁定设备。

• 擦除设备数据(即,将设备恢复到出厂默认状态)。

developer.android.com的设备管理页面(设备管理,n.d.),演示了此 API 的几个示例,如图 5.2 所示。

图像

图 5.2 设备管理 API 示例。

当用户安装一个使用新管理 API 的应用程序时,他们会看到一个“启用设备管理员”的屏幕,如图 5.3 所示。

图像

图 5.3 启用设备管理员。

尽管这比没有设备管理有所改进,但它远远不能满足企业客户的需求和要求。此外,尽管 API 存在,但开发者必须将它们整合到他们的应用中。

几家公司正在尝试填补全功能设备管理的空白。然而,针对智能手机的解决方案也仍然相当不成熟。投资第三方解决方案可能满足短期需求。然而,随着时间的推移,Android、制造商和设备开发者将开发更复杂的管理功能和工具。同样,许多企业设备使用微软的 Exchange ActiveSync(EAS)协议与电子邮件系统同步,这个平台的管理功能也在不断成熟。因此,如果迫切需要更好的远程设备管理以提高安全性,企业可以考虑实施第三方工具以逐步提高安全性。然而,存在这样的风险:这些工具可能无法满足或超过制造商的工具,从而使得技术和人员的投资可能不值得。

由于移动设备上的企业数据大多围绕电子邮件,因此在这个领域集中安全努力可以取得良好效果。一些公司已经认识到这一需求,并开发了自己的电子邮件客户端,这些客户端实施包括双因素认证、加密数据存储和额外的管理界面在内的一系列附加安全机制。然而,注重安全的实体应该审计这些软件,以确保它们实际上实现了所声称的功能。

显然,远程设备管理对企业客户来说非常重要,尽管这些功能的支持还不够成熟,但预计在接下来几个 Android 版本中会有显著的改进。

应用程序和设备审计

如果你不完全了解哪些信息处于风险之中,就很难保护移动设备和其数据。企业可以启动移动安全和风险缓解审计,以评估移动设备上暴露的数据。通过分析公司实际使用的设备和操作系统,可以确定存储了哪些数据,数据可能在哪些地方处于风险中(在设备上、传输过程中、备份中等),并创建具体的策略、程序,甚至软件实施来最小化风险。

一个典型的审计可以包括评估许多标准,包括

• 可能存储在设备上的企业数据类型

• 数据存储的位置

• 可以安装哪些其他应用程序,以及它们可以访问企业数据

• 远程擦除和设备管理的有效性/能力

• 实施企业安全策略的能力

• 密码、认证信息和其他敏感数据的安全存储和传输

• 加密的有效性

一旦支持设备被充分理解,保护静止和传输中的数据任务就不再那么令人畏惧,可以制定具体策略来最小化不可接受的风险。

与信息安全的其他领域一样,需要策略和持续的过程来维持适当的安全措施和评估风险。

应用开发安全策略

对于移动安全来说,一个极其重要的最后领域是开发并安装的应用程序。这不仅包括第三方应用程序,还包括操作系统开发者(在这种情况下是 Android)、设备制造商和无线运营商分发的应用程序。应用程序是用户与其移动设备交互以访问他们感兴趣信息的主要机制。通常这些信息是敏感的,并且提供了关于用户的私人细节。

移动应用程序安全测试

在进行取证工作的过程中发现了许多移动应用程序的安全漏洞,作者和 viaForensics 的同事们开始对流行应用程序的数据安全性进行审计,并在我们的网站上公开披露他们的发现。名为 appWatchdog 的免费公共服务的目标是提高移动应用程序数据安全性,保护消费者。随着消费者对数据安全风险意识的提高,将鼓励开发者在发布前彻底审查他们的应用程序,并达到更高的安全水平。调查结果可以在viaforensics.com/appwatchdog/查看。viaForensics 计划发布一个移动应用程序,该程序将检查 Android 设备上安装的应用程序,并提供已审计应用程序的 appWatchdog 结果。它还将允许消费者建议审查某个应用程序,并在有疑虑时联系应用程序开发者。

appWatchdog 服务采用取证和安全评估技术来确定用户名、密码、信用卡号码或其他应用数据是否被不安全地存储。该过程包括安装应用程序,并以消费者使用该应用的方式运行它。然后对设备进行取证成像和分析,以获取个人信息和应用数据。首先将调查结果通知应用开发者,然后公开披露,以便直接向消费者提供此信息。用户可以据此做出是否继续使用该应用的明智决定,或者等待开发者发布更安全的版本。

每个应用程序都根据特定标准进行审查,这些标准取决于应用程序的具体用途。例如,对于移动支付应用,将分析用户名、密码、应用数据和信用卡号码。然而,对于其他应用程序,信用卡号码可能并不相关。以下标准将详细解释,其中前三项最适用于大多数应用程序:

• 是否安全存储密码? 如果设备上以任何形式未加密存储密码,该应用程序将被评为“不合格”。

• 安全存储用户名? 检查应用程序数据以确定用户名是否未加密存储在设备上。

• 安全存储应用程序数据? 分析每个应用程序以查找与应用相关的数据。例如,金融应用会被搜索账户号码、余额和转账信息。其他应用程序可能会存储额外的个人信息,如电子邮件地址、电话号码或地址。

• 安全存储信用卡信息? 对于处理信用卡信息的应用程序,将检查数据以确定设备上是否未加密存储了完整的信用卡号码以及与信用卡相关的任何支持数据,如有效期或卡片背面的安全号码。

• 附加安全测试: 这些测试可能包括捕获移动设备发送的无线数据,并检查该流量中是否包含用户名、密码、PIN 码以及其他相关的应用程序数据。附加安全测试通常更耗时,因此只在深入的应用程序安全审查中执行。

appWatchdog 服务仅提供了一种基本指示,用以判断移动应用是否实现了安全措施。通过结合先进的移动取证和安全技术,对移动应用程序进行更深入的分析是可能的。以下列出的是一些应评估的标准,用以确定移动应用程序是否安全。

• 应用程序如何处理网页历史和缓存?

• 应用程序是否安全传输登录数据?

• 应用程序是否能够避免中间人攻击?

• 应用程序是否安全传输敏感数据?

• 应用程序是否能够防止会话劫持?

• 应用程序是否能够永久删除数据并阻止在设备上存储?

• 应用程序是否安全处理中断?

• 应用程序是否在备份中正确保护数据?

彻底的应用程序安全审计利用先进的取证和安全测试来揭示安全漏洞,保护开发者和用户。viaForensics 提供这些测试服务以及一个名为 appSecure 的认证。只要内部取证和安全团队拥有工具、专业知识、预算和时间来执行测试,他们可以有效地应用类似的测试方法。

应用安全策略

appWatchdog 和 appSecure 的结果导致了一些移动应用开发者应该考虑的一般性指南,这些指南涉及应用的设计、开发和测试阶段。这个列表和其他列表一样,并不一定详尽无遗,但提供了一些值得考虑的重要概念。

用户名

避免在设备上以明文形式存储用户名。出于明显的可用性问题,你可能会决定在设备上缓存用户名,以便消费者不必每次都输入。但是,考虑对用户名的一部分进行掩码处理,为消费者提供足够的信息以识别他们的用户名,但不足以让攻击者获得整个用户名。用户名是登录账户所需的组成部分之一,攻击者知道得越少,他们就越无效。

例如,假设有一个访问敏感健康信息的应用程序需要用户名。消费者创建了一个名为“andrewhoog”的用户名。但是,在初次登录后,如果应用程序只存储“andr∗∗∗∗”并显示给用户,那么用户可以清楚地知道他们登录的是正确的账户。然而,攻击者可能只能获取前四个字符。此外,如果掩码(在这种情况下使用“∗”,但也可以以其他方式呈现)没有透露出用户名的总长度,这将使攻击者更难以猜测。

最后,越来越多的在线服务要求更复杂的用户名,必须具有一定长度且为字母数字组合。因此,一个用户名“andrewhoog”可能相对容易猜测,而“AndrewHoog6712”则要困难得多。一些网站甚至可能对用户名施加更多限制,比如不能包含你基本资料信息(如你的名字)的任何部分。

密码

也许更令人担忧的是那些将密码以明文形式存储的应用程序。有几种策略可以避免这个严重的问题。首先,如“安全哲学”一节所述,你可以简单地要求用户每次运行应用程序时都输入密码。如果你考虑从家里电脑登录银行网站的情况,每次都必须登录。虽然你可以在当前会话中保持登录状态,但在一定时间的非活动期过后(或者你登出),如果没有重新输入用户名和密码,你就无法访问受保护的网站。

另一个可以考虑的方法是使用安全令牌来避免在移动设备上存储真实密码。如果用户安全地通过互联网认证到受保护的资源,可以生成一个安全令牌,该令牌不仅会在一定时间后过期,而且仅限于该设备。尽管拥有物理访问手机的人可以访问受保护的资源,但这仅持续到令牌过期为止,届时他们需要再次输入用户名和密码。此外,如果安全令牌特定于设备并且远程受到威胁,令牌将无法访问受限资源。使用安全令牌方法的技术也不会将互联网上的任何其他受保护资源置于风险之中,即使账户持有人使用相同的用户名和密码(这是相当常见的)。

实现基于令牌的认证方案比简单的用户名和密码更为复杂,这是一种开发者不太广泛使用或理解的 方法论。然而,许多提供此功能的 API 已经可用并日趋成熟。一个名为 OAuth 的框架得到了许多 Google 服务的支持。还有其他 API,但它们往往专注于特定服务。OAuth 网站描述了与其他服务的相似性和联系:

OAuth 是许多成熟行业协议的标准化和集体智慧的结晶。它与目前使用的其他协议(如 Google AuthSub、AOL OpenAuth、Yahoo BBAuth、Upcoming API、Flickr API、Amazon Web Services API 等)相似。每种协议都提供了一种专有的方法,用于交换用户凭证以获取访问令牌或票据。OAuth 是在仔细研究这些协议后,提取最佳实践和共性,以便新实现以及现有服务平滑过渡支持 OAuth。

OAuth 比其他一些协议和服务在处理非网站服务方面更为先进。OAuth 内置了对桌面应用程序、移动设备、机顶盒以及当然还有网站的支持。今天许多协议使用硬编码在软件中的共享密钥进行通信,当尝试访问你的私人数据的服务是开源的时候,这会带来问题。

(Introduction—OAuthn, n.d.)

由于 Google 正在向 OAuth 过渡,他们提供了关于 API 以及如何使用的详细信息。在 Google Code 网站上,他们提供了以下关于 OAuth 过程的基本概述(Default, n.d.):

  1. 你的应用程序请求访问,并从 Google 的授权服务器获取一个未经授权的请求令牌。

  2. Google 要求用户授权你的应用程序访问所需数据。

  3. 你的应用程序从授权服务器获取一个经过授权的请求令牌。

  4. 你用经过授权的请求令牌交换访问令牌。

  5. 你使用访问令牌从 Google 的服务访问服务器请求数据。

如你所见,实际的用户名和密码只发送到授权服务(在本例中为 Google),并且不会存储或与请求的应用程序共享。请求的应用程序通过协商过程获得各种令牌,并需要存储最终的访问令牌,但时间和范围都是有限的。

尽管典型的 OAuth 场景允许第三方服务(例如社交媒体网站)在时间和范围限制内,基于令牌对受保护信息(例如,你的 Gmail 联系人列表)进行认证,但有趣的是指出应用开发者可以使用 OAuth 服务对自己进行认证。采用这种方法,应用开发者不仅以标准化的方式提供安全的、基于令牌的服务访问,而且现在他们拥有允许经过批准的第三方应用访问数据的基础设施,前提是账户所有者授权访问。

有许多不同的方案和技术可以用来安全地认证用户,这些用户不需要移动应用在移动设备上以明文形式存储用户名和密码。应用开发者必须转向这些更安全的方法,以更好地保护他们的客户。

信用卡数据

安全行业的多数人都熟悉支付卡行业(PCI)数据安全标准(DSS),它为保护信用卡数据提供了标准。在 PCI 安全标准委员会(SSC)成立之前,主要的信用卡供应商都有自己的信用卡数据保护标准。2006 年,以下支付品牌发起了 PCI SSC:

• 美国运通

• 发现金融服务

• JCB 国际

• 万事达卡全球

• Visa 公司

这些品牌在减少支付卡行业的欺诈行为方面有着既得利益。在 2010 年 10 月发布的 2.0 版“要求和安全评估程序”文件中,列出了 PCI DSS 的具体要求。以下是一小部分要求示例,涵盖了在移动应用中使用信用卡数据的情况(文档库,未注明日期)。

• 3.2 授权后不要存储敏感认证数据(即使已加密)。敏感认证数据包括 3.2.1 至 3.2.3 要求中引用的数据。

• 3.2.1 不要存储任何磁道(位于卡片背面的磁条,芯片中包含的等效数据或其他地方)的完整内容。这些数据也可以称为全磁道、磁道、磁道 1、磁道 2 和磁条数据。

• 3.2.2 不要存储用于验证非现场交易(卡不在场交易)的卡片验证码或值(打印在支付卡正面或背面的三位数或四位数)。

• 3.2.3 不要存储个人识别号码(PIN)或加密的 PIN 块。

• 3.3 显示时遮蔽 PAN(最多显示前六位和最后四位数字)。

• 3.4.1 如果使用磁盘加密(而不是文件或列级别的数据库加密),逻辑访问必须独立于本地操作系统访问控制机制进行管理(例如,不使用本地用户账户数据库)。解密密钥不得与用户账户绑定。

尽管 PCI DSS 并非没有受到批评,但它是一个相当成熟的标准,旨在保护数量惊人的金融交易。有趣的是,可以比较 PCI DSS 随时间发展起来的某些标准,如要求加密,限制存储敏感信息,以及在屏幕显示时屏蔽敏感信息。

无需多言,在移动设备上以明文形式存储信用卡信息不仅违反了 PCI DSS 标准,而且在设备受到威胁时也会使卡主面临极大风险。或许不足为奇,上面提到的 appWatchdog 服务会检查是否以明文形式存储信用卡数据,不幸的是,在一些应用程序中发现了这些信息。

如果一个应用程序需要处理支付,建议与成熟的在线服务如 PayPal 和 Google Checkout 集成,或者与支付提供商合作实现安全的支付应用程序。请注意,这是一个重大的任务,不仅从开发和测试的角度来看是这样,还需要进行持续的安全审计过程。

敏感应用程序数据

许多移动应用程序包含消费者不希望失去控制的敏感数据。数据有不同的级别。以下是一个旨在说明级别的简单列表:

  1. 不含敏感用户数据——例如,计算器应用程序不包含任何敏感用户数据。

  2. 不含敏感用户数据但可能包含一些元数据——例如,天气应用程序不包含任何敏感用户数据;然而,它可能包含应用程序运行时的 GPS 坐标和日期/时间戳。

  3. 包含用户数据但不是敏感的——一些应用程序旨在供公众使用,如人们在 Twitter 上分享的信息。如果用户知道他或她的所有 Twitter 消息都可以被全世界阅读,大多数人(除了那些保护自己消息的人)不会感到担忧。

  4. 包含敏感用户数据——许多应用程序属于这一类,包含敏感用户数据,如您的完整电子邮件消息、短信和彩信、语音邮件、通话记录等等。

  5. 高度敏感的用户数据——这是一个特殊级别,涵盖包含财务信息、医疗保健信息、密码保险库以及其他如果其安全性受到威胁会使消费者面临极大风险的应用程序。

识别应用程序包含的数据敏感性有助于提供适当级别的安全保护。如果一个计算器应用程序需要双因素认证和 AES-256 加密,用户显然会感到烦恼,可能会尝试在纸上计算 15%的小费(一旦写下,它将面临多种物理和社会工程攻击的风险,但这只是题外话)。

然而,appWatchdog 服务经常发现包含第 4 和第 5 级别敏感数据的应用程序,这些数据以明文形式存储在 NAND 闪存上。如果你开发的程序包含此级别的敏感数据,你应该以某种安全级别来保护这些数据。有许多选项包括……(此处原文未提供后续内容,故无法翻译后续部分)

  1. 不要存储数据——这是最简单的做法,可以缓解任何授予访问 NAND 闪存的攻击。如前所述,用于保护传输中数据的加密算法比任何保护静态数据的方法(至少在移动设备上)都更有效。大多数移动设备与互联网高度连接,因此无需缓存数据。当然,缓存数据也有其优势,包括即使设备离线也能提供访问,以及提高应用程序响应性。

  2. 加密数据——如前所述,在移动设备上对静态数据进行加密需要将密钥也存储在设备上,因此它不能提供完美的安全性。然而,如果密钥足够难以找到,它提供的保护级别比明文要高得多。此外,随着针对移动设备的远程攻击增加,它们可能获得对 NAND 闪存的访问,但无法访问存储加密密钥的其他区域,如内存。如果数据是明文,它们将处于风险之中;而如果数据被加密,在这种情况下消费者将得到保护。

保护敏感数据对于保护消费者至关重要,行业必须成熟并考虑将此作为应用程序的要求。

SSL/TLS

最后一个需要讨论的领域是安全套接字层(SSL)和传输层安全(TLS)的实施,它们保护传输中的数据。应用程序开发人员正确实施 SSL/TLS 至关重要,包括对数字证书进行完全验证,以防止 MITM 攻击。尽管 SSL/TLS 在保护传输中的数据方面很有效,但如果没有正确实施,它会让用户面临极高的攻击风险。在为 appWatchdog 服务测试应用程序时,测试攻击机器通常会显示不在范围内的应用程序的用户名和密码,因为它会自动执行(即,一些应用程序会定期登录以检查新消息)并遭受妥协。

除了确保在移动应用程序中正确实施和验证 SSL/TLS 之外,SSL/TLS 还必须在服务器上安全配置。自 20 世纪 90 年代以来,SSL 就已经可用,用于在不可信网络上保护数据传输。早期 SSL 的实现包含了一些必须解决的安全缺陷,以确保安全传输。随着时间的推移,算法得到了改进,以降低暴力攻击的风险。这项技术的最新版本被称为 TLS,通常与 SSL 以相同的方式工作,因此许多人仍然简单地将两者都称为 SSL。

一个普遍问题是,负责在服务器上实施 SSL/TLS 的人员不一定是安全工程师,因此他们倾向于关注服务器基础设施。他们可能会实施并测试 SSL/TLS,表面上看起来很安全;但是,可能存在漏洞。例如,MD5 是一种广泛使用了超过 10 年的常见加密算法。尽管仍然被认为在文件完整性检查等应用中有用,但权威机构已将其从保护通信的使用中退役。美国国土安全部 CERT 小组在漏洞注释 #836068 中指出:“软件开发者、认证机构、网站所有者和用户应避免在任何情况下使用 MD5 算法。如先前研究所示,它应被视为在加密上已破坏,不适宜进一步使用”(US-CERT 漏洞注释 VU#836068, n.d.)。这种加密的实时破解仍然不切实际,但所有主流网页浏览器和移动设备都支持更强大的加密。

更大的问题是服务器 SSL/TLS 设置中接受 NULL 密码(无加密)或较弱的出口级加密。多年来,美国限制出口具有密码学技术的设备和软件,因此为出口软件实施了较弱的加密算法。出口密码使用只有 40 位的短密钥长度,比具有 128 或 256 位长密钥的现代密码更容易受到攻击。

SSL/TLS 使用中的另一个问题是实施的版本。TLSv1 已经有 10 多年历史,在 2009 年被发现容易受到“重新协商攻击”的攻击。在这种攻击中,服务器将客户端的初始 TLS 握手视为重新协商,因此认为攻击者最初传输的数据与后续客户端数据来自同一实体(US-CERT 漏洞注释 VU#120541, n.d.)。安全顾问 Thierry Zoller (2009 年 11 月) 提供了一个关于涉及步骤的视觉描述的很好总结。尽管解释了许多不同的攻击,但 图 5.4 是本总结中提供的第一个示例,有助于说明这种攻击。

图像

图 5.4 通用 TLS 重新协商前缀注入漏洞。

大多数使用 TLSv1 的服务器已经打补丁来关闭这个漏洞。然而,TLSv1 协议已经更新,更现代的 TLSv1.2 提供了最新的技术和最强的加密密码。包括 SSLv2 和 SSLv3 在内的旧规范仍然被广泛使用,并且如果使用足够的密码和密钥长度,它们可以是相当安全的,但它们不如 TLS 安全。

保护移动设备传输敏感数据需要协调、勤奋,以及对 SSL/TLS 的彻底理解,这不仅仅需要应用程序开发者的努力,还需要维护参与安全通信的服务器团队的努力。尽管 SSL/TLS 已经存在了一段时间,可能被认为是理所当然的,但重要的是,必须对系统的正确实现和彻底的安全测试进行认真对待。

摘要

安卓设备既可能是恶意攻击的目标,也可能被用作执行此类攻击的工具。个人用户和公司都必须意识到这些风险,并应采取一定措施来防止恶意滥用。应用程序开发者也必须更加关注安全问题,并承担保护用户数据的责任。尽管本章讨论的基本安全措施不能提供完全保护,但至少可以作为阻止大多数攻击的威慑。

参考文献

1. 国家。(未注明日期)。计算机犯罪法—计算机犯罪法指南。《computer-crime.html》于 2011 年 2 月 10 日检索自 www.hg.org/computer-crime.html

2. 思科统一视频会议多个漏洞。(未注明日期)。Matta 咨询。《MATTA-2010-001.txt》于 2011 年 2 月 11 日检索自 www.trustmatta.com/advisories/MATTA-2010-001.txt

3. 思科安全公告:思科统一视频会议产品中存在多个漏洞—思科系统。(未注明日期)。《products_security_advisory09186a0080》于 2011 年 2 月 10 日检索自 www.cisco.com/en/US/products/products_security_advisory09186a0080

4. 默认。(未注明日期)。为安装的应用程序提供 OAuth 认证和授权—Google APIs—Google 代码。《OAuthForInstalledApps.htm》于 2011 年 2 月 12 日检索自 code.google.com/apis/accounts/docs/OAuthForInstalledApps.htm

5. 设备管理。(未注明日期)。安卓开发者。《device-admin.html》于 2011 年 2 月 11 日检索自 developer.android.com/guide/topics/admin/device-admin.html

6. Donohue, B.(未注明日期)。移动设备用户更容易受到网络钓鱼的攻击。《mobile-device-users-more-susceptible-phishing-scams-010511》于 2011 年 2 月 10 日检索自 threatpost.com/en_us/blogs/mobile-device-users-more-susceptible-phishing-scams-010511

7. 文档库。(未注明日期)。PCI 安全标准文档:PCI DSS、PA-DSS、PED 标准、合规指南等。《documents.php?agreements=pcidss&assocation=PCI%20DSS》于 2011 年 2 月 12 日检索自 www.pcisecuritystandards.org/security_standards/documents.php?agreements=pcidss&assocation=PCI%20DSS

[完全披露] Microsoft Windows NT #GP 陷阱处理程序允许用户切换内核堆栈。(未注明日期)。2011 年 2 月 10 日检索。

OAuth 介绍。(未注明日期)。OAuth 社区网站。2011 年 2 月 12 日检索。

Johnston, S. J. (未注明日期)。微软警告一个 17 岁的 Windows 漏洞。2011 年 2 月 10 日检索。

Microsoft 安全公告(979682):Windows 内核中的漏洞可能允许提升权限。(未注明日期)。2011 年 2 月 10 日检索。

Ralf-Philipp Weinmann。(未注明日期)。CryptoLUX。2011 年 2 月 10 日检索。

Schneier 谈安全:静态数据与动态数据。(未注明日期)。2011 年 2 月 9 日检索。

Linux 和 Unix 安全编程 HOWTO。(未注明日期)。David A. Wheeler 的个人主页。2011 年 2 月 10 日检索。

Ten, T. T. (未注明日期)。梦幻之地(1989)—难忘的台词。互联网电影数据库(IMDb)。2011 年 2 月 10 日检索。

US-CERT 漏洞注释 VU#836068。(未注明日期)。CERT 知识库。2011 年 2 月 13 日检索。

US-CERT 漏洞注释 VU#120541。(未注明日期)。CERT 知识库。2011 年 2 月 13 日检索。

WordNet 搜索—3.0。(未注明日期)。2011 年 2 月 10 日检索。

Zoller T. TLS & SSLv3 重协商漏洞解释 SANS 互联网风暴中心;合作网络安全社区—互联网安全。2009 年;2011 年 2 月 13 日从isc.sans.edu/diary.html?storyid=7582检索。

第六章

Android 取证技术

本章信息

• 处理 Android 设备的程序

• 对 Android USB 大容量存储设备进行成像

• 逻辑技术

• 物理技术

引言

在我们深入探讨实际的 Android 取证技术之前,有一些影响因素决定了取证分析师应该使用哪种技术。在本节中,我们将讨论不同的调查类型,逻辑技术与物理技术之间的差异,以及如何限制或避免对设备的修改。

调查类型

在各种情况下,都可能受益于 Android 取证调查的结果。尽管取证在所有情况中都有共性应用,但每种情况可能需要不同的程序、文件记录以及整体关注点。

人们通常想到的第一个情况是在刑事或民事法庭上进行裁决的调查。在这些情况下,有许多重要的考虑因素:

• 证据链

• 详细的同时期记录和最终报告

• 可能使用不同工具或调查员验证结果

• 基于事实或观点的证词

另一个常见的情况是企业内部调查。这些调查可能会在法庭上诉讼,但通常它们用于确定问题的根本原因(无论是系统、外部攻击还是内部员工)并可能导致对员工的纪律处分。内部企业调查可以涵盖许多领域,但最常见的是:

• 知识产权或数据盗窃

• 不当使用公司资源

• 尝试或成功攻击计算机系统

• 与就业相关的调查,包括歧视、性骚扰等。

• 安全审计(随机或针对性)

在涉及家庭事务的情况下也需要取证。最常见的案例包括:

• 离婚

• 子女抚养权

• 遗产争议

取证调查可以在政府的安全和运作方面产生重大价值的最后一个领域。政府通常是国内最大的雇主,美国就是一个很好的例子。根据美国人口普查局的数据,2009 年公共就业和工资年度调查显示,联邦政府在所有职能中拥有超过 300 万名雇员,而州和地方政府有 1660 万全职等效雇员(政府就业与工资,不详)。

除了与就业相关的事务外,国家也可能是攻击和外国政府情报搜集的目标。取证在挫败针对国家的攻击、调查成功的攻击、反情报情景以及为国家的治理提供有价值的情报方面可以发挥关键作用。

逻辑技术与物理技术之间的区别

Android 取证技术本质上是逻辑的或物理的。逻辑技术提取分配的数据,通常是通过访问文件系统实现的。分配数据意味着数据未被删除,并且在文件系统上可以访问。这个定义的一个例外是一些文件,例如 SQLite 数据库,可能是已分配的,但数据库中仍可能包含已删除的记录。虽然恢复已删除的数据需要特殊的工具和技术,但从逻辑获取中恢复已删除数据是可能的。

另一方面,物理技术直接针对物理存储介质,并不依赖文件系统本身来访问数据。这种方法有其优点;最显著的是物理技术可能提供对大量已删除数据的访问。如第四章所述,文件系统通常只将数据标记为已删除或过时,除非需要,否则不会实际擦除存储介质。由于物理取证技术直接访问存储介质,因此有可能恢复分配和未分配(已删除或过时)的数据。

当然,分析 Android 物理获取通常要困难得多,也更耗时。此外,物理技术更难以执行,操作失误可能导致设备无法访问。

在 Android 取证中,最常见的逻辑技术并不能直接访问文件系统,其工作级别比传统的逻辑技术更抽象,效果也更差,后者可以直接从文件系统获取所有未删除的数据。这种技术依赖于 Android 平台和软件开发工具包(SDK)内置的内容提供者,虽然能生成一些重要的法医数据,但只是系统中可用数据的一小部分。

修改目标设备

任何法医调查的基本原则之一是避免以任何方式修改目标设备。在许多情况下,这是可以实现的。例如,假设你收到了一台未启动的台式电脑。你被告知这是从嫌疑人那里没收的,你需要开展法医调查。在取得保管权后,对该设备进行调查通常不会对数据造成实质性更改。典型的调查会完整记录电脑信息,取出硬盘,连接到物理写保护器上,并获取硬盘的逐位法医级安全映像。然后,调查将在取证映像的副本上进行,原始设备将保持不变。

随着计算机的功率和功能不断增强,这种理想情况越来越难以实现。首先,假设你被叫到调查现场,有一台台式电脑,但这次电脑正在运行中。任何与电脑的交互,无论是简单移动它,甚至是物理上拔掉设备,都会以某种方式改变设备。虽然许多检查员主张直接拔掉电脑电源,但这样做仍然会改变电脑,因为 RAM 中的内容、打开的网络连接等(这些在调查中可能非常有价值)会永久丢失。

如果你选择在设备运行时进行检查,所有的交互都会改变设备。为了进一步复杂化调查,可能会出现计算机正在使用加密,并且设备运行时数据可以访问的情况。然而,如果设备关闭,且你没有加密密钥,那么你可能永久失去恢复数据的能力。

另一个复杂因素可能是存在具有特殊硬件、复杂设置的服务器,或者简单地不能在不给其他系统或人员带来重大影响的情况下关闭。复杂的服务设置示例包括复杂的 RAID 设置、依赖基于网络的存储区域网络(SAN)的设置和不支持的硬件。在这种情况下,检查员必须在设备运行时直接与设备交互,尽管这些操作会改变设备。

当然,尤其是安卓设备在内的移动设备,如果没有对设备造成任何影响,几乎不可能进行法医分析。与台式机、笔记本电脑和服务器不同,安卓设备上有一部分存储是无法轻易移除的。如果设备处于开启状态,关闭设备或再次拔掉电池都会改变设备。

当移动电话首次出现在调查中时,从设备中可以提取的数据非常少。许多调查采用了传统方法,比如对无线运营商发出搜查令以获取通话详单。在 GSM 设备上,还可以移除用户身份模块(SIM)卡并提取一些数据。随着手机开始存储更多数据,检查员之间出现了深刻分歧:一些人主张使用旧方法(对设备影响小,相应地只能获取少量数据),而另一些人则主张更充分地利用设备。利用设备的技术会修改设备,导致了随后的争论。

到 2011 年,许多争论已经平息,因为移动设备现在持有的数据量需要更侵入式的技术。《英国警察局长协会》制定的指南清楚地解决了这个问题。该指南《计算机电子证据良好实践指南》(ACPO Good Practice Guide, n.d.)确立了计算机电子证据的四个原则:

  1. 法律执法机构或其代理人的任何行动都不应改变计算机或存储介质上可能随后在法庭上依赖的数据。

  2. 在个人认为有必要访问计算机或存储介质上保存的原始数据的情况下,该人员必须具备相应能力,并能够提供证据解释其行为的关联性和影响。

  3. 应当创建并保留对基于计算机的电子证据所执行的所有流程的审计跟踪或其他记录。独立第三方应当能够检查这些流程,并得到相同的结果。

  4. 负责调查的人员(案件官员)有总体责任,确保遵守法律法规和这些原则。

由于移动设备明显呈现需要直接访问原始设备的情形,因此在审查员接受过充分培训、提供合理的处理方式并保持清晰的审计跟踪,使得第三方能重复其操作的情况下,这是被允许的。这无疑是好的建议,它有助于为移动设备的法医调查提供一个坚实的框架。

处理安卓设备的程序

对于法医分析师来说,一个主要的挑战是制定一个在分析师直接接管之前处理设备的协议。这绝对不是分析师的新问题,因为参与调查的其他人员可能也会处理其他数字设备,如计算机或笔记本电脑。然而,移动设备相对较新,首批响应者往往处理不当。有一种倾向是立即检查设备,这几乎不可避免地导致数据修改和可能失去访问设备的机会。

保护设备

许多机构和首批响应者已经建立了保护证据的协议。以下各节旨在补充现有的程序,而不是替代它们。当然,这些程序是特殊的,而对那些有许多其他责任的首批响应者进行教育可能相当具有挑战性。

密码操作程序

由于消费者和企业安全意识的提高,带有密码锁定的设备越来越常见。在下一节中,我们将介绍一些绕过密码的具体技巧。然而,这并不总是可能的。从设备获取信息时首先要考虑的是是否存在立即禁用或以其他方式绕过密码的机会。

如果您遇到一个屏幕处于激活状态的安卓设备,应该强烈考虑检查并可能更改其设置。对于那些有密码的设备,有一段时间(从不到一分钟到大约 15 分钟)可以无需重新输入密码即可完全访问设备。如果设备处于这种状态,可以考虑以下几个步骤:

  1. 增加屏幕超时时间以防止或推迟屏幕锁定。这个设置的位置在安卓版本和设备间并不一致。例如,在运行安卓 1.5 的 G1 上,可以通过按下菜单(从主屏幕开始),然后选择设置、声音与显示、屏幕超时,并选择“从不超时”。在运行安卓 2.2 的 HTC Incredible 上,按下菜单(从主屏幕开始),然后选择设置、安全、锁定手机后,最后选择“15 分钟”。只要设备在分配的超时设置内有一些名义上的活动,它将保持可访问状态。

  2. 启用 USB 调试和“保持唤醒”设置。这个设置在设备中保持一致,可以通过按下菜单(从主屏幕开始),然后选择设置、应用程序和开发。在那里,您可以勾选 USB 调试和保持唤醒。如果您选择了“保持唤醒”设置并将其连接到充电器,设备将永远不会休眠,这有效防止了屏幕锁定。通过启用 USB 调试,可以通过 USB 访问设备,从而实现数据提取。

当然,这些步骤是对设备进行更改,应该详细记录在案例笔记中,描述设备的状态、尝试更改的理由以及每次更改的结果。这不仅有助于未来的报告编写,如果您的更改设备决定在法庭上受到挑战,这也可能是重要的因素。

为了使情况更加复杂,同样重要的是在屏幕锁定激活的情况下尽量减少触摸屏幕。我们稍后会讨论,有时可以通过增强设备屏幕的照片来确定设备的图案锁。第一响应者与屏幕的交互越少,这种技术的成功率就越高。

网络隔离

正如许多检验员可能知道的,尽快将设备与网络隔离非常重要。在最坏的情况下,可能会在设备上启动远程擦除,如果成功,将无法恢复任何数据。虽然大多数远程擦除是通过数据网络完成的,但有些可以通过短信触发,因此确保设备完全隔离以防止远程擦除。在其他情况下,设备上可能会收到或甚至被外部触发器移除的额外信息。由于取证图像的目标是保留设备状态以进行进一步分析,应避免任何更改。

有多种方法可以将设备与网络隔离,每种方法都有其优缺点。表 6.1 概述了每种技术的优缺点。

表 6.1 设备隔离技术

技巧 优点 缺点
将设备设置为飞行模式。这需要你完全访问设置菜单。 设备继续运行,临时数据保持完整。禁用蜂窝数据网络以及Wi-Fi.com 你进一步修改了设备设置。只有在完全访问设备的情况下才有效。
如果手机是 GSM 手机,移除 SIM 卡。 易于移除,有效禁用所有蜂窝语音、短信和数据传输。 不禁用Wi-Fi.com或其他网络。不适用于非 GSM 手机,包括 CDMA 和 iDEN 手机。
暂停与无线运营商的账户。 对于任何手机,有效禁用所有蜂窝语音、短信和数据传输。 过程可能需要一些时间,可能需要法院命令。不禁用Wi-Fi.com或其他网络。
将设备放入屏蔽袋、盒子、帐篷或房间中。 法拉第屏蔽可以防止各种类型的网络传输,如果你无法使用前面的任何选项,这可能是一个有效的办法。 关于便携式法拉第屏蔽的有效性存在一些争议,尤其是法拉第袋。同时,虽然传输被阻止,但设备会反复尝试联系蜂窝网络,从而迅速耗尽电池。无法将线缆插入屏蔽装置中,因为它们会传输信号。专用于移动设备检查的屏蔽室是理想的,但它们的建造和维护成本相当高。
关闭设备。 完全有效地阻止所有网络传输。 设备状态被修改,临时数据丢失。重启时可能会启用密码,从而限制对设备的访问。

如你所知,将 Android 设备与网络隔离并非易事,每个选项都有优缺点。虽然每个检查员或其组织应该确定采取的适当步骤,但最佳选择可能是将设备置于飞行模式。这在不同的 Android 设备和版本之间略有差异,但总体方法是一样的:

  1. 长按电源键并选择飞行模式。

  2. 从主屏幕按菜单键,然后选择设置,然后选择通常位于顶部的无线选项。例如“无线控制”或“无线和网络”。下一个菜单应显示飞行模式选项。

图 6.1 是电源键方法的截图。图 6.2 显示了通过无线设置选项的方法。

图像

图 6.1 通过电源键选择飞行模式。

图像

图 6.2 通过无线和网络设置选择飞行模式。

无论你最终选择哪种技术,主要目标应该是尽快将设备与网络隔离。

电源和数据线

虽然大多数取证实验室将拥有充电和连接设备所需的电缆,但直接从现场扣押电缆总是谨慎的。可能正在使用较新的设备,而取证工具箱还没有合适的电缆。例如,为连接媒体设备而开发了一项新规范,称为便携式数字媒体接口(PDMI),并集成到两款 Android 平板电脑中,分别是 Dell Streak 和 Samsung Galaxy Tab。PDMI 接口不仅提供电源和高分辨率视频输出,还提供 USB 3.0 支持。如果在检查这些设备之一时需要等待合适的电缆,可能会造成延迟;如果需要充电且你没有合适的电缆,电源的损失将导致时间数据的丢失。

已关闭的设备

当你遇到一个已经关闭的设备时,最好的选择是将其启动到恢复模式以测试连通性和根访问权限。设备所有者可能已经启用了 USB 调试或已经获取了根权限,这样你可以在不启动正常操作模式的情况下访问数据。

这种方法类似于在标准计算机硬盘上进行取证。任何受过训练的取证分析师最后会做的一件事就是启动电脑以确定安装了什么操作系统。相反,硬盘被取出并连接到写保护器进行成像,以防止对证据进行任何更改。同样,如果移动设备无需启动到正常模式,就没有必要这样做,因为这可能会对设备进行更改。本章后面将讨论如何在恢复模式下测试设备以获取足够权限的具体信息。

如何绕过密码

随着 Android 设备被频繁使用,并且在大多数情况下不允许数据提取,绕过 Android 设备上的密码变得越来越重要。虽然没有保证的方法,但在某些情况下有一些技术是有效的。

如前所述,目前 Android 设备支持三种类型的密码。第一种是图案锁。这是最初 Android 设备的默认设置。要访问设备,用户在锁定手机上绘制图案,如果绘制正确,设备将被解锁。在 HTC Incredible 上的图案锁的一个示例显示在图 6.3 中。

image

图 6.3 安卓图案锁。

第二种密码是简单的个人识别码(PIN),这在其他移动设备中很常见。图 6.4 是一个启用 PIN 的 HTC Incredible 的示例。

image

图 6.4 安卓 PIN 锁。

目前在 Android 设备上找到的最后一种密码类型是完整的字母数字代码,如图 6.5 所示。

image

图 6.5 安卓字母数字锁。

如第四章所述,并非所有的密码都是平等的。最有效的密码是允许或需要字母数字密码的密码,因为这些密码要难以绕过得多。

如果启用了 USB 调试,请使用 ADB

如果手机开机,您应该尝试的第一种技术是通过 USB 连接 Android 调试桥(ADB),这在第三章中已经广泛介绍。尽管只有少数 Android 设备允许通过 USB 调试设置进行 ADB 连接,但值得一试,因为它可以轻松提供足够的数据提取访问权限。用户启用 USB 调试的最常见原因包括:

• 应用开发和测试

• 某些应用需要此设置,例如 PDAnet,它允许设备通过 USB 向连接的设备提供互联网访问

• 定制 ROM

• 开发者手机,例如谷歌的 Android 开发者手机(ADP1)

• 设备破解

如果您使用的是 Ubuntu 虚拟机(VM)或有正确安装和配置了软件开发工具包的取证工作站,判断 USB 调试是否启用相当简单。将手机正常模式下运行,并将其插入 Ubuntu VM。从命令提示符输入“adb devices”。如果启用了 USB 调试,ADB 守护进程将返回设备序列号以及手机当前所处的模式。

image

如果禁用了 USB 调试,当输入“adb devices”命令时,它将不会返回任何内容。

image

如果你在虚拟工作站的内部运行命令,记得将设备传递给你的虚拟机。如果虚拟机看不到设备,你会得到与未启用 USB 调试相同的结果。一旦你确认 USB 连接已经传递给 Ubuntu 虚拟机,你可以执行 lsusb 命令来验证操作系统已经识别到该连接:

图像

在这个例子中,我们强调了一些明显的区域,这些区域清楚地表明了安卓设备已经连接,在这种情况下,我们可以看到 ADB 接口已经暴露。如果设备已连接但你无法通过 ADB 连接,你还应该杀死你本地的 ADB 守护进程然后重新启动它。这可以轻松完成,如下所示:

图像

如果启用了 USB 调试,法医分析师可以利用该接口获取访问权限并进行逻辑恢复设备,这部分内容在本章后面会详细介绍。

涂抹攻击

最初,安卓设备使用图案锁作为密码保护,而不是数字或字母数字代码。宾夕法尼亚大学计算机与信息科学系发表的一篇名为“智能手机触摸屏上的涂抹攻击”的论文,展示了一种通过增强屏幕照片访问图案锁定的安卓设备的技术(Aviv, Gibson, Mossop, Blaze, Smith, n.d)。论文总结称:

我们的照片实验表明,干净的触摸屏表面主要是反射的,但并不完全是;而涂抹则主要是散光的,但也并非完全如此。我们发现,几乎任何非正对相机补角位置的方向性光源都能呈现可恢复的涂抹图像。调整照片以查看图案几乎不需要什么操作,但是通常在照片曝光过度两到三个光圈值(4 到 8 倍“正确”曝光)时,图像效果最佳。

如果第一响应者小心处理,尽量减少与设备屏幕的接触,这种恢复技术可能是可行的。作为可能性的一个例子,图 6.6 展示了同一款安卓设备并排显示的照片。两张图片使用了同一张原始照片,但右侧的图片在涂抹攻击过程中进行了增强,以突出接触点。

图像

图 6.6 显示涂抹攻击的增强照片。

恢复模式

一些用户安装了自定义 ROM,通常通过修改恢复模式来获得设备的 root 访问权限。大多数自定义 ROM 安装了修改过的恢复分区,从而简化了安装自定义 ROM 的过程。有几个流行的恢复分区主要与自定义 ROM 配合使用,它们都提供从恢复控制台本身具有 root 权限的 shell 访问。由于手机没有引导到正常模式,因此绕过了密码,用户数据分区可以被挂载为只读,从而防止该区域发生更改。

在取证分析师在设备关机时取得控制权时,应尝试引导进入恢复模式。如果设备正在运行并且存在密码,你应首先尝试通过 ADB 连接,并考虑使用污迹攻击。如果这两种方法都不成功,那么你应该尝试重启进入恢复模式。与许多其他技术一样,根据设备制造商和型号的不同,进入恢复模式的方式也有所不同。表 6.2 涵盖了进入本书所提及手机恢复模式所需的关键组合。每个步骤都假定设备已经关闭。

表 6.2 进入恢复模式的关键组合

设备 键组合
HTC G1 按住主页按钮并按下电源按钮。使用音量减键选择 RECOVERY,然后按下电源键。
Nexus One 按住音量减键并按下电源按钮。
Motorola Droid 按住 X 键并按下电源按钮。
HTC Incredible 按住音量减键并按下电源按钮。使用音量减键选择 RECOVERY,然后按下电源键。

进入恢复模式后,你可以将设备连接到 Ubuntu 工作站,并尝试使用 ADB 连接。如果设备运行的是非修改过的恢复模式,连接将失败。屏幕通常会显示一个带有感叹号的三角形,旁边通常有一个小型的 Android 设备。在其他设备上,你会看到三个著名的 Android 图标在滑板上。最后,其他恢复模块明确显示它们处于修改过的恢复代码中,并提供了一系列设备选项。

刷新新的恢复分区

有许多协议、工具和设备允许熟练的检查员使用修改过的镜像刷新设备的恢复分区。

支持这种方法的第一个协议是 fastboot。Fastboot 是一种在引导加载程序模式下通过 USB 执行的 NAND 闪存更新协议。大多数设备出厂时都启用了引导加载程序保护,这禁止使用此协议。然而,保护可能已被禁用。要确定是否启用了引导加载程序保护,你必须访问引导加载程序并查看签名信息,这将表明是 S-ON 还是 S-OFF。S 代表安全,因此 S-ON,即默认的生产版本,启用了安全性;S-OFF 表示未启用安全性。一些设备出厂时带有 S-OFF,例如 Google Nexus One,因为它预装了 Google 的工程 SPL/引导加载程序。其他 rooting 技术也会禁用此保护,因此在密码保护的设备上检查可能会得到结果。你可以使用前一部分的键组合访问主引导加载程序,这部分在前面章节的表 6.2 中有所描述。

Fastboot 不需要 USB 调试来访问设备。因此,像恢复模式一样,它可用于访问设备的数据。一旦新的恢复分区可用,设备应重新启动进入恢复模式,然后可以进行法医成像。

其他技术允许用新的映像刷新恢复分区。一些示例包括:

• 摩托罗拉的 RSD Lite

• sbf_flash

• 三星的 Odin Multiloader

尽管这些工具和协议最终可能提供了法医分析师所需的权限,但需要相当大的努力不仅去查找和测试这些技术,而且要充分理解它们,以便在法医调查中使用。

屏幕锁绕过应用程序

安全研究员托马斯·坎农最近开发了一项技术,可以通过安装一个应用程序来绕过屏幕锁,这个应用程序是通过新的基于网络的 Android 市场安装的(坎农,T.,未标明日期)。坎农的技术利用了基于网络的 Android 市场的一个新功能,可以直接从网站安装应用程序。因此,你需要使用设备的主要 Gmail 用户名和密码访问 Android 市场,这可能从用户的主要计算机上可以访问。或者,如果你知道用户名和密码并且有足够的权限,你也可以访问 Android 市场。在这种情况下,更改用户的 Gmail 密码将不起作用。

坎农在这个网站上解释了这项技术,如下节所述(坎农,T.,未标明日期)。

工作原理

这个过程实际上非常简单。Android 会发送一系列广播消息,应用程序可以接收,比如收到短信或Wi-Fi.com断开连接。应用程序必须注册其接收器以接收广播消息,这可以在运行时完成,或者对于某些消息,在安装时完成。当相关的消息进来时,它会被发送到应用程序,如果应用程序没有运行,它将自动启动。

在尝试了各种广播消息后,我发现对于这个实用程序来说最好的消息是 android.intent.action.PACKAGE_ADDED。这个消息在所有 API 版本 1 中都存在,并在安装应用程序时触发。因此,要远程执行应用程序,我们首先从 Android 市场部署它,然后部署任何会导致第一个应用程序启动的其他应用程序。

启动后,只需调用 KeyguardManager 中的 disableKeyguard()方法即可。这是一个合法的 API,允许应用程序在检测到来电时禁用屏幕锁定。通话结束后,应用程序应重新启用屏幕锁定,但我们只是保持其禁用状态。

如果您能正确访问 Android 市场,这项技术绝对值得考虑。

使用 Gmail 用户名/密码

在大多数 Android 手机上,如果您知道与设备关联的主要 Gmail 用户名和密码,可以绕过密码。在多次尝试失败后(G1 上十次尝试),您将看到一个询问是否忘记密码的屏幕。从那里,您可以输入 Gmail 用户名和密码,然后系统会提示您重置密码。这种技术不需要手机在线,因为它使用存储在手机上的凭据信息。

如果您没有当前的 Gmail 用户名和密码,但拥有足够的权限(例如,法院命令)来重置密码,您可以尝试迫使谷歌重置账户密码。然后,您需要将 Android 设备连接到网络并获取访问权限。这个问题带来了许多挑战,包括需要将设备上线,这除了对设备进行更改外,还可能导致远程擦除的风险。各种执法邮件列表上的报告表明,这种方法并不总是有效。

如果尝试这种方法,需要进一步研究。特别是,最好控制设备使用的互联网连接,很可能是通过一个W-Fi.com的接入点。这样,你可以限制网络访问仅限于那些谷歌服务器进行身份验证所需的。此外,还应该分析测试设备的详细网络捕获以及实际对设备所做的更改。

JTAG 和芯片脱焊

当前,大多数 Android 设备并未对 NAND 闪存的内容进行加密,这使得在启用密码的情况下直接访问和解码存储芯片成为了一种潜在的解决方案。有两种主要技术可以直接访问芯片。这两种技术都具有技术挑战性。这两种技术是:

• 联合测试行动组(JTAG)

• 物理提取(芯片脱焊)

这两种技术不仅在技术上具有挑战性,需要部分或完全拆解设备,而且还需要进行大量的后期提取分析以重新组装文件系统。因此,JTAG 和芯片脱焊可能是绕过锁定设备的最后选择。

使用 JTAG,通过将引线焊接到底板(PCB)上的特定 JTAG 焊盘,直接连接到设备的 CPU。然后可以使用 JTAG 软件执行 NAND 闪存的完整二进制内存转储,修改某些分区以允许 root 访问,或者完全消除密码。

在芯片脱焊过程中,使用热风将 NAND 闪存芯片从 PCB 上物理取出。然后,通常需要将这种小型的球栅阵列(BGA)封装的芯片的 BGA 连接重新生成,并将其插入到连接到芯片并读取 NAND 闪存的特殊硬件中。

这些技术的优点是,在任何未加密 NAND 闪存的情况下都能使用。然而,要执行这些技术,需要进行广泛的研究、开发、测试和实践。

对 Android USB 大容量存储设备进行成像

迄今为止,每一部 Android 设备都配备了外部 Secure Digital(SD)卡或嵌入式 MultiMediaCard(eMMC),这些设备为许多用户提供了所需的大存储空间。这些存储设备的存在是因为用户的应用数据通常存储在/data/data 中,出于安全和隐私的考虑,这些数据是被隔离的。然而,用户希望在其 Android 设备和计算机之间复制歌曲、图片、视频或其他文件,而这些大容量 FAT 文件系统分区解决了这个问题。敏感的用户数据仍然受到保护,但更大且更便于携带的文件可以被用户访问。

最初,对大容量存储进行成像的方法是简单地从 Android 设备中取出并使用 USB 写保护器进行成像。然而,随着时间的推移,出现了一系列挑战,包括:

• 转向 eMMC 存储意味着大容量存储不再是可移动的。

• 现在应用程序可以从 SD 卡运行,在这种情况下,.apk 文件是加密的。如果获取应用程序未加密副本对调查至关重要(例如,涉及恶意软件分析或木马防御的案件),则必须将 SD 卡保留在 Android 设备中。

• 新设备更频繁地使用 RAM 磁盘(tmpfs)来存储可能在调查中有所帮助的用户数据。通常,移除 SD 卡需要关闭设备并取出电池,从而失去恢复临时数据的能力。

因此,建议的针对 Android 上 USB 大容量存储(UMS)设备成像的方法不再涉及移除 SD 卡,而是通过 UMS 接口进行成像。

SD 卡与 eMMC 对比

SD 卡和 eMMC 实际上并没有太大的区别。当然,主要的区别在于 SD 卡是可移动的,可以轻松地在不同设备间转移。它们使用 NAND 闪存,基于 MultiMediaCard(MMC)规范,并具有嵌入式存储控制器,因此客操作系统无需 MTD 即可读取它们。

迄今为止,Android 设备普遍支持的 microSD 卡容量从 2 GB 到 16 GB 不等。然而,更大的卡片也是可能的。根据 Android 设备的不同,SD 卡可能可以轻松地从运行中的设备访问并取出。然而,许多设备需要关闭设备,以便移除电池。

对于设备上嵌入的存储,一些制造商已经开始使用 eMMC,它由带有 MMC 接口的嵌入式存储组成,直接集成到设备的 PCB 上。这一标准简化了使用标准 eMMC 协议访问 NAND 闪存,并能够支持不是 NAND 闪存意识的文件系统。这并不意味着文件系统能以与像 YAFFS2 这样的 NAND 闪存意识文件系统相同级别和复杂性的保护 NAND 闪存的使用寿命。然而,Android 设备的普遍使用寿命确实在缩短,对大多数用户来说可能并不是问题。

如何法医镜像 SD 卡/eMMC

有两种主要的方法可以在不将 SD 卡和 eMMC 从设备中取出的情况下进行法医获取。这里介绍的第一种方法是将 UMS 设备接口暴露给您的法医工作站,并允许您使用您选择的法医工具获取镜像。第二种方法没有将 UMS 暴露给您的法医工作站,而是在 Android 设备上使用 dd。这需要 adb 端口转发,这将在本章后面的物理技术部分介绍。

尽管我们的 Ubuntu VM 内置了 dd,但我们仍将下载、编译并安装由美国国防部网络犯罪中心维护的 dd 更新版本。该程序,dc3dd,是 GNU dd 的修补版本,包括许多对计算机取证有用的功能(dc3dd, n.d.),例如:

• 分段和整体散列,支持多种算法——支持 MD5、SHA-1、SHA-256 和 SHA-512。

• 带有自动输入/输出文件大小探测的进度条。

• 散列和错误的组合日志。

• 错误分组——对于相同的连续错误,只产生一条错误消息。

• 验证模式——能够对输出文件进行散列处理,并将散列与获取散列进行比较。

• 能够将输出分割成带有数字或字母扩展名的块。

• 能够同时写入多个输出文件。

该程序是开源软件,根据 GNU 公共许可证第 3 版(GPLv3)获得许可,并通过 SourceForge 在线分发,并在 2010 年 8 月更新到了版本 7.0(dc3dd, n.d.)。在本书的这一点上,你应该对编译程序相当熟悉并且拥有所需的所有工具,所以以下是简化的步骤。

image

在这一点上,你可以继续进行成像。然而,每次都输入整个 dc3dd 命令不仅繁琐,而且可能导致因拼写错误而造成无法修复的损害。因此,创建一个 shell 脚本,它不仅可以获取设备,还可以记录各种系统特性、日期/时间戳,并创建日志文件,这些在你稍后编写报告时可能很有帮助。

我们将获取脚本放置在 /usr/local/bin 中,这样你就可以从任何目录轻松地运行脚本,因为默认情况下 /usr/local/bin 在你的执行路径中:

image

接下来,将以下内容复制到脚本中,通过按 Ctrl-O 保存,然后通过按 Ctrl-X 退出:

image

image

接下来,你必须更改权限,以便你可以运行脚本,然后不带参数运行它以查看使用帮助:

image

这个脚本以及开源软件的伟大之处在于,你可以根据需要简单地修改它。如果你不想跟踪客户名称,只需从脚本中删除它。

接下来,我们必须在你的 Ubuntu 工作站上挂载 UMS 设备。正如在 第一章 中关于 Ubuntu VM 设置所讨论的,关键在于你已经禁用了工作站上的自动挂载。如果你没有这样做,请查看必要的步骤并在向 VM 展示 UMS 设备之前完成。

此外,理想情况下,首先应将 Android 设备连接到基于硬件的 USB 写保护器。然而,一些写保护器似乎在连接的设备暴露出多个设备 ID 时会遇到问题。你应该尝试使用你的 USB 写保护器,理想情况下,首先让这个工作。

注意

Tableau UltraBlock USB

Tableau UltraBlock USB 模型 T8,运行着 2009 年 8 月 9 日的最新固件,仅能通过参考 HTC Incredible 上找到的第一个 USB 设备,因此在分析设备时我们无法使用它。Tableau 有一个新的 UltraBlock USB 设备可能有效;然而,我们尚未验证这一点。审查员应该测试他们拥有的各种 USB 写保护器以确认兼容性。

接下来,我们需要确定 UMS 映射到哪些设备。此信息显示在内核日志中,可以通过“dmesg”命令轻松访问:

image

如先前所讨论,除了 ADB 之外,HTC Incredible 还暴露了三个 USB 接口:

• 用于设备驱动程序安装的 CD-ROM (sr1)

• eMMC UMS 设备 (sdb)

• SD 卡 UMS 设备(sdc)

然而,/dev/sdb 和/dev/sdc 之间的区别在 Android 设备上启用 UMS 或磁盘驱动器功能之前不容易辨别。启用后,您应该再次检查 dmesg 的输出。

警告

使用硬件写保护器

尽管 Ubuntu 工作站上的自动挂载功能已被禁用,但法医分析师通过硬件写保护器仅将 Android 设备连接到工作站至关重要,以确保不对设备进行任何更改。所有硬件在案件中的积极使用之前都应经过彻底测试。

image

现在更清楚的是,/dev/sdb 是 7GB 存储设备(即 eMMC),而 2GB 的 SD 卡映射到/dev/sdc。我们现在可以使用获取脚本或您的法医工作站上可用的任何法医成像工具获取设备。脚本需要以下六个参数:

1.客户——此参数创建文件夹结构,示例可能是“sheriffs-office”或如“viaforensics”的客户名称。

2.案例——此参数提供了一个案例名称,例如 af-book。

3.标签——此参数是您正在法医成像的证据的标签编号,在我们的示例中是 item001。

4.序列号——这是设备、磁盘、SD 卡等的序列号。如果您无法访问序列号,可以输入您选择的任何文本,例如 unknown-serialno。

5.源设备——这是您想要获取的设备,如/dev/sdb、/dev/sdc 等。您可以使用 dmesg 来确定,下面将解释 dmesg。

6.目标路径——应创建文件夹的顶级目录。它可以是您的家目录(~)或称为 clients 的文件夹(~/clients)。

对于此示例,在您的家目录中创建一个名为 sd-emmc 的文件夹,然后使用 sudo 权限运行获取脚本。

image

然后,您可以使用相同的通用命令,但更改参数以成像 eMMC,对于设备来说,它位于/dev/sdb。完成这些命令后,法医图像和日志文件位于~/sd-emmc,并按以下结构组织:

image

对于每个法医成像的 UMS 设备,我们不仅拥有经过验证的映像,还有 dd 映像的 hashlog,带有日期、时间、系统信息和运行的命令的日志文件,错误日志,最后是每个日志文件及其 sha256 哈希的列表。这确保了关于成像过程有足够的细节。

提示

SD 卡上的加密应用

如果在 SD 卡上安装了应用,它们会被加密,因此,如果从 SD 卡映像检查文件,它们将无法读取。但是,当 SD 卡未在您的法医工作站上挂载时,未加密的.apk 文件将挂载在/mnt/asec 中。如果调查依赖于.apk 应用分析,请确保您也获取未加密文件的副本。

逻辑技术

正如本章开始时所讨论的,逻辑取证技术可以提取已分配的数据。这通常是通过访问文件系统来实现的。逻辑技术往往是取证分析师首先运行的一种检查类型,因为它们不仅更容易执行,而且通常能为案件提供足够的数据。安卓取证物理技术可以提供更多的数据。然而,它们更难以成功执行,并且需要更多的努力进行分析。

逻辑技术还有更多的应用场景,因为唯一的要求是启用 USB 调试。换句话说,安卓取证逻辑技术不需要根权限。

在本节中,我们首先介绍免费提供的技术(尽管 AFLogical 仅对活跃的法律执法和政府机构免费),然后是可用商业软件的回顾。

ADB Pull

在第四章中,递归 adb pull 命令被多次演示,因为文件系统的不同部分被复制到 Ubuntu 工作站以进行进一步分析。除非安卓设备具有根权限或运行自定义 ROM,否则在设备上运行的 adb 守护进程,代理递归复制,只具有 shell 权限。因此,一些更具取证意义的文件无法访问。然而,仍然有一些可以访问的文件。

如果您尝试访问 shell 用户没有权限的文件,它根本不会复制这些文件:

image

然而,如果您有足够的权限(下一个示例中的根权限),那么这种方法非常简单有效:

image

如您从上面的输出中所见,整个“/data”分区在三分半多一点的时间内被复制到了本地目录。在复制过程中保持了目录结构,因此您可以从工作站简单地浏览或分析感兴趣的文件。

由于大多数手机默认情况下不会有根权限,这种方法似乎价值不大。然而,了解这个工具非常有用,并且有几种情况非常适合这种方法。这些场景包括:

• 在未获得根权限的设备上,adb pull 仍然可以访问有用的文件,例如未加密的应用程序,大部分包含用户数据的 tmpfs 文件系统,例如浏览器历史记录,以及“/proc”、“/sys”和其他可读目录中的系统信息。

• 在已获得根权限的设备上,几乎可以简单地进行所有目录的提取,并且“/data”中的某些文件和目录会很有价值。

• 当使用物理技术时,并不总是能够挂载一些获取的文件系统,如 YAFFS2。如果 adbd 以根权限运行,您可以使用 adb pull 快速提取文件系统的逻辑副本。

由于 adb 不仅是 Android SDK 中的免费工具,而且功能非常多样,它应该是设备上使用的首要逻辑工具之一。

警告

adb 拉取问题

由于权限或其他问题,一些使用 adb 的递归拉取操作可能会在数据传输过程中失败。你应该密切监控命令的结果,以确定是否遇到任何问题。将大型目录的递归拉取分解为较小的数据拉取可能会得到更好的结果。

备份分析

当 Android 首次发布时,并没有为用户提供备份个人数据的机制。因此,在 Android Market 上开发并分发了许多备份应用。对于运行定制 ROM 的用户,开发了一个更强大的备份工具,称为 nandroid。

许多备份工具都有一个“保存到 SD 卡”的选项(用户发现这非常方便),以及几个“保存到云端”的选项。无论如何,用户可以备份他们的设备,如果需要,他们可以恢复所需的数据。这不仅用户保护自己免受数据丢失的好方法,而且对于法医分析师来说,这也是一个很好的信息来源。

较受欢迎的备份应用之一是 RerWare 的 My Backup Pro,它可以使用内容提供者备份设备数据,如果设备有 root 权限,甚至可以备份整个“/data/data”文件。用户可以选择保存到 SD 卡或保存到 RerWare 的服务器。该应用支持以下功能(RerWare, LLC, n.d.):

• 应用安装文件(如果手机有 root 权限,包括 APK + 数据和 _market 链接)

• 联系人

• 通话记录

• 浏览器书签

• 短信(文本消息)

• 彩信(消息中的附件)

• 系统设置

• 主屏幕(包括 HTC Sense UI)

• 闹钟

• 词典

• 日历

• 音乐播放列表

• 集成的第三方应用程序

最后一个条目,“集成的第三方应用程序”,指的是提供 RerWare 钩子进行数据备份的公司。至少最初,RerWare 会支付开发者在其应用中包含 RerWare 备份支持。

有趣的是,该应用不仅运行在 Android 上,还运行在 Windows Mobile、Blackberry 上,并且很快将支持 Symbian OS。用户可以在一个平台上进行备份,然后在完全不同的支持操作系统上进行恢复。当设备备份存储在本地时,RerWare 会将单个 SQLite 文件保存到 SD 卡上。

在 Android 的最新版本中,现在提供了一个新的备份 API。开发者只需将这些 API 集成到他们的应用中,其余的备份工作由 Android 和 Google 处理。这为用户提供了安全、基于云的备份,并在应用之间保持一致性,很可能会成为事实上的标准。不幸的是,目前的研究尚未发现新的备份 API 在 Android 设备上留下的有用痕迹。

无论使用哪种备份应用,取证分析师都应确定是否安装了备份应用,如果安装了,备份数据存储在哪里。应该检查 SD 卡,以及其他设备,如计算机或笔记本电脑。备份中保存的数据在检查中显然具有重大价值。

AFLogical

AFLogical 是一种 Android 取证逻辑技术,免费提供给执法和政府部门。由 viaForensics 开发的应用程序通过内容提供者提取数据,这是 Android 平台的一个关键特性。这正是商业取证工具用于逻辑取证的技术。

请记住,Android 的安全模型在限制应用数据访问方面是有效的,但在少数情况下除外。以下是 Android 安全模型关键组件的快速回顾:

• 每个应用都会分配一个唯一的 Linux 用户和组 ID。

• 应用使用其特定的用户 ID 在专用进程和 Dalvik VM 中执行。

每个应用都有专用的存储空间,通常位于“/data/data”目录下,只有应用本身可以访问。

然而,Android 框架确实提供了一种机制,允许应用间共享数据。应用开发者可以在他们的应用程序中包含对内容提供者的支持,这使他们能够与其他应用共享数据。开发者控制着哪些数据可以被其他应用访问。在安装应用时,用户可以控制应用是否能够访问请求的内容提供者。

一些内容提供者的例子包括:

• 短信/彩信

• 联系人

• 日历

• Facebook

• Gmail

等等,还有更多。

AFLogical 应用利用内容提供者架构来获取设备上存储的数据。类似于商业的 Android 逻辑工具,需要在设备上启用 USB 调试,以便 AFLogical 提取数据。当前版本 1.5.1,从 41 个内容提供者中提取数据,并将输出信息保存到 SD 卡上,格式为 CSV 文件和 info.xml 文件,后者提供有关设备和安装应用的具体信息。AFLogical 支持运行 Android 1.5 及以上版本的设备,并特别更新以支持提取大型数据集,如包含超过 35,000 条消息的短信数据库。目前支持的内容提供者包括:

1. 浏览器书签

2. 浏览器搜索

3. 日历

4. 日历参与者

5. 日历事件

6. 日历扩展属性

7. 日历提醒

8. 通话记录

9. 联系人联系方式

10. 联系人扩展

11. 联系人分组

12. 联系人组织

13. 联系人电话

14. 联系人设置

15. 外部媒体

16. 外部图片媒体

17. 外部图片缩略媒体

18. 外部视频

19. 即时通讯账户

20. 即时通讯账户

21. 即时通讯聊天

22. 即时通讯联系人提供者(即时通讯联系人)

23. 即时通讯邀请

24. 即时通讯消息

25. 即时通讯提供者

26. 即时通讯提供者设置

27. 内部图片媒体

28. 内部图片缩略媒体

29. 内部视频

30. 地图-朋友

31. 地图-朋友额外信息

32. 地图-朋友联系人

33. 彩信

34. Mms 部件提供者(MMSParts)

35. 笔记

36. 人员

37. 已删除的人员

38. 手机存储(HTC Incredible)

39. 搜索历史

40. 短信

41. 社交合同活动

让我们逐步了解在设备上运行 AFLogical 的步骤。首先,确保你已经下载了 AFLogical,这需要通过 viaForensics 进行注册和批准。(你可以访问 AFLogical 页面:viaforensics.com/products/tools/aflogical/。)接下来,你需要用你控制的 SD 卡替换用户的 SD 卡,并确保设备上启用了 USB 调试。然后将 Android 设备连接到你的 Ubuntu 工作站,并确保将 USB 连接传递到虚拟机。

警告

替换用户的 SD 卡

这个版本的 AFLogical 直接将内容写入 SD 卡,确保移除用户的 SD 卡并用检查者的 SD 卡替换是重要的。如果未执行此操作,将导致数据写入用户的 SD 卡,或者因为无法写入 SD 卡而使 AFLogical 失败。该应用程序的商业版本最终将用通过 adb 进行端口转发替换写入 SD 卡。

在终端会话中,验证你是否可以看到设备:

image

假设你将 AFLogical 应用程序保存在你的主目录中,你可以使用以下命令进行安装:

image

注意:如果设备上已经安装了 AFLogical,将显示错误,你必须卸载现有应用程序才能安装新版本。要卸载,请运行以下命令:

image

成功安装应用程序后,你可以直接从 Android 设备或通过命令行运行程序。如果你从命令行运行应用程序,你可以简单地启动应用程序,然后使用设备完成操作,或者让它自动运行。要自动运行应用程序和提取,请执行以下操作:

image

程序立即启动并开始从所有支持的内容提供者提取数据。如果你正在查看屏幕,你会看到一个类似于图 6.7 的图像。

image

图 6.7 AFLogical,从命令行提取所有内容。

或者,你可以使用以下命令简单地启动应用程序:

image

然后使用设备上显示的屏幕完成获取,如图 6.8 所示。

image

图 6.8 AFLogical,从命令行运行。

否则,你可以直接从设备上的所有应用程序屏幕运行应用程序,如图 6.9 所示。首先,访问 Android 应用程序菜单,寻找一个名为 viaForensics 的程序,并点击图标启动应用程序。

image

图 6.9 AFLogical 在所有应用程序列表中。

接下来,您将看到 AFLogical 数据提取屏幕。您可以选中或取消选中单个内容提供者,或者选择全部保留选中状态。然后点击捕获,这将开始如图 6.10 所示的数据收集过程。

image

图 6.10 AFLogical 捕获数据。

数据收集完成后,您将收到如图 6.11 所示的相应消息。

image

图 6.11 AFLogical,数据提取完成。

提取的数据保存在设备的 SD 卡上的一个名为 forensics 的目录中,以及一个以日期(YYYYMMDD.HHMM 格式)命名的子目录中。在这个例子中,我们使用 adb pull 命令将文件从 SD 卡移动到本地文件系统上的 AFLogical 目录。如果您检查该文件夹,您会看到:

image

这包含了提取的数据:

image

CSV 文件可以使用任何编辑器或表格程序查看。目录中还有一个名为 info.xml 的文件,其中包含有关设备的信息,包括 IMSI、IMEI、Android 版本、网络提供商等,以及所有已安装应用的列表。

image

image

现在法医检查员可以分析这些数据,并且可以轻松地与其他人共享。

警告

卸载 AFLogical

不要忘记卸载 AFLogical。如果未能卸载该应用,意味着 Android 设备可能会在法医代理仍然可以访问的情况下归还给所有者。要卸载 AFLogical,请输入以下命令:

adb uninstall com.viaforensics.android

这应该会显示成功。另外,您也可以回到主屏幕,按下菜单,选择应用程序,管理应用程序,选择 viaForensics,最后点击卸载。

商业供应商

目前,许多商业移动法医软件供应商已支持 Android。迄今为止,法医软件仅支持使用与 AFLogical 相同的内容提供者技术对 Android 设备进行逻辑检查。对于法医检查员来说,了解每个法医软件供应商如何实现 Android 支持可能是有帮助的。

每家软件公司都提供了一份软件评估版以及各自平台的概述,这些内容包含在每个章节的开头部分。本次评估使用了运行 Android 2.2 系统的摩托罗拉 Droid 手机。本节目的并非对每个平台进行评估,而是提供一个有帮助的概览。以下是为本次评估提供的法医软件包(按字母顺序排列):

• Cellebrite UFED

• Compelson MOBILedit!

• EnCase Neutrino

• Micro Systemation XRY

• Paraben Device Seizure

• viaForensics 的 viaExtract

测试了另外两个法医软件包。然而,遇到的问题阻止了它们这次的包含。这些供应商确实为 Android 提供了一种法医解决方案,如果你感兴趣,应该独立查看他们的产品。此次省略的软件包包括 Oxygen Forensic Suite 2010 和 Logicube 的 CellDEK。

任何此类概述的挑战在于,法医软件的更新频率很高,可能已经存在一个更新的版本。对特定软件包感兴趣的司法检查员和安全工程师应检查供应商的网站或直接与他们联系。

Cellebrite UFED

以下是由供应商提供的 Cellebrite 概述:

Cellebrite UFED 法医系统是一个独立的设备,能够从大约 1600 种移动设备中获取数据,并将信息存储在 USB 驱动器、SD 卡或 PC 上。UFED 还内置了 SIM 卡读取器和克隆器。克隆 SIM 卡的能力是一项强大的功能,因为你只需创建并插入原始 SIM 的克隆版,手机就能正常使用。然而,它不会在移动运营商的网络中注册,这就省去了法拉第袋的必要性,也避免了手机数据被更新(或删除)的可能。UFED 套件附带了大约 70 根线缆,用于连接现今大多数可用的移动设备。支持的连接协议包括串行、USB、红外线和蓝牙。

Cellebrite 还提供了 UFED 报告管理器,它提供了一个直观的报告界面,并允许用户将数据/报告导出到 Excel、MS Outlook、Outlook Express、CSV,或者直接打印报告。

UFED 设备完全支持 Unicode,因此可以处理任何语言启用的手机。此外,以下数据类型被提取:

• 电话簿

• 短信

• 通话记录(接收、拨出、未接)

• SIM ID 克隆

• 从 SIM/USIM 删除的短信

• 音频录音

• 视频

• 图片

• 手机详情(IMEI/ESN 手机号码)

安装

UFED 系统是一个独立的单元,包装在一个软壳中,包含 UFED 设备、用户手册、软件 CD-ROM、USB 蓝牙收音机(剑桥硅无线电有限公司)、250MB USB 驱动器和大约 72 根用于连接支持设备的线缆。

UFED 系统提供了几种机制,通过这些机制可以更新固件和软件。在设置日期和时间之后,检查员只需通过以太网电缆将 UFED 系统连接到网络,前提是提供 DHCP 和互联网访问。接下来,选择服务、升级、立即升级应用程序,并选择 HTTP 服务器作为源。对于这次测试,安装了最新的应用程序软件,版本 1.1.0.5。由于 UFED 系统是一个独立的解决方案,无需进行其他安装。

获取

在 UFED 系统上对摩托罗拉 Droid 的获取非常快速和简单。打开设备电源后,选择提取手机数据,摩托罗拉 CDMA,Moto. A855 Droid (Android),USB 磁盘驱动器(目标位置),以及所需的内容类型。然后 UFED 系统显示了以下指令(见图 6.12):

image

image

图 6.12 UFED 针对 Android 设备的指令。

应该注意的是,如果按照建议的步骤操作,联系人列表将被保存到 SD 卡上。执行这些步骤后,点击继续,获取过程将继续进行。UFED 系统接下来提示:

image

在此步骤完成后,将继续进行获取。在获取完成之前,你可能会再次被提示设置 UMS。获取过程耗时超过三分钟,并提供了以下提示:

image

获取的结果存储在插入 UFED 的闪存驱动器上。在此驱动器上创建了一个 25 MB 的文件夹,其中包含视频、音频和图片的文件夹。还创建了三个感兴趣的文件:电话簿 2010_11_23 (001).htm短信消息 2010_11_23 (001).htm,和报告.htm。所有这些都可以在网页浏览器中查看。报告.htm 文件包含了提取的完整报告。这包括手机检查报告属性、手机检查报告索引、手机联系人、手机短信—文本消息、手机来电列表、手机去电列表、手机未接来电列表、图片、铃声、音频和视频部分。

整个获取过程大约需要十分钟。在获取完成后,快速检查 SD 卡发现一个名为 00001.vcf 的文件,其中包含了导出过程中的联系人信息。

电话信息布局良好且相当准确。

数据展示与分析

获取的数据存储在连接到 UFED 系统的闪存驱动器上,包含一个存储视频、音频文件和图片的文件夹以及三个 HTML 文件,这些文件包含了报告数据:

1. 电话簿 2010_11_23 (001).htm

2. 短信消息 2010_11_23 (001).htm

3. 报告.htm

这些文件可以在网页浏览器中查看,报告样本显示在图 6.13 中,其中捕获了详尽的手机信息。

image

图 6.13 UFED 手机信息报告。

图 6.14 显示了电话联系人的布局。

image

图 6.14 UFED 电话联系人报告。

图 6.15 按时间顺序显示了短信,并详细说明了短信是发送还是接收。

image

图 6.15 UFED SMS 报告。

然而,已删除的短信和 MMS 消息不会显示。

通话记录按时间顺序显示,如图 6.16 所示,并包括通话时长。它们被分类为来电、去电和未接部分。

图像

图 6.16 UFED 电话通话报告。

通话记录中删除了几个电话;然而,UFED 能够提取并显示详细信息。

手机上找到的所有图像都会被报告,包括图像的缩略图和详细信息,如文件名、大小、创建日期和时间以及分辨率,如图 6.17 所示。

图像

图 6.17 UFED 图像报告。

已删除的图像没有出现,似乎每张图像都创建了一个副本。音频和视频文件都被报告。报告包括文件名、文件大小、创建日期和时间以及查看或收听媒体的链接,如图 6.18 所示。

图像

图 6.18 UFED 音频和视频报告。

没有返回已删除的视频,而且上传到设备的歌曲也没有出现在报告中。报告中的音频文件来自 Google 地图导航。

Compelson MOBILedit!

以下是由供应商提供的 MOBILedit! 概述:

只需单击一下,MOBILedit! Forensic 就可以从手机中收集所有可能的数据,并在电脑上生成详尽的报告,以便存储或打印。这是最通用的手机解决方案,软件支持大多数 GSM 手机,开放架构允许支持任何手机。系统允许你自定义输出,使其完全适应你司法系统的需求。

MOBILedit! Forensic 对手机进行彻底分析,包括电话簿、最后拨打的号码、未接电话、已接电话、MMS 消息、SMS 消息、照片、视频、文件、手机详情、日历、便签、任务等等。

MOBILedit! Forensic 为全球服务,报告可以用任何语言生成。你可以根据特定需求准备创意模板。你构建所有希望在每个最终报告中出现的文本。它还允许 XML 导出,以便你可以将应用程序与其他系统连接。XSL 模块将所有数据导出并格式化,以便在互联网浏览器中查看。你可以根据需要刻录、发送和分享报告。

MOBILedit! 法医报告可以无需人工干预自动生成。在 MOBILedit! 法医中,无需从 SIM 卡或手机导入或导出数据存根,但在手动调查模式下是可能的。它是只读的,因此可以防止设备上的更改,这可能导致证据的消失。所有项目还通过数字签名中使用的 MD5 哈希码受到后期修改的保护。它可以帮助您快速定位可能修改的位置。

MOBILedit! 法医还经常更新和升级,因此您可以确保使用的是绝对最新的技术。其详尽的报告和用户友好的设计使其成为一种工作的乐趣。

安装

www.mobiledit.com 下载了 MOBILedit!4 法医应用程序,安装仅需几分钟。安装完成后,首次运行应用程序,系统会提示您检查更新。

为了激活软件,Compelson 会发送一封带有“激活卡”附件的电子邮件。这个 PDF 文件包括安装说明以及一个无需任何问题即可使用的激活密钥。

获取

要开始获取,检查员首先需要使用 USB 将 Android 设备连接到法医工作站,并确保启用了 USB 调试。MOBILedit! 尝试检测设备,如图 6.19 所示。

图像

图 6.19 检测 Android 设备。

点击“完成”后,出现了提示在设备上安装“连接器”应用的通知,如图 6.20 所示。

图像

图 6.20 安装连接器。

在快速安装后,您为调查创建一个名称,并选择要提取的数据类型。在如图 6.21 所示的示例中,选择了备份“整个文件系统”的选项,该选项无误执行,并显示了如图 6.22 所示的成功状态。

图像

图 6.21 备份整个文件系统。

图像

图 6.22 操作成功完成。

然后,您可以决定是将此添加到现有案例中,还是创建一个新案例。对于本例中,如图 6.23 所示,创建了一个新案例,并选择了 XLS 数据导出格式选项。

图像

图 6.23 数据导出格式。

数据呈现和分析

在获取设备后,MOBILedit 立即显示已获取设备的统计信息,以及可供分析的应用程序数据视图。图 6.24 展示了主屏幕,检查人员可以查看特定设备信息,包括 IMEI 号码、序列号以及设备上的电话内存量、电池信号、网络信号和内存卡可用空间等详细信息。

image

图 6.24 主屏幕。

在树视图中下一个选项是电话簿,检查人员可以查看电话簿中存储的所有联系人,包括电子邮件地址、电话号码、昵称以及关于联系人的任何备注,如图 6.25 所示。

image

图 6.25 电话簿。

通话记录紧随其后,被分为未接电话、最后拨打的号码和已接电话,如图 6.26 所示。

image

图 6.26 通话记录—未接电话。

短信同样被分为不同类别,包括收件箱、已发送和草稿箱。每个部分都包含了消息接收(或发送)的日期和时间、消息内容以及发件人信息。联系人姓名与电话簿链接,因此可以显示姓名和电话号码。图 6.27 展示了短信收件箱。

image

图 6.27 短信—收件箱。

所有 MMS 消息都显示在“MMS 存储”文件夹中,如图 6.28 所示。在左侧,显示有关消息的信息,包括主题、发送者号码、接收者号码以及日期和时间。在右侧是实际图像的预览。

image

图 6.28 MMS 存储。

选择日历选项将在报告工具中拉起一个日历,如图 6.29 所示。

image

图 6.29 日历。

从设备或 SD 卡提取的额外数据显示在“文件”目录中。此目录包含了设备上的文件系统列表。尽管这些文件夹有些是空的(如缓存、配置和数据),但也有包含从设备获取的原始文件的文件夹。例如,在 SD 卡文件夹中,子文件夹“secret stuff”包含两个文件,如图 6.30 所示。

image

图 6.30 SD 卡文件。

最后,该工具还为指定文件提供了十六进制转储功能。选择“十六进制转储”后,再选择一个文件(在此示例中,选择了一个.jpg 文件),十六进制转储内容将在右侧的十六进制编辑器中显示,如图 6.31 所示。

image

图 6.31 十六进制转储。

在 Android 上的大多数原始用户数据文件可以在“data”文件夹中找到,当 MOBILedit 在树形视图中为此文件夹(位于“文件”目录下)创建条目时,它并不包含任何文件。

需要注意的是,在采集和分析完成后,“MOBILedit! Connector”应用程序仍然安装在设备上。调查员在调查完成后应考虑手动从设备上卸载该软件。

EnCase Neutrino

以下是供应商提供的中微子概述:

EnCase® Neutrino® 旨在为执法部门、安全分析师和 eDiscovery 专家提供法医级别的移动设备数据收集和审查。调查员可以在任何 EnCase® 产品中处理和分析移动设备数据,同时与其他类型的数字证据一起工作。

该解决方案具有对最常见的移动设备和智能手机操作系统(包括 iPhone、Palm、BlackBerry®、Android、Windows Mobile、Motorola、Nokia、Samsung 和更多)的硬件支持和解析能力。调查员可以收集、分析和保存所有可能相关的数据,包括:

• 设备设置

• 联系人

• 通话记录

• 电子邮件

• 图像

• 短信/彩信

• 日历

• 设备上存储的其他文件

使用 EnCase Neutrino,调查员可以:

• 使用易于使用的向导从各种设备采集数据

• 将来自多个设备和计算机媒体的数据相关联

• 将采集的数据无缝集成到 EnCase 法医或 EnCase 企业版中进行分析

• 快速解析数据,以提高调查过程的速度

• 相比类似产品,访问选定设备上的更多数据

安装

安装 EnCase Neutrino 首先需要安装 EnCase,然后才是 Neutrino。按照屏幕上的指示操作,软件安装顺利进行。要使用该软件,你必须拥有 EnCase 提供的硬件 USB 令牌。

采集

Neutrino 对 Android 设备的采集在单一界面上处理。首先,选择设备、制造商和型号。接下来,输入有关案件和设备的基本信息。最后,将设备连接到你的法医工作站,并点击“采集当前项目”。图 6.32 显示了采集界面。

image

图 6.32 中微子采集界面。

采集过程不到一分钟就完成了。完成后,点击生成报告以查看采集结果。

数据展示与分析

Neutrino 报告有简短和详细两种。简短报告如图 6.33 所示,显示了详细报告的所有条目,但细节较少。

image

图 6.33 Neutrino 联系人简报。

并且详细视图如图 6.34 所示,提供了关于联系人的更多详细信息。

image

图 6.34 详细报告中的中微子联系人。

短信部分也有简略和详细视图。简略视图只显示对话中的另一个电话号码、消息的日期和时间、消息方向(发送或接收)以及消息内容。详细视图,如图 6.35 所示,包括与消息相关的电话号码的名称以及消息的状态等信息。

image

图 6.35 详细报告中的中微子 SMS。

MMS 消息只出现在详细视图中,如图 6.36 所示。

image

图 6.36 详细报告中的中微子 MMS。

没有恢复任何已删除的短信。用户网页历史的详细视图,如图 6.37 所示,提供了大量细节。

image

图 6.37 详细报告中的中微子网页历史。

从设备中恢复的仅有照片是作为 MMS 发送的图片,而不是保存在设备 SD 卡上的照片或视频。

报告可以导出为其他格式,例如 HTML,以便整个报告可以在一页中查看,如图 6.38 所示。

image

图 6.38 以 HTML 格式导出的中微子报告。

Micro Systemation XRY

以下是由供应商提供的 XRY 概述:

XRY 是由位于斯德哥尔摩的 Micro Systemation(MSAB)公司开发的一款专业的移动设备取证工具。

自 2002 年以来,XRY 一直可用,“XRY Complete”是一个包含软件和硬件的套件,可进行移动设备的逻辑和物理分析。产品配有一个便捷的便携式箱子,内部定制,包含所有必要的硬件,如下所示:

• XRY 取证包软件许可密钥

• 用于 USB、蓝牙和红外连接的通信枢纽

• SIM ID 克隆设备

• 一套 SIM 卡克隆卡

• 带写保护的通用存储卡读卡器

• 用于逻辑和物理获取的完整电缆套件

• XACT 十六进制查看器软件应用

• 用于分发至第三方的 XRY 阅读工具

XRY 是经过法医调查员反馈设计和优化的,向导会引导你完成整个流程以协助检查。新的统一逻辑/物理提取向导和生成的报告有助于以整洁、清晰、专业的方式向检查员展示设备的全部内容。

XRY 的独特功能之一是设备手册,其中包含每个设备完整且详细的可用支持列表;指出了可以检索哪些数据,以及哪些数据无法恢复,这对于调查人员有时同样重要。

所有提取(逻辑或物理)都保存在一个 XRY 文件中,出于法医安全目的保留该文件。从 XRY 文件中,你可以根据需要创建 Word、Excel、Open Office 或 PDF 格式的报告。你可以包括案件数据和相关引用,选择报告中包含哪些数据,然后将其分发给调查中涉及的其他方;律师、检察官或其他调查员。MSAB 提供了一个免费的 XRY 阅读器,你可以将其提供给第三方,让他们在报告上做笔记——同时保持数据的原始法医完整性。

在该软件包内是 XACT 十六进制查看器应用程序,用于对恢复的原始数据进行更详细的检查,并协助搜索和手动解码,以补充 XRY Physical 中可用的自动解码。

XRY 法医包 5.1 版于 2010 年 6 月 28 日发布,增加了对 Apple iPad 的支持。

安装

XRY 是一个 Windows 应用程序,你可以通过供应商提供的单个安装程序进行安装。安装包括一个安装向导,在线检查软件更新,大约需要 15 分钟。该软件需要使用硬件加密狗才能运行。

采集

安装完成后,运行软件,选择“提取数据”,然后选择从手机中提取数据。之后,你必须识别设备类型,这可以通过几种方式完成。对于此示例,通过选择“名称搜索”,搜索 Droid,选择 Motorola Droid A855,然后选择“下一步”执行了搜索。这如图 6.39 所示。

image

图 6.39 XRY—搜索设备类型。

尽管 MSAB 法医套件支持某些设备的物理提取,但 Android 设备仅支持逻辑提取。选择逻辑采集后,软件会显示可用于提取的数据,如图 6.40 所示。

image

图 6.40 XRY Droid 提取可用的数据类型。

选择“下一步”,然后选择通过电缆提取数据并进行完整读取的选项,最后点击“下一步”开始数据提取。提取完成后,你会看到如图 6.41 所示的提取完成屏幕。

image

图 6.41 XRY 提取完成。

数据展示与分析

提取后,应用程序在内部显示数据,易于导航。联系人列表不仅包括联系人的详细信息,还显示了联系人的存储位置,如图 6.42 所示。

image

图 6.42 XRY 联系人列表。

通话记录提供了通话类型(拨打或接听)、姓名、号码、时间、时长和存储位置,如图 6.43 所示。

image

图 6.43 XRY 通话记录。

图 6.44 展示了包括号码、姓名、短信内容、时间、状态、存储、索引以及所在文件夹的短信信息。

image

图 6.44 XRY 短信。

图 6.45 显示,从设备中提取的唯一图像来自一条彩信。

image

图 6.45 XRY 图像。

其他数据被提取了。然而,它并没有在专门的报告部分中显示。例如,你可以在报告的日志部分查看网页浏览器历史、网站书签和谷歌搜索历史。

MSAB 还有一个名为 XACT 的工具,它提供了特定条目的十六进制视图。例如,图 6.46 展示了短信内容。

image

图 6.46 XACT—短信内容。

Paraben 设备查扣

以下是供应商提供的 Device Seizure 概述:

Paraben 的 Device Seizure(DS)是一款手持式取证工具,使调查人员能够对大约 2400 种型号的手机、PDA/智能手机和便携式 GPS 设备执行逻辑和物理数据获取、删除数据恢复以及完整数据转储。物理数据获取—通常是找到删除数据的地方—大约有三分之二的支持型号可以做到。此外,DS 被记录并验证为 100%符合取证要求,意味着数字证据在任何情况下都不会被改变。通过任何 PC 的标准 USB 数据线连接,这些功能都是可能的。

过去两年中,谷歌的 Android 移动设备操作系统对行业产生了重大影响。Paraben 专注于与最新的创新保持同步,并将对 Android 操作系统的支持添加到 DS 中。随着 DS 4.0 版本的发布,调查人员能够获取最常见的数据,如通话记录、地址簿和短信。除了这些数据类型,DS 还将获取多媒体文件—彩信、图像、视频和音频文件。可以从 Android 型号获取的完整数据类型列表如下:

• 地址簿,包括联系人分组、组织以及地址簿设置,以及标准的姓名、电话号码和地址

• 短信

• 彩信

• 通话记录

• 联系方式

• 浏览器历史

• 外部图像媒体(元数据)

• 外部图像缩略媒体(元数据)

• 外部媒体、音频和杂项数据(元数据)

• 外部视频(元数据)

• 所有已安装应用程序及其版本的列表

安装

在 Windows 取证工作站上安装了 Paraben DS 版本 4.1.3971.37683。安装过程需要安装许多必要的驱动,这需要相当长的时间。软件在使用前必须注册,可以通过硬件加密狗或通过 Paraben 提供的注册密钥文件来完成。要安装注册密钥文件,只需将文件复制到 DS 安装目录中,该目录通常是 C:\Program Files\Paraben Corporation\Device Seizure。

获取

要开始获取新的 Android 设备,首先你需要打开一个新案例并完成所需的案例信息部分。然后选择“数据获取”,并选择 Android,此时会提供以下指引:

image

根据这些说明,摩托罗拉手机不被支持。然而,摩托罗拉 Droid 的获取是成功的。

按照说明操作,然后点击“下一步”,此时 DS 尝试识别手机。确保识别的设备信息准确无误,然后如图 6.47 所示点击“下一步”。

image

图 6.47 设备扣押设备识别。

下一个屏幕提供了 DS 可以从设备中提取的支持数据类型列表。全部被选中,包括获取它可以读取的文件系统部分和 SD 卡,因此获取过程较慢。图 6.48 展示了 DS 获取时间。

image

图 6.48 设备扣押获取时间。

获取过程在大约两小时后完成,并接受了整理文件的提示。整理文件的过程花费了相当长的时间,但少于两小时。在那时,获取过程完成。图 6.49 展示了 DS 获取完成的输出。

image

图 6.49 设备扣押获取完成。

数据展示与分析

设备扣押以易于浏览和导航的结构显示获取的数据和应用程序。获取的目录结构如图 6.50 所示。

image

图 6.50 设备扣押 Droid 目录结构。

联系人不仅提供姓名、备注、电话号码和电子邮件,还提供了一些有用的字段,如联系次数、最后联系时间以及可用的照片,如图 6.51 所示。

image

图 6.51 设备扣押联系人。

短信报告提供了预期的字段,但已删除的信息并未包括在内。报告没有将联系人数据与电话号码进行交叉参考,因此检查员必须知道电话号码或自行处理交叉参考。图 6.52 展示了 DS 短信。

image

图 6.52 设备扣押短信。

然而,通话记录确实进行了交叉引用并显示了日期、信息类型、持续时间、号码、号码类型、名称,或者是否为新通话(大概是该号码第一次出现在通话记录中)。图 6.53 显示了通话记录。

image

图 6.53 设备查获的通话记录。

完整的网络历史记录可供使用并进行分析,包括访问次数和书签。但是,数据视图相当长,仅在 图 6.54 中显示了开头的信息。

image

图 6.54 设备查获的网络历史记录。

设备查获允许检查员选择任何文件并将其提取到取证工作站进行进一步分析。这对于查看或分析 DS 环境中不支持的原生文件类型很有帮助。由于在获取阶段选择了文件分类选项,因此每个提取的文件都被识别并按类型分组,从而可以快速访问感兴趣的文件。这在 图 6.55 中显示。

image

图 6.55 设备查获的文件分类器。

viaForensics 的 ViaExtract

以下是通过供应商提供的 viaExtract 概述:

viaExtract 是来自 viaForensics 的最新安卓取证解决方案,该公司是该领域的领先者和创新者。除了他们的移动取证白皮书和书籍外,viaForensics 还为执法和政府部门提供了一个免费的安卓取证解决方案,名为 AFLogical。

基于这一经验,viaForensics 开发了 viaExtract,该工具能够提取、分析和报告安卓设备中的数据。viaExtract 是一个模块化解决方案,接下来将提供基于 viaForensics 研究和开发的安卓取证物理技术。关于 viaExtract 的最新信息可以在网上找到,网址是 viaforensics.com/products/viaextract/,包括对安卓取证物理技术的支持、其他支持的移动平台以及先进的取证恢复技术。

viaForensics 是一家取证和安全公司,积极调查移动设备和传统计算机。他们作为检查员的直接经验导致开发了一个专门为取证检查员量身定做的工具。该工具旨在频繁更新,因为移动取证学科正在迅速变化。集成到 viaExtract 中的独特调试和报告系统简化了将调试和净化数据发送到 viaForensics 的过程,以协助设计和改进在多样化的安卓生态系统中运行的 viaExtract。

安装

viaExtract 软件作为虚拟机分发,因此它可以在运行支持虚拟化软件的 Microsoft Windows、Apple OS X、Linux 或其他操作系统上运行。该软件完全配置好,包括必要的驱动程序和支持库,这大大简化了安装过程。有几个支持虚拟化软件包是免费的,包括:

• Oracle 的 VirtualBox

• VMWare Player

市场上也有许多商业软件包可供选择。虚拟机从 viaForensics 的网站下载,然后导入到支持的软件中。检查员可以使用虚拟化软件内置的功能,例如在每次案例后恢复软件到原始状态快照,或者直接将其集成到宿主操作系统中,共享数据存储和其他宝贵功能。

收购

将 viaExtract 导入到宿主系统的虚拟化软件并运行后,法医检查员登录到 Ubuntu 虚拟机并运行 viaExtract,如图 Fig. 6.56 所示。

image

图 6.56 viaExtract 软件。

然后,检查员可以开始一个新案例或打开一个旧案例,如图 Fig. 6.57 所示。

image

图 6.57 viaExtract—新案例。

输入案例详情后,检查员可以选择直接从 Android 设备提取数据,或者从文件系统上的先前数据提取加载。后者对于检查员使用 viaForensics 的免费 AFLogical 软件从 Android 设备提取数据的案例非常有用。它还允许检查员根据以前设备提取的数据生成新的法医报告,这在使用新报告功能时非常有帮助。

在此示例中,我们将通过点击前进从 Android 设备中提取数据。然后我们会看到加载数据屏幕,提供启用 USB 调试的指导。点击确定后,数据提取就开始了,如图 Fig. 6.58 所示。

image

图 6.58 通过 viaExtract—数据提取。

数据提取完成后,检查员会看到一个数据提取列表,并可以选择他们希望在法医分析和报告中包含的内容,如图 Fig. 6.59 所示。

image

图 6.59 通过 viaExtract—法医分析和报告。

完成选择并点击应用后,报告逻辑被执行,数据提取完成。

数据展示和分析

数据提取完成后,viaExtract 向用户展示分析后的数据。通过导航应用程序左侧的选择项,检查员可以查看报告的不同部分。例如,首先展示的是设备信息部分,如图 Fig. 6.60 所示。

image

图 6.60 viaExtract—设备信息。

接下来,图 6.61 显示了报告中可用的浏览器历史和书签。

image

图 6.61 viaExtract—浏览器历史和书签。

在此示例中,你可以看到报告视图的几个功能,包括:

• 能够即时筛选报告的任何部分

• 能够对任何一列进行升序或降序排序

在下一个示例中,对 29 条人员记录应用了viaforensics.com的筛选条件,结果剩下 2 条。然而,许多字段显示在截图右侧,如图 6.62 所示。

image

图 6.62 viaExtract—筛选过的人员记录。

总的来说,viaExtract 目前支持 41 个以上的内容提供者。然而,在下一个版本中,将积极查询大约 100 个内容提供者。如果设备响应内容提供者,提取和随后的报告将成功。图 6.63 是通话记录的一个示例。

image

图 6.63 viaExtract—通话记录。

图 6.64 显示了视频媒体元数据。

image

图 6.64 viaExtract—视频媒体元数据。

报告也可以导出为 PDF 格式,如图 6.65 所示。

image

图 6.65 viaExtract—导出为 PDF。

物理技术

法医技术通常获取目标数据存储的物理映像,从而指数级地恢复更多数据,并且常常绕过程序保护。这些技术不仅可以访问已删除的数据,还可以访问系统不再需要而仅是废弃的数据。例如,一些系统记录上次访问网站的时间,并且每次再次访问该站点时更新日期字段。以前的日期和时间数据并未被明确删除,但系统没有跟踪它们。在采用 YAFFS2 的 Android 设备上,只要垃圾回收没有发生,就可以恢复以前的值。因此,物理技术不仅可以访问已删除的数据,还可以访问系统上的过时数据。

安卓法医物理技术分为两大类:

• 硬件:将硬件连接到设备或物理提取设备组件的方法

• 软件:在具有 root 访问权限的设备上运行的技术,并提供数据分区的完整物理映像

基于硬件的方法需要专业且通常昂贵的设备和培训,但对于无法获得 root 访问权限的设备可能非常有效。基于软件的物理技术是获取的直接路径,通常是最佳起点。当然,在软件技术可行之前,你必须在设备上拥有 root 访问权限。

基于硬件的物理技术

本节提供了两种基于硬件的物理技术:JTAG 和芯片摘除的简要概述。

JTAG

JTAG 是在 20 世纪 80 年代创建的,旨在开发一个用于测试印刷电路板(PCB)上的布线和互连的标准。到 1990 年,该标准已完成,成为电气和电子工程师学会的标准,即 IEEE 1149.1-1990(IEEE SA, n.d.),后来在 2001 年进行了更新,名为 IEEE 1149.1-2001。该标准被广泛接受,如今大多数 PCB 都有 JTAG 测试访问端口(TAPs),便于访问中央处理单元(CPU)。

JTAG TAP 暴露了各种信号,大多数移动设备包括以下内容:

  1. TDI—测试数据输入

  2. TDO—测试数据输出

  3. TCK—测试时钟

  4. TMS—测试模式选择

  5. TRST—测试重置

  6. RTCK—返回测试时钟

JTAG 的一个主要障碍是在 PCB 上定位 TAP 并追踪到 CPU,以确定每个测试功能的负责焊盘。即使芯片制造商已经发布了 CPU 地图,这也很难实现。此外,从芯片追踪 JTAG 功能可能非常困难,可能需要首先从 PCB 上移除 CPU。设备制造商拥有 JTAG 原理图,但通常被认为是公司机密,只发布给授权服务中心。另一种方法是,通过读取每个焊盘的电压来确定每个焊盘的功能,并根据参考电压识别功能。在某些情况下,刷机盒制造商或各种在线团体会发布 JTAG 引脚输出。图 6.66 是一个 T-Mobile HTC G1 JTAG 引脚输出的例子。六个引脚输出由小白圈指示,右侧的图例提供了详细信息。

图像

图 6.66 T-Mobile HTC G-1 PCB。

在大多数情况下,你的焊接线连接到 PCB 上的焊盘,另一端连接到一个特殊设备(刷机盒),通过软件管理 CPU。一些公司制作了定制连接器,支持特定设备,并通过将 PCB 放在两个带有弹簧针的夹具板之间简化与焊盘的连接。弹簧针与 PCB 上的 JTAG 焊盘接触,然后可以轻松连接到刷机盒。然而,有经验的工程师可能会发现直接将引线焊接在 PCB 上可以提供更稳定的连接。

一旦引线连接到适当的焊盘,就必须给主板供电以启动 CPU。每个 CPU 制造商都会发布其硬件的参考电压,这个电压绝不能超过。一些编程器盒子提供了管理电压的选项,但一般来说,应该通过内置数字电压表的 external 电源来管理电力,以确保准确。主板供电后,编程器盒软件能够执行 NAND 闪存的完整二进制内存转储。然而,这种连接是串行的,需要相当长的时间。尽管存在所有这些复杂性,如果正确执行 JTAG 技术,手机可以重新组装并且能够正常工作,不会有数据丢失。

尽管 JTAG 是从 Android 设备 NAND 闪存中提取数据的一种选择,但它非常困难,只有经过足够培训并且具有焊接小型 PCB 连接特定经验的合格人员才应尝试。如果在 JTAG 焊盘上焊接出错或给主板施加了错误的电压,不仅可能导致 JTAG 失效,还可能严重损坏设备。因此,JTAG 通常不是获取 Android 设备物理取证镜像的首选方法。

芯片移除

芯片移除是一种从设备中物理移除 NAND 闪存芯片并在外部进行检查的技术。芯片移除技术允许恢复损坏的设备,并且绕过密码保护的设备。这种移除过程通常是破坏性的——将 NAND 闪存重新连接到 PCB 并使设备运行相当困难。

芯片移除技术有三个主要步骤:

  1. NAND 闪存芯片通过焊接拆除或使用喷射热空气和真空的特殊设备来从设备中物理移除。还有一些技术是将芯片加热到特定温度。在这个过程中很容易损坏 NAND 闪存,因此存在用于提取的专业硬件甚至控制软件。

  2. 移除过程通常会损坏芯片底部的连接器,因此必须先进行清洁,然后再进行修复。修复芯片底部导电球的过程被称为重新焊接。

  3. 然后将芯片插入专用的硬件设备中,以便读取。这些设备通常必须针对特定的 NAND 闪存芯片进行编程,并且已经支持许多较流行的芯片。

在这一点上,你现在有了存储在 NAND 闪存芯片上的数据的物理镜像。

尽管芯片脱焊过程非常有效,但其进入门槛也很高。设备和工具的成本非常高,检查员必须具备非常专业的培训和技能。在脱焊过程中,NAND 闪存芯片在从 PCB 上移除时可能会损坏。最后,还需要一个防静电的干净房间。虽然地方甚至州执法机构和取证公司可能会发现芯片脱焊的成本过高,但这绝对是一个大型机构在其取证技术组合中会发现有用的有效技术。

基于软件的物理技术和权限

基于软件的物理技术相对于基于硬件的技术有诸多优势。软件技术:

• 更容易执行;

• 通常直接访问文件系统,以便完整复制所有逻辑文件(简化某些分析);

• 对设备或数据损坏的风险非常小。

要执行基于软件的物理技术,首先必须获得 root 权限,然后运行采集程序。

不幸的是,Android 设备默认不启用 root 权限。然而,在某些情况下可能获得 root 权限,我们接下来会介绍其中一些情况。但是,需要记住获取 root 权限的一些主要挑战:

  1. 获取 root 权限在很多情况下都会改变设备。

  2. 获取 root 权限的技术不仅因制造商和设备而异,而且针对每个 Android 版本甚至使用的 Linux 内核都不同。仅根据到目前为止开发的 Android 设备和版本,就有数千种可能的组合。

  3. 许多用于获取 root 权限的漏洞在线上被讨论,而且常常包含不准确的信息。

鉴于此,获取 root 权限可能相当困难,而且常常令人非常沮丧。

有三种主要的 root 权限类型:

  1. 通过 root 漏洞获得的临时 root 权限,在重启后不会保留。在这种情况下,通常 adb 守护进程不会以 root 身份运行。

  2. 通过自定义 ROM 或持久 root 漏洞获得的完全 root 访问。自定义 ROM 通常以 root 身份运行 adb 守护进程,而大多数持久 root 漏洞则不会。

  3. 通过刷入自定义恢复分区或自定义 ROM 的一部分来在恢复模式下获取 root。自定义 ROM 通常以 root 身份运行 adb 守护进程,大多数修改后的恢复分区也是如此。

想要获取 root 权限的 Android 爱好者通常只对完全、持续的 root 权限感兴趣。然而,从取证的角度来看,更倾向于使用临时 root 权限或通过自定义恢复模式获取 root 访问。

如果你需要在新的设备或 Android 版本上获取访问权限,你必须有一个用于测试的单独设备,以确保该过程有效且不会丢失数据。测试虽然耗时,但在这种情况下是一个重要的步骤。

以下各节详细介绍了每个步骤。

su

法医检查员首先应该检查的是设备是否已经拥有 root 权限。这是我们所讨论的任何技术中最简单的,绝对值得花费很短的时间来测试。设备必须启用 USB 调试,即使设备被锁定,你也应该检查。如果设备没有密码锁定,请确保已启用 USB 调试,这将在第三章中介绍。

接下来,将设备连接到你的工作站,尝试通过以下方式请求超级用户访问权限以获取 root 权限:

图像

在此例中,没有授予 root 权限。这是该命令典型的输出结果。然而,以下情况出现在一个已经拥有 root 访问权限的设备上:

图像

与其收到权限被拒绝的错误,不如直接授予 root 权限。这可以通过新的#提示符体现出来。有时设备会允许 root 访问,但要求用户点击设备上显示的提示上的 OK 来授权权限。如果设备没有密码保护,你应该检查是否有提示显示。

研究 Root 权限漏洞

如果设备尚未拥有 root 权限,你可以在线研究可能的技巧。这个过程可能会非常令人沮丧,因为许多经验不足的人在各种讨论板上寻求帮助。然而,尽管存在大量不准确的信息,也有一些知识渊博的资源和技术是确实有效的。

尽管有许多讨论 Android root 漏洞的网站,但有一个网站无疑是最出色的。xda-developers 网站极其受欢迎且活跃,它自称是“Android 和 Windows Mobile 平台智能手机爱好者和开发者最大的互联网社区”(Android & Windows Phone, n.d.)。其他许多网站发布了各种 root 漏洞,但通常都会链接到 xda-developers 上的一个讨论主题。

研究 root 漏洞的最佳方法通常是使用你喜欢的搜索引擎简单地搜索互联网,拥有一个测试设备,以及大量的耐心。

恢复模式

恢复模式是 Android 的一个操作模式,旨在应用更新、格式化设备以及执行设备上的其他维护工作。大多数设备上的默认恢复模式非常基础,只提供一些有限的功能,而且肯定不会在 shell 中提供 root 权限。

另一方面,自定义恢复分区几乎总是允许通过 shell 获取 root 权限。这些新的恢复分区通常由用户在设备被 root 时安装,并提供各种简化自定义 ROMS 备份和更新过程的功能。

与研究 root 漏洞一样,安装自定义恢复分区的检查员应该极度小心,因为该过程通常包含可能导致设备无法使用的内核和无线电更新(通常称为“变砖”),如果设备、内核和无线电固件之间存在不兼容。首先必须在实验室设备上进行大量测试,以确保没有问题发生。并且法医检查员应该了解在安装自定义恢复固件时设备上正在被修改的内容。

支持恢复模式的软件存储在专用分区上,体积相当小。在许多设备上,你可以通过检查/proc/mtd 来了解恢复分区的详细信息:

image

这个列表来自 T-Mobile HTC G1,你可以看到恢复分区的容量为 0x500000 字节,即 5 MB(0x500000 = 5,242,880,然后除以 1024 两次转换为 KB,最后为 MB)。以下是本书中使用的其他手机的大小:

• T-Mobile HTC G1:5 MB

• HTC Incredible:4 MB

• 摩托罗拉 Droid:4 MB

• 谷歌 Nexus One:4 MB

这有助于我们理解在下一节中探索替换虽小但重要的恢复分区技术。

在上一节介绍绕过密码保护设备的技术时,访问恢复模式是可能的解决方案之一。同样,建议检查恢复分区是否具有 root 权限,因为它将启用基于软件的物理技术。首先,按照表 6.2 所述启动设备进入恢复模式,或者直接在互联网上搜索你设备的特定键组合。设备进入恢复模式后,将其连接到你的 Ubuntu VM,并按以下方式运行 adb:

image

在这个情况下,adb 发现了一个处于恢复模式的设备。然而,许多设备在恢复模式下根本不支持 adb 访问,尤其是在原厂设备上。在这种情况下,你可以按照以下方法判断 shell 是否具有 root 权限:

image

如我们之前所讨论的,如果你看到一个#提示符,这表示你有 root 权限。如果你看到的是$提示符,则你没有 root 权限。不过,你至少应该尝试通过运行 su 命令来获取它们。

引导加载程序

如 第二章 所讨论的,引导加载器是 Android 启动过程中早期执行的小程序,负责(除其他细节外)选择和加载主内核。在某些设备上,存在特殊软件,通常由制造商开发,可以与引导加载器交互。这种软件能够将新镜像写入设备的 NAND 闪存。制造商使用此软件修复无法正常工作的设备,可能在其他情况下如开发和测试也会使用。法医检查员也可以使用该软件将实用程序或利用程序刷新到设备的 NAND 闪存,这将提供 root 权限。然而,大多数设备的引导加载器在出厂时处于锁定状态,这阻止了此类更新。

一个与 Motorola 安卓设备交互的软件示例是 Motorola 开发的名为 RSD Lite 的程序。RSD Lite 是专有软件,似乎只分发给 Motorola 服务中心用于设备维修。可以认为任何使用此软件的人都拥有完全授权,本概述仅作为某些安卓设备刷新操作的示例。

有许多网站讨论 RSD Lite 并提供该软件的使用指南。modmymobile.com 就是这样一个网站,它提供了一篇名为“[指南] 使用 RSD Lite 版本刷新 Linux Motorola 手机”的文章,该文章提供了软件的逐步操作说明([Guide] Flashing Linux, n.d.]。

在设备得到支持且引导加载器已解锁的情况下,你可以将设备连接到工作站,然后运行软件,软件会检测到手机。然后你必须提供适当的 .sbf 文件,然后点击开始,如 图 6.67 所示刷新设备。

image

图 6.67 RSD Lite。

完成过程并重新启动设备后,新的恢复分区(以及由使用的 .sbf 文件修改的任何其他区域)就准备好了。对于有适当授权使用 RSD Lite 的法医分析师来说,RSD Lite 可能是一个很好的选择。

sbf_flash

与 Motorola 的 RSD Lite 类似的一个工具是 sbf_flash,它没有 RSD Lite 的许可和使用的限制。这个应用程序是由一个安卓爱好者开发并在网上发布的,虽然在网上很多地方都可以找到,但最好是从作者的博客 OPTICALDELUSION 上获取,该博客会在新版本可用时更新。这个工具是在 Linux 上开发的,现在也可以在 OS X 上运行,因此大大简化了通过解锁引导加载器向 NAND 闪存刷新数据的过程。sbf_flash 的最新版本是 1.15,它支持以下功能:

image

要使用 sbf_flash,你首先必须确认设备是被支持的。对于本例,我们将涵盖摩托罗拉 Droid;然而,其他设备也被支持。设备必须置于引导加载模式,这可以通过在按下电源键的同时按住 D-pad 上的上方向键来实现。在摩托罗拉 Droid 上,引导加载程序很容易通过一个全黑的屏幕识别,屏幕上有白色的内核版本、USB 状态和电池状态文本。在尝试此过程之前,请确保电池充满电,因为如果刷新过程中断电,你可能会很容易地损坏设备。此外,你必须在取证工作站上保存 SBF 文件,以便你可以将其刷新到设备上。在进行目标设备操作之前,必须进行大量测试以确保兼容性和对过程的详细了解。

当 Droid 处于引导加载模式时,我们可以使用 sbf_flash 查询设备,如下所示:

图像

图像

sbf_flash 工具查找处于引导加载模式的设备,并立即将镜像文件刷新到 NAND 闪存。更新过程的状态会在屏幕上显示,之后 Droid 将重新启动。

图像

你应该准备好立即将设备引导进入恢复模式,因为摩托罗拉 Droid 后续版本的固件实现了一个检查现有恢复分区与该 Android 版本的标准恢复分区的哈希签名是否一致的程序。如果有差异,系统将在引导过程中重建标准恢复分区,从而覆盖修改后的恢复镜像。

一旦刷新了新的 SBF 文件,并且设备在修改后的恢复模式下运行,你将获得 root 权限,并可以继续进行基于软件的物理技术操作。

fastboot

Fastboot 是另一种通过 USB 向 NAND 闪存刷新图像的工具。Fastboot 的源代码包含在 AOSP 中,因此当你编译 AOSP 代码时,该工具会被构建。与 sbf_flash 一样,引导加载程序必须支持 fastboot,这不仅需要一个兼容的引导加载程序,还需要一个关闭了安全机制的引导加载程序(S-OFF)。

Fastboot 最初是在由 HTC 制造的谷歌 Android 开发者手机(ADP)上使用的。因此,关于 fastboot 的许多文档和参考资料都指向 ADP,HTC 有一个关于该工具的有用参考页面(HTC—开发者中心,n.d.)。这个页面不仅包含 ADP 设备的各种标准 NAND 闪存镜像文件,还提供了使用 fastboot 和访问设备上适当模式的说明(HTC—开发者中心,n.d.):

要进入 fastboot 模式,在按下 BACK 键的同时开机(或重启设备)。一直按住 BACK 键,直到引导加载程序屏幕可见并显示“FASTBOOT”。现在设备处于 fastboot 模式,可以接收 fastboot 命令。如果你想在此刻退出 fastboot 模式,可以按住 MENU+SEND+END 键(在 ADP 上,SEND 是“通话”键,END 是“结束通话”键)。

请注意,引导加载程序屏幕可能会因设备而异。对于 ADP 设备,引导加载程序屏幕会显示滑板机器人图像。其他设备可能会显示不同的图像或颜色图案。在所有情况下,引导加载程序屏幕在 fastboot 模式下会显示“FASTBOOT”文本。引导加载程序还会显示无线电版本。

进入 fastboot 模式后,使用以下命令验证 fastboot 是否检测到设备:

图像

Fastboot 提供了许多选项,当你使用以下帮助参数执行 fastboot 时,这些选项会被详细列出:

图像

如你所见,一旦进入 flashboot 模式,刷新修改后的恢复分区就相当简单了:

图像

此过程完成后,你可以将手机重启到恢复模式,并继续使用基于软件的物理成像技术。

AFPhysical 技术

AFPhysical 技术由 viaForensics 开发,用于提供 Android NAND 闪存分区的物理磁盘映像。该技术需要在设备上拥有 root 权限,并且应该支持任何 Android 设备。然而,这个过程并不简单,取证分析师需要根据所调查的具体设备调整技术。这是由于 Android 设备之间存在很大的差异,不仅不同制造商之间存在差异,而且运行不同版本 Android 的设备之间也存在差异。

AFPhysical 的整个过程相当简单:

  1. 在目标 Android 设备上获取 root 权限。

  2. 确定需要成像的 NAND 闪存分区。

  3. 将取证二进制文件上传到目标 Android 设备。

  4. 获取 NAND 闪存分区的物理映像。

  5. 如果在非易失性存储上存储了取证二进制文件,请将其删除。

无论使用哪种技术,都假定你在设备上拥有 root 权限。在这个例子中,我们将使用摩托罗拉 Droid。由于我们能够将修改后的恢复分区刷新到摩托罗拉 Droid,即使设备被密码锁定,这项技术也能在设备上工作。

在我们刷新了修改后的恢复分区并重启到恢复模式后,将设备连接到我们的 Ubuntu VM,并通过运行 adb devices 验证 adb 是否可以定位到设备。

图像

在那里,访问 shell 以确保你有 root 权限:

图像

在这一点上,我们需要更多地了解手机,以便决定需要物理镜像的内容。首先应该检查已挂载的文件系统(如果有):

图像

现在,我们知道设备使用 MTD 来访问 NAND 闪存以及 YAFFS2。为了确定 MTD 公开的分区,我们执行以下操作:

图像

审查员应选择对所有 MTD 分区进行镜像。然而,对于本例,我们将专注于 mtd8,即用户数据分区。

由于我们现在准备获取设备,如果有些术语或数据结构令人困惑,可以参考第四章中关于 NAND 闪存和文件系统的主题。一旦你拥有一个具有 root 权限的设备,就可以使用四种 Android 物理获取策略:

  1. 对所有分区进行完整的 nanddump 操作,包括数据和 OOB(推荐)

  2. 对分区进行 dd 镜像,只获取数据,不获取 OOB

  3. 使用 tar 进行文件的逻辑获取

  4. 使用 adb 进行文件的逻辑获取

此外,有两种主要方式可以保存从设备获取的数据:

  1. 使用 adb 端口转发通过 USB 在 Ubuntu 工作站和 Android 设备之间建立网络连接

  2. 将 SD 卡插入设备,挂载并在本地保存

这两种方法都有优点。使用 adb 端口转发,你无需插入自己的设备,并且可以立即在工作站上创建文件。当你保存到 SD 卡时,获取速度会快得多。这两种方法都是有效的,并将在此处进行演示。

我们将从用户数据分区的完整 nanddump 开始,因为这将提供最完整的数据取证副本。为了实现 nanddump,你必须拥有为 ARM 平台编译的 nanddump 版本。交叉编译 nanddump 超出了本书的范围。但是,你可以尝试在网上搜索该程序,或者按照网上发布的指南操作。

提示

为 ARM 进行交叉编译

将源代码交叉编译以在 ARM 平台上运行可能相当困难,而且网上对此的支持也很少。一个可能的解决方案是使用 Android 的本地开发工具包(NDK)来构建兼容的二进制文件。另一个选择是使用 Linux 并安装交叉编译器,例如从www.codesourcery.com/sgpp/lite/arm/portal/release1039为 ARM GNU/Linux 安装 Code Sourcery 的 G++ Lite 2009q3-67。安装交叉编译器后,你必须修改源代码的 Makefile 以指示交叉编译选项。还可以访问本书的网站viaforensics.com/education/android-forensics-mobile-security-book/以获取未来的更新。

为了避免向 NAND 闪存写入任何数据,我们可以再次检查 mount 命令的输出,并注意“/dev”目录是 tmpfs,因此存储在 RAM 中。因此,我们可以将取证工具推送到“/dev”:

image

接下来,我们需要让设备上的程序可执行。为此,我们使用 chmod 命令,它更改文件的权限,包括执行标志。我们将设置所有文件,允许任何用户读取或执行程序:

image

如你所见,在我们对程序执行了“chmod 755”命令之后,它们现在都设置了可执行位,这在文件权限中的“x”表示。

如果你决定将 nanddump 保存到 SD 卡上,请确保你将一个格式正确的 SD 卡放入设备中,并将其挂载在系统上。然后我们可以如下执行 nanddump:

image

最后,你可以使用 adb pull 将其传输到 Ubuntu VM,或者拔下 SD 卡并通过直接 USB 连接复制,后者要快得多。

注意

MD5 哈希

尽管在获取设备期间没有挂载用户数据分区,但“/dev/mtd/mtd8ro”的 md5sum 哈希签名即使没有任何写入也会改变。这是由于 NAND 闪存的特性,操作系统和内存几乎始终处于变化状态,由于磨损均衡、坏块管理和其他机制,即使用户数据没有变化也会发生变化。最好的做法是对生成的 NAND 闪存文件执行 md5sum,以确保从那时起确保完整性。

保存 NAND 闪存文件或任何其他成像数据的第二种方法是使用 netcat,这是一个允许你将命令输出重定向到网络的工具。对于这种方法,你需要两个活跃的终端或 ssh 会话。我们将它们称为 Session0 和 Session1。所有 Session0 命令都在 Ubuntu VM 上运行,因此我们不会从 Session0 进入 Android 设备的 shell。需要在 Android 设备的 shell 中执行的所有命令都将在 Session1 中进行。

首先,我们使用 adb 端口转发功能启用两个端点之间的网络连接:

image

这个命令本质上是连接了 Android 设备和 Ubuntu VM 上的 31337 端口。接下来,我们在 Android 设备上执行 nanddump 并将输出管道到 netcat:

image

现在 Android 设备正在通过 netcat 发送 nanddump 数据,我们需要在 Ubuntu 虚拟机端接收它:

image

当 nanddump 完成后,它会像 Ubuntu 虚拟机上的 netcat 一样简单地退出,没有任何额外的输出。我们可以使用 ls 命令验证 nanddump 是否已经接收到了工作站上:

image

在这一点上,你可以继续对调查所需的所有 MTD 分区进行物理成像,这至少应包括用户数据和缓存分区。

在第七章中,我们提供了一个程序,可以帮助你从 nanddump 中提取 OOB 数据,以协助进行文件雕刻等法医处理。由于你可以以这种方式生成 dd 镜像,因此无需使用 Android 设备获取 dd 镜像。然而,dd 已内置于 Android 中,因此我们提供了这个例子,它类似于 nanddump 例子的使用,不同之处在于它使用了 dd 工具,因此不会捕获 OOB 数据。本例使用了参考的 HTC Incredible。

图像

由于 Android 设备、MTD、YAFFS2 和其他一些不便之处存在差异,并不总是能够挂载获取的 nanddump 镜像并提取逻辑文件。既然你已经拥有足够的权限,最好提取所需的逻辑数据。这可以通过使用递归 adb pull 来实现,因为设备上运行的 adb 守护进程具有 root 权限。你也可以使用诸如 tar 之类的工具将数据复制到一个归档文件中。在任何一种情况下,你都必须确保所需的文件系统已挂载。一些修改过的恢复分区提供了一个用户界面来挂载文件系统。不过,你也可以在命令行上执行此操作,并只读挂载文件系统。在上面提到的摩托罗拉 Droid 上,执行以下操作:

图像

第一个命令以只读方式挂载“/data”分区。第二个命令获取已经挂载的“/cache”目录并将其重新挂载为只读。现在你可以执行 adb pull:

图像

最后一个选项是使用 tar 工具,它通常将文件和目录放入一个称为 tarball 的单个归档中。

图像

在这个例子中,我们传递给 tar 两个我们想要归档的目录:“/data/data”中包含短信/彩信的目录和“/cache”目录。我们将归档文件通过网络发送,并在 Ubuntu VM 上接收。但你也可以直接将归档保存到 SD 卡上。

一旦你在 Android 设备上拥有 root 权限并充分理解了设备的架构,你可以使用 nanddump、dd、tar、netcat 和 adb 来创建法医镜像或仅仅复制数据进行分析。

总结

有几种技术可用于对 Android 设备进行法医获取。如果设备设有密码保护,你必须绕过或避开保护以提取数据。尽管存在许多绕过密码的技术,但在每种情况下都不可能实现这一点。一旦设备可以访问,法医分析师可以选择从逻辑获取开始,主要关注通过内容提供者可以访问的未删除数据,或者更彻底但技术上更具挑战性的物理获取。虽然物理获取会产生更多的数据,但它通常需要更复杂的分析技术,这将在第七章中介绍。

参考文献

1. ACPO Good Practice Guide for Computer-Based Electronic Evidence7Safe Information Security. (未注明日期). 摘自 7safe.com/electronic_evidence/index.html#,2011 年 2 月 19 日检索。

2. Android & Windows Phone: Tablets, Apps, & ROMs @ xda-developers. (未注明日期). 摘自 www.xda-developers.com/,2011 年 2 月 23 日检索。

3. Aviv, Gibson, Mossop, Blaze, & Smith. (未注明日期). 智能手机触摸屏上的污迹攻击. 摘自 www.usenix.org/events/woot10/tech/full_papers/Aviv.pdf,2011 年 2 月 21 日检索。

4. Cannon, T. (未注明日期). Android 锁屏绕过. 摘自 thomascannon.net/blog/2011/02/android-lock-screen-bypass/,2011 年 2 月 21 日检索。

5. dc3dd. (未注明日期). 摘自 dc3dd.sourceforge.net/,2011 年 2 月 22 日检索。

6. Government Employment & Payroll. (未注明日期). 摘自 www.census.gov/govs/apes/,2011 年 2 月 19 日检索。

7. [指南] 使用 RSD Lite 版本刷新 Linux 摩托罗拉. (未注明日期). 摘自 modmymobile.com/forums/8-guides-downloads-forum-suggestions/218651-guide-flashing-linux-motorolas-rsd-lite-versions.html,2011 年 2 月 24 日检索。

8. HTC—Developer Center. (未注明日期). 摘自 developer.htc.com/adp.html,2011 年 2 月 28 日检索。

9. IEEE SA—1149.1–1990—IEEE Standard Test Access Port and Boundary-Scan Architecture. (未注明日期). 摘自 standards.ieee.org/findstds/standard/1149.1-1990.html,2011 年 2 月 23 日检索。

10. RerWare, LLC: Android Backup and BlackBerry Backup—MyBackup Pro. (未注明日期). 摘自 www.rerware.com/,2011 年 2 月 22 日检索。

第七章

安卓应用程序与法医分析

本章信息

• 分析技术

• FAT 法医分析

• YAFFS2 法医分析

• 安卓应用分析与参考

引言

到目前为止,本书已经讨论了大量材料,不仅涵盖了安卓设备的历史和架构,还提供了关于文件系统、设备安全方法和数据获取方法的完整详细信息。但缺乏上下文和分析的数据只是噪音。许多传统法医调查中使用的技术适用于安卓法医分析。

分析技术

本节将提供分析技术概述,随后是展示特定文件系统程序的章节。

时间线分析

时间线分析应成为任何调查的关键组成部分,因为事件的时间几乎总是相关的。构建法医时间线的方法有很多。然而,除非使用专门软件创建,否则这个过程可能非常繁琐。本章后面将详细介绍几种软件技术,包括来自 The Sleuth Kit 和 log2timline 的自由开源法医工具。其他法医工具也可以创建时间线。

对于支持的文件系统(例如,在 SD 卡和嵌入式多媒体卡[eMMC]上发现的 FAT16/FAT32 文件系统),有许多工具可以创建时间线。然而,目前没有分析工具支持 YAFFS2,因此创建时间线需要大量的手动分析。

时间线信息的主要来源是文件系统元数据,包括修改(文件元数据)、访问、更改(文件内容)和创建时间。这些元数据通常被称为 MAC 时间,有时也被称为 MACB(其中“B”代表文件创建时间)。在进行法医分析时,必须考虑文件系统跟踪不同时间戳并具有细微差别。

例如,微软的 FAT 文件系统已经成为了许多法医调查和分析的主题。微软开发者网络(MSDN)提供了关于 FAT 和 NTFS 文件系统中的文件时间的详细信息,并指出:

并非所有文件系统都能记录创建和最后访问时间,而且不是所有文件系统都以相同方式记录它们。例如,FAT 上的创建时间分辨率为 10 毫秒,而写入时间分辨率为 2 秒,访问时间分辨率为 1 天,因此实际上它是访问日期。NTFS 文件系统会将文件最后访问时间更新延迟最多 1 小时。

(文件时间,未标明日期)

Andre Ross 在他的 digfor(数字法医)博客上创建了一个有用的图形表示(digfor.blogspot.com/2008/10/time-and-timestamps.html),如图 7.1 所示(Ross, A., 未标明日期)。

image

图 7.1 FAT 和 NTFS 时间及时间戳。

为了进一步说明 FAT 时间戳的工作原理,数字取证和事件响应公司 cmdLab 发布了一篇名为“文件系统时间戳的误解”的博客(Casey, E., n.d.),其中提供了关于 FAT 时间戳的完整详细信息。

之所以出现混淆,是因为 FAT 文件系统对创建时间和最后写入时间戳的表示略有不同。最后写入时间戳是 32 位小端值,解释如下:

image

以以下 FAT 文件夹条目为例,其中最后写入日期以粗体突出显示:

image

转换为大端表示为 3a 75 b9 78,其二进制表示如下:

00111010 01110101 10111001 01111000

这对应于以下时间戳:2009.03.21 23:11:48:

• 7 位 = 0011101 = 1980 年以来 29 年

• 4 位 = 0011 = 3 个月

• 5 位 = 10101 = 21 天

• 5 位 = 10111 = 23 h

• 6 位 = 001011 = 11 min

• 5 位 = 11000 = 24 = 48 s

请注意,5 位无法存储所有的 60 秒,因此最后写入时间戳必须以 2 秒的间隔递增,并且总是偶数秒。

尽管创建时间遵循类似的通用计算方法,但它使用额外的 8 位来表示百分之一秒。在上面的同一目录列表中,创建时间戳与最后修改时间戳相同,除了多出一个字节(75 78 b9 75 3a)。这个额外的字节等于 117 百分之一秒,这使得创建时间变为 2009.03.21 23:11:49.17。因此,创建时间可以有奇数秒,并且具有 10 毫秒的分辨率。

本书用于时间线分析的一个工具是 The Sleuth Kit(TSK),它支持多种文件系统。TSK 维基提供了表 7.1 中的信息,以定义支持的文件系统 MACB 时间戳的含义(Carrier, B., n.d.)。

表 7.1 文件系统 MAC 含义

Image

不幸的是,截至版本 3.2.1,TSK 并不完全支持 YAFFS2。然而,有一些努力提供这些信息。对于 Android,TSK 在分析 FAT 文件系统以及某些设备上发现的 EXT3 方面是有效的。TSK 尚未完全支持 EXT4,但软件更新频繁,检查员应访问www.sleuthkit.org/以获取最近的更改。

文件系统分析

正如本书所讨论的,Android 文件系统中的目录和文件显然是法医调查的主要关注点。本章和本书的最后一节“Android 应用分析与参考”将提供对 Android 应用的详细分析。将此信息与第四章中展示的技术相结合,将为调查提供最重要的结果。

调查中需要检查许多目录。随着时间的推移,检查员需要扩展目录和文件列表,因为 Android 设备变化迅速。解决这个问题最好的方法是首先运行以下命令,以确定系统上挂载了哪些文件系统,它们挂载在哪里,以及它们的类型是什么。为了说明,让我们看看四款不同的 Android 手机,包括 T-Mobile/HTC G1,谷歌 Nexus One,摩托罗拉 Droid 和 HTC Incredible。

首先,让我们检查一下运行 Android 1.5 的 G1 上的 mount 命令输出:

图像

这款特定的 G1 运行的是原厂固件,没有插入 SD 卡,所以我们只剩下四个用强调标记的文件系统需要检查。

同样,我们检查一下运行 Android 2.1-update1 的 Nexus One 上的 mount 输出:

图像

在这个案例中,Nexus One 上有五个文件系统,我们用强调的方式标记出来,这应该是检查的初步关注点。新增的文件系统是挂载的 SD 卡。

接下来,我们看看运行 Android 2.2.1 系统的摩托罗拉 Droid 的挂载文件系统:

图像

图像

摩托罗拉 Droid 也有七个值得关注的文件系统。然而,它们与 Nexus One 略有不同。

最后,让我们看看之前讨论的运行 Android 2.2 的 HTC Incredible 的输出:

图像

HTC Incredible 以九个值得关注的文件系统位居榜首。如您所见,不同的 Android 设备和不同的 Android 版本,关注的文件系统会有所变化。然而,从上述检查中,我们创建了表 7.2,这为文件系统检查提供了一个强有力的起点。

表 7.2 调查中应包含的文件系统

挂载点 文件系统类型 相关性
/proc proc 使用“cat”命令在手机上检查。寻找关于系统的相关元数据,如文件系统统计信息
/data/data(在旧系统上,整个/data 是 1 个分区/文件系统) YAFFS2 几乎所有的应用数据
/data(在新手机上/data 可以进一步细分) EXT3/EXT4/YAFFS2 应用和系统数据,不包括/data/data 中的应用数据存储
/cache YAFFS2/EXT3 一些应用和系统使用的缓存文件系统
/mnt/asec tmpfs 未加密的应用 .apk 文件,它存储在 SD 卡上并加密,但在这里解密以便运行系统访问和使用
/app-cache tmpfs 临时文件系统,HTC Incredible 上的 com.android.browser 存储缓存。随着时间的推移,其他应用也可能使用这个目录
/mnt/sdcard vfat 可移动 SD 卡上的 FAT32 文件系统
/mnt/emmc vfat 嵌入式 MultiMediaCard (eMMC) 上的 FAT32 文件系统

值得注意的是,由于这些文件已被分配,即使是不受支持的文件系统(如 YAFFS2),这些文件也可以被复制到另一个介质上,并使用现有的取证工具和技术进行检验。例如,可以从 Android 设备将“/data/data”的内容复制到你的取证工作站上,然后直接检查内容。

文件雕刻

文件雕刻是一个过程,通过这个过程,在二进制数据中搜索并提取特定的文件类型,通常会导致整个磁盘或分区的取证镜像。文件雕刻通过检查二进制数据并基于已知的文件头来识别文件。如果文件格式有一个已知的文件尾,它将从头部扫描直到找到尾部(或达到配置文件设置的最大文件长度),然后将雕刻的文件保存到磁盘以供进一步检查。

传统的文件雕刻技术要求数据在镜像中是连续的,如果文件被碎片化,这无法产生完整的文件。文件碎片化的原因有很多,因为将文件保存到非易失性存储的过程因文件系统类型而异,并且受到内存类型(如 NAND 闪存)的强烈影响。这也意味着,非常大的文件(如视频)将更难以恢复。

新的文件雕刻技术正在被研究和开发,以解决文件碎片化带来的限制。纽约的一家数字取证解决方案公司——数字装配(Digital Assembly)开发了一种这样的技术,称为 SmartCarving。该技术分析了多种流行文件系统(不幸的是,不包括 YAFFS2)的碎片化特性,并利用这些信息来雕刻碎片化的照片。他们的产品 Adroit Photo Forensics 还可以从未知文件系统中雕刻图像(数字装配,未标明日期)。

用于雕刻数据文件的一种流行工具是 scalpel,这是一个由 Golden G. Richard III 编写的开源高性能文件雕刻工具(Scalpel,未标明日期)。Scalpel 读取一个配置文件,其中包含所需的文件头和尾定义,以便从原始镜像中提取文件。它是独立于文件系统的,可以在 FATx、NTFS、EXT2/3、HFS 或原始分区上工作。Scalpel 是用 C 语言编写的,可以在 Linux、Windows、OS X 和其他可以编译 C 代码的操作系统上运行(Scalpel,未标明日期)。

获取 scalpel 有两种方法。首先,在取证工作站上,你可以通过 apt-get 安装:

图像

这将安装最新版本。另外,你也可以从源代码编译,这将允许你在 Linux 或其他平台上安装最新版本,而无需等待特定平台维护者更新预打包版本。

图像

现在 scalpel 可执行文件位于“~/scalpel-1.60”目录下,简单地称为 scalpel。此外,在同一目录中还有一个样本 scalpel.conf 文件,scalpel 需要它来运行并扩展支持的文件定义。以下是针对 Android 设备的起始 scalpel.conf 文件:

image

image

如你所见,这个配置文件的头部定义了扩展名或文件类型(如果区分大小写),要雕刻的最大大小,头部定义(以 ASCII、十六进制和其他支持的表示法),以及尾部(如果存在)。针对雕刻的目标文件类型不需要定义每个设置。有关更多信息,请参见下载源文件中的示例配置文件,因为还有许多其他非常强大的选项。现在你的 Ubuntu 工作站已经具备了进行文件雕刻所需的软件,这将在 FAT32 和 YAFFS2 部分进行介绍。

值得一提的是,大量的文件签名已经被汇编好了。Gary Kessler,一位独立的咨询数字取证实践者,在他的网站上积极维护文件签名表(Kessler, G., n.d.)。他引用了“magic file”,在大多数 Unix 系统中都可以找到,位于 Ubuntu 工作站上的“/usr/share/file/magic”。在工作站上,您可以运行“file”命令,它接受一个文件作为参数,并尝试根据 magic 文件中的签名确定文件类型。

一个简单的例子是查看“/mnt/emmc/.Trashes”中的未知文件,名为“._501”,通过文件名无法轻易识别它(当然,有些人可能会通过更改扩展名来隐藏文件类型;然而,通过检查文件签名,很容易发现这一点):

image

因此,eMMC 中有一个 OS X 文件在垃圾箱里,这可能表明有人将 Android 设备连接到了 Mac 电脑。

字符串

Ubuntu 工作站上的 strings 命令默认会从任何文件(文本或二进制)中提取至少四个字符长的 ASCII 可打印字符串。虽然这种技术不是特别优雅或复杂,但它非常有效,可以快速检查二进制数据,以确定文件中是否可能包含感兴趣的信息。

有几个选项对字符串输出有很大影响。首先,让我们看一下命令手册页面的概要部分:

image

在执行 strings 命令时,有几个选项你应当始终考虑使用。首先,“—all”选项告诉 strings 检查整个文件(对于某些文件,它只检查文件的某些部分)。其次,“--radix=”选项指示 strings 打印在文件中找到字符串的偏移量。当你将 strings 命令和十六进制编辑器结合使用,以检查文件中可能找到的证据时,这个选项非常有帮助。radix 选项可以以八进制(--radix=o)、十六进制(--radix=x)或十进制(--radix=d)打印偏移量。对于大多数十六进制编辑器,你应该考虑使用十六进制或十进制偏移量。

另一个极其重要的选项控制字符串的字符编码,它支持大端和小端格式下的 Unicode 字符:

image

这一点很重要,因为 Android 不仅原生支持 Unicode,而且它还允许调查者探究那些默认语言需要 Unicode 的手机。以下是之前 dd 镜像中的一些例子:

image

在这个例子中,结果的最初几行被省略了。但是,你可以看到 dd 镜像在偏移量 0x880A 处引用了 htcchirp.db,紧接着我们看到了未链接(0x900A)、已删除(0x980A),最后是 htcchirp.db-journal (0xA00A)。那么这一切意味着什么?看起来 htcchirp.db 数据库被修改了。在那段时间里,它创建了一个特殊文件(htcchirp.db-journal,一个日志文件),该文件管理更新并允许在更新不成功时回滚更改。当不再需要日志文件时,它被删除了。这对于理解发生的情况以及可能存在已删除数据的位置(日志文件对正在更新的 SQLite 页面进行了完整快照,因此,以前的值存储在 NAND 闪存上)是重要的信息。

现在,让我们更改编码参数并查找以下内容:

image

在这个例子中,我们正在寻找 16 位大端字符。在这个案例中,从结果中提取了两个示例。在一个示例中,偏移量 0xC42404 处清楚显示了一些与芝加哥相关的活动。调查者可以简单地打开一个十六进制编辑器,跳转到偏移量 0xC42404,查看这个条目周围的数据,试图理解这一活动。

同样有趣的是,偏移量 0x1943020 处的下一个条目引用了bearshare.com网站,并且似乎有一个时间戳。如果我们把数字 1295219345 转换成基于 Unix Epoch 的日期/时间,我们得到的是 2011 年 1 月 16 日星期日 23:09:05 GMT。同样,调查者需要更仔细地检查数据以验证任何发现,但一个好的假设是,在那时 Android 设备上发生了一些基于网络的活动。

最后一个例子(其他编码留给读者作为练习)揭示了以下内容:

图像

这是一个很好的例子,因为它不仅包含了一个(有效的)经度和纬度,还包含了一个时间戳(以毫秒为单位,自 1970 年以来,不是秒),它转换为 GMT 时间:Sat, 30 Oct 2010 20:20:18 GMT。

Strings 是一个非常强大的命令,当与搜索和过滤器结合使用时,可以快速确定数据文件中是否容易提取电话号码、姓名、位置、GPS 坐标、日期以及更多信息。

十六进制:法医分析师的好朋友

在许多法医调查中,从物理获取的逻辑获取或逻辑文件系统分析将提供足够的数据。然而,某些案件需要深入分析以找到已删除的数据或未知文件结构。当文件系统在标准法医工具中几乎没有或没有支持时,这也同样必要,例如 YAFFS2。

可以理解,许多法医分析师宁愿不对数据进行深入分析,因为这需要大量的时间,非常繁琐,并且需要对数据结构有相当深入的理解和好奇心。然而,这种分析得出的结果常常非常惊人。可以了解到有关该案件的重要信息,而且这些知识通常可以应用于未来的许多案件。

由于这些原因,每个法医分析师都应该熟练使用十六进制编辑器,以备不时之需。这使分析师能够确切地看到正在存储哪些数据,寻找模式,并可能识别已删除或以前未理解的数据结构。

当然,让我们用一个例子来更好地解释这一点。首先,确保在你的 Ubuntu 工作站上安装以下软件包:

图像

这是一个非常快速的基于 curses(终端)的十六进制编辑器。当然,你可以使用任何你觉得舒适的十六进制编辑器。接下来,让我们使用 strings 命令查看位于/data/data/com.android.providers.telephony/databases 目录下的 mmssms.db 文件,看看我们是否能找到一些已删除的短信。在这个示例案例中,已知设备上删除了发送到 3128781100 的短信。首先,让我们使用 strings 命令看看是否能在这个 SQLite 文件中找到那个电话号码:

图像

在这个命令中,我们使用了管道(“|”)操作符,它将一个命令的输出传递给下一个命令。通过这种方式,我们可以将许多命令连接在一起,即时获得非常强大的分析方法。因此,上述命令执行了以下操作:

  1. 在 SQLite 数据库上运行 strings 命令。

  2. 将 strings 命令的输出通过 grep 程序运行,该程序基于提供的模式过滤输出。在这种情况下,我们提供了有疑问的电话号码。然而,你可以为 grep 创建非常强大的搜索字符串,包括正则表达式。

  3. 将 grep 命令的输出传递给单词计数程序(“wc”),并指示它按行而不是按单词计数,以查看返回了多少行。

结果是,找到了针对该电话号码的 417 条记录;显然表明确实与该设备上的电话号码进行了通信。接下来,我们想仔细查看这些消息,因此不是将输出传递给 wc 程序,而是直接查看结果,并在电话号码后添加“-A 1”选项来包含一行文本(另外,我们将输出传递给“less”命令,以一次显示一页):

image

因此,我们知道有一个 SQLite 数据库,其中包含目标号码和消息。让我们使用 SQLite3 来更好地了解数据库。这里我们将使用命令行(第四章介绍)进行操作,但如果你愿意,也可以使用带有图形界面的 SQLite 查看器。

提示

SQLite 语言参考

尽管本书中提到了多个 SQLite 工具,但您可能会发现www.sqlite.org/lang.html的 SQLite 语言参考是一个极佳的资源。对于不熟悉 SQL 的人来说,它提供了全面的概述。如果您已经了解 SQL,这个语言参考将有助于解释,正如页面标题所说,“SQLite 理解的 SQL”。

image

image

在上述 SQLite3 会话中,运行了以下命令以更好地理解数据:

  1. SQLite3 mmssms.db: 打开数据库以进行查询。

  2. .tables: 列出数据库中的表。

  3. .schema sms: 关注 sms 表,请求数据库提供表的结构(架构)。架构相当长,因此被截断了。

  4. .mode line: 将显示模式设置为行,以便更容易查看。

  5. “select ∗ from sms limit 1;”: 指示 SQLite3 从 sms 表显示一条记录到屏幕上(限制一条),显示所有列。

  6. .quit: 退出程序

因此,我们现在可以看到 sms 表中有很多字段,但在电话号码之后是一个个人 ID,然后是时间戳。使用十六进制编辑器,让我们确定一下从关于电话激活的消息中是否能确定日期/时间戳。首先,让我们在刚才安装的十六进制编辑器中打开 mmssms.db:

image

这将显示文件开头的框状十六进制以及右侧的可打印 ASCII 字符串:

image

我们可以按 Ctrl-T (^T)跳转到文件中的偏移量。在这种情况下,前面的 strings 命令包括了“--radix=x”,因此我们有十六进制的偏移量(0x12108),是时候搜索了:

image

十六进制编辑器非常响应迅速,跳转到偏移量:

image

从上面的十六进制数据中,我们可以看到电话号码,并在 0x12111 结束。在那之后,我们应该看到一个 person 字段,因为它是表设计中指定的下一个列(也称为表架构)。如果设置了 person 字段,它会链接到联系人表,以提供涉及人员详细信息。在这种情况下,没有设置 person,所以 SQLite 没有记录任何内容。最后,我们查看接下来的六个字节,得到 0x012AFC97C52C。转换为十进制后,得到的数字是 1284138059052。最后,我们可以使用多种技术将这个时间(以毫秒为单位的 Unix 纪元时间)转换为更易于阅读的日期/时间。对于这种情况,一个快速的技术是使用内置的 date 命令。然而,它只能处理以秒为单位的 Unix 纪元时间,而不是毫秒,所以你可以简单地将数字除以 1000(即省略最后三位数字):

图像

date 命令会自动以当前系统时区显示日期。另一种快速转换时间的方法是使用设计用于转换 Unix 纪元时间的网站www.epochconverter.com/,它支持以秒和毫秒为单位的 Unix 纪元时间(Epoch Converter, n.d.)。要转换,将整个时间戳(无需除以 1000)复制到网站文本框中,然后点击“Timestamp to Human date”,如图 7.2 所示。

图像

图 7.2 在www.epochconverter.com/上的时间转换。

最后一个要提及的时间戳转换技术是由英国数字取证软件公司 Digital Detective 提供的免费工具 DCode。DCode 支持许多格式(Digital Detective, n.d.)并且如图 7.3 所示,可以转换毫秒。

图像

图 7.3 Digital Detective 的 DCode 时间转换工具。

这个例子仅仅是为了说明如果取证分析师超越他们使用的取证软件,直接检查数据,那么可能只有这样才能访问到数据的重要性。对于知名的文件系统和“标准”案例,通常并不需要这样做。然而,移动取证,尤其是 Android 取证是一个具有挑战性的领域,因为许多文件格式、文件系统、硬件和软件不仅非常新(支持不佳),而且变化速度惊人。深入十六进制的取证分析师会发现,他们揭露的数据远比仅仅依赖现有取证软件要多。

Android 目录结构

对 Android 目录结构有一个广泛的理解对于设备的取证分析非常有帮助。为了进行这项分析,从 HTC Incredible 复制了五个重要的根级目录,然后在本地工作站上使用 tree 命令显示。按照层次结构布局,提供了许多目录的解释。

image

image

第 1 行:顶部是根目录,它创建了其他文件系统的结构和挂载点,这些文件系统之前已经探讨过。

第 2 行:如前所述,HTC Incredible 创建了一个类型为 tmpfs 的“/app-cache”目录。你可以看到浏览器缓存的结构。据推测,随着时间的推移,其他应用可能会利用这个目录。

第 6-8 行:从一开始,Android 设备就有一个专门的“/cache”目录,最初看似未被使用。然而,实际情况并非如此,应该对“/cache”分区进行完整分析。这里可以找到包括 Gmail 附件预览、浏览器 DRM、一些下载(市场和其它)以及来自无线运营商的 OTA 更新文件。

第 9 行:根级别的“/data”目录有许多重要的子目录,将在下一步介绍。请注意,一些手机(如 HTC Incredible)为“/data/data”子目录分配了一个专用的分区。

第 10 行:" /data/anr"目录包含了来自系统的堆栈跟踪(调试信息),通常对 shell 用户不可访问。然而,一些 adb 调试命令似乎可以读取这些数据。

第 11 行:" /data/app"目录包含了来自 Android 市场的.apk 文件。

第 12 行:" /data/app-private"目录用于存储来自 Android 市场的受保护应用。

第 13 行:较新版本的 Android 有一个安全的云备份 API,开发者可以将其集成到他们的应用中。" /data/backup"目录用于排队和管理这些备份。然而,到目前为止,还没有从该目录恢复有意义的数据。

第 14 行:" /data/btips"(德州仪器的蓝牙协议栈)目录存储了相关应用(com.ti.btips)崩溃时的日志文件。

第 15 行:" /data/davlik-cache"目录包含了 Davlik VM 用于运行应用的缓存 dex 文件。

第 16 行:" /data/data"目录包含了应用特定的数据,这无疑是调查中需要重点关注的最重要的区域。

第 17-23 行:出于演示目的,在目录层次结构中保留了一个应用。该目录根据包名命名,通常可以清晰地识别开发者(在本例中是 Facebook)。

第 24 行:对于《银河系漫游指南》(The Hitchhiker’s Guide to the Galaxy)的粉丝(这部经典小说给星际旅行者的著名建议是:不要恐慌),有一个名为“/data/dontpanic”的目录非常有趣,它只是用来存储系统的一些错误日志文件的地方。再次,开放系统的优点是可以检查代码。如果不是这样,我们就只能猜测其用途或进行大量的测试。以下是 AOSP 的内容:

image

image

第 25 行:/data/local目录非常重要,因为它允许 shell(非 root 手机运行 adbd 的用户账户)具有读写权限。安装应用时,首先将其复制到/data/local目录。此外,一些取证技术依赖此目录上传重要文件,通常是二进制文件。

第 26 行:/data/lost+found目录在 YAFFS2 文件系统的多个位置出现。再次,快速搜索(尝试从我们下载的 YAFFS2 源代码目录中使用“grep -R lost+found ∗.c”)将解释任何没有到根目录路径的文件或目录都将被放置在此文件夹中。

图像

第 27-35 行:/data/misc目录包含与蓝牙、dhcp、vpn、Wi-Fi 等相关的文件。其中一个重要的文件是/data/misc/wifi/wpa_supplicant.conf,其中包含设备连接过的Wi-Fi.com网络的列表。如果无线接入点需要密码,该文件将以明文形式存储密码(渗透测试人员可以好好利用)。以下是部分列表:

图像

图像

第 36 行:/data/property目录包含各种系统属性,如时区、国家和语言。

第 37 行:除了子目录,你可以看到/data/system包含几个关键文件。首先,accounts.db 包含需要身份验证的账户列表,并提供名称、类型、密码(加密)和认证令牌(以及其他数据)。还有两个与设备密码或 PIN 码相关的非常重要的文件。这些文件是 gesture.key 和 password.key,它们包含密码的编码/加密十六进制值。

第 43 行:当进程崩溃时,会创建一个特殊的墓碑文件。该文件为 ASCII 格式,因此可读。更多信息可以在网上找到,例如Crazydaks.com上的一篇有信息性的帖子(在 Android 中调试,n.d.)。

第 44 行:/mnt目录是系统挂载各种文件系统的地方,包括 SD 卡、eMMC 等。

第 45 行:/mnt/asec目录包含存储在 SD 卡上的未加密应用。当 Android 引入在 SD 卡上存储应用的功能时,出于安全原因对内容进行了加密。然而,当系统运行并需要访问未加密的文件时,这些文件将在/mnt/asec中被解密并挂载。

第 46 行:/mnt/emmc包含一些设备上的 NAND 闪存上的 FAT32 文件系统。第 47 至 55 行是几个 eMMC 子目录的示例。

第 51 行:/mnt/emmc/DCIM目录,相册缩略图存储在这里。

第 52 行:/mnt/emmc/DCIM/100MEDIA目录包含由 HTC Incredible 拍摄的照片或视频。

行 53:在 FAT32 分区上可以找到"/mnt/emmc/LOST.DIR"目录,其中可能包含文件系统失去追踪的文件或片段(类似于 YAFFS2 的 lost+found 目录)。应该检查这个目录。

行 56:如果存在物理 SD 卡,它将被挂载在"/mnt/sdcard"。

行 66:与 eMMC 类似,"/mnt/sdcard/dcim"目录用于存储设备中的图片和视频。在 HTC Incredible 上,它们存储在"/mnt/emmc/DCIM"中,因此并不在物理 SD 卡上。

行 67-68:"/mnt/sdcard/download"和"/mnt/sdcard/Downloads"目录包含浏览器、电子邮件客户端等下载的文件。

行 72:如前所述,"/mnt/sdcard/secure/asec"目录是加密的,那些位于 SD 卡上(而不是 NAND 闪存)的应用程序会在此存储数据。

行 75:"/system/app"目录包含与系统一起提供的.apk 应用文件。这包括由 Google/Android、制造商(在本例中为 HTC)和无线运营商(在本例中为 Verizon)捆绑的应用。在 HTC Incredible 的情况下,该目录包含一个重要的 152 个.apk 文件。在需要对案件进行应用分析时(这意味着你需要访问 apk 文件),了解这个位置很重要。参考 HTC Incredible 上存在的.apk 文件包括:

image

行 76 和 117:"/system/bin"和"/system/xbin"目录包含系统上使用的 Android 二进制文件。法医分析师和网络安全工程师(以及无疑的 Android 研究人员)可以通过实验这些目录中的文件,找到许多有用且未记录的命令。

行 77-80:"/system/customize"目录包含针对手机的运营商特定定制,尤其是 UI。

行 81:"/system/etc"目录是 Android 存储典型的 Linux/Unix 配置(/etc)目录的地方。它包含许多值得检查的配置文件——本书中无法一一讨论——但会因设备而异。

有更多目录和文件等待探索,但上述概览提供了一个很好的起点。

FAT 法医分析

SD 卡对法医调查人员来说可能是一座金矿。所有与手机同步的多媒体,或者用手机相机拍摄的内容,都存储在这里。可以恢复的项目包括图片、视频、语音录音、应用数据、音乐、Google 地图数据,以及可能使用 SD 卡存储的备份应用生成的完整备份文件。此外,调查人员还可以找到缓存的彩信图片缩略图、与已删除对象相关的垃圾信息,以及下载的应用 APK 文件。

例如,一个典型的用户可能会使用 Google 地图获取到当地购物中心的驾车指南。通过在 SD 卡上对“com.google.android.apps.maps/cache”目录进行取证检查,我们能够恢复地图图像块和导航语音提示。这些语音提示也带有日期和时间戳,因此取证调查员可以字面上根据给定的日期和时间追溯设备的位置。

在芝加哥郊区短暂旅行后,它看起来像这样:

图像

还需要记住,SD 卡可以通过 Android 作为外部大容量存储设备挂载。这使得用户可以在 SD 卡和个人电脑之间传输任何文件。

在第六章中,我们演示了如何获取包含数据的 Android 设备上的两个当前 FAT32 分区。有许多书籍和文章涵盖了 FAT32 文件系统的分析,本节将不再详细重复这些内容。但是,本节将展示一些使用 Ubuntu 工作站对 Android 设备上发现的 FAT32 分区进行检查的技术。

FAT 时间线分析

为了构建一个 FAT32 映像的文件系统时间线,我们同时使用 The Sleuth Kit(TSK)和另一个名为 log2timeline 的优秀开源取证工具。由 Kristinn Gudjonsson 编写的 log2timeline 工具是一个自动创建时间线的框架,包括系统上各种日志文件和发现的工件。log2timeline 可在许多系统上使用,并且在提取多种文件格式的的时间戳信息以进行分析方面做得非常出色。

由于我们已经设置了 TSK,我们需要采取几个步骤来安装 log2timeline。首先,自从你第一次构建 Ubuntu 工作站以来可能已经有一段时间了,因此更新任何有新版本并且通常包含安全补丁或错误修复的软件包是一个好主意。

图像

第一步更新了你的软件列表,第二步将实际执行升级。接下来,我们将安装 log2timeline,Kristinn 通过为他的软件创建了一个 Ubuntu 软件包,极大地简化了这一过程。

图像

这四个命令执行以下操作:

  1. 将 log2timeline 自定义软件仓库添加到 Ubuntu 工作站的总体列表中。

  2. 下载用于验证软件的公钥并将其添加到接受密钥列表中。

  3. 更新软件包列表。

  4. 安装 log2timeline。

为了进行分析,我们将使用在第六章中成像的 2 GB SD 卡的取证映像。首先,检查员应始终确保映像的哈希签名与取证成像期间获取的哈希相匹配,以确保映像是有效的。

图像

如果你记得,输入设备(在本例中为/dev/sdc)的哈希值是 e5dcc0af1d8a09c9af4d2db98f5f684d20a561666b9ff8df7c8b90a0b9d78770。取证镜像现在已验证。接下来,让我们先用 file 命令快速查看文件:

image

因此,我们实际上是在处理一个带有有效分区的磁盘镜像。接下来,我们可以使用 TSK 的 mmls 进一步检查磁盘镜像:

image

最后是 TSK 的 fsstat,但请注意,你必须提供一个扇区偏移量 129,因为 FAT 分区从那里开始:

image

image

在此例中,分区是一个带有数据的 FAT16 分区。因此,我们首先要使用 TSK 的 fls 命令构建时间线:

image

设置的选项具有以下含义:

• -z CST6CDT—将时区设置为美国中部时间的 CST6CDT

• -s 0—如果已知时间偏移,则设置时间偏移

• -m /mnt/sdcard—在写入 body 文件时用这个值作为路径前缀

• -f fat16—将文件系统设置为 FAT16

• -r—递归遍历所有目录以构建时间线

• -o 129—将偏移量设置为 129(假定一个扇区大小为 512 字节,但可以使用-b 选项更改)

• -i raw—设置镜像类型,在本例中为原始镜像,而不是其他取证镜像格式

• ~/sd-emmc/viaforensics/af-book/sdcard2-113serialno/sdcard2-113serialno.dc3dd—镜像文件

• > ~/sdcard.body—将命令的输出重定向到文件,而不是在屏幕上显示

通常了解命令需要多长时间很有帮助(如果没有什么,随着时间的推移,你会知道什么时候去拿咖啡加热器最好)。因此,我们在 fls 前加上 time 命令,它会告诉我们程序运行了多长时间(实际)以及各种系统时间(用户,系统)。你可以查看 body 文件的内容,但在后续步骤中,我们将把它转换成更易读的格式。如果你想验证 fls 返回的结果,你总是可以确定文件中的总行数:

image

因此,我们刚刚超过了 24,000 个条目。接下来,我们需要以只读方式挂载文件系统,然后我们可以对其运行 log2timeline。要使用 dd 镜像挂载文件系统,请使用 mount 命令和一个名为 loopback 的特殊设备。完整的命令如下:

image

再次,让我们看看设置的每个选项。首先,此命令需要管理员权限,所以我们用 sudo 运行。选项如下:

• -t vfat

• -o loop,ro,offset=66068—这告诉 mount 使用 loopback 设备,因为我们使用的是物理文件而不是实际的设备。ro 以只读方式挂载电子邮件。最后,我们必须告诉 mount 在哪里找到分区。从 mmls 命令中,你记得偏移量是扇区 129。Mount 不知道扇区大小,所以我们计算 129×512,等于 66,048

• ~/sd-emmc/viaforensics/af-book/sdcard2-113serialno/sdcard2-113serialno.dc3dd—dd 镜像文件

• ~/mnt/sdcard—挂载镜像的位置

我们可以通过执行不带选项的 mount 命令来验证文件系统是否已挂载,这将返回所有已挂载文件系统的列表。我们通过 grep 管道来隔离我们要查找的文件系统:

image

因此,我们可以看到 vfat 文件系统通过环回设备“/dev/loop0”以只读方式挂载在“/home/ahoog/mnt/sdcard”位置。你可以使用 df 命令查看总大小:

image

因此,在可用的 1.7G 中,只有 244M 被使用。现在我们准备使用与 log2timeline 一起提供的 timescanner 程序,从文件中提取额外的时间线信息。我们将把命令输出追加到与 fls 相同的正文文件中:

image

timescanner 的选项如下:

• -d /home/ahoog/mnt/sdcard—指定要扫描时间戳工件的目录

• -z CST6CDT—再次将时区设置为美国中部时间

• >> sdcard.body—将输出追加到现有的 sdcard.body。请注意双大于号(“>>”),它会指示 shell 将内容追加到文件中(如果文件不存在,则创建它)。如果你忘记并使用了单“>”,那么你会覆盖 fls 的输出。

Timescanner 只提取了 410 个工件,这比扫描整个硬盘所提取的数量要少得多。但是,这 410 个工件肯定有助于构建设备的整体时间线。

最后,我们可以使用 TSK 的 mactime 命令创建一个易于阅读(且易于分享)的时间线 csv 文件:

image

传递给 mactime 的选项如下:

• -b sdcard.body—指定要转换的正文文件

• -z CST6CDT—时区

• -d—以 csv 格式输出文件

这只需几秒钟,对于不到 25,000 个条目,但在 csv 文件中产生了超过 73,000 行。

image

你现在可以轻松地在电子表格程序中浏览时间线,甚至可以将其导入数据库进行进一步分析。有几个有趣的项目需要指出。

首先,你可能会看到很多接近 1970 年 1 月 1 日的日期。这是由于时间戳被设置为 0 或根本没有设置。由于 Unix 纪元是基于自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数,那么偏移量将是那个确切的时间。在上面的例子中,我们将时区设置为 CST6CDT,一月份这是 GMT -6 小时。因此,有很多带有“Wed Dec 31 1969 18:00:00”时间戳的工件。虽然我们无法从这些工件中提取具体的时间线数据,但它们可能仍然包含重要信息。

如果你从 Ubuntu 工作站双击 sdcard-timeline.csv 文件,Open Office 的 Calc 程序将显示如图图 7.4 所示的文本导入屏幕。确保“分隔符”设置为逗号,然后按确定。

image

图 7.4 将 sdcard-timeline.csv 文本导入到 OO Calc 中。

然后 Calc 程序将打开,你可以浏览时间线,如图图 7.5 所示。

image

图 7.5 在 OO Calc 中查看时间线。

如你所见,大多数文件都被删除了。然而,TSK 和其他程序仍然可以恢复它们。一个有趣的事件是检查一个应用程序出于测试目的被移动到 SD 卡上。该应用程序,愤怒的小鸟,支持从 SD 卡运行,在 2011 年 2 月 15 日 06:17:28 进行了测试,如图图 7.6 所示。

image

图 7.6 应用程序移动到 SD 卡的时间线。

时间线清楚地显示在“/mnt/sdcard/.android_secure”中在 06:17:28 创建并修改了一个新文件。

最后一个要指出的是来自 log2timeline 的条目。当它遇到一个 PDF 时,提取了元数据。我们可以看到以下内容:

• 2010 年 11 月 29 日星期一 04:44:47

• 23,159 字节

• 文件已修改

• 标题:(扫描文档)

• 作者:[michelle]

• 创建者:[HardCopy]

• 制作者:[Lexmark X543]

• 文件:/mnt/sdcard/.easc/Attachment/ATT_1291219677612.pdf

时间线分析非常强大,特别是如果法医分析师结合了 Kristinn Gudjonsson 的传统文件系统时间戳工件 log2timeline。

FAT 附加分析

对于 FAT 分区的进一步分析有许多不同的方法。首先,市场上大多数法医软件都支持 FAT 文件系统,许多检查员都有他们感到舒适的工具集。除了法医软件,我们在第一部分中介绍了一些额外的技术,包括:

• 文件系统分析

• 文件雕刻

• 字符串

• 十六进制分析

即使文件系统类型不同,这些技术也是相似的,因此我们将在接下来的 YAFFS2 部分提供详细的内容。但是,下面突出了一些简要概念。

首先,SD 卡显然有大量被删除的文件。建议使用法医工具来恢复数据。TSK 可以恢复数据,以及其他许多法医软件包。此外,应使用文件雕刻技术来恢复分区文件分配表中未引用的文件。字符串和十六进制分析再次成为快速定位感兴趣数据的好方法。

如果使用 Ubuntu 工作站进行文件系统分析,还有一项快速技术要提及。使用 find 和 file 命令,你可以按名称、路径和文件类型列出所有已分配的文件。你可以轻松地即时排序,或者将它们导入电子表格或数据库进行进一步分析。这项技术只列出已分配(未删除)的文件,但非常有效。

命令如下:

image

image

总的来说,这个命令在 SD 卡上找到了并分类了 4352 个已分配的文件。以下是命令每一部分完成的工作:

• find ~/mnt/sdcard—在挂载 SD 卡镜像的目录中查找文件,即~/mnt/sdcard

• -type f—只检查普通文件(即,不列出目录)

• -print0—使用 NULL 字符结束每个文件名,而不是默认换行符,当文件名包含空格时会导致问题

• “|”—将 find 的输出传递给下一个程序

• xargs—这个程序使用标准输入(例如,其他程序的输出)构建并执行命令行

• -0—告诉 xargs,通过管道传输的数据由 NULL 字符结束(与 find 的-print0 匹配)

• file—这是 xargs 针对 find 命令返回的每一行执行的命令

find 和 xargs 命令是检查、交互或以其他方式处理大量文件非常强大的方法。通过结合时间线分析和文件系统分析、文件雕刻、字符串和十六进制分析,调查员装备了强大的工具,以揭示对案件至关重要信息。

FAT 分析笔记

关于 Android 上的 FAT 文件系统还有几点剩余的说明。

SD 卡上的应用

首先,如第六章所述,从 Android 2.2 开始,用户可以将支持的应用移动到 SD 卡,以节省"/data/data"目录中的空间,该目录用于存储用户数据。应用必须明确支持此功能,典型的候选者是使用大量存储空间的应用,如游戏。为了测试这个功能,在参考 HTC Incredible 上安装了 Rovio Mobile 公司流行的 Angry Birds 游戏(Rovio - Angry Birds, n.d.)。运行了该应用,然后关闭。要将应用移动到 SD 卡,你从主屏幕选择设置,然后是应用程序,最后是管理应用程序,如图 7.7 所示。

image

图 7.7 管理应用程序屏幕。

如你所见,"Angry Birds"在"/data/data"目录下占用了 18.40 MB 的空间,这是非常宝贵的空间。因此,应用开发者包含了必要的支持,将.apk 移动到 SD 卡。然后用户可以选择应用(在这个例子中是 Angry Birds),并会看到一个包含有关应用信息及选项的屏幕,包括“移动到 SD 卡”选项,如图 7.8 所示。

image

图 7.8 移动到 SD 卡。

从这个屏幕上,你可以看到应用程序本身使用了 18.39 MB,而用户数据只有 12.00 KB,显然是移动.apk 文件到 SD 卡的理想候选者。正如图 7.9 所展示的,只需点击“移动到 SD 卡”按钮,然后等待任务完成即可。

image

图 7.9 应用程序移动到 SD 卡完成。

这对于用户来说是非常好的。但对于取证检查员或安全分析师来说这意味着什么呢?接下来描述了一些步骤,并在代码列表中突出显示。

1. .apk 文件从“/data/app”(或“/data/app-private”)移动到 SD 卡上加密分区中的/mnt/secure/asec(见下一个列表中突出显示的部分),只能通过根目录访问。

2. 一个新的设备映射文件系统被只读挂载,来自“/mnt/secure/asec”的应用程序被解密,并且可以在“/mnt/asec/com.rovio.angrybirds-1”处被系统访问。系统必须能够访问未加密的.apk 文件才能运行该应用程序。

3. 用户数据保留在“/data/data”中(在本例中为“/data/data/com.rovio.angrybirds”)。

4. 如果 SD 卡无法访问(无论是被移除、损坏,还是仅仅在主机计算机上挂载用于文件共享),未加密的卷会被卸载,并且不再能被系统访问。这就是为什么核心应用程序目前无法从 SD 卡运行的原因。

.apk 文件在 SD 卡上被加密,以确保其他应用程序(或进程)不能损坏或恶意修改应用程序。然而,应用程序开发者不应依赖加密来防止人们访问.apk 文件,因为它只是从未加密的“/mnt/asec/”中复制的问题。以下代码中的 mount 和 ls 命令说明了这个结构。

image

如果你需要.apk 文件进行分析(例如,调查恶意软件),那么在获取过程中,当 SD 卡插入并激活在 Android 设备上时(即没有在取证工作站上进行物理获取的挂载),复制“/mnt/asec”子目录是至关重要的。

nomedia

在 SD 卡和 eMMC 分区上常见的另一个项目是一个名为.nomedia 的空文件,它会指示 Android 的媒体扫描器跳过该目录,这样在诸如图库或音乐等应用程序中就不会包含任何媒体文件。如果一个目录不包含这个文件,那么很可能之前删除的图片仍然有缩略图存在于媒体扫描器的目录中。关于 Android 应用程序分析和参考的部分将进一步讨论这个问题。

YAFFS2 取证分析

正如在第四章所讨论的,YAFFS2 是一个开源的、针对 NAND 闪存设计的日志结构文件系统,支持磨损均衡和错误校正码算法。这对于手机用户来说是个好消息,因为 YAFFS2 在 Android 上运行良好;对于法医分析师来说也是个好消息,因为大量的旧数据(已删除或更新的)是可以恢复的。但好消息仅此而已。由于 YAFFS2 是一个相对较新的文件系统,目前还没有商业法医软件解决方案支持它。

然而,一切并未丢失。利用 Linux 的强大功能,YAFFS2 的开放性,有效的获取策略,以及已经讨论过的技术,包括文件系统分析、文件雕刻、字符串和十六进制分析,法医检查员可以从文件系统中提取大量相关信息。

当我们深入分析 YAFFS2 时,记住它的结构方式非常有帮助。需要回忆的一个重要概念是数据是如何通过 MTD 在 NAND 闪存上物理结构化的。通常,YAFFS2 和 MTD 将 NAND 闪存组织成 128 KB 的块,每个块由 2048 KB 的数据块和 64 字节的带外数据(OOB)组成(使得 NAND 闪存上的总大小为 132 KB),用于存储磁盘和某些文件系统元数据,如图图 7.10 所示。

图像

图 7.10 块(128 KB = 64 × 2k 块 + OOB)。

当然,Android 设备并不需要以这种方式构建 NAND 闪存和 MTD,最好的验证方法是检查“/proc/mtd”文件的内容,该文件包含配置信息。以下是来自参考 HTC Incredible 的文件内容。

图像

虽然如果我们想在 Ubuntu 工作站上尝试挂载 YAFFS2 nanddump,我们需要 OOB 数据,但 64 字节的 OOB 数据肯定会对大多数法医技术,尤其是文件雕刻造成问题。为了减轻这个问题,你可以使用一个简单的程序简单地移除 OOB。该程序是用 Python 编写的,可以轻松地适应不同的块和 OOB 配置。

首先,让我们使用 sudo 权限打开一个新文件进行编辑,这样我们就可以将程序放在“/usr/local/bin”中,这是保存自定义脚本和程序的最佳位置。

图像

接下来,将以下内容复制到编辑器中:

图像

图像

然后使用 Ctrl-O 保存并使用 Ctrl-X 退出。接下来,你需要使 Python 文件可执行,所以输入以下内容:

图像

最后,我们可以对 nanddump 文件运行程序:

图像

让我们确保 removeOOB.py 的结果符合我们的预期。根据“/proc/mtd”的信息,分区“/dev/mtd/mtd6”的大小为 0x9500000 字节,擦除大小(块大小)为 0x20000。总字节大小为 156,237,824(将十六进制的大小转换为十进制),大约为 154 MB。同样,擦除大小为 2048 字节,因此如果我们用 156,237,824 除以 2048,我们得到数据中的 76,288 个块。这与 removeOOB.py 的结果相符合。但还有一件事我们可以检查。由于我们知道 nanddump 在每个 2k 数据块后都有 64 字节的 OOB 数据,因此磁盘上的 nanddump 总大小应为 (76,288 × 64) + 156,237,824。然后总数应为 161,120,256,这代表了数据块及其相应的 OOB。我们可以通过简单的“ls –l”命令查看磁盘上的大小:

图像

如您所见,完整的 nanddump 和 .dd 映像(移除了 OOB 的 nanddump)都与预期的大小相符。

既然我们已经有了 YAFFS2 nanddump 文件、dd 映像以及逻辑文件(通过 tar、adb pull 或挂载 YAFFS2 分区获得),我们可以对数据执行各种技术。

YAFFS2 时间线分析

理想情况下,这一节将详细说明已经构建的取证软件的使用,该软件可以构建 YAFFS2 时间线。不幸的是,目前还没有任何取证时间线工具支持 YAFFS2,因此需要这些信息的检查员必须走一条更艰难的道路。

在未来几年中,取证行业需要针对 YAFFS2 进行更多的研究。然而,随着 Android 向 EXT4 迁移,可能大部分 YAFFS2 研究不会发生。希望情况不会是这样。

在这里,我们将介绍一些旨在为 YAFFS2 研究提供一个基本框架的研究。这项研究是在第四章中首次介绍的模拟 NAND 闪存上进行的。尽管这种方法为研究者提供了进行有效研究所需的控制和权限,但它并不一定能模仿生产环境。

如第四章所述,YAFFS2 和 MTD 都涉及将数据写入 NAND 闪存。YAFFS2 模块负责文件系统的所有方面。然而,将数据写入 NAND 闪存是由 MTD 管理的。不幸的是,这增加了分析的复杂性,因为 MTD 可以接受来自 YAFFS2 的数据,这些数据需要写入 NAND 闪存,然后它有自主权,不仅可以写入 YAFFS2 数据,还可以按照它认为合适的方式写入额外的 MTD 数据。对持久数据的研究必须考虑到不仅是 YAFFS2 代码,还有 MTD 代码。此外,不同 Android 设备上使用的 YAFFS2 和 MTD 模块之间可能存在细微差异,这又增加了一层复杂性。

这并不意味着理解 nanddump 中找到的 YAFFS2 数据是不可能的。为了开始,我们将在 Ubuntu 工作站上设置一个 64 MB 的模拟 NAND 闪存设备。

image

你可以验证 nandsim 是否正确设置:

image

在挂载 YAFFS2 文件系统之前,我们将启用 YAFFS2 内置的各种调试功能。YAFFS2 支持许多调试选项(YAFFS Debugging, n.d.),但我们只启用其中的三个。为此,我们首先需要拥有完整的 root 权限,然后将调试标志输入到“/proc/yaffs”:

image

echo 命令后的值首先移除所有现有的调试(无),然后启用 os、write 和 mtd 调试选项。你可以在位于“/var/log/syslog”的系统日志中查看调试的结果。理想情况下,打开第二个终端窗口或 ssh 会话,并使用 tail 命令持续输出 syslog 的末尾部分:

image

接下来,我们创建挂载点并挂载 YAFFS2 文件系统:

image

在这一点上,检查员应该创建一系列测试用例,以便在模拟 NAND 闪存上检查预期的受控数据,最终确定其结构。对于这个测试,采取了以下步骤:

  1. 在“~/mnt/yaffs2”中创建一个名为 test 的目录(mkdir ~/mnt/yaffs2/test)

  2. 创建包含“viaforensics”内容的“~/mnt/yaffs2/test/file1.txt”文件(nano -w ~/mnt/yaffs2/test/file1.txt)

  3. 更新“~/mnt/yaffs2/test”并将“updated”内容追加到文件(echo “updated” >> ~/mnt/yaffs2/test/file1.txt)

  4. 读取“~/mnt/yaffs2/test/file1.txt”(cat ~/mnt/yaffs2/test/file1.txt)

  5. 更改目录和文件的用户和组所有者(chown -R pulse.rtkit ~/mnt/yaffs2/test)

  6. 更改目录和文件的权限(chmod -R 777 ~/mnt/yaffs2/test)

在执行这些测试时,不仅文件系统被更新,而且调试信息被写入 syslog。调试信息非常详细(我们只启用了三个调试选项),因此这里只提供了两个示例,分别对应以下内容:

  1. 创建“~/mnt/yafs2/test”目录

  2. 更改 file1.txt 的权限(chmod -R 777 ~/mnt/yaffs2/test)

image

image

调试提供了有价值的信息,包括对象 id、序列号、块 id 以及 YAFFS2 创建文件所遵循的详细过程。如果你启用了额外的调试功能,你将拥有更多的数据来关联和使用,以便更好地理解 YAFFS2。

在我们检查实际的 nanddump 之前,还有另一个有用的命令值得一提。stat 命令将提供关于文件、目录或其他文件系统对象的详细信息。例如,我们可以对“/mnt/yaffs2/test”和“/mnt/yaffs2/test/file1.txt”运行 stat 命令,并将信息用于我们的研究:

图像

现在我们已经获得了文件和目录的修改、访问和更改属性,结合我们创建数据的操作,我们有足够的信息开始我们的研究。

是时候查看 NAND 闪存了,这需要 root 权限。以下命令将跳过 NAND 闪存的行,这些行都是 0xFF 和 0x00,使其更容易看出趋势。此外,出于空间原因,这里只显示了 NAND 闪存的一小部分,以十六进制表示:

图像

包括的 NAND 闪存部分涵盖以下内容:

1. 创建“~/mnt/yaffs2/test”目录

2. 对 file1.txt 文件权限更改(chmod -R 777 ~/mnt/yaffs2/test)

显示的数据是 YAFFS2 ObjectHeaders 的一部分,包含文件系统的元数据。文件名清晰可见,64 字节的 OOB 区域也是如此。此数据的一个关键特点是表示 Unix 纪元时间戳的整数以小端序排列,这意味着您必须从右到左读取数据。

• 写入 NAND 闪存的数字:63 99 d5 d4(0x6399d5d4)

• 从 little endian 转换为 big endian:4d 5d 99 36(0x4d5d9936,这是从右到左读取的十六进制数)

• 将 0x4d5d9936(十六进制)转换为十进制是 1297979702

• Unix 时间戳 1297979702 以人类可读的日期/时间格式是 2011 年 2 月 17 日星期四 15:55:02 CST(date -d @1297979702)

使用这些信息,我们可以在 nanddump 中隔离出许多重要的工件,如表 7.3 所示。

表 7.3 来自 YAFFS2 Nanddump 的工件

图像

令人满意的是,调试日志、stat 命令以及模拟 NAND 闪存设备的 nanddump 数据均相互对应。通过进一步分析,完全有可能为 NAND 闪存上的每个文件和目录创建 MAC 时间,这将为审查员提供明显的好处。也有可能从 NAND 闪存上仍然存在的 ObjectHeaders 中收集完整的元数据信息,并且如果在块上没有发生垃圾回收,还可以获取每个时间点的全部内容。

值得指出的是,在本文展示的非常有限测试和分析中,似乎文件的atime(访问时间)并不是每次访问文件时都会更新。这并不奇怪,因为这意味着每次程序访问文件时,都必须将新的 ObjectHeader 写入 NAND 闪存。这将导致对 NAND 闪存的写入次数大大增加,不仅会消耗宝贵的电池电量,而且还会因大多数用户并不真正关心的元数据更新而耗尽 NAND 闪存。这种做法并不特别不寻常,因为微软在默认情况下,在 Microsoft Windows Vista 和 Windows 7 中禁用了atime更新。

需要指出的是,这种分析并不是微不足道的。它能提供有价值的信息,并为对 YAFFS2 文件系统进行法医研究提供基础。

YAFFS2 文件系统分析

对 YAFFS2 文件系统进行十六进制分析非常耗时,因此让我们继续分析分配的文件的技术。不幸的是,这里又遇到了挑战,因为从 Android 设备提取后,挂载 YAFFS2 nanddump 可能会相当困难。

因此,如第六章所述,如果你在 Android 设备上有 root 权限,最好不仅要获取适当的 YAFFS2 nanddump 文件,还要使用 adb pull、tar 或其他方法从系统中逻辑地复制重要目录。这样,如果你无法挂载 YAFFS2 nanddump,你仍然有一个逻辑上的文件副本。然后可以使用 nanddump 来创建时间线、进行其他十六进制分析以及文件雕刻。

然而,在 Linux 中可能挂载一些 YAFFS2 nanddumps,随着时间的推移,预计会有更多的 nanddump 文件成功挂载。但是,在本节中,我们将关注来自摩托罗拉 Droid 的 nanddump,因为它们可以通过 nandsim 和 YAFFS2 内核模块在 Linux 中成功挂载。

首先,我们需要加载合适的内核模块并创建一个 1 GB 的 nandsim 设备。

图像

现在我们有一个 1 GB 的 nandsim 设备,可以容纳 Droid 的“/data”分区。下一步是使用 nandwrite 将数据和 OOB 都复制到模拟的 NAND 闪存中。

图像

这些参数指示 nandwrite 执行以下操作:

• sudo nandwrite—nandwrite 需要 root 权限

• --autoplace—使用自动 oob 布局

• --oob—图像包含 oob 数据

• /dev/mtd0—写入 nanddump 的 mtd 设备

• droid_userdata.nanddump—nanddump 文件的名称

如果一切按照预期进行,我们现在应该能够使用以下命令挂载文件系统:

图像

在这个过程中,你可能会遇到两个主要问题。首先,YAFFS2 和 MTD 可能无法成功挂载文件系统,并会显示以下信息:

图像

导致这种情况的原因可能有:

• 设备的 YAFFS2 和 MTD 实现与你的工作站之间的差异

• 损坏或无效的 nanddump

• 文件系统问题

第二个最常见的问题是文件系统挂载了,但是没有文件:

图像

这很可能是由于设备的 YAFFS2 和 MTD 实现与你的工作站之间的差异造成的,并且可能很难调试。你可以尝试一些方法来解决问题。首先,如果你有大于 20090606-1 版本的 mtu-utils,尝试安装旧版本。以下是检查你当前版本并选择安装的方法:

图像

既然我们已经降低了 MTD 的版本,你可以尝试再次执行挂载 YAFFS2 nanddump 的步骤。

另一个可能的情况是,你的 YAFFS2 版本与 Android 设备上使用的版本不够一致。为了获得不同版本的 YAFFS2,你需要使用 YAFFS2 或 Android 开源项目的源代码控制系统。然后,你可以编译该源代码,移除现有的 YAFFS2 内核模块,插入新的模块,并再次尝试。

如果这些步骤有效,以下是你会看到的情况:

图像

目前,我们已经可以在 Ubuntu 工作站上访问到一个摩托罗拉 Droid 手机的完整“/data”文件系统,你可以使用你选择的取证工具进行探索和分析。最终,如果你无法在 Ubuntu 工作站上挂载 nanddump,你仍然应该拥有获取过程中完整的逻辑文件集,因此它不应该妨碍对设备进行分析。

YAFFS2 文件雕刻

下一个用于分析 YAFFS2 文件系统的技术是文件雕刻。在本章前面,我们在 Ubuntu 工作站上安装并配置了 scalpel。对于这个例子,假设 Ubuntu 虚拟机上登录用户的主目录中有一个名为 htc-datadata.dd 的文件。在同一个目录(你可以在命令中使用 ~ 来引用它),有一个包含 1.3 节条目的名为 scalpel-android.conf 的 scalpel 配置文件。

请注意,我们在这里使用的是 dd 映像 进行文件雕刻,而不是 nanddump。这是必要的,因为每个 2k 块 YAFFS2 数据后面的 OOB 数据将严重影响 scalpel 雕刻有效文件的能力。以下命令将在 dd 映像上运行 scalpel,并将文件输出到名为 htc-scalpel-test 的文件夹中,该文件夹位于你的主目录中:

图像

在这种情况下,scalpel 能够恢复 11,370 个文件,并且输出提供了有关恢复的文件类型和数量的详细信息。图 7.11 是在 Ubuntu 工作站上查看其中一个 JPG 目录的屏幕截图。

图像

图 7.11 使用 scalpel 恢复的图像查看。

图片的分辨率并不高,但特别是在工作站上直接查看时,你可以分辨出内容。以下是这部分图片显示的一些内容:

• 前三张图片是 YouTube 视频的开头帧,在这个例子中是龙卡通。

• 接下来的图片是 Facebook 消息的一部分,询问午餐并推荐寿司。

• 剩余的图片似乎来自不同的新闻文章。

正如所示,文件雕刻可以从 YAFFS2 恢复重要的工件,对于法医分析来说是一个有价值的工具。

YAFFS2 字符串分析

我们已经展示了一个在 Android 设备上使用 strings 查找数据的例子。但是,让我们通过另一个练习来演示这项技术以及这种分析类型的强大功能。

在这个例子中,检查员需要在 Android 设备上找到位置信息。特别是在 Android 设备上,一个需要搜索的关键词是maps.google.com,因为 Google 地图服务与操作系统紧密集成。一个非常强大的搜索工具叫做 grep,它被广泛使用,现在在技术术语中已经变成了一个动词(“你有没有用 grep 搜索设备上的地图引用?”)。它不仅内置在 Ubuntu 虚拟机中,而且支持非常强大的正则表达式(通常简称为 regex 或 regexp),这允许进行复杂的模式匹配。有许多在线资源介绍了 grep 和 regex,并附有很好的示例。

在我们的例子中,我们将使用 grep 的最基本功能,我们只需搜索一个字符串:

image

查询返回了 775 个示例——出于简洁和隐私原因,这里只显示了一些。然而,很容易确定设备上发生的一些活动。具体来说:

• 对 Naperville 犯罪预防的搜索(URL 中的 q=代表查询)已经进行,URL 是有效的,包括地址、电话号码、图片、方向等。

• 对肯尼迪航天中心游客综合体的搜索也已完成。

• 肯尼迪航天中心的查询随后被移动地图应用程序查看,我们甚至可以看到 IP 地址。

如果我们查看 IP 地址,它是最后一个查询的一部分(174.253.2.53),我们可以使用命令行工具或在线 IP 查找服务(What Is My IP Address, n.d.)来获取更多信息。结果在图 7.12 中显示。

image

图 7.12 IP 地址查找结果。

IP 查找服务的信息揭示了几个重要的信息片段:

  1. 设备正在使用威瑞森无线网络。

  2. 设备位于伊利诺伊州芝加哥地区(可以伪造和欺骗 IP 地址,但在大多数情况下这并不简单且不太可能)。

由于我们已恢复字符串的十六进制偏移量,我们可以查看此搜索周围的数据以确定搜索发生的大致时间范围。

YAFFS2 分析师笔记

对于 YAFFS2 取证的大部分手动分析确实很耗时且有些令人畏惧,这导致进入这一领域的门槛比分析那些理解深入、支持充分的文件系统要高。然而,有许多易于获取的资源可以协助刚接触这种方法的分析师。

首先,希望这本书为取证分析中使用 Linux 提供了一个良好的介绍(请推荐给你的所有朋友和同事,让他们也都在书架上放一本)。

也许更有帮助的是,简单的 Google 搜索常常会带来许多博客、讨论板、邮件列表等资源上的有用帖子。尽管互联网上确实存在不准确的信息,但许多在这些领域工作的技术人员发布的信息相当准确和精确。而且,作为额外的好处,许多作者对询问和澄清非常响应。

接下来,有一个针对执法和取证分析师的 Linux 优秀入门介绍,该资源在线免费提供。网站“Linux LEO:执法和取证检验员的 Linux 入门”提供了 PDF 格式的指南,并介绍了使用操作系统作为取证工具所需的 Linux 概念(Grundy, B., n.d.)。

随着你进一步使用 Linux,你会发现自动化许多手动任务其实相当简单。这不仅让你对系统如何工作有很好的控制,而且自动化可以节省大量时间。这对于忙碌的分析师来说是一个很好的组合,他们可以使用前沿工具处理更多取证数据,同时还能准确解释系统做了什么,而不仅仅是说点击了一个按钮并生成了一份报告。

开始自动化常见 Linux 任务的最简单方法就是编写一个 shell 脚本,这非常容易实现,本质上就是模仿你在终端会话中输入的命令。

例如,假设你有一系列.csv 文件,这些文件包含了在 Android 设备上运行 AFLogical 取证技术得到的结果。你需要将每个文件的第一行发送给某人,但不应包含任何设备数据。你可以手动打开每个文件,删除数据行,将更新后的文件保存到新目录,然后发送信息。但这可能需要相当长的时间。相反,你可以编写一个简单的 shell 脚本。

首先,我们打开一个新文件进行编辑:

图像

然后将以下内容放入文件中:

图像

然后通过按 Ctrl-O 保存文件,并通过 Ctrl-X 退出。接下来,我们必须使脚本可执行:

图像

我们需要清理的文件位于用户主目录下的一个名为 AFLogical 的目录中,如您所见,手动处理这些文件会非常耗时:

image

我们现在可以轻松处理这些文件:

image

现在,AFLogical 目录不仅有一个名为 sanitized 的新子目录,其中包含了每个更新的文件,而且还有一个包含数据的单一文件:

image

这些数据可以轻松地通过电子邮件发送或复制到另一个驱动器。

下面是一个更复杂的例子,它将创建一个 nandsim 设备,挂载一个空白的 YAFFS2 文件系统,生成几个文件,然后允许用户卸载文件系统。这是自动化测试 YAFFS2 涉及的步骤的快速方法。

image

image

希望检查员不要认为由于缺乏支持 YAFFS2 文件系统的商业工具,就无法恢复额外的数据。使用 Ubuntu 工作站上可用的免费开源工具,显然可以提供进一步调查的强大手段。将这些技术与本章概述的十六进制分析相结合,检查员应发现他们已经很好地准备好从安卓设备上的 YAFFS2 分区提取证据。当一个涉及运行嵌入式 Linux 和 YAFFS2 文件系统的医疗设备的案例放在您的桌子上时,您可以自信地深入研究并解决问题。

安卓应用分析与参考

尽管本章描述了许多对安卓设备进行取证和安全调查有用的技术,但了解关键应用数据存储位置的信息很有帮助。当然,由于应用程序数量庞大,以及特定设备和安卓版本之间的差异,要维护一个完整的参考资料几乎是不可能的。

在以下各节中,我们将分析本书中使用的参考手机上的 10 个重要应用,并提供以下数据:

  1. 应用信息

  2. 文件和目录(包括 /data/data,SD 卡和 eMMC)

  3. 重要的数据库表

  4. 分析师笔记

通过应用分析,所有时间戳都是 Unix 纪元毫秒,即自 1970 年 1 月 1 日以来的毫秒数,除非特别说明。

测试的应用是在设备上安装并使用后,再通过一个自定义的 Python 程序进行分析,以自动化本章前面描述的一些技术。虽然提供了大量信息,但请注意,这只是一个参考,可能不完整。分析人员应该使用本章描述的取证和安全工具以及技术,对正在检查的设备进行全面分析。

短信(sms 和 mms)

应用信息

这是安卓系统默认的短信和彩信处理应用。

• 应用名称:短信

• 软件包名称:com.android.providers.telephony

• 版本:2.2

• 设备:HTC Incredible

• 应用开发者:Android

目录、文件和文件类型

/data/data/com.android.providers.telephony 目录下:

图像

重要的数据库表和文件

MMS 和 SMS 的重要数据库表和文件显示在表 7.4 中。

表 7.4 来自 /data/data/com.android.providers.telephony/databases/mmssms.db 的重要数据库表和文件

数据库表/文件 描述
words_content 消息内容
part MMS 附件详情,包括类型、名称、如果为二进制文件(例如图像)在文件系统中的位置以及如果为纯文本的附件内容
sms 完整的 SMS 消息,包括收件人、发件人、联系人、时间戳、阅读状态、发送/接收状态和消息内容
分析笔记

对于 /data/data/com.android.providers.telephony 的分析笔记:

• app_parts 文件夹将包含 MMS 附件,可以包括图像、视频或任何其他支持的数据。文件类型没有维护,因此请使用 file 命令或其他文件签名分析工具来识别。

• telephony 数据库通常没什么兴趣,因为它只包含无线运营商的服务信息。

• sms 表包含所有消息,应该是主要关注点。

• 其他几个表似乎复制了 sms 表内容的部分,因此查看 words_content 和其他表以帮助分析。

• 另请参阅:com.android.mms。

MMS 辅助应用

应用信息

该应用存储一些 MMS 数据,似乎是主 Messaging 应用的辅助应用。

• 应用名称:com.android.mm

• 软件包名称:com.android.mms

• 版本:2.2

• 设备:HTC Incredible

• 应用开发者:Android

目录、文件和文件类型

/data/data/com.android.mms 目录下:

图像

重要的数据库表和文件

• 在 /data/data/com.android.mms/cache 目录下的 PART 文件

分析笔记

对于 /data/data/com.android.mms 的分析笔记:

• 文件“bufferFileForMms”在发送时可能包含缓冲数据。但它通常只包含 0x00。

• 缓存中的 PART 文件是 Messaging 应用中找到的位于 /data/data/com.android.providers.telephony/app_parts 的图像的小 PNG 版本。

浏览器

应用信息

这是基于开源 WebKit 项目的 Android 内置 Web 浏览器。

• 应用名称:Internet

• 软件包名称:com.android.browser

• 版本:2.2

• 设备:HTC Incredible

• 应用开发者:Android

目录、文件和文件类型

/data/data/com.android.browser 目录下:

图像

图像

/app-cache/com.android.browser/cache 目录下:

图像

重要的数据库表和文件

支持的 Web 应用的本地存储显示在表 7.5 中。

表 7.5 来自 /data/data/com.android.browser/app_databases/http_www.google.com_0.localstorage 的重要数据库表和文件

数据库表格/文件 描述
项目表格 这个表格是一个简单的键/值对列表;然而,可能包含有关访问过的网站的实用信息,并利用了 localStorage 功能。

缓存的地理位置数据显示在表 7.6 中。

表 7.6 来自/data/data/com.android.browser/app_geolocation/CachedGeoposition.db 的重要数据库表格和文件

图像

地理位置权限数据库显示在表 7.7 中。

表 7.7 来自/data/data/com.android.browser/app_geolocation/GeolocationPermissions.db 的重要数据库表格和文件

数据库表格/文件 描述
权限 这个表格是源(网站)及其每个权限(允许)的列表。例如,www.google.com 和值 1 意味着 Google 网站有权限访问地理位置

表 7.8 显示了浏览器数据库。

表 7.8 来自/data/data/com.android.browser/databases/browser.db 的重要数据库表格和文件

图像

表 7.9 显示了网页视图数据库。

表 7.9 来自/data/data/com.android.browser/databases/webview.db 的重要数据库表格和文件

图像

网页视图缓存数据库显示在表 7.10 中。

表 7.10 来自/data/data/com.android.browser/databases/webviewCache.db 的重要数据库表格和文件

图像

分析师笔记

关于/data/data/com.android.browser 的分析师笔记:

• 如果需要查找特定网站并且该网站有 favicon,请检查 app_icons 中的 WebpageIcons.db。

• 特定的应用数据库可能包含非常有用的信息。例如,Google 应用数据库包含先前的搜索词,许多带有时间戳的“lon/lat/acc”缓存版本等。

• com.adobe.flashplayer 目录不仅包含以.sol 扩展名结尾的“Flash cookies”,可以通过 log2timeline 解析,还包含一些 Flash .swf 文件。

浏览器数据库(databases/browser.db)包含一个名为 bookmarks 的表格,该表格通常预先填充了来自无线运营商的书签。这个表格还包含了网页浏览器历史记录。还有一个名为 Searches 的表格,其中包含了从浏览器进行的 Google 搜索。

• 网页视图数据库(databases/webview.db)包含大量信息,不仅对法医检查员有用,对安全工程师也有用。Cookies 是可见的,而且大多数都不安全,这意味着它们可能容易受到像 Firesheep 这样的工具的 cookie 劫持攻击。表单 URL 和数据通常包含敏感信息,httpauth 和密码也是如此。

• 网页视图缓存数据库(databases/webviewCache.db)提供了有关存储在缓存目录中的缓存文件的元数据。

• 大多数设备将网页视图缓存数据作为/data/data/com.android.browser 的子目录保存。然而,HTC Incredible 将此目录移动到了 tmpfs(RAM 磁盘)目录。

联系人

应用信息

该应用是 Android 提供的主要联系人应用。尽管有许多其他应用可用,但此应用提供了核心的联系人功能。

• 应用名称:联系人

• 包名:com.android.providers.contacts

• 版本:2.2

• 设备:HTC Incredible

• 应用开发者:Android

目录、文件和文件类型

在/data/data/com.android.providers.contacts:

image

重要的数据库表和文件

只有一个数据库,即 contacts2.db,它有超过 30 个表。一些关键表在表 7.11 中列出。

表 7.11 来自/data/data/com.android.providers.contacts/databases/contacts2.db 的重要数据库表和文件

Image

分析师笔记

关于/data/data/com.android.providers.contacts 的分析师笔记:

• 该应用在 calls 表中存储设备的通话记录。

• contacts2.db 中超过 30 个表,可能需要进一步检查。数据表包含有关联系人的额外值,而 raw_contacts 包含有关某些联系人的额外数据。

• 该应用能够存储来自许多不同账户的联系人信息,包括 Gmail、Exchange、Facebook、Twitter 等。存储的一些数据包括来自这些其他应用的信息,如 Facebook 状态消息。

• 如果联系人的图片可用,它们将存储在 files 目录中,并命名为 thumbnail_photo_[NNNNN].jpg。在参考 HTC Incredible 中,发现超过 200 张图片,但有重复。

媒体扫描器

应用信息

该应用扫描并存储内部和外部存储介质上媒体文件的元数据。

• 应用名称:媒体商店

• 包名:com.android.providers.media

• 版本:2.2

• 设备:HTC Incredible

• 应用开发者:Android

目录、文件和文件类型

在/data/data/com.android.providers.media:

image

重要的数据库表和文件

每个数据库的结构相似,如表 7.12 所示。

表 7.12 来自/data/data/com.android.providers.media/databases/的重要数据库表和文件

Image

分析师笔记

关于/data/data/com.android.providers.media 的分析师笔记:

• 数据库名称包含卷 ID(如果有)。例如,在参考 HTC Incredible 设备上,eMMC FAT32 文件系统有一个卷 ID 为 0xc7f80810。

• 如果一个目录中有一个名为.nomedia 的文件,那么媒体商店将不会扫描并记录该目录中文件的元数据。

• 如果删除了一张图片,缩略图可能仍然存在。此外,即使删除了元数据记录,由于 YAFFS2 文件系统,它很可能可以被恢复。

• 还会扫描音频文件、专辑等。

• 存在其他媒体扫描器和应用,因此需要检查这些内容。其中一个在 SD 卡上存储缩略图,这可以提供被删除图片和视频的洞察。

YouTube

应用信息

YouTube 是一个视频观看网站,现在由 Google 拥有,为此他们为 Android 开发了一个原生应用。

• 应用名称:YouTube

• 包名:com.google.android.youtube

• 版本:1.6.21

• 设备:HTC Incredible

• 应用开发者:Google

目录、文件和文件类型

/data/data/com.google.android.youtube中:

image

重要的数据库表和文件

YouTube 偏好设置,包括在/data/data/com.google.android.youtube/shared_prefs/youtube.xml中的设备密钥和已观看视频。

image

/data/data/com.google.android.youtube/cache的 XML 文件中保存的关于特定已观看电影的信息:

image

分析师笔记

关于/data/data/com.google.android.youtube的分析师笔记:

• 检查缓存目录和 shared_prefs 目录中的 XML 文件,了解已观看视频的信息。

• 通常可以通过文件雕刻或其他技术在设备上找到视频开场图像的快照。

应用信息

这个应用是为 Google Nexus One 开发的,提供了一个媒体库和扫描器。

• 应用名称:Cooliris Media Gallery

• 包名:com.cooliris.media

• 版本:1.1.30682

• 设备:Google Nexus One

• 应用开发者:Cooliris

目录、文件和文件类型

/data/data/com.cooliris.media中:

image

更重要的是,缩略图存储在 SD 卡上:

image

重要的数据库表和文件

对于这个设备,picasa.db 是空的,但数据库可能包含有用的信息。

分析师笔记

关于/data/data/com.cooliris.media的分析师笔记:

• 这个应用真正的价值在于,在设备上发现的媒体会在 SD 卡上的“/mnt/sdcard/Android/data/com.cooliris.media/cache”目录中被缓存,应该仔细检查。

Google Maps

应用信息

这是内置的 Google Maps 应用,用于查看地图、搜索终点,甚至提供导航。

• 应用名称:Google Maps

• 包名:com.google.android.apps.maps

• 版本:4.4.0

• 设备:HTC Incredible

• 应用开发者:Google

目录、文件和文件类型

/data/data/com.google.android.apps.maps中:

image

image

这个应用还在 SD 卡上存储数据:

image

image

重要的数据库表和文件

尽管每个数据库都应该被检查,但在 HTC Incredible 上,有两个数据库包含非常有用的信息。第一个是在表 7.13 中显示的 da_destination_history 数据库,以及表 7.14 中显示的 search_history 数据库。

表 7.13 /data/data/com.google.android.apps.maps/databases/da_destination_history 的重要数据库表和文件

图像

表 7.14 /data/data/com.google.android.apps.maps/databases/search_history.db 的重要数据库表和文件

图像

files 目录也包含大量信息。例如,DATA_LAYER_24 文件的第一部分包含以下字符串:

图像

存储在 SD 卡上的数据用于谷歌地图导航的逐向指引,且逐向指引都带有时间戳:

图像

分析师笔记

关于/data/data/com.google.android.apps.maps 的分析师笔记:

• 该应用在 files 目录中存储了大量关于地图、瓦片、搜索等信息,应仔细检查。

• 尽管每个数据库可能不包含信息,但应仔细检查 search_history.db 和 da_destination_history。

• 尽管 shared_prefs 目录包含一些信息,但大多数对法医检查来说并不有用。然而,可以恢复认证令牌,这在进行安全审查时可能是有趣的。

• 导航功能在 SD 卡上缓存地图数据,以及实际指引的.wav 文件。如果你查看文件的时间戳,它们以“._speech_nav”为前缀,你可以确定指引是在何时提供的,并且可以听到实际的语音指引。

Gmail

应用信息

谷歌为他们的 Gmail 服务提供了一个本地客户端:

• 应用名称:Gmail(Google Mail)

• 包名称:com.google.android.gm

• 版本:2.2

• 设备:HTC Incredible

• 应用开发者:Google

目录、文件和文件类型

在/mnt/sdcard/Android/data/com.google.android.apps.maps/:

图像

图像

重要的数据库表和文件

Gmail 应用在 SQLite 数据库中存储了大量信息,关键表的一个示例显示在表 7.15 中。

表 7.15 /data/data/com.google.android.gm/databases/mailstore.book@viaforensics.com.db 的重要数据库表和文件

图像

图像

分析师笔记

关于/data/data/com.google.android.gm 的分析师笔记:

• 每个配置的 Gmail 账户将有自己的 SQLite 数据库,其中将包含全部电子邮件内容。

• 其他数据库如 downloads.db、suggestions.db 和 gmail.db 包含附加信息。

• 一些 SQLite 日志文件可能可恢复。

• 缓存/下载目录存储下载内容。

• 同步的 Gmail 账户也在 shared_prefs 中的 Gmail.xml 中引用。

Facebook

应用信息

这是官方的 Facebook 应用。

• 应用名称:Facebook

• 包名称:com.facebook.katana

• 版本:1.2

• 设备:HTC Incredible

• 应用开发者:Facebook

目录、文件和文件类型

在/data/data/com.facebook.katana 中:

图像

重要的数据库表和文件

如表 7.16 所示,有一个主数据库。

表 7.16 来自/data/data/com.facebook.katana/databases/fb.db 的重要数据库表和文件

图像

分析师笔记

对于/data/data/com.facebook.katana 的分析师笔记:

• fb.db 几乎包含了所有信息,上面只分析了三个表。完整的表单列表包括以下内容:

• albums

• info_contacts

• notifications

• android_metadata

• key_value

• perf_sessions

• chatconversations

• mailbox_messages

• photos

• chatmessages

• mailbox_messages_display

• search_results

• default_user_images

• mailbox_profiles

• stream_photos

• events

• mailbox_threads

• user_statuses

• friends

• mailbox_users

• user_values

• 文件目录包含了来自 Facebook 应用的大量图片。

Adobe Reader

应用信息

这是官方的 Adobe PDF 文件阅读器

• 应用名称:Adobe Reader

• 包名称:com.adobe.reader

• 版本:9.0.1

• 设备:HTC Incredible

• 应用开发者:Adobe

目录、文件和文件类型

在/data/data/com.adobe.reader 中:

图像

重要的数据库表和文件

com.adobe.reader.preferences.xml 偏好文件:

图像

分析师笔记

对于/data/data/com.adobe.reader 的分析师笔记:

• 缓存的 PDF 文件存储在缓存目录中。

• 最近文件列表存储在 cache/com.adobe.reader.preferences.xml 中。

摘要

尽管获取 Android 设备是研究、开发和讨论的重点,但这实际上只是 Android 取证挑战的一半。需要使用逻辑和物理技术进行分析。然而,物理获取后所需的分析量要大得多。本章的目标是提供技术,使法医分析师或安全工程师能够检查并从获取的数据中提取信息,即使文件系统不受取证工具支持。通过利用现有的取证工具、Linux 命令,有时还有十六进制分析,可以获取调查所需的大部分数据。

参考文献

1. 文件时间(Windows)。(未确定日期)。2011 年 2 月 13 日检索自msdn.microsoft.com/en-us/library/ms724290%28VS.85%29.aspx

2. Carrier, B. (未确定日期)。Mactime 输出—SleuthKitWiki。2011 年 2 月 13 日检索自wiki.sleuthkit.org/index.php?title=Mactime_output

3. Casey, E. (未确定日期)。文件系统时间戳的误解。2011 年 2 月 13 日检索自blog.cmdlabs.com/2009/05/08/misinterpretation-of-file-system-timestamps/

4. 《使用墓碑在 Android 中进行调试》. (未标明日期). 从 crazydaks.com/debugging-in-android-with-tombstones.html 检索于 2011 年 3 月 14 日。

5. 《数字装配:Adroit 照片取证—SmartCarving™》. (未标明日期). 从 digital-assembly.com/products/adroit-photo-forensics/features/smartcarving.html 检索于 2011 年 2 月 13 日。

6. 《数字侦探—DCode》. (未标明日期). 从 www.digital-detective.co.uk/freetools/decode.asp 检索于 2011 年 2 月 14 日。

7. 《Epoch 转换器—Epoch 与 Unix 时间戳转换工具》. (未标明日期). 从 www.epochconverter.com/ 检索于 2011 年 2 月 14 日。

8. Grundy, B. (未标明日期). Linux LEO. 从 www.linuxleo.com 检索于 2011 年 2 月 19 日。

9. Kessler, G. (未标明日期). 文件签名表. 从 www.garykessler.net/library/file_sigs.html 检索于 2011 年 2 月 13 日。

10. Ross, A. (未标明日期). digfor: 时间和时间戳. 从 digfor.blogspot.com/2008/10/time-and-timestamps.html 检索于 2011 年 2 月 13 日。

11. 《愤怒的小鸟—Rovio》. (未标明日期). 从 www.rovio.com/index.php?page=angry-birds 检索于 2011 年 2 月 15 日。

12. 《Scalpel:一个节俭、高性能的文件雕刻器》. (未标明日期). 从 www.digitalforensicssolutions.com/Scalpel/ 检索于 2011 年 2 月 13 日。

13. 《我的 IP 地址是什么》. (未标明日期). 从 www.whatismyip.com/ 检索于 2011 年 2 月 19 日。

14. 《YAFFS 调试》. (未标明日期). 从 www.yaffs.net/yaffs-debugging 检索于 2011 年 2 月 17 日。

posted @ 2024-05-22 15:11  绝不原创的飞龙  阅读(63)  评论(0编辑  收藏  举报