文章目录

  • 一. 基本信息
  • 1.1 应用权限
  • 1.2 应用行为
  • 1.3 第三方SDK
  • 1.4 恶意程序
  • 1.5 越权行为
  • 1.6 权限滥用风险
  • 1.7 资源文件包含APK
  • 二. 源文件安全
  • 2.1 应用完整性
  • 2.2 程序签名包
  • 2.3 Java代码加壳程度
  • 2.4 Java代码混淆
  • 2.5 SO文件加固
  • 2.6 H5文件加固
  • 2.7 Java层关键函数风险
  • 2.8 资源文件泄露风险
  • 2.9 单元测试配置
  • 三. 数据存储风险
  • 3.1 WebView明文存储密码
  • 3.2 数据库注入漏洞
  • 3.3 FFmpeg文件读取漏洞
  • 3.4 证书文件明文存储风险
  • 3.5 AES/DES加密算法不安全使用风险
  • 3.6 RSA加密算法不安全使用风险
  • 3.7 数据文件全局可读写风险
  • 3.8 数据越权备份风险
  • 3.9 日志数据泄露风险
  • 3.10 UEL硬编码风险
  • 3.11 密钥硬编码风险
  • 3.12 测试信息泄露风险
  • 3.13 SD卡数据泄露风险
  • 四. 安全防护能力检测
  • 4.1 从SD卡加载so漏洞
  • 4.2 ZipperDown漏洞
  • 4.3 下载任意APK漏洞
  • 4.4 Janus漏洞
  • 4.5 动态加载外部代码风险
  • 4.6 Java层代码动态调试风险
  • 4.7 C层代码动态调试风险
  • 4.8 动态注入攻击风险
  • 4.9 模拟器运行风险
  • 4.10 启动隐藏服务风险
  • 4.11 未使用编译器堆栈保护技术风险
  • 4.12 随机数不安全使用风险
  • 4.13 私有函数调用风险
  • 4.14 终端ROOT状态监测
  • 五. 内部数据交互风险检测
  • 5.1 Content Provider数据泄露风险
  • 5.2 拒绝服务攻击风险
  • 5.3 Intent隐式调用风险
  • 5.4 动态注册Receiver风险
  • 5.5 PendingIntent错误使用Intent风险
  • 六. 通信传输风险检测
  • 6.1 HTTPS未校验服务器主机名
  • 6.2 HTTPS允许任意服务器主机名漏洞
  • 6.3 HTTP传输通道风险
  • 6.4 SSL证书有效性风险
  • 6.5 联网环境检测
  • 6.6 启用VPN服务检测
  • 6.7 访问境外服务器风险
  • 七. 身份认证风险检测
  • 7.1 系统键盘使用风险
  • 7.2 截屏攻击风险
  • 7.3 使用调试证书发布应用风险
  • 八. 组件风险检测
  • 8.1 Activity最小化特权检测
  • 8.2 Service最小化特权检测
  • 8.3 Content Provider最小化特权检测
  • 8.4 Broadcast Receiver最小化特权检测
  • 8.5 WebView组件忽略SSL证书验证错误漏洞
  • 8.6 WebView远程代码执行漏洞
  • 8.7 WebView跨域访问漏洞
  • 8.8 未移除有风险的WebView系统隐藏接口漏洞
  • 8.9 WebView File域同源策略绕过漏洞
  • 8.10 Fragment注入攻击漏洞
  • 8.11 Intent Scheme URL攻击漏洞
  • 九. 内容风险
  • 9.1 敏感词汇
  • 9.2 敏感文本
  • 9.3 敏感图片


一. 基本信息

1.1 应用权限

1.2 应用行为

1.3 第三方SDK

1.4 恶意程序

1.5 越权行为

说明:应用中是否包含企业或者监管机构禁止的越权行为
描述:权限是一种安全机制,主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组件访问。Android通过在AndroidManifest.xml中增加权限来控制限制性功能的使用和组件访问。恶意应用利用已申请权限可以在未被授权的情况下读取、修改通讯录,拨打电话,发送地理位置,访问浏览器历史记录等。可能导致隐私数据泄露,钓鱼扣费等风险。企业或者监管机构从安全性考虑,禁止应用申请某些权限,采取最小权限的原则。
方案:删除AndroidMainfest.xml中企业或者监管机构禁止的权限。

1.6 权限滥用风险

说明:应用中是否存在权限滥用情况
描述:权限是一种安全机制,主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组件访问。Android通过在AndroidManifest.xml中增加权限来控制限制性功能的使用和组件访问。权限滥用是指应用权限开放过多、自定义权限限制不严格,导致攻击者利用应用权限可以使用某些特殊的功能,如拨打电话、访问摄像头、利用麦克风录音、编写并植入木马等。可能导致隐私数据泄露,钓鱼扣费等风险。

1.7 资源文件包含APK

说明:应用资源文件中是否包含APK
描述:应用的资源文件中包含的APK文件可能会携带恶意程序或造成其他不可预知的风险。

二. 源文件安全

2.1 应用完整性

说明:应用是否进行完整性验证保护
描述:应用完整性验证即验证APK中的文件是否被修改或者删除。对于未进行完整性验证的APP,攻击者可以通过反编译工具对APK反编译后,随意修改或删除APK中的资源文件、源码文件、配置文件等,二次打包成其他应用,导致大量盗版应用的出现,损害开发者的利益;还能添加恶意代码,实现应用钓鱼,窃取登录账号密码、支付密码等等。

2.2 程序签名包

说明:应用是否进行签名校验保护
描述:签名证书是验证APP开发者身份的关键标识,可用于判断APP是否是正版APP,是防止APP被二次打包的重要措施。开发者可利用签名证书有效降低APP的盗版率。未进行签名证书校验的APP,被反编译进行二次打包后,仍可以正常运行。可能导致APP被仿冒盗版,甚至可能被添加钓鱼代码、病毒代码、恶意代码,导致用户敏感信息泄露或者恶意攻击

2.3 Java代码加壳程度

说明:应用程序中Java代码是否加壳
描述:Java代码加壳即在Java代码外面包裹上另外一段代码,保护里面的Java代码不被非法修改或反编译。Java文件未进行加壳保护,可能面临被反编译的风险。攻击者通过baksmali/apktool/dex2jar等反编译工具得到应用程序的代码,导致代码逻辑泄露、重要数据加密代码逻辑泄露等
方案:建议使用专业应用安全加固方案,对APK包中的classes.dex文件进行保护,防止应用被反编译

2.4 Java代码混淆

说明:应用程序中Java代码是否进行过混淆
描述:由于Java代码容易被工具反编译,反编译后可用jd_gui工具查看到源码。如果Java代码未进行混淆,会导致应用源代码清晰的呈现在工具上,这样就暴露了客户端所有逻辑,比如与服务端的通讯方式、加解密算法、密钥等。攻击者可以利用这些信息窃取客户端的敏感数据,包括手机号、密码;绕过业务安全认证流程,直接篡改用户账号信息等

2.5 SO文件加固

说明:应用程序中的SO文件是否进行加固
描述:SO文件为APK中包含的动态链接库文件,Android利用NDK技术将C/C++语言实现的核心代码编译为SO库文件供Java层调用。SO文件被破解可能导致应用的核心功能代码和算法泄露。攻击者利用核心功能与算法可轻易抓取到客户端的敏感数据,并对其解密,导致用户的隐私泄露或直接财产损失

2.6 H5文件加固

说明:应用资源文件中的H5文件是否加固
描述:应用中如果存在明文存储的H5资源文件,则会泄露页面基本布局和一些重要的信息,如登录界面、支付界面等。攻击者可篡改H5资源文件,可能植入钓鱼页面或者恶意代码,导致用户账号、密码、支付密码等敏感信息泄露。更有甚者,通过H5代码暴露相关活动的业务逻辑,可能被黑产团队用来刷红包、薅羊毛等,造成经济损失

2.7 Java层关键函数风险

说明:应用中Java层关键函数是否通过C/C++实现进行保护
描述:应用未使用专业的安全加固方案进行保护,可能面临代码被反编译的风险,攻击者可以通过baksmali/apktool/dex2jar等反编译工具得到应用程序的代码。如果程序中的关键函数(例如:https证书相关或者加密解密相关的函数)没有通过C/C++语言实现,容易被他人破解获取源代码,分析出逻辑流程,导致程序被破解的风险

2.8 资源文件泄露风险

说明:应用中的资源文件是否存在被查看分析风险
描述:程序在未进行资源文件加密时,直接把APK解压缩或者反编译会造成APK 的资源文件被窃取、查看分析的风险
方案:使用专业的安全加固方案,对资源文件进行加密处理,保证文件在存储过程中为密文

2.9 单元测试配置

说明:应用是否存在单元测试配置
描述:应用Androidmainfest.xml文件保留有单元测试配置项或者源码中保留

三. 数据存储风险

3.1 WebView明文存储密码

说明:应用的WebView组件中是否使用明文保存用户名及密码
描述:WebView组件默认开启了密码保存功能,会提示用户是否保存密码,当用户选择保存在WebView中输入的用户名和密码,则会被明文保存到应用数据目录的databases/webview.db中。攻击者可能通过root的方式访问该应用的WebView数据库,从而窃取本地明文存储的用户名和密码

3.2 数据库注入漏洞

说明:应用是否存在数据库注入漏洞
描述:SQL注入攻击指通过构建特殊的输入作为SQL的查询参数传入应用程序,从而欺骗应用程序执行恶意的SQL命令。Android应用开发时,如果开发者使用拼接字符串形式构造的SQL语句去查询底层SQLite数据库时,则容易发生SQL注入。攻击者可以利用此漏洞攻击应用的本地数据库,导致存储的敏感数据信息被查询泄露,例如用户名、密码等,或者产生查询异常导致应用崩溃

3.3 FFmpeg文件读取漏洞

说明:应用中是否存在FFmpeg文件读取漏洞
描述:FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它提供了录制、转换以及流化音视频的完整解决方案。FFmpeg可以处理HLS(HTTPLiveStreaming)播放列表,而HLS播放列表可以引用外部文件。通过在AVI文件中添加自定义的包含本地文件引用的HLS播放列表,可以在文件播放过程中显示本地文件的内容。该漏洞可能导致服务器端以及应用内存储的个人身份信息、密码等重要敏感信息泄露

3.4 证书文件明文存储风险

说明:应用资源文件中的证书文件是否为明文存储
描述:应用中的证书文件被用来验证服务器的合法性,以及在与服务器通信的过程中对传输数据进行加密、解密,保证数据传输的保密性、完整性。证书文件明文存储可能导致如下风险:1. 攻击者可以篡改明文存储的公钥证书,进行中间人攻击,解密通过HTTPS协议传输的数据,窃取用户的账号、密码等敏感信息。2. 攻击者可以利用泄露的明文证书,批量向服务器发送数据请求,进行注册、刷单等操作,导致服务器相应异常或者损害开发者的利益等

3.5 AES/DES加密算法不安全使用风险

说明:应用中使用AES/DES加密算法时是否使用了不安全的加密模式
描述:AES/DES是Android程序中常用的两种对称加密算法,其工作模式有ECB、CBC、CFB和OFB。当其使用ECB或OFB工作模式时,加密数据可能被选择明文攻击CPA破解。加密方法失效可能造成客户端隐私数据泄露、加密文件破解、传输数据被获取、中间人攻击等后果,导致用户敏感信息被窃取

3.6 RSA加密算法不安全使用风险

说明:应用中是否存在RSA加密算法不安全使用情况
描述:RSA加密算法是一种非对称加密算法,是第一个既能用于数据加密也能用于数字签名的算法。当其密钥长度过短,通常认为长度小于512位时,就会存在较高的被破解风险;没有使用正确的工作模式和填充方式,将会存在重放攻击的风险。因RSA加密算法不安全使用造成的加密方法失效,可能造成客户端隐私数据泄露、加密文件破解、传输数据被获取、中间人攻击等后果,导致用户敏感信息被窃取

3.7 数据文件全局可读写风险

说明:应用是否存在数据文件全局可读写
描述:Android在使用SharedPreferences、文件和数据库存储数据时,可以指定文件的访问模式。MODE_PRIVATE表示该文件是私有文件,只能被应用本身读取;MODE_WORLD_READABLE表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE表示当前文件可以被其他应用写入。当文件的访问模式被设置为MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE时,导致数据文件被恶意读写,泄露文件中存储的关键配置信息、账户密码、身份信息等敏感信息。或者篡改存在的用户信息、诱导用户误操作等,导致应用无法运行

3.8 数据越权备份风险

说明:应用是否存在数据越权备份风险
描述:Android 2.1以上的系统可为APP提供应用程序数据的备份和恢复功能,该功能由AndroidMainfest.xml文件中的allowBackup 属性值控制,其默认值为true。当该属性没有显式设置为false时,攻击者可通过adb backup和adb restore对APP的应用数据进行备份和恢复,从而可能获取明文存储的用户敏感信息,如用户的密码、证件号、手机号、交易密码、身份令牌、服务器通信记录等。利用此类信息攻击者可伪造用户身份,盗取用户账户资产,或者直接对服务器发起攻击
方案:将AndroidMainfest.xml文件中的allowBackup属性值设置为false来关闭应用程序的备份和恢复功能;或者使用专业安全加固方案的本地数据保护功能,避免本地数据泄露

3.9 日志数据泄露风险

说明:应用是否存在日志数据泄露风险
描述:调试信息函数可能输出重要的调试信息,其中包含的信息可能导致用户信息泄露,泄露核心代码逻辑等,为发起攻击提供便利,例如:Activity的组件名;通信交互的日志;跟踪的变量值等

3.10 UEL硬编码风险

说明:应用代码中是否使用硬编码
描述:URL硬编码是指将URL地址信息以硬编码的方式写在应用代码中。攻击者反编译应用包后,可以获取应用包中的URL地址信息,并攻击其所在服务器。如果服务器的安全防范能力薄弱,攻击者可以破解服务器的安全防护措施,从而获取服务器上存储的敏感信息
方案:删除存在敏感信息的URL地址;采用动态生成的方式请求URL地址,不要硬编码在程序代码中

3.11 密钥硬编码风险

说明:应用是否存在密钥硬编码风险
描述:密钥硬编码是指在代码中直接将加密算法的密钥设置为一个固定值。加密算法本身都是公开的,加密内容的安全主要依赖于加密密钥。当密钥被硬编码在代码中时,攻击者可以通过反编译得到密钥,从而破解加密数据,获取加密前的明文信息。密钥硬编码,可直接造成加密数据被破解,客户端与服务器之间的通信内容被破解,导致应用内的加密文件被破解,或是用户的敏感信息泄露

3.12 测试信息泄露风险

说明:应用是否存在测试信息,例如内网URL、手机号码等
描述:应用中是否包含内网URL、手机号码等,判断应用中是否残留测试数据。如果应用中包含测试数据,可能会造成测试服务地址、测试账号或者测试信息外泄。攻击者可以利用这些信息发动攻击,例如账号重试,攻击测试服务器获取安全漏洞等
方案:应用正式发布前删除全部测试数据

3.13 SD卡数据泄露风险

说明:应用是否使用SD卡存储数据
描述:使用外部存储实现数据持久化,这里的外部存储一般就是指SD卡。使用SD卡存储的数据,不仅本应用访问,任何有访问SD卡权限的应用均可以访问。如果在SD卡上存储账号、密码等敏感信息,容易导致信息泄漏

四. 安全防护能力检测

4.1 从SD卡加载so漏洞

说明:应用是否从SD卡动态加载SO文件
描述:为了达到减小APK的包体大小、动态更新SO文件、灵活加载不同的SO文件等目的,开发者需要动态加载SO文件。System.load()函数可以实现动态加载SO文件,但是该函数只能加载两个目录下的SO文件(/system/lib和/data/data/packagename/),并且两个目录有权限保护不能随便访问。所以需要先下载SO文件到SD卡上,然后保存到指定目录,再使用System.load()函数动态加载SO文件。在这个过程中,如果SD卡上存储的SO文件被恶意SO文件替换,将导致恶意代码执行,导致用户敏感信息泄漏、恶意扣费、病毒注入等风险

4.2 ZipperDown漏洞

说明:应用中是否存在ZipperDown漏洞
描述:当前大量应用均会读取zip压缩包进行相关业务,最常见的场景就是从服务器下载压缩包,进行资源、代码热更新。在解压zip包时,如果对文件名没有进行限制,通过在文件名加上“../../”前缀的方式,可以将文件解压到任意路径。如果攻击者用远程劫持或者本地替换等方式将APP将要加载的正常zip包替换为带有路径前缀的恶意zip包,而APP又未对解压文件的文件名称进行处理,则攻击者可以对应用资源、代码进行任意篡改、替换,从而实现远程代码劫持等

4.3 下载任意APK漏洞

说明:应用是否存在下载任意APK漏洞
描述:具有下载APK功能的组件存在导出漏洞,并且未对组件调用者进行校验。攻击者可利用导出组件的方式让用户下载攻击者指定的任意APK文件,并且在下载过程中伪装APK文件的下载信息,例如图标、描述等,导致用户被诱导下载安装恶意应用

4.4 Janus漏洞

说明:应用是否存在Janus漏洞
描述:Google在2017年12月发布的安卓系统安全公告中披露“Janus”漏洞(漏洞编号:CVE-2017-13156)。该漏洞可以让攻击者绕过安卓系统的signature scheme V1签名机制,直接对APP进行篡改。由于安卓系统的其他安全机制也是建立在签名和校验基础之上,该漏洞相当于绕过了安卓系统的整个安全机制。攻击者可以在正常应用中植入恶意代码,可替代原有的APP做下载、更新。安装这些仿冒APP后,攻击者可以窃取用户的账号、密码等敏感信息;或者植入木马病毒,导致手机被ROOT,甚至被远程操控

4.5 动态加载外部代码风险

说明:应用是否动态加载外部代码
描述:Android4.1之前的系统版本允许Android应用动态加载存储在SD卡中的DEX文件。如果DEX文件被注入恶意代码或被恶意程序替换,同时客户端未对DEX文件进行有效校验时,将会导致攻击者的恶意代码被自动执行,可以实现窃取输入的账号、密码、通讯数据等

4.6 Java层代码动态调试风险

说明:应用是否允许Java层代码动态调试
描述:应用配置文件AndroidManifest.xml中的调试标记开启,可被Java调试工具如JDB进行调试,获取和篡改用户敏感信息,甚至可以分析并且修改代码实现的业务逻辑,例如窃取用户密码、绕过验证码防护等
方案:设置AndroidManifest.xml文件中的android:debuggable属性为false,关闭Java动态调试功能

4.7 C层代码动态调试风险

说明:应用是否存在C层代码动态调试风险
描述:Android C 层代码动态调试漏洞是指在程序运行过程中,恶意程序或者人工可以通过动态调试技术,对程序进行内存调试跟踪,可以窃取目标进程的数据信息,从而获取用户的隐私数据信息
方案:建议使用专业安全加固方案的防动态调试功能,防止应用被动态调试

4.8 动态注入攻击风险

说明:应用是否存在动态注入攻击风险
描述:Android动态代码注入是不修改源程序只修改目标进程的寄存器、内存值等就能控制程序实现既定目标的一种方法。通过动态注入,攻击者可以劫持目标进程函数、窃取目标进程数据、篡改目标进程数据等,从而监控程序运行、获取敏感信息等。常见的动态注入,可以获取登录账号、密码等
方案:建议使用专业安全加固方案的防内存代码注入功能,防止应用被动态注入攻击

4.9 模拟器运行风险

说明:应用是否允许在终端模拟器中运行
描述:Android模拟器是指运行在电脑中的虚拟设备,可以预览、开发和测试APP。在模拟器中运行,可能带来如下安全风险:模拟多个设备,进行虚假注册、刷单、薅羊毛等;模拟虚假位置,发送位置欺骗信息;适用于大多数的外挂程序,导致用户挂机刷任务,破坏APP的公平性;存在后台程序,导致用户在模拟器中输入的敏感数据(APP账号和密码等)被窃取

4.10 启动隐藏服务风险

说明:应用中是否启动隐藏服务
描述:一般的应用会以界面形式启动程序,隐藏程序启动Activity的应用易被安全检测工具误识别为恶意应用木马、病毒等,也可能存在感染恶意木马和病毒的风险

4.11 未使用编译器堆栈保护技术风险

说明:应用是否使用编译器堆栈保护技术
描述:缓冲区溢出指程序对接收的输入数据长度没有进行有效检测,向缓冲区内填充数据超过了缓冲区本身的容量,导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他合法的数据。利用缓冲区溢出漏洞发起攻击,可以导致程序运行失败、系统关机、重新启动,或者执行攻击者的命令,比如非法提升权限等,窃取用户的敏感信息等。Stack Canaries漏洞探测技术,可以对缓冲区溢出进行有效预警。在所有函数调用发生时,系统通过检测栈帧中的canary数值来判断是否发生了栈溢出漏洞。发生缓冲区溢出时,程序将输出错误消息并终止执行

4.12 随机数不安全使用风险

说明:应用是否存在随机数不安全使用风险
描述:SecureRandom随机性是通过它的seed来保证的,输入相同的seed会导致生成相同的随机数。在默认情况下,SecureRandom会从系统中找到一个默认随机源,每次生成随机数时都会从这个随机源中取seed,这种方式是安全的。当我们调用setSeed方法指定seed替代系统的默认随机源时,例如指定当前系统时间作为种子,如果同一毫秒连续调用,则得到的随机数是相同的。该漏洞存在于Android系统随机生成数字串安全密钥的环节中,这会导致使用的随机数或加密算法被破解

4.13 私有函数调用风险

说明:应用是否存在私有函数反射调用风险
描述:Android系统级API中包含大量的类,这些底层类共有的API可以直接被调用。调用系统未开放的私有API需要突破系统的限制,使用反射调用能够做到。Google之所以将有些API隐藏,可能是因为这些API属于内部逻辑,不能对外暴露;也有可能是API接口还未最终确定下来。所以在低版本Android系统上的隐藏API不一定能在高版本的Android上使用,也就说隐藏API的兼容性比较差,调用私有函数可能导致应用兼容性、稳定性方面的问题

4.14 终端ROOT状态监测

说明:应用运行时对终端是否ROOT进行检测
描述:终端在ROOT条件下,可能被攻击者获取ROOT权限。攻击者获取了ROOT权限可以随意访问任意应用储存的任何数据,造成数据泄露、数据非法篡改等风险

五. 内部数据交互风险检测

5.1 Content Provider数据泄露风险

说明:应用是否存在Content Provider数据泄露风险
描述:Content Provider被用于在不同应用程序或者进程之间共享数据,而应用程序的不同数据内容应该具有严格的访问权限。如果权限设置不当,应用程序的Content Provider数据可能被其他程序直接访问或者修改,导致用户的敏感数据泄露,或者应用数据被恶意篡改,例如盗取账号信息,修改支付金额等

5.2 拒绝服务攻击风险

说明:应用中是否存在拒绝服务攻击的风险
描述:攻击者向Intent中传入其自定义的序列化类对象,当调用组件收到此Extra序列化类对象时,应用开发者没有对传入的数据做异常判断,导致应用崩溃。本地拒绝服务漏洞不仅可以导致应用的防护功能被绕过或失效(如杀毒应用、安全卫士、防盗锁屏等),也可以导致应用被大面积攻击而崩溃,造成不同程度的经济利益损失

5.3 Intent隐式调用风险

说明:应用是否存在Intent组件隐式调用风险
描述:隐式调用Intent能够在不同应用间传递数据,但并未对Intent消息接收端进行限制,没有指明哪些接收方有权限接收该Intent。恶意程序指定相同的Action标识后,可以获取Intent中的数据,导致数据泄露、Intent劫持、仿冒应用、钓鱼应用等风险
方案:建议开发者自查,使用显示调用方式发送Intent,使用Intent.setPackage、Intent.setComponent、Intent.setClassName、Intent.setClass、new Intent(context,Receivered.class)中任一种方法明确指定Intent接收方

5.4 动态注册Receiver风险

说明:应用是否存在动态注册Receiver风险
描述:BroadcastReceiver组件可动态注册,即在代码中使用registerReceiver()方法注册BroadcastReceiver,只有当registerReceiver()的代码执行到了才进行注册,取消时则调用unregisterReceiver()方法。但registerReceiver()方法注册的BroadcastReceiver是全局的并且默认可导出的,如果没有限制访问权限,可以被任意外部APP访问,向其传递Intent来执行特定的功能。因此,动态注册的BroadcastReceive可能导致拒绝服务攻击、APP数据泄漏或是越权调用等风险

5.5 PendingIntent错误使用Intent风险

说明:应用是否存在PendingIntent调用隐式Intent或空Intent风险
描述:PendingIntent提供特殊的异步处理机制,实现跨APP的功能调用。PendingIntent可以将原始APP的权限临时赋予其他APP,这些权限用于执行PendingIntent的行为。即使原始APP已经关闭,其他APP也能继续执行PendingIntent的行为。使用PendingIntent时,如果使用了一个空Intent或者隐式Intent,会导致攻击者劫持并修改Intent的内容。这样可能导致原始APP的用户数据泄漏,攻击者可以利用原始APP执行恶意操作,例如恶意关闭系统、短信劫持、删除系统数据、篡改用户数据等

六. 通信传输风险检测

6.1 HTTPS未校验服务器主机名

说明:应用使用HTTPS协议传输数据时是否校验主机名
描述:使用HTTPS协议进行通信时,客户端需要对服务器身份进行完整性校验,以确认服务器是真实合法的目标服务器。如果没有校验,客户端可能与仿冒的服务器建立通信链接,即“中间人攻击”。Android允许开发者重定义证书验证方法,使用HostnameVerifier类检查证书中的主机名与使用该证书的服务器的主机名是否一致。如果重写的HostnameVerifier不对服务器的主机名进行验证,即验证失败时也继续与服务器建立通信链接,存在发生“中间人攻击”的风险。发生“中间人攻击”时,仿冒的中间人可以冒充服务器和客户端通信,也可以冒充客户端与服务器通信,从而截获通信内容,获取用户隐私信息

6.2 HTTPS允许任意服务器主机名漏洞

说明:应用使用HTTPS协议传输数据时是否允许任意服务器主机名
描述:使用HTTPS协议进行通信时,客户端需要对服务器身份进行完整性校验,以确认服务器是真实合法的目标服务器。如果没有校验,客户端可能与仿冒的服务器建立通信链接,即“中间人攻击”。Android允许开发者重定义证书的验证方法,当调用的setHostnameVerifier方法被配置为接受任何服务器主机名(ALLOW_ALL_HOSTNAME_VERIFIER)或者空的HostnameVerifier时,客户端可以与任意主机名的服务器(包括仿冒的服务器)建立通信链接,存在发生“中间人攻击”的风险。发生“中间人攻击”时,仿冒的中间人可以冒充服务器和客户端通信,也可以冒充客户端与服务器通信,从而截获通信内容,获取用户隐私信息

6.3 HTTP传输通道风险

说明:应用是否使用HTTPS协议对传输通道进行加密
描述:由于HTTP数据传输是明文传输的,导致HTTP数据容易被抓取、篡改,泄露用户的敏感数据,如账号、密码等。甚至通过中间人劫持将原有信息替换成恶意链接或恶意代码程序,以达到远程控制、恶意扣费等攻击意图

6.4 SSL证书有效性风险

说明:应用是否对客户端和服务端证书进行有效性校验
描述:使用HTTPS协议时,客户端必须对服务器证书进行完整性校验,以验证服务器的合法性。如果未校验,客户端可能与仿冒的服务器建立通信链接,同时服务端也可能与仿冒的客户端建立通信链接,即“中间人攻击”。Android允许开发者重定义证书验证方法,使用X509TrustManager类检查证书是否合法并且是否过期。如果重写X509TrustManager时,checkServerTrusted()方法对证书校验结果未做任何处理,即在证书验证失败时,仍然与服务器建立通信链接,存在发生“中间人攻击”的风险。当发生中间人攻击时,仿冒的中间人可以冒充服务器与客户端进行交互,同时冒充客户端与服务器进行交互,在充当中间人转发信息的时候,窃取手机号码、账号、密码等敏感信息,甚至可能对通信内容进行篡改

6.5 联网环境检测

说明:应用是否使用代理服务器联网
描述:使用代理服务器具有以下风险:突破中国电信的IP封锁,访问国外网站;隐藏真实IP;通信数据被监听或者篡改。应用使用代理服务器联网,可能导致客户端与服务器端通信的数据被监听和篡改,导致用户敏感数据泄露或者服务器被恶意攻击

6.6 启用VPN服务检测

说明:应用是否启动了VPN服务
描述:使用VPN联网时,通过网络请求的数据容易被劫持,造成用户敏感信息泄露。可以提供VPN服务的软件,又叫“翻墙”软件。提供“翻墙”服务属于违法行为

6.7 访问境外服务器风险

说明:应用中ip、域名是否访问境外服务器
描述:应用程序访问境外服务器造成网络请求延迟、卡顿,被防火墙屏蔽网络请求出现访问无响应

七. 身份认证风险检测

7.1 系统键盘使用风险

说明:应用在敏感数据输入时是否使用不安全的系统键盘
描述:客户端的敏感界面如登录界面、注册界面、支付界面等,用户在输入敏感信息与显示(输出)时,如果未使用安全键盘,而使用第三方未知键盘或系统键盘的话可能存在数据被拦截与监听的风险,导致账号、密码等敏感数据泄露

7.2 截屏攻击风险

说明:应用界面是否允许被录屏或截图
描述:截屏攻击是指在APP运行过程中,界面被监控并且截屏或者录屏。截屏攻击主要发生在APP登录、身份认证、资金操作等界面。Android5.0中增加了一个MediaProjection接口,它提供截屏或者录屏的服务,准许APP拥有截取屏幕或者记录系统音频的能力。同时系统允许其他消息窗口覆盖在系统的录制提示上,从而在用户无感知的情况下启动录屏或者截屏工具。通过此方式,攻击者可以获取APP关键界面的截图或者录像,从而获取用户的敏感信息

7.3 使用调试证书发布应用风险

说明:应用是否使用了调试证书发布应用
描述:签名证书是验证APP开发者身份的关键标识,可用于判断APP是否是正版APP,是防止APP被二次打包的重要措施。调试证书是adt插件或者ant工具生成的,名字和密码已经预先定义、不能修改的签名证书。使用调试证书发布正式APP,可能导致APP无法在应用市场上架;调试证书有效期仅有一年,一旦此调试证书失效,则使用该调试证书的APP将无法更新升级;使用调试证书,可能导致签名校验失效,导致APP被二次打包。

八. 组件风险检测

8.1 Activity最小化特权检测

说明:应用Activity组件权限设置是否满足最小化特权要求
描述:Activity的最小化特权是指组件只能自身调用,其他应用无权访问,即组件不导出。Activity组件设置导出权限,则该组件能够被外部的其他组件直接调用,这样就可能导致泄露隐私数据或者应用程序崩溃等风险。Activity被恶意应用调用,可能有以下威胁描述:修改程序的状态或者数据;被调用的Activity可能返回隐私信息给恶意应用,造成数据泄露;可能使应用程序崩溃,造成拒绝服务等漏洞
方案:设置AndroidManifest.xml文件中Activity组件EXPORTED属性为false,对于必须导出的组件必须限制于授权用户或者特定应用组件,并且尽量不包含任何的Intent Filter

8.2 Service最小化特权检测

说明:应用Service组件权限设置是否满足最小化特权要求
描述:Service组件的最小化特权是指组件只能自身调用,其他应用无权访问,即组件不导出。Service执行的操作比较敏感,比如更新数据库、提供事件通知等,如果设置了导出权限,可能被系统或者第三方的App直接调出并使用。Service导出可能导致拒绝服务攻击,程序功能被第三方恶意调用等风险
方案:设置AndroidManifest.xml文件中Service组件EXPORTED属性为false,对于必须导出的组件必须限制于授权用户或者特定应用组件,并且不要给未知名的Service传递Intent

8.3 Content Provider最小化特权检测

说明:应用Content Provider组件权限设置是否最小化特权要求
描述:Content Provider组件的最小化特权是指组件只能自身调用,其他应用无权访问,即组件不导出。Content Provider组件对外导出后可被第三方恶意程序调用,会产生本地SQL注入、文件遍历等风险,造成用户敏感信息泄露
方案:设置AndroidManifest.xml文件中Content Provider组件EXPORTED属性为false,对于必须导出的组件必须限制于授权用户或者特定应用组件

8.4 Broadcast Receiver最小化特权检测

说明:应用Broadcast Receiver组件权限设置是否满足最小化特权要求
描述:Broadcast Receiver组件的最小化特权是指组件只能自身调用,其他应用无权访问,即组件不导出。从全局考虑Broadcast Receiver可以方便应用程序和系统、应用程序之间、应用程序内的通信,对单个应用程序而言Broadcast Receiver是存在安全性问题的,比如恶意程序可以不断的去发送你所接收的广播,这样会造成应用被攻击,导致应用直接退出、处理逻辑出错等风险
方案:设置AndroidManifest.xml中的Broadcast Receiver组件EXPORTED属性为false,对于必须导出的组件必须限制于授权用户或者特定应用组件

8.5 WebView组件忽略SSL证书验证错误漏洞

说明:WebView组件是否存在忽略SSL证书验证错误
描述:Android WebView组件加载使用HTTPS协议加密的网页时,如果服务端校验证书错误,客户端应该拒绝加载网页。但是如果发生证书认证错误时,调用WebViewClient类的onReceivedSslError方法,并在该方法实现中调用了handler.proceed()来忽略该证书错误,则客户端会绕过证书校验错误继续加载此网页。这样会导致“中间人攻击”,攻击者可以冒充中间人,在客户端和服务端中间转发信息,窃取账号、密码等敏感信息

8.6 WebView远程代码执行漏洞

说明:应用是否存在WebView远程代码执行漏洞
描述:Android API level 17以及之前的版本,由于程序没有正确限制使用addJavascriptInterface方法,远程攻击者可通过使用Java Reflection API利用该漏洞执行任意Java对象的方法。通过addJavascriptInterface给WebView加入一个 JavaScript桥接接口,JavaScript通过调用这个接口可以直接与本地的Java接口进行交互。导致手机被安装木马程序,发送扣费短信,通信录或者短信被窃取,甚至手机被远程控制

8.7 WebView跨域访问漏洞

说明:应用是否存在跨域访问漏洞
描述:在Android应用中,WebView开启了file域访问,允许file域访问http域,且未对file域的路径进行严格限制。攻击者通过URL Scheme的方式,可远程打开并加载恶意HTML文件,远程获取用户隐私数据(包括手机应用数据、照片、文档等敏感信息),还可窃取用户登录凭证,在受害者毫无察觉的情况下实现对APP用户账户的完全控制

8.8 未移除有风险的WebView系统隐藏接口漏洞

说明:应用是否移除有风险的WebView系统隐藏接口
描述:根据CVE披露的WebView远程代码执行漏洞信息(CVE-2012-663、CVE-2014-7224),Android系统中存在一共三个有远程代码执行漏洞的隐藏接口。分别是位于android/webkit/webview中的“searchBoxJavaBridge”接口、android/webkit/AccessibilityInjector.java中的“accessibility”接口和“accessibilityTraversal”接口。调用此三个接口的APP在开启辅助功能选项中第三方服务的Android系统上将面临远程代码执行漏洞

8.9 WebView File域同源策略绕过漏洞

说明:应用是否存在WebView File域同源策略绕过漏洞
描述:应用程序一旦使用WebView,同时支持File域,并打开了对JavaScript的支持,就能利用JavaScript的延时执行,绕过File协议的同源检查,并能够访问应用程序的私有文件,导致敏感信息泄露
方案:
1.对于不需要使用File协议的应用,禁用File协议,显式设置webView.getSettings().setAllowFileAccess(false)。
2.对于需要使用File协议的应用,禁止File协议调用JavaScript,显式设置webView.getSettings().setJavaScriptEnabled(false)

8.10 Fragment注入攻击漏洞

说明:应用中是否存在Fragment注入攻击漏洞
描述:Activity可包含多个Fragment来分区域展示界面,PreferenceActivity是支持Fragment的基类Activity,其根据传入的参数动态创建Fragment实现界面展示。当PreferenceActivity的Activity是属性为export,攻击者可以调用此PreferenceActivity并为其提供构造的特定数据,如果数据没有正确处理或者未经目标应用验证,就可以绕过权限限制任意调用应用内部的任意Fragment。Fragment注入攻击可导致应用的敏感信息泄露、远程代码执行或者应用崩溃

8.11 Intent Scheme URL攻击漏洞

说明:应用中是否存在Intent Scheme URL攻击漏洞
描述:Intent Scheme URL是一种特殊的URL格式,用来通过Web页面启动已安装应用的Activity组件。如果过滤规则缺失,攻击者利用Intent Scheme URL可以通过web js代码进行一些恶意行为,比如盗取cookie、启动应用等等。攻击者也可以构造特殊格式的URL直接向系统发送意图,启动应用的Activity组件或者发送异常数据,导致应用的敏感信息泄露或者应用崩溃

九. 内容风险

9.1 敏感词汇

说明:应用中是否含有企业关注的特定词汇
描述:应用中包含企业关注的特定词汇,特定词汇的范围由企业定义。在应用中如果包括这些词汇,可能会给企业带来法律、声誉以及其他不可预知的影响

9.2 敏感文本

说明:应用中是否含有企业关注的特定文本
描述:应用中包含企业关注的特定文本,特定文本的范围由企业定义。在应用中如果包括这些文本,可能会给企业带来法律、声誉以及其他不可预知的影响

9.3 敏感图片

说明:应用中是否含有色情、暴力等类型的图片
描述:应用中包含色情、暴力等类型的图片,可能会给企业带来法律、声誉以及其他不可预知的影响