即时通讯安全篇(四):实例分析 Android 中密钥硬编码的风险

1、前言
经常发现有开发者将密钥硬编码在 Java 代码、文件中,这样做会引起很大风险。
信息安全的基础在于密码学,而常用的密码学算法都是公开的,加密内容的保密依靠的是密钥的保密,密钥如果泄露,对于对称密码算法,根据用到的密钥算法和加密后的密文,很容易得到加密前的明文;对于非对称密码算法或者签名算法,根据密钥和要加密的明文,很容易获得计算出签名值,从而伪造签名。
密钥硬编码在代码中,而根据密钥的用途不同,这导致了不同的安全风险,有的导致加密数据被破解,数据不再保密,有的导致和服务器通信的加签被破解,引发各种血案,本文主要借用乌云上已公布的几个 APP 漏洞来讲讲这其中的潜在风险和危害。
2、风险案例(一):某互联网金融 APP 加密算法被破解导致敏感信息泄露
某 P2P 应用客户端,用来加密数据的 DES 算法的密钥硬编码在 Java 代码中,而 DES 算法是对称密码算法,既加密密钥和解密密钥相同。
反编译 APP,发现 DES 算法:
发现 DES 算法的密钥,硬编码为“yrdAppKe”,用来加密手势密码:
将手势密码用 DES 加密后存放在本地 LocusPassWordView.xml 文件中:
知道了密文和加密算法以及密钥,通过解密操作,可以从文件中恢复出原始的手势密码。或者使用新的生成新的手势密码,而与服务器通信时接口中的 Jason 字段也用了 DES 算法和密钥硬编码为“yRdappKY”:
和服务器通信采用 http 传输,没有使用 https 来加密通信,如果采用中间人攻击或者路由器镜像,获得流量数据,可以破解出用户的通信内容。
3、风险案例(二):某租车 APP 加密算法被破解导致一些列风险
某租车 APP 与服务器通信的接口采用 http 传输数据,并且有对传输的部分参数进行了加密,加密算法采用 AES,但是密钥硬编码在 java 代码中为“shenzhoucar123123”,可被逆向分析出来,导致伪造请求,结合服务器端的漏洞,引起越权访问的风险,如越权查看其它用户的订单等。
和服务器通信时的数据为:
q 字段是加密后的内容。逆向 APP,从登录 Activity 入手:
分析登录流程:
v1 是用户名,v2 是密码,v3 是 PushId,在用户名和密码不为空并且长度不小于 11 情况下,执行 LoginOperate 相关操作,追踪 LoginOperate 的实现,发现继承自 BaseOperate,继续追踪 BaseOperate 的实现。
在 BaseOperate 的 initUrl()方法中,找到了 APP 是怎么生成请求数据的:
继续追踪上图中的 initJsonUrl()方法,发现其调用了 AES 加密:
继续追踪 aes.onEncrypt()函数:
在 onEncrypt()函数中调用了 encrypt()函数用来加密数据,追踪 encrypt()函数的实现:
发现其使用 AES 算法,并且密钥硬编码在 java 代码中为“shenzhoucar123123”。
构造{“id”:”11468061”}的请求:
到现在请求中的数据加密如何实现的就清晰了,另外由于服务器权限控制不严,就可以构造订单 id 的请求,达到越权访问到其他用户的订单。
其中 uid 设置为你自己的 uid 即可,可以成功看到其他人的订单:
攻击者完全可以做到使用其他脚本重新实现相同的加密功能并拼接出各个接口请求,批量的刷取订单信息和用户其他信息。
4、风险案例(三):某酒店 APP 加签算法被破解导致一系列风险
某酒店 APP 和服务器通信时接口采用 http 通信,数据进行了加密,并且对传输参数进行签名,在服务器端校验签名,以检查传输的数据是否被篡改,但是加签算法和密钥被逆向分析,可导致加签机制失效,攻击者可任意伪造请求包,若结合服务器端的权限控制有漏洞,则可引发越权风险等。
APP 和服务器通信的原始包如下图,可以看到有加签字段 sign:
逆向 APP 定位到加密算法的逻辑代码,com.htinns.biz.HttpUtils.class,其实现逻辑为:
原始数据是 unSignData,使用 RC4 算法加密,密钥为 KEY 变量所代表的值,加密后的数据为 signData,传输的数据时的 data 字段为 signData。 加签字段 signd 的生成方法是用 unsignData 拼接时间戳 time 和 resultkey,然后做 md5,再进行 base64 编码。时间戳保证了每次请求包都不一样。 sendSign()算法是用 c 或 c++写的,放入了 so 库,其他重要算法都是用 java 写的。
可以使用 IDA 逆向分析 so 库,找到 sendSign()方法:
而乌云漏洞提交者采用的是分析 sign 和 getSign(sign)的数据,做一个算法破解字典。其实还有种方法直接调用此 so 库,来生成字典。签名破解以后,就可以构造发送给服务器的数据包进行其他方面的安全测试,比如越权、重置密码等。
5、总结及建议
通过以上案例,并总结下自己平时发现密钥硬编码的主要形式有:
1)密钥直接明文存在 sharedprefs 文件中,这是最不安全的。
2)密钥直接硬编码在 Java 代码中,这很不安全,dex 文件很容易被逆向成 java 代码。
3)将密钥分成不同的几段,有的存储在文件中、有的存储在代码中,最后将他们拼接起来,可以将整个操作写的很复杂,这因为还是在 java 层,逆向者只要花点时间,也很容易被逆向。
4)用 ndk 开发,将密钥放在 so 文件,加密解密操作都在 so 文件里,这从一定程度上提高了的安全性,挡住了一些逆向者,但是有经验的逆向者还是会使用 IDA 破解的。
5)在 so 文件中不存储密钥,so 文件中对密钥进行加解密操作,将密钥加密后的密钥命名为其他普通文件,存放在 assets 目录下或者其他目录下,接着在 so 文件里面添加无关代码(花指令),虽然可以增加静态分析难度,但是可以使用动态调式的方法,追踪加密解密函数,也可以查找到密钥内容。
保证密钥的安全确是件难事,涉及到密钥分发,存储,失效回收,APP 防反编译和防调试,还有风险评估。可以说在设备上安全存储密钥这个基本无解,只能选择增大攻击者的逆向成本,让攻击者知难而退。而要是普通开发者的话,做妥善保护密钥这些事情这需要耗费很大的心血。(本文已同步发布于:http://www.52im.net/thread-312-1-1.html)
产品设计者或者开发者要明白自己的密钥是做什么用的,重要程度怎么样,密钥被逆向出来会造成什么风险,通过评估 APP 应用的重要程度来选择相应的技术方案。
6、参考资料
[1] https://www.zhihu.com/question/35136485/answer/84491440
[2] 传输层安全协议 SSL/TLS 的 Java 平台实现简介和 Demo 演示》
[3] 理论联系实际:一套典型的 IM 通信协议设计详解(含安全层设计)》
[4] 微信新一代通信安全解决方案:基于 TLS1.3 的 MMTLS 详解》
[5] 来自阿里 OpenIM:打造安全可靠即时通讯服务的技术实践分享》
[6] 简述实时音视频聊天中端到端加密(E2EE)的工作原理》
[7] 移动端安全通信的利器——端到端加密(E2EE)技术详解》
[8] Web 端即时通讯安全:跨站点 WebSocket 劫持漏洞详解(含示例代码)》
[9] 通俗易懂:一篇掌握即时通讯的消息传输安全原理》
[10] IM 开发基础知识补课(四):正确理解 HTTP 短连接中的 Cookie、Session 和 Token》
[11] 快速读懂量子通信、量子加密技术》
[12] 一分钟理解 HTTPS 到底解决了什么问题》
[13] 一篇读懂 HTTPS:加密原理、安全逻辑、数字证书等》
[14] 基于 Netty 的 IM 聊天加密技术学习:一文理清常见的加密概念、术语等》
[15] 手把手教你为基于 Netty 的 IM 生成自签名 SSL/TLS 证书》
[16] 微信技术分享:揭秘微信后台安全特征数据仓库的架构设计》
[17] 即时通讯初学者必知必会的 20 个网络编程和通信安全知识点》
[18] 零基础 IM 开发入门(五):什么是 IM 系统的端到端加密?》
7、IM 安全系列文章
本文是 IM 通讯安全知识系列文章中的第 3 篇,总目录如下:
《即时通讯安全篇(一):正确地理解和使用 Android 端加密算法》
《即时通讯安全篇(二):探讨组合加密算法在 IM 中的应用》
《即时通讯安全篇(三):常用加解密算法与通讯安全讲解》
《即时通讯安全篇(四):实例分析 Android 中密钥硬编码的风险》(☜ 本文)
《即时通讯安全篇(五):对称加密技术在 Android 上的应用实践》
《即时通讯安全篇(六):非对称加密技术的原理与应用实践》
《即时通讯安全篇(七):用 JWT 技术解决 IM 系统 Socket 长连接的身份认证痛点》
《即时通讯安全篇(八):如果这样来理解 HTTPS 原理,一篇就够了》
《即时通讯安全篇(九):你知道,HTTPS 用的是对称加密还是非对称加密?》
《即时通讯安全篇(十):为什么要用 HTTPS?深入浅出,探密短连接的安全性》
《即时通讯安全篇(十一):IM 聊天系统安全手段之通信连接层加密技术》
《即时通讯安全篇(十二):IM 聊天系统安全手段之传输内容端到端加密技术》
《即时通讯安全篇(十三):信创必学,一文读懂什么是国密算法》
《即时通讯安全篇(十四):网络端口的安全防护技术实践》
《即时通讯安全篇(十五):详解硬编码密码的泄漏风险及其扫描原理和工具》







评论