本文主要围绕APP安全测试从哪些方面开展、APP安全测试实践、APP安全测试难点,以及对行业未来发展的展望,这四部分展开。
一、APP安全测试从哪些方面开展
APP的安全是非常重要的,关系到APP是否能够正常上线,能否长久地运营。APP安全测试可以通过一些工具或方法挖掘出APP的安全漏洞,在上线前或上线的过程中将这些漏洞反馈给研发人员,针对漏洞进行修复和调整。APP安全测试的重要性有很多,我们从安全合规、客户端安全和敏感信息安全分别展开介绍一下。
1、安全合规
这两年相信大家对“安全合规”越来越熟悉,网信办和各地网安对APP的安全合规管控也越来越严格。在APP上线之前都会进行一些相关的合规检测,这些部门几乎都是通过采购一些第三方的合规检测工具来进行检测。如果我们的APP被检测到有不合规的情况,应用就会面临整改、通报甚至下架的风险。这对整个业务线来说是一个致命的打击。
所以安全合规这一点在APP安全测试方面是首要的一点。我们的测试也要围绕网信办颁布的相关法律法规以及行业规范,从个人信息收集、权限使用场景、隐私政策等多个维度进行安全合规检测。在检测的过程中,我们要结合动态检测和静态检测,以验证我们的应用是否合规。
2、客户端安全
客户端是整个应用的核心,是业务线的具体实现。这部分涉及到的点很多,最主要的有:代码方面的安全,路径方面的安全,文件存储方面的安全,以及网络通信交互方面的安全。
3、敏感信息安全
应用中有没有对敏感词进行过滤,APP中是否存在一些弱口令、明文数据,敏感文件是不是明文存储等。如果不对这些敏感信息进行处理,那就意味着整个业务线都将暴漏在风险中。
以上是APP安全测试比较重要的几个点,一定要将这几个点关联起来,去做更完整的测试,才能更好地保障应用的安全。针对安全测试,现在很多第三方厂商都提供了一些漏洞扫描和安全相关的工具,安全测试工程师是否有必要去深入研究,这是一个很值得探讨的问题,在这里我们就不展开了。
二、APP安全测试实践
APP安全测试实践这部分也是围绕我们前面讲的安全合规、客户端安全和敏感信息安全这三部分进行展开。
1、安全合规
在安全合规方面总结下来,比较重要的主要有以下三类:
1)隐私政策未明确收集信息
在APP中用户信息的收集是否和隐私政策同步,明确信息收集的范围和目的。
我们现在的APP中都会关联隐私政策,这个是合规性的要求。在测试的过程中,需要明确APP收集了哪些信息,测试验证这些信息在隐私政策中是否同步,是否有明确的收集目的。
2)强制过度频繁索取权限
App安装和运行时,向用户索取与当前服务场景无关的权限;在用户明确拒绝权限申请后,频繁弹窗、反复申请与当前服务场景无关权限的行为;未及时明确告知用户索取权限的目的和用途。
3)sdk中是否存在违法收集信息
在APP中集成的第三方sdk是否有收集用户信息,是否有在隐私政策明确收集的范围和目的。现在APP中都会集成非常多的SDK,这些SDK很多时候都会成为合规性问题的定时炸弹。
我们需要明确这些安全合规的要求,才能针对这些合规性政策进行安全测试。接下来我们就一起看一下,这几个合规性测试有哪些可以进行验证的点。
1)安装APP,手动验证测试拒绝给予app权限,是否存在不提示直接使用或频繁弹窗申请权限。
如果拒绝给予权限后,APP直接使用权限或频繁弹窗,就需要我们记录下来,将问题反馈给研发人员进行修复。
2)反编译在AndroidManifest.xml文件中查看申请的权限和获取的敏感信息是否有和隐私政策同步。
验证权限和弹窗触发场景,我们需要掌握APP申请了哪些权限,在测试的时候可以针对APK进行反编译,在 AndroidManifest.xml 文件中存储的都是权限的申请信息和相关隐私政策的一些信息。我们在测试的时候就需要对这些权限信息进行过滤和排查,是否用到了一些 audio 权限。如果有 audio 权限,我们需要特别注意,这些权限的使用是否符合合规性要求。是否收集了一些电话等个人信息,是否有频繁的获取,这些都是需要我们特别注意的,需要进行验证和确认。
3)第三方共享清单和app中的sdk的收集信息是否合理。
前面我们一起看了反编译的AndroidManifest.xml 文件,怎么确认我们使用的SDK里面是否同步。现在应用里面都要求将第三方共享清单列出来,我们可以将第三方共享清单和反编译后的文件一一对应,进行验证,看是否有遗漏和错误。
2、 APP客户端安全
接下来我们一起看一下客户端的安全测试。针对客户端测试,我主要为大家罗列了三个方向:客户端完整性测试、通信数据安全和四大组件安全。其实整个客户端的测试远远不止这三个方向,这里只是为大家罗列了最具代表性的三个。
1)客户端完整性测试
客户端的测试主要是对客户端进行动态和静态的检测。静态测试需要对客户端进行反编译。我们在测试的时候通常会借助一些自动化测试工具,手动测的话工作量是非常大的。
(1)用apktool或androidkiller 等反编译工具将apk进行反编译,简单做点修改然后重新打包签名,安装验证是否正常使用。
我们通过反编译工具对APK进行反编译,重新打包,对里面的文件进行一些修改,对里面的文件进行修改,然后重新打包,安装后使用,确认一下是否有对完整性的校验。修改后如果还能正常使用,就说明没有做过完整性的校验。我们做安全测试的时候,职责是出报告,反馈给研发人员修复,而不是直接去修复。
(2)用查壳工具查看apk是否采用第三方加固保护或反编译查看代码保护。
客户端的安全性跟合规性的关联性是非常强的,这一点也是合规性相关的。合规性有要求APK需要做加固保护和代码保护。我们可以通过一些查壳工具查看apk是否采用第三方加固保护,或使用反编译工具查看代码保护。
市面上常见的一些加固产品都会在apk里打上属于自己的标识,可以通过通用的SO文件去做识别。如果采用的是自研的方式进行加固,我们可以通过IDA的方式进行查验,查验代码中是否做了一些混淆相关的操作,这块后面会给大家进一步展示。
添加图片注释,不超过 140 字(可选)
(3)测试资源文件将其破坏,验证是否有完整性校验。
完整性校验就是验证一下代码是否有做相关的保护。下图是一个dex文件的反编译工具,它可以很直观地将apk中的dex文件直接转化为Java代码,方便我们查验是否有做相关的保护。
下图我们可以看到左侧一栏的类别都已经变成无意义的了,这就说明它做了混淆相关的操作。
上图是Java部分的代码,接下来我们说一下SO部分的代码。我们的sdk里面的核心代码大部分是SO代码,也就是C/C++代码。这部分的核心点是我们需要验证一下代码是否有做相关的保护。从下图可以看到,这里面的函数都做了混淆和打乱,里面的名称也都是乱的,这就说明它是做了保护的。
这里我用的是IDA工具,是一个逆向和反逆向时会用到的工具,在客户端的安全测试中,这是一个必不可少的工具。
2)通信数据
通信数据方面的测试在测试之前,我们需要知道黑客破解和攻击的手法,通过模拟黑客的方式去测试。
(1)通过利用代理模式进行做数据包抓取,分析数据包是否有采取加密手段进行保护。
比如通信数据包里面是不是明文,里面的数据是不是有完整性相关的一些校验,是否有一些反抓包相关的操作。这些都需要我们借助工具对功能进行解析,去进行验证。
(2)用抓包工具(charles)验证数据的合法性,伪造假数据包和服务端通信是否正常。
比如说我们可以构建一些非法数据向服务器发送,看是否能够和服务端实现正常的通信。如何构建数据包在网上也有很多成熟的方案,这里我们就不展开讲了。
针对抓包工具市面上也非常的多,这里我给大家列举的是charles,这款工具是我们用得比较多的。
3)四大组件
android的四大组件:Activity、Service、ContentProvider、Broadcas。
对于APP安全测试而言,主要是这四大组件是否会被外部恶意调用,带来一些越权的行为,从而造成一些安全问题。这方面需要我们借助一些自动化的工具去挖掘。
可以直接通过将apk拖进jadx工具或androidkiller中查看AndroidManifest.xml文件。
对组件进行分析我们常用的工具有frida,里面可以集成objection插件,这个插件可以快速地做应用安全分析。objection插件是基于frida的,需要两者结合去应用。
还有一个经常用到的工具是xposed,在做安全分析的时候会经常用到。
MobSF也是一个会经常用到的非常强大的工具,它是一个移动应用自动化测试框架。它可以结合静态分析和动态分析,可以全面分析出APP中是否有漏洞、恶意行为。
再给大家推荐一个工具drozer,做安全测试会经常用到,这个工具是针对系统的安全测试框架,主要测试一些共享方面的安全漏洞,比如远程攻击、渗透等相关方面。
这些工具可以在安全测试的过程中为我们减少很多工作量,提高我们的工作效率。
3、敏感数据安全
针对敏感数据这部分,我认为比较重要的有三点:敏感数据明文硬编码、敏感词是否过滤,敏感数据本地明文存储以及调试信息Logcat明文展示。
敏感数据明文硬编码、敏感词是否过滤,这个需要结合反编译,快速搜索是不是有以上相关的内容。
敏感数据本地明文存储,在实际的测试中,我们需要分析一下在运行的过程中是否会往某个目录下释放文件等相关操作。这些数据是否是明文的,针对这些敏感数据是否有做相应的保护。
调试信息Logcat明文展示。研发人员在研发或上线的过程中,在关闭调试信息时,很容易会漏掉一些,存放和展示了一些敏感的数据,所以这部分也需要我们去测试的。
1)敏感词和敏感数据
通过利用GDA工具去分析dex文件中所有字符串信息,验证是否存在敏感词数据。
GDA工具能够快速展示dex文件中所有字符串信息,我们需要对这些字符串信息进行验证,检查是否有一些敏感词或敏感数据。我们在分析的过程中,也需要我们做一些标准,不断同步和更新敏感词库。如果没有及时更新敏感词库,会导致我们在分析的时候漏掉一些,这也是一个需要重视的问题点。
上面的示例是针对dex文件的,接下来我们一起看一下SO文件。跟前面讲的一样,我们可以利用ida反汇编工具去验证,查看下so代码中是否存在敏感信息或敏感词。如果没有做SO保护的话,这些敏感信息都是完全暴露的。
2)本地数据存储
/data/data/包名/文件下的配置文件中的敏感数据是否是明文的。
下面的截图是一个本地存储方面的示例,data文件下的一些配置文件在APK里面运行的时候,会释放一些文件,我们需要校验一下这些文件里面是否存储了一些未经保护的敏感数据。
/sdcard/android/data/包名/文件下的配置文件中的敏感数据是否是明文的。
sdcard路径下也是同理。
3)调试信息
利用SDK中自带的Android Device Monitor工具进行监控测试app运行过程中是否有输出敏感的调试信息。
APP运营的时候,通过这个工具可以输出全部的调试信息,我们只需要去分析过滤一下,这些调试信息里面是否有敏感词相关的信息。如果有就需要我们及时反馈做相关处理,这是我们调试信息验证的一个方式。
三、APP安全测试难点
前面为大家介绍了一些APP测试的实践,在本部分我们一起探讨一下APP安全测试的难点,主要从APP合规性、安全测试技术复杂化、漏洞复现难这三部分展开。
1、APP合规性
测试人员需时时跟进网信办发布的合规要求文件,避免在安全测试过程中漏掉个别合规性测试。
这部分是我们APP测试的一个难点,难在我们需要一直跟进网信办的一些政策和规定。这些政策和规定会不断地更新和调整,需要我们及时跟进,如果漏掉,会给APP带来很大的风险。
2、安全测试技术复杂化
安全测试越来越复杂化,不仅需要对APP进行安全测试,也需要关注第三方sdk的安全性问题,不仅需要静态测试,也需要动态测试和脱壳相关技术测试,这里面涉及到非常多的自动化测试框架。
随着对移动应用安全性的要求越来越高,我们对APP的测试也需要不断深入。有时候我们会做第三方的加固,加固后我们也需要做相关的测试,是否有做一些环境的检测,是否有模拟器,是否有反调试,强度怎么样,怎样能够实现快速脱壳这些都需要我们去深入了解。
3、漏洞复现难
APP在安全测试过程中由于漏洞复现成本高,无法保证完全的将漏洞复现。
我们作为测试人员其实都没有完全的把握能够把漏洞复现出来,有些漏洞的触发场景是很奇怪的,这方面也会给我们的工作带来一些挑战。
四、APP安全测试未来发展展望
1、 技术门槛
越来越多的安全测试工具的成熟和更新,会降低安全测试的技术门槛。
我们做安全测试主要还是基于一些自动化的测试工具,随着技术的快速更新和迭代,这些测试工具也会逐渐成熟,相对应地就会降低我们安全测试的技术门槛。比如我们把反调试和脱壳相关的工具集成起来,做自动化测试的时候就不需要我们写太多的代码和脚本。
2、测试平台
加固厂商的app自动化安全测试平台,不断迭代更新会大大降低安全测试成本。
现在有很多安全厂商都在做一些安全测试自动化平台,现在很多公司的加固也都是通过采购第三方厂商的产品来实现。随着这些平台的不断成熟和完善,我们也可以借助这些平台去降低我们测试的成本。