译者序
这是一本Android安全的实训教材,你甚至可以把它当成参加一次专家手把手的专题培训!
自从Android操作系统成为移动平台上的两大主流操作系统之一后,Android系统的安全性就受到了广泛的关注,确实也出版过几本Android安全方面专著,但是这些著作实在是太高大上了一些,一般都是要从高深的原理讲起,吓跑了许多对它感兴趣的爱好者。即使有人硬着头皮看下去,也如坠云里雾里,短期内无法把学到的知识,融会贯通地运用到实践中去。更别提那些只是不想让自己的代码沦为别人的“炮灰”的程序员了,他们确实学到了一些黑客知识,但是面对这些攻击时,又该怎样防护自己编写的代码呢?
本书的英文原名为《Android security cookbook》。其中的单词“cookbook”是“菜谱”的意思,也就是在给定场景下,如何进行操作的操作指南。顾名思义,书中的内容也就是针对典型的Android安全攻-防场景,通过实验来说明Android安全技术原理的。利用这种教学方法,能使学员快速上手,通过相对简短的培训,解决大部分实践中可能遇到的问题。由于本书同时也计划作为我校“网络安全与执法”专业“移动平台安全”课程的实训教材,所以我将书名直接译为《Android安全实验教程》。
实用性是本书最大的特色。除了常规工具外,作者还介绍了开源的Android安全评估框架“drozer”,利用这个工具,你不仅可以“敲一、两个命令”就能完成以前要花很大代价才能搞定的活。有经验的安全研究人员还能为自己定制开发一些针对特定问题的插件,让自己活得更滋润些。而且,由于这个框架能够暴露出Android app内部实现的许多细节,随着你越来越熟练的掌握这一工具,你对Android的理解也一定会越来越深入。
对于想要寻找代码加固方案的程序员来说,本书中更是针对常见的攻击方法,提供了详细且极富操作性的代码加固建议,其中不光有系统中自带的库或新增的特性的使用方法,也介绍了不少开源的库,通过对它们的使用,能把你的软件的安全性提高到一个新的级别。
本书的作者也不是光说不练的嘴把式,他们都是Android安全圈中的大牛,作者Keith Makan就是多个0day漏洞的发现者,数次入选谷歌应用安全名人堂(Google Application Security Hall of Fame);而作者Scott Alexander-Bown也是移动app开发、逆向和加固方面的专家,在多个国际会议上做过演讲。
单词“application”在书中,既是指用Java语言编写的Android应用,也指使用Android NDK编写的原生(native)应用程序,显然,在翻译时,将它们不加区分的全部译为“应用”或“应用程序”是不合适的。为了表示其中的区别,在翻译中,我们将用Java语言编写的Android应用一律译为“Android app”,而用Android NDK编写的原生应用程序则全部译为“应用”。
全书由上海公安高等专科学校的教师教官翻译完成的,全书共九章,分工安排如下:
第一至第四章由武晓音同志翻译,第五至第九章由我翻译。全书翻译完成后由我统一审校。
本书中文版的面世,特别要感谢博文视点的各位编辑老师,特别是顾慧芳、刘皎老师,感谢你们对我的一贯支持和耐心的指导,使我从中获益良多!同时也感谢你们为本书的出版所花费的大量时间!此外,也要感谢Team509安全研究小组的朋友们在本书翻译时给予的宝贵建议!
由于翻译时间仓促,书中存在错误在所难免,敬请读者不吝指正。
崔孝晨
2015年2月
前言
Android已经快速地成为了最主流的移动操作系统之一——这不光是对用户而言,也是对开发者和所有类型的公司而言的。当然也正是因为这个原因,它也成了恶意敌手眼里的一块肥肉。
自从2005年进入公众视线时起,Android在功能和复杂性上都有了长足的进展。移动智能手机中一般都存有其使用者的非常敏感的信息,而且还能访问他们的电子邮件、短消息,以及公共网络和专门网络的服务。就像其他所有软件一样,在功能和复杂性增长的同时,也会增加安全风险。软件越强大,越复杂,人们就得越努力地应对和适应险恶的大千世界。
这一点还特别适用于移动智能手机上的软件。这些存放私人信息和隐私信息的温床,必然存在于我们十分关心的一个安全的上下文环境中,同时,我们也要在这一环境中解决问题。从一方面看,移动智能手机的安全上下文环境,与网上的或“云”中的服务器中的安全上下文环境是截然不同的。因为究其本质而言,网上的或“云”中的服务器是不会移动的。它们不会被轻易地搬走或偷走。我们可以同时强制执行软件的和物理的防护措施保护它们,使之未经许可就不能被访问。我们也可以一直监视它们,并及时响应各个安全应急事件。但是对于我们经常放在口袋或手提包里,带着到处跑,还会被落在出租车里的设备来说,游戏规则就完全变了。
Android的用户和开发者需要持续关注他们的移动安全风险,而正是因为这一原因,对移动安全和风险评估专家和安全工程师的需求也一直是很旺盛的。本书致力于降低成为Android安全评估专家之初的学习难度,并希望成为经验丰富的Android安全专业人士手中的工具,帮助他们解决常见的Android安全问题。
本书的内容
第1章“Android开发工具”介绍了安装和运行开发者用来编写Android app和Android平台上的原生级组件的工具。这一章也为那些想要了解如何搭建常用的Android开发环境和相关工具的新手做了一个大致的介绍。
第2章“实践app安全”介绍了Android操作系统提供的,专门用来保护app的组件。这一章里将讨论:(对app的)手工检查和一些用来保护app的安全相关的工具和服务的使用方法,以及用它们与操作系统交互的方法。
第3章“Android安全评估工具”介绍了一些主流(新的或即将发布的)安全工具和框架,Android安全专业人士可以用它们来评估app暴露给用户的技术风险。在这一章里,你将学到如何安装、运行和扩展本书之后的这些章节中会使用到的黑客和逆向工程工具的功能。
第4章“利用app中的漏洞”介绍了针对Android app的目的漏洞利用技术的框架。这一章的内容涵盖了所有类型的Androidapp组件,从源码和app间上下文关系的角度,详述了如何检查这些组件的安全风险。另外,这一章里还将介绍在第 3 章“Android安全评估工具”中介绍的工具的一些高级用法。
第5章“保护app”的写作目的与第4章“利用app中的漏洞”的目的是完全相反的。这一章并不光讨论app中的漏洞,也讨论如何修补它们。它将引领读者学习那些开发者能够用来保护他们的app,免受第4章“利用app中的漏洞”中详细描述的一些攻击危害的,有用的技术。
第6章“逆向app”帮助读者学习如何破解app並教授他们Android逆向工程师用来检查和分析app时所使用的技术。你将会非常详细地学到Dex文件的格式,以及如何把Dex字节码解析成易于进行逆向工程的更有用的表示形式。这一章里也会介绍一些逆向工程师用来动态分析app和运行在Android操作系统上原生组件的新奇的方法。
第7章“网络安全”帮助读者深入研究一些app开发者能用来保护他们通过网络传输数据的实用方法。使用这些技术,你可以在安全套接字层(Secure Sockets Layer,SSL)通信中添加更有效的验证。
第8章“原生代码中漏洞的利用与分析”专门用来讨论关于Android平台上原生可执行程序的安全评估和测试技术。读者将会学到怎样去寻找能用于root手机和在Android系统中提权的安全漏洞——那些能用来对原生服务进行包括内存溢出攻击和利用竞争条件漏洞在内的底层攻击的漏洞。
第9章“加密与在开发时使用设备管理策略”将专注于如何正确地使用加密技术和避免一些常见的错误做法,以保护你的app中数据的安全。这一章中将给你使用几个健壮的,帮助你节省开发时间的第三方库,来快速且安全地加固你的app的安全性的建议。为了使讨论内容完整,我们还将介绍如何使用Android设备管理API,来实现和强制执行企业安全策略。
阅读本书时所需的软件
虽然,在阅读本书时需要使用一些软件,但是在本书的许多实验里,在真正下载和用这些软件做实验之前,都讨论了下载和安装它们的方法。
话虽如此,但在开始做实验之前,你可能还是最好先准备好下列软件:
The Android Software Development Kit (SDK);
The Android Native Development Kit (NDK);
GNU C/C++ 编译器(GCC);
GNU 调试器(GDB);
Python,最好是2.7,3.0可能有时会无法正常工作;
Virtual box;
Ettercap (for Windows版的或Linux/UNIX版的);
Dex2Jar;
Objdump;
Radamsa;
JD-GUI;
The Java Development Kit (JDK);
drozer,一个Android 安全评估框架;
OpenSSL命令行工具;
keytool命令行工具。
这本书是写给谁的
本书中有些章节是专门用来讨论如何利用Android app中漏洞的,而另一些章节则讨论如何加固它们。本书的目标是:同时展示硬币的两面——攻击和防御。
安全研究人员,分析师和渗透测试人员会喜欢如何利用Android app中漏洞的部分。而想要学习更多安全方面知识的app开发者,将会从保护app免受攻击危害的部分中获得切实可行的建议。
字体风格约定
在这本书中,你会看到一些不同排版风格的文字——这些不同的排版风格是用来区分各类不同的信息的。下面是一些排版风格的样例及对其所表示的意思的解释。
文字中的“代码字体”的部分,表示数据库中表的名字、目录名、文件名、文件扩展名、路径、URL和用户的输入。比如:“上一步中你选中的系统镜像的ID可以用-t参数来指定”。
代码块是像下面这样表示的:
fromdrozer import android
fromdrozer.modules import common Module
classAttackSurface(Modulecommon.Filters common.PackageManager):
如果我们希望你注意代码块中的某些部分,那么相关的行或语句就会被加粗:
fromdrozer import android
fromdrozer.modules import common Module
classAttackSurface(Modulecommon.Filters common.PackageManager):
命令行窗口中的输入或输出,则被表示成这样:
sudo aptitude update //如果你已经装好了aptitude
第一次出现的术语和重要的单词会被加粗。在正文中,你会在屏幕上,菜单栏或对话框中看见的文字,也会像这样出现:“当你同意了用户许可协议之后,你可以单击“安装”按钮,收集你的文档和API”。
警告或重要的提示会出现在这样的地方。
小窍门或小技巧会这样显示。
读者反馈
我们总是欢迎你——亲爱的读者提出宝贵的意见。请让我们知道你对本书的看法——无论你喜欢还是不喜欢。反馈意见对我们今后出版你真正最需要的东西是非常重要的。
如果只是一般的意见,请送电子邮件,并在主题中注明书名即可。
如果你对某个主题特别有研究,或者你有兴趣写一本书或投稿,请移步我们的作者指南页面。
售后服务
你现在已经是尊贵的Packt book的客户了。我们愿意为你的购买提供全面的服务,使你获得更多东西。