最全Android安全检测漏洞解决方案_安卓常见的安全漏洞以及缓解方案-程序员宅基地

技术标签: 安全漏洞  android  Android学习  android studio  

前言: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.RECEIVE_USER_PR ESENT

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

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

5 、未知 android.permission.SYSTEM_OVERLAY_ WINDOW

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

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

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

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

10 、唤醒锁定 android.permission.WAKE_LOCK

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

12 、未知 android.permission.READ_MEDIA_VIDE O

13 、未知 android.permission.READ_MEDIA_AUDI O

14 、未知 android.permission.READ_MEDIA_IMAG ES

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

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

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

18 、录音 android.permission.RECORD_AUDIO

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

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

21 、访问网络 android.permission.INTERNET

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

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

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

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

26、 访问额外的定位 服务 android.permission.ACCESS_LOCATION _EXTRA_COMMANDS

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文件中增加以 下参数LOCAL_CFLAGS := -Wall -O2 -U_FORTIFY_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方法被配置为接受任何服务 器主机名(ALLOW_ALL_HOSTNAME_VERIFIER)或者空的HostnameVerifier时 ,客户端可以与任意主机名的服务器(包括仿冒的服务器)建立通信链接 ,存在发生“中间人攻击”的风险。发生“中间人攻击”时,仿冒的中间 人可以冒充服务器和客户端通信,也可

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

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:///android_asset和file:///android_res 在不开启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.FLAG_SECURE, LayoutParams.FLAG_SECURE);或者 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文件 ,植入钓鱼页面或者恶意代码,造成用户的敏感信息泄露。

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

还等什么,赶紧检测吧。
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40798907/article/details/114579028

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法