安卓 HackingPart 16:脆弱的加密
背景介绍
本文介绍Android应用开发中一些脆弱的加密方式,程序员希望通过加密来提升程序的安全性性,但却缺乏专业的密码学背景知识,使得应用对数据的保护非常薄弱。本文会介绍可能出现在Android应用中的一些脆弱的加密方式,以及对应的攻击方法。
造成脆弱加密的主要原因
Android应用中造成弱加密的原因多种多样,OWASP Mobile Top 10 Projects 中提及了其中主要的两原因:
使用了脆弱的加密算法
使用了强健的加密算法,但加密的实现存在漏洞。
使用弱密码算法实现加解密
我们先来看看如果如果一个应用使用弱加密算法会遭受怎样的攻击。
例如使用MD5作为Hash算法,MD5已经认为不安全了。如果应用使用了MD5这样的脆弱算法,而攻击者又能读取到Hash,攻击者就有相当大的机会能破解加密。假设应用使用MD5生成了这样一段Hash:
9a618248b64db62d15b300a07b00580b
攻击者可以使用john之类的工具或在线的彩虹表破解服务:
如上图,hash被成功破解。
除此之外,有的开发者也会使用编码来保护敏感信息。编码不是加密,可以很容易就解码还原出明文。例如我们在反编译了一个应用之后发现了如下的一段Base64编码字符:
c3VwZXJzZWNyZXQ=
找一个提供在线base64解码的网站就能还原出明文:
强密码算法的不安全实现
另一种情况是使用了较强的加密,但使用方法不够安全,例如使用了AES这样的对称加密算法,尽管该算法足够强壮,但当其实现不当的时候也一样容易受到攻击。例如对AES来说,秘钥管理就是一个巨大的挑战。下一节中我们就会看到攻击者如何利用糟糕的秘钥管理进行攻击。
实例:SQLCipher Library的误用
Android应用以多种方式存储数据,使用内置的SQLite库进行数据的存储和管理非常普遍。
本例中,我们使用SQLCipher 库来加密数据库。
从黑盒测试的角度,要解密应用数据库,数据文件地址和其加密方式等信息是必须的。
环境准备:
1、一台运行Ubuntu的主机
2、SQLCipher 命令行工具-可以在以下地址中下载到:
https://www.zetetic.net/sqlcipher/open-source/
3、安装好AndroidSDK
4、Dex2jar 和jd-gui ,可以在以下地址中下到:
https://code.google.com/p/dex2jar/
下载APK文件,在模拟器中运行,应用会自动创建加密的数据库:
(下载链接)
检查SQLite数据库-通常用的方式
我们先看看我们能不能查看模拟器中的数据内容,先将数据库下载到本地:
adb pull /data/data/[packagename]/databases/filename.db
使用SQLite3命令查看数据库表名:
如图,报错说文件被加密了,现在我们需要加密算法使用的秘钥来解密文件。
从应用的代码中找出加密的详细过程
首先需要知道整个加密的过程,我们可以使用dex2jar和JD-GUI来反编译java代码。
解压apk文件
Android应用以apk文件格式发布,该文件可以直接使用unzip解压出其中的内容。
unzip SecureSQLite.apk
该命令会在当前目录下解压出apk文件中的内容。
其中的“classes.dex”就是我们要的文件。
反编译
“classes.dex”文件中保护了应用的代码,该文件被编译成了Android的二进制格式,我们首先要将其装换为jar文件,可以使用dex2jar:
dex2jar classes.dex –o classes.jar
该命令会在同一目录下创建一个classes.jar文件。
我们可以进一步使用JD-GUI这样的工具反编译出java代码
查看代码
简单查看下代码就能知道数据库使用了何种加密:
如上图,代码中引入了一个第三方库:“sqlcipher”来对数据库进行加密,应用的包名为包名为”com.androidpentesting.secreqlite”。
尽管不是很常见,有些加密用的秘钥能直接在代码中找到。
如上图,代码中使用”password”作为秘钥。
注:由于是实例程序,所以我们插入到数据库中的数据也是硬编码到代码中的。
解密数据库
解密数据库可以使用同名的Unix/Linux命令行工具:”SQLCipher Core Command Line”。
下载地址:http://sqlcipher.net/open-source/
选择并解压后,会产生一个名为sqlcipher的文件夹。
在终端中打开该目录,并按照文章中的方法编译:
http://sqlcipher.net/introduction/
该工具的用法:http://sqlcipher.net/sqlcipher-api/
比如解密数据库”secure.db”的命令如下:
首先使用sqlcipher工具打开数据库,然后设置我们刚才在代码中找到的秘钥:
PRAGMA key = ‘password’;
现在就可以向普通数据库一样对其进行访问了。
我们也能导出未加密的数据库。
最后,使用”.exit”命令退出。
扩展
使用自定义的加密算法也会造成应用易受到攻击。
本文介绍了Android应用中脆弱的加密方式如何被攻破,对此加密算法的秘钥管理很重要,所以最好不要在代码中硬编码秘钥,如果真的需要使用对称加密,基于密码的加密可能更合适,应为秘钥需要基于用户输入的密码生成。
相关阅读
https://www.owasp.org/index.php/Mobile_Top_10_2014
https://www.zetetic.net/sqlcipher/
目录
安卓Hacking Part 2: Content Provider攻防(连载)
安卓Hacking Part 3:Broadcast Receivers攻防(连载)
安卓Hacking Part 4:非预期的信息泄露(边信道信息泄露)
安卓Hacking:Part 5:使用JDB调试Java应用
安卓hacking Part9: 不安全的本地存储:Shared Preferences
安卓Hacking Part 11:使用Introspy进行黑盒测试
安卓Hacking Part 12: 使用第三方库加固Shared Preferences
安卓Hacking Part 13:使用Drozer进行安全测试
安卓Hacking Part 14:在没有root的设备上检测并导出app特定的数据
安卓hacking Part 15: 使用备份技术黑掉安卓应用
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:http://resources.infosecinstitute.com/android-hacking-security-part-16-broken-cryptography/