漏洞挖掘—APP应用
Last updated
Last updated
APP应用比浏览器有更好的交互体验,比PC端应用更加便捷,作为IOT设备控制手段愈发流行。APP为IOT生态提供了丰富的接口和灵活的交互,许多传统设备厂商也逐步从web管理投入APP应用的怀抱。与此同时,更多接口带来更多风险,代码重新实现也带来更多漏洞隐患。
手机也是智能设备,当然也属IOT网络重要环节,但由于手机(APP)安全已自成体系且资料全面,所以不作为本文侧重点。本篇旨在从APP在IOT网络中所处角色出发,阐述可能存在的漏洞点,并给出一些加固建议,最后梳理研究大致流程,推荐几款研究工具。
首先来看移动APP在IOT网络的中可能承担的角色, 这是一个比较简单的模型,其中设备、APP和云端服务组成一个三角,APP的角色有:
和设备通信,控制设备行为、向设备读写数据和升级操作等。
和服务端通信,与云端同步(读写)数据、指令和获取升级等操作。
从APP在网络中的位置出发,可以预见从其出发可能找到的漏洞点,即
(1) APP本身存在漏洞,比如本地数据读写等;
(2) APP与设备(云端)通信漏洞,比如弱加密,甚至未加密,认证逻辑等;
(3) APP与设备通信触发设备漏洞,比如越权,内存破坏,拒绝服务等。
其中(2)和(3)的主要区别在于,(2)是APP和设备双向漏洞,即通信和协议问题,(3)可能只有设备存在漏洞,而APP作为一个漏洞发掘的突破口,两者的研究方法有所差异,下文将逐一介绍。
从APP安装运行环境出发,其与本地接口的交互和对本地数据的读写是重要的漏洞挖掘点。
有些APP会存储一些诸如用户名、认证token等个人敏感信息,以便后续调用,如果这些信息未加密存储则有信息暴露风险;有些APP还会存储设备日志和调试未加密信息,这些信息往往成为漏洞挖掘的重要依据。比如在某智能门锁APP中就存在此类数据泄露问题:
数据库信息泄漏
该门锁Andriod APP在/data/data/com.belwith.hickorysmart/databases
目录下存储SQLite的未加密数据信息,这些都是用户远程控制门锁设备的关键信息,在退出重启APP后,这些信息任然存在:
在该门锁iOS APP中同样存在类似问题,目录/private/var/mobile/Containers/Data/Application/3CAC91D1-872C-4F96-9460-A93F770AC42D/Library/Caches/com.belwith.HickorySmart
下存在未加密远程开锁信息:
调试信息泄漏
该门锁Andriod APP在HickorySmartLog/Logs/SRDeviceLog.txt
的调试日志中明文存储所有以蓝牙方式进行的联网的API服务和门锁连接记录。该日志文件存于SD卡中,无需高权限就可任意访问:
通过该日志内容果然发现了API访问控制漏洞,即可用其它用户身份来控制门锁,和之前特斯拉“串车”事件类似。
通信问题比较常规,也容易发现,一般就是加密认证存在缺陷。
通信未加密
IOT设备的运算性能普遍不高,一些厂商为性能和成本考虑在通信中使用弱加密甚至直接明文通信,造成了很大的安全隐患。
认证逻辑错误
一些APP存在认证逻辑缺陷或采用弱身份认证时,攻击者极易获取其认证信息,截取通话内容,可伪造终端同服务端对话,或伪造服务端同终端/移动端通信。同时,缺乏防爆破手段和找回(重置)密码等存在缺陷的问题也时常出现。
APP是设备的控制手段和重要接口,通过澄清通信协议可模拟APP与设备交互,发现一些其他接口无法挖掘的漏洞。
比如某智能门铃,通过抓包发现APP与设备采用HTTP明文通信,首先未加密就有安全隐患,这里还存在鉴权问题。 通过设备序列号直接获取设备信息,不需要之前的cookie:
request
response
无需认证直接可以更新门铃声音:
request
response
无需认证直接查看图像:
http://britain.oss-eu-west-1.aliyuncs.com/EKDB_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/2020xxxxxxxxxx.jpg
有些设备需要通过APP升级,比如APP联网下载固件,再通过蓝牙等协议传输给设备。如果APP未对升级包安全校验就会存在固件被篡改的风险。
通过APP端的数据构造和变异可以挖掘一些设备内存破坏漏洞,在NDSS 2018的一篇论文 IOTFUZZER: Discovering Memory Corruptions in IoT Through App-based Fuzzing中,几位作者提出了一种新的名为IOTFuzzer模糊测试框架,就是从APP的角度出发,以寻找IOT设备中的内存破坏漏洞,可惜的是IOTFuzzer并没有开源,笔者至今也未找到相关工具。
论文作者通过fuzz APP测试的一些设备:
从开发源头开始每个环节都把好安全是治标又治本的方法,在代码编写时应注意数据存储、防注入、防逻辑漏洞、通信加密等问题。奈何理想很丰满,现实很骨感。虽然安全开发慢慢提上日程,但代码bug在所难免,所以从防“讨厌”的安全研究者出发,为提高门槛,对APP做一些混淆加密。加固的思路一般是静态反逆向,动态反调试。
由于IOS App Store有严格的审查机制,有时代码混淆无法通过,所以下面以Andriod为例,对加固作简单介绍。
代码混淆
代码混淆是通过对源代码压缩、混淆、优化和预检等操作,提高代码阅读的难度。
程序加壳
程序加壳是对原始App中的dex文件加密,并外包一层壳,将App核心代码隐藏。
代码抽取
代码抽取是对dex文件中所有类及方法函数内容抽取、加密和隐藏,单独加密后存放在apk中特定文件内。
DVMP虚拟机
DVMP(dex virtual machine protect)使用全新的指令“语言”替代原有Andriod虚拟机的指令集,在程序类、方法保护上更近一部,实现指令集层面保护。
由于本篇主题侧重漏洞研究,所以并没有阐述加固细节和相关工具使用,下文介绍研究一般流程和相关工具。
漏洞研究方法基本类似,无非逆向、审计、调试、抓包分析和Fuzz等,从APP角度亦然,一般从数据、认证、交互和通信几个方面寻找漏洞点。
(1) 逆向分析获得APP代码,梳理APP大致功能,此时可以对APP做一些常规测试;
(2) 抓取通信数据,看是否加密,认证过程是否有完备,找回重置功能是否有逻辑问题,模拟APP通信数据与设备(云)交互,通过重放找寻一些通信中的缺陷;
(3) 利用测试工具或APP端Fuzz变异数据,寻找设备端的一些内存破坏漏洞。、
上文简介了加固方法,回到研究者角度,自然需要和这些保护机制作对抗,实际上破解保护已经成为APP逆向的主要任务,可以借助JEB、Jadx等工具,这里就不详细展开。
JEB反混淆效果
Jadx反混淆效果
IDA、Ghdria和JEB之类的常规工具就不提了,下面给出一些常用工具。
frida是一个轻量级别的hook框架和代码插桩工具,Andriod和iOS研究必备。
honggfuzz
Google fuzz框架,之前介绍过,在二进制和协议测试都很有效。
Andriod ART环境下基于主动调用的自动化脱壳方案
Andriod反混淆工具
基于frida开发,逆向必备,可以很容易看到第三方应用的各类信息。
Android加壳工具,当外壳运行的时侯,把真正的程序解密出来,动态加载到系统中。
本文是IOT漏洞研究系列的最后一篇,主要从APP应用角度分析一些IOT网络中可能存在的漏洞风险,由于侧重设备,对于一些常见的APP漏洞点,比如Andriod webview等并没有涉及。如果之前是(移动)软件漏洞研究人员,不太熟悉IOT硬件固件,从化归思维出发,设备APP会是一个很好的切入点。