最全Android安全检测漏洞解决方案
检测     Android安全     发布于 09/14/2021 22:53:04   61次围观  0条评论
检测    Android安全    发表于 01/01/0001 00:00:00   61人围观  0条评论

(6 条消息) 最全 Android 安全检测漏洞解决方案EnthusiasmsForme 的博客 - CSDN 博客安卓组件漏洞

前言:APP 安全检测通常在一些小型企业涉及的比较少,并且并不太关注这方面的问题。然而在一些大型互联网企业或者国企等等就非常在意这方面的安全问题,并且会有专门的人去对 APK 进行检测。本节我们一起学习在 Android 中大量的 app 漏洞应如何去避免或者修改。

一、基本应用信息

通常包括:应用名称、包名、文件大小、版本信息、文件 MD5、签名信息、加固厂商、第三方 SDK 等。

二、安全漏洞检测项

加密算法和密码安全

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

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

安全防护能力

1、 ZipperDown 漏洞

2、 下载任意 APK 漏洞

3 、Janus 漏洞

4、 从 SD 卡加载 so 漏洞

5 、动态加载外部代码风险

6 、Java 层代码动态调试风险

7、 C 层代码动态调试风险

8、 动态注入攻击风险

9 、模拟器运行风险

10 、启动隐藏服务风险

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

12、 随机数不安全使用风险

13、 私有函数调用风险

14 、终端 ROOT 状态检测

通信传输风险

1、 HTTPS 未校验服务器主机名漏洞

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

3、 HTTP 传输通道风险

4 、SSL 证书有效性风险

5 、联网环境检测

6 、启用 VPN 服务检测

7、 访问境外服务器风险

内容风险

1、 敏感词汇检测

2、 敏感文本检测

3 、敏感图片检测

组件风险

1、 Activity 最小化特权风险

2、 Service 最小化特权检测

3 、Content Provider 最小化特权风险

4、 Broadcast Receiver 最小化特权风险

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

6 、WebView 远程代码执行漏洞

7 、WebView 跨域访问漏洞

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

9、 WebView File 域同源策略绕过漏洞

10、 Fragment 注入攻击漏洞

11、 Intent Scheme URL 攻击漏洞

内部数据交互风险

1、 Content Provider 数据泄露风险

2、 拒绝服务攻击风险

3 、Intent 隐式调用风险

4 、PengingIntent 错误使用 Intent 风险

5、 动态注册 Receiver 风险

优化建议

1 、全局异常检测

2 、IP 地址检测

基本信息检测

1 、基本信息检测

2、 应用权限检测

3、 应用行为检测

4、 越权行为检测

5 、资源文件中包含 APK

6 、权限滥用风险

数据存储风险

1 、WebView 明文存储密码漏洞

2、 数据库注入漏洞

3 、FFmpeg 文件读取漏洞

4 、证书文件明文存储风险

5、 数据越权备份风险

6 、日志数据泄露风险

7 、URL 硬编码风险

8、 密钥硬编码风险

9 、测试信息泄露风险

10、 SD 卡数据泄露风险

身份认证风险

1 、系统键盘使用风险

2 、截屏攻击风险

3 、使用调试证书发布应用风险

源文件安全

1、 应用完整性检测

2 、程序签名保护检测

3 、Java 代码未加壳风险

4 、Java 代码混淆检测

5、 so 文件未加固风险

6 、H5 文件加固检测

7 、Java 层关键函数风险

8 、资源文件泄露风险

9 、单元测试配置风险

三、应用权限检测

1、拨打电话 android.permission.CALL_PHONE

2、接收当用户出现 即屏幕点亮的广 播 android.permission.RECEIVEUSERPR ESENT

3、 显示系统窗口 android.permission.SYSTEMALERTWI NDOW

4、 写入外部存储 android.permission.WRITE_EXTERNAL_ STORAGE

5 、未知 android.permission.SYSTEM_OVERLAY_ WINDOW

6、 获取精确位置 android.permission.ACCESSFINELOC ATION

7、 不同用户的应用 之间可以产生完 全权限交互 android.permission.INTERACTACROSS _USERSFULL

8 、访问近似位置 android.permission.ACCESSCOARSEL OCATION

9、 访问网络信息 android.permission.ACCESS_NETWORK_ STATE

10 、唤醒锁定 android.permission.WAKE_LOCK

11 、访问 Wi-Fi 网络 信息 android.permission.ACCESSWIFISTA TE

12 、未知 android.permission.READMEDIAVIDE O

13 、未知 android.permission.READMEDIAAUDI O

14 、未知 android.permission.READMEDIAIMAG ES

15 、访问振动设备 android.permission.VIBRATE

16 、未知 com.djd.znly.permission.JPUSH_MESS AGE

17 、挂载或者反挂载 外置 sdcard 的文 件系统 android.permission.MOUNTUNMOUNTF ILESYSTEMS

18 、录音 android.permission.RECORD_AUDIO

19 、安装应用程序 android.permission.REQUEST_INSTALL _PACKAGES

20 、改变 WiFi 连接状 态 android.permission.CHANGEWIFISTA TE

21 、访问网络 android.permission.INTERNET

22 、改变网络状态 android.permission.CHANGE_NETWORK_ STATE

23 、使用照相设备 android.permission.CAMERA

24 、读取外部存储 android.permission.READEXTERNALS TORAGE

25、读取手机状态 android.permission.READPHONESTAT E

26、 访问额外的定位 服务 android.permission.ACCESSLOCATION _EXTRACOMMANDS

27、 读写系统设置 android.permission.WRITE_SETTINGS

四、加密算法和密码安全问题

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

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

解决方案:使用 AES/DES 算法时,应使用 CBC 和 CFB 工作模式。

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

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

解决方案:1.使用 RSA 算法进行数字签名时,建议密钥长不要低于 512 位,推荐 1024 位 。2.使用 RSA 加密时,建议设置工作模式为 ECB,填充方式为 OAEPWithSHA256AndMGF1Padding。

五、安全防护能力

1、 ZipperDown 漏洞

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

解决方案:1. 对 zip 包进行解压操作时,在获取文件名后,添加过滤代码对文件名中 可能包含的”…/” 进行过滤判断。2. 使用通信协议加密技术,对通信过程中的数据进行加密保护,保证数 据不被篡改。3. 建议客户端与服务端使用加密通道进行数据交互,并对传输数据进行 完整性校验,防止 zip 包被拦截替换。

2、Janus 漏洞

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

解决方案:建议使用 V1+V2 签名方案对 APK 进行签名。

3、 从 SD 卡加载 so 漏洞

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

解决方案 : 建议使用 System.loadLibrary() 函数动态加载 so 文件,不要使用 System.load() 函数。

4、Java 层代码动态调试风险

应用配置文件 AndroidManifest.xml 中的调试标记开启,可被 Java 调试工具 如 JDB 进行调试,获取和篡改用户敏感信息,甚至可以分析并且修改代码实 现的业务逻辑,例如窃取用户密码、绕过验证码防护等。

解决方案 :开发者自查,设置 AndroidManifest.xml 文件中的 android:debuggable 属性 为 false,关闭 Java 动态调试功能。

5、模拟器运行风险

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

解决方案:1. 建议在应用运行时,获取运行设备的设备信息 (IMEI、IMSI、通道、 QEmu、CPU 等),与常见的模拟器特征做对比,当运行设备为模拟器时,程 序做出响应,提示或退出。2. 使用专业加固方案的防模拟器功能,禁止应用在模拟器中运行。

6、启动隐藏服务风险

解决方案:建议开发者自查,给应用添加启动界面;或者采取渠道监测的方案,实时 监控互联网上是否存在被篡改和二次打包的盗版应用,这些盗版应用中可 能包含隐藏启动恶意程序或病毒。

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

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

解决方案:建议开发者使用 gcc 编译时,使用以下参数 gcc -o demo demo.c -fstack - protector -all;或者使用 NDK 编译 SO 文件时,在 Android.mk 文件中增加以 下参数 LOCALCFLAGS := -Wall -O2 -UFORTIFY_SOURCE -fstackprotector-all。

8、随机数不安全使用风险

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

解决方案 :1. 正确使用 SecureRandom 类,不要使用自定义随机源代替系统默认随机源 (除非有特殊需求)。在使用 SecureRandom 类时,不要调用以下函数:new SecureRandom(byte[] seed)、SecureRandom.setSeed(long seed)、 SecureRandom.setSeed(byte[] seed)。2. 在调用 setSeed 方法前先调用任意 nextXXX 方法(例如 nextInt、 nextFloat 等)。因为调用此类方法时,已经设置了系统的 seed,setSeed 中传入的 seed 将添加到系统 seed 的尾部。这样生成随机数时 也会使用系统随机源的 seed,从而保证其随机性。

9、私有函数调用风险

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

解决方案:建议开发者不要反射调用未公开 API,改用其他方式实现相关功能。

10、终端 ROOT 状态检测

终端在 ROOT 条件下,可能被攻击者获取 ROOT 权限。攻击者获取了 ROOT 权限 可以随意访问任意应用储存的任何数据,造成数据泄露、数据非法篡改等 风险。

解决方案 :代码里面对运行环境进行检测,检测到 ROOT 权限时,进行相应的提醒或者 禁止软件运行。

六、通信传输风险

1、HTTPS 未校验服务器主机名漏洞

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

解决方案 :建议开发者自查,使用 HTTPS 协议时必须对服务器主机名进行校验,校验失 败时应进行正确处理。修复代码示例如下:HostnameVerifier hnv = new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { if(“yourhostname”".equals(hostname)){

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

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

解决方案:建议开发者自查,在对服务器的主机名进行验证时,必须将 setHostnameVerifier 方法的验证模式配置为 STRICTHOSTNAMEVERIFIER。修复代码示例如下:SSLSocketFactory sf = new MySSLSocketFactory(trustStore); sf.setHostnameVerifier(SSLSocketFactory.STRICTHOSTNAMEVERIFIER) ;

3、HTTP 传输通道风险

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

解决方案:建议开发者对应用中的重要数据使用 HTTPS 协议传输。

4、SSL 证书有效性风险

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

解决方案:建议开发者自查,在使用 HTTPS 协议时应对证书的合法性进行校验,校验失 败时应进行正确处理。修复代码示例如下:@Override public void checkServerTrusted(X509Certificate[] X509Certificates, String s) throws CertificateException {if(x509Certificates == null) { throws new IllegalArgumentException(“Check Server x509Certificates is null”");

5、 联网环境检测

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

解决方案:建议开发者在应用启动时检测当前联网环境,如果设置成网络代理模式应 提示用户或者退出。

6、启用 VPN 服务检测

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

解决方案:应用中不要启动 VPN 服务。

七、内容风险

1、敏感词汇检测

应用中包含色情、暴力等敏感词汇,可能会给企业带来法律、声誉以及其 他不可预知的影响。

解决方案 :删除 APK 中的相关敏感词汇。

八、组件风险

1、 Activity 最小化特权风险

Activity 的最小化特权是指组件只能自身调用,其他应用无权访问,即组 件不导出。Activity 组件设置导出权限,则该组件能够被外部的其他组件 直接调用,这样就可能导致泄露隐私数据或者应用程序崩溃等风险。Activity 被恶意应用调用,可能有以下威胁描述:修改程序的状态或者数 据;被调用的 Activity 可能返回隐私信息给恶意应用,造成数据泄露;可 能使应用程序崩溃,造成拒绝服务等漏洞。

解决方案 :设置 AndroidManifest.xml 文件中 Activity 组件 EXPORTED 属性 为 false,对于必须导出的组件必须限制于授权用户或者特定应用组件,并 且尽量不包含任何的 Intent Filter。

2、 Service 最小化特权检测

Service 组件的最小化特权是指组件只能自身调用,其他应用无权访问,即 组件不导出。Service 执行的操作比较敏感,比如更新数据库、提供事件通 知等,如果设置了导出权限,可能被系统或者第三方的 App 直接调出并使用 。Service 导出可能导致拒绝服务攻击,程序功能被第三方恶意调用等风险 。

解决方案 :设置 AndroidManifest.xml 文件中 Service 组件 EXPORTED 属性 为 false,对于必须导出的组件必须限制于授权用户或者特定应用组件,并 且不要给未知名的 Service 传递 Intent。

3、 Content Provider 最小化特权风险

Content Provider 组件的最小化特权是指组件只能自身调用,其他应用无 权访问,即组件不导出。Content Provider 组件对外导出后可被第三方恶 意程序调用,会产生本地 SQL 注入、文件遍历等风险,造成用户敏感信息泄 露。

解决方案 :设置 AndroidManifest.xml 文件中 Content Provider 组件 EXPORTED 属性为 false,对于必须导出的组件必须限制于授权用户或者特定 应用组件。

4、 Broadcast Receiver 最小化特权风险

Broadcast Receiver 组件的最小化特权是指组件只能自身调用,其他应用 无权访问,即组件不导出。从全局考虑 Broadcast Receiver 可以方便应用 程序和系统、应用程序之间、应用程序内的通信,对单个应用程序而言 Broadcast Receiver 是存在安全性问题的,比如恶意程序可以不断的去发 送你所接收的广播,这样会造成应用被攻击,导致应用直接退出、处理逻 辑出错等风险。

解决方案 :设置 AndroidManifest.xml 中的 Broadcast Receiver 组件 EXPORTED 属性为 false,对于必须导出的组件必须限制于授权用户或者特定 应用组件。

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

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

解决方案 :当发生证书认证错误时,采用默认的处理方法 handler.cancel(),停止加 载问题页面

6、WebView 远程代码执行漏洞

Android API level 17 以及之前的版本,由于程序没有正确限制使用 addJavascriptInterface 方法,远程攻击者可通过使用 Java Reflection API 利用该漏洞执行任意 Java 对象的方法。通过 addJavascriptInterface 给 WebView 加入一个 JavaScript 桥接接口,JavaScript 通过调用这个接口可 以直接与本地的 Java 接口进行交互。导致手机被安装木马。

解决方案:建议使用 addJavascriptInterface 接口时满足以下条件:1. 设置 minSdkVersion 值大于或等于 17,使应用不能在 4.2 以下系统上运行 。2. 允许被 JavaScript 调用的函数必须以 @JavascriptInterface 进行注解。

7、 WebView 跨域访问漏洞

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

解决方案 :1. 若 file 域访问为非功能需求时,手动配置 setAllowFileAccessFromFileURLs 或 setAllowUniversalAccessFromFileURLs 两个 API 为 false。(Android4.1 版 本之前这两个 API 默认是 true,需要显式设置为 false) 2. 若需要开启 file 域访问,则设置 file 路径的白名单,严格控制 file 域的 访问范围,具体如下:1) 固定不变的 HTML 文件可以放在 assets 或 res 目录下 ,file:///androidasset 和 file:///androidres 在不开启 API 的情况下 也可以访问。2) 可能会更新的 HTML 文件放在 / data/data/(app) 目录下,避免被第三方 替换或修改。3) 对 file 域请求做白名单限制时,需要对 “…/…/” 特殊情况进行处理 ,避免白名单被绕过。3. 避免 App 内部的 WebView 被不信任的第三方调用。排查内置 WebView 的 Activity 是否被导出、必须导出的 Activity 是否会通过参数传递调起内置 的 WebView 等。4. 建议进一步对 APP 目录下的敏感数据进行保护,可采用加固方案对敏感 数据进行保护,使攻击者难以利用相关漏洞获得敏感信息。

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

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

解决方案 :如果使用了 WebView,那么使用 WebView.removeJavascriptInterface(String name) API 时,显示的移除 searchBoxJavaBridge_、accessibility、accessibilityTraversal 这三个 接口。

9、WebView File 域同源策略绕过漏洞

应用程序一旦使用 WebView,同时支持 File 域,并打开了对 JavaScript 的支 持,就能利用 JavaScript 的延时执行,绕过 File 协议的同源检查,并能够 访问应用程序的私有文件,导致敏感信息泄露。

解决方案 :1. 对于不需要使用 File 协议的应用,禁用 File 协议,显式设置 webView.getSettings().setAllowFileAccess(false)。2. 对于需要使用 File 协议的应用,禁止 File 协议调用 JavaScript,显式设 置 webView.getSettings().setJavaScriptEnabled(false)。

10、 Fragment 注入攻击漏洞

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

解决方案 :建议正确的实现 PreferenceActivity.isValidFragment() 这个方法 ,重写该方法验证 Fragment 来源正确性。

11、Intent Scheme URL 攻击漏洞

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

解决方案:建议使用 Intent.parseUri 函数,获取的 Intent 必须严格过滤 ,Intent 至少包含 addCategory(“android.intent.category.BROWSABLE”)、 setComponent(null)、setSelector(null)3 个策略。

九、内部数据交互风险

1、拒绝服务攻击风险

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

解决方案 :建议开发者将不必要导出的组件设置为不导出,或 Intent 处理数据时进行 捕获异常判断。

2、Intent 隐式调用风险

隐式调用 Intent 能够在不同应用间传递数据,但并未对 Intent 消息接收端 进行限制,没有指明哪些接收方有权限接收该 Intent。恶意程序指定相同 的 Action 标识后,可以获取 Intent 中的数据,导致数据泄露、Intent 劫持 、仿冒应用、钓鱼应用等风险。

解决方案 :建议使用显示调用方式发送 Intent,使用 Intent.setPackage、Intent.setComponent、Intent.setClassName、 Intent.setClass、new Intent(context,Receivered.class) 中任一种方法 明确指定 Intent 接收方。

3、PengingIntent 错误使用 Intent 风险

PendingIntent 提供特殊的异步处理机制,实现跨 APP 的功能调用。PendingIntent 可以将原始 APP 的权限临时赋予其他 APP,这些权限用于执行 PendingIntent 的行为。即使原始 APP 已经关闭,其他 APP 也能继续执行 PendingIntent 的行为。使用 PendingIntent 时,如果使用了一个空 Intent 或者隐式 Intent,会导致攻击者劫持并修改 Intent 的内容。这样可 能导致原始 APP 的用户数据泄漏,攻击者可以利用原始 APP 执行恶意操。

解决方案 :1. 禁止使用一个空 Intent 去构造 PendingIntent。2. 构造 PendingIntent 的 Intent 一定要设置 ComponentName 或者 action。

4、动态注册 Receiver 风险

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

解决方案:1. 在 AndroidManifest.xml 文件中静态注册 BroadcastReceiver,同时设 置 exported=“false”"。

十、优化建议

1、全局异常检测

如果应用没有使用全局异常捕获机制,则当出现未捕获的异常时,系统会 强制终止应用,出现系统的默认提示 “抱歉,XXX 应用已停止运行”,既影 响用户体验,也不利于开发者解决问题。应用应该有一个全局的异常捕获 机制,当出现未知异常时,捕获这个异常,将异常信息记录下来,并且上 传到服务器分析出现异常的具体原因。

解决方案 :建议使用全局异常捕获 UncaughtExceptionHandler 类,当程序发生 未知异常时,由该类来处理,并记录发送错误报告。或者使用第三方异常 机制。

2、 IP 地址检测

解决方案 :IPv6 相比 IPv4,具有更大的地址空间和更高的安全性,推荐使用 IPv6。

十一、数据存储风险

1、WebView 明文存储密码漏洞

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

解决方案 :建议通过 WebView.getSettings().setSavePassword(false) 来关闭 WebView 组件的密码保存功能。

2、数据库注入漏洞

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

解决方案 :不要使用拼接字符串形式构造的 SQL 语句去查询底层 SQLite 数据库,建议使 用参数化查询方式来查询数据库。修复代码示例如下:String sql = “SELECT * FROM table where name=?”" ;

3、FFmpeg 文件读取漏洞

FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的 开源计算机程序。它提供了录制、转换以及流化音视频的完整解决方案。FFmpeg 可以处理 HLS(HTTPLiveStreaming)播放列表,而 HLS 播放列表可以 引用外部文件。通过在 AVI 文件中添加自定义的包含本地文件引用的 HLS 播 放列表,可以在文件播放过程中显示本地文件的内容。该漏洞可能导致服

解决方案 :1. 将 FFmpeg 升级到 3.3.2 及以上版本。2. 将 file:// 等危险协议类型添加到黑名单。

4、证书文件明文存储风险

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

解决方案 :建议开发者对证书文件设置密码加密处理。

5、日志数据泄露风险

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

解决方案 :在发布程序之前关闭所有调试日志函数的调用,或者使用统一的 Log 控制类 ,这样可以更加方便的控制 Log 的输出打印。

6、URL 硬编码风险

URL 硬编码是指将 URL 地址信息以硬编码的方式写在应用代码中。攻击者反 编译应用包后,可以获取应用包中的 URL 地址信息,并攻击其所在服务器。如果服务器的安全防范能力薄弱,攻击者可以破解服务器的安全防护措施 ,从而获取服务器上存储的敏感信息。

解决方案 :删除存在敏感信息的 URL 地址;采用动态生成的方式请求 URL 地址,不要硬编码在程序代码中。

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

解决方案 :1. 使用算法生成密钥。2. 若不使用算法生成密钥,则使用参数的形式传递密钥,并且密钥与加密 算法不在同一函数中。

8、测试信息泄露风险

如果 APK 文件中存在内网 URL 地址,可能会被盗取并恶意利用在正式服务器 上进行攻击如重放攻击,或者攻击安全薄弱的测试服务器以获取安全漏洞 或者逻辑漏洞等。

解决方案:应用正式发布前删除全部测试数据。

9、SD 卡数据泄露风险

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

解决方案 :对数据进行持久化存储的时候,尽量避免重要信息存放在外部设备 (SD 卡) 上。

十二、身份认证风险

1、系统键盘使用风险

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

解决方案 :在敏感数据输入时使用专业的安全键盘,可以有效防止输入敏感内容时被 监听。

2、截屏攻击风险

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

解决方案:在 Activity 的 oncreate() 方法中调用 getWindow().setFlags(LayoutParams.FLAGSECURE, LayoutParams.FLAGSECURE); 或者 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); 达到 防止截屏攻击的目的。

十三、源文件安全

1、Java 代码未加壳风险

Java 代码加壳即在 Java 代码外面包裹上另外一段代码,保护里面的 Java 代 码不被非法修改或反编译。Java 文件未进行加壳保护,可能面临被反编译 的风险。攻击者通过 baksmali/apktool/dex2jar 等反编译工具得到应用程 序的代码,导致代码逻辑泄露、重要数据加密代码逻辑泄露等。

解决方案:建议使用专业应用安全加固方案,对 APK 包中的 classes.dex 文件进行保护 ,防止应用被反编译。

2、.Java 代码混淆检测

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

解决方案:建议使用专业应用安全加固方案确保代码安全,防止应用被反编译。

3、so 文件未加固风险

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

解决方案 :建议使用专业安全加固方案,对 APK 中的 SO 文件进行加固保护。(注:有资金能力的建议采用大公司的加固方案,一年好几万而且还是一个 APP,小公司的工具基本不行,就是简单套了一个壳。亲身体验。)

4、资源文件泄露风险

APK 中包含多种类型的资源文件,例如图片、ICON、H5 文件等,直接对 APK 进行解压缩就可以查看 APK 中的资源文件,窃取应用图标,篡改 H5 文件 ,植入钓鱼页面或者恶意代码,造成用户的敏感信息泄露。

解决方案 :使用专业的安全加固方案,对资源文件进行加密处理,保证文件在存储过 程中为密文。(网上也有对资源文件进行混淆的方法,很简单。)

还等什么,赶紧检测吧。

立即登录,发表评论
没有帐号?立即注册
{{$.post.CommentNum}} 条评论