Android应用安全检测项目
Posted 苛学加
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android应用安全检测项目相关的知识,希望对你有一定的参考价值。
android应用安全检测项目
使用静态检测引擎对APK文件进行反编译,扫描反编译后的代码文件即可发现应用的安全漏洞。
一般有以下内容,比较有参考价值,部分是平时编码时有可能忽略的问题,在此整理供大家参考。
1. 基础信息
1.1 权限过度声明风险检测
检测应用中是否存在权限滥用情况。
权限是一种安全机制,主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组件访问。Android通过在AndroidManifest.xml中增加权限来控制限制性功能的使用和组件访问。权限滥用是指应用权限开放过多、自定义权限限制不严格,导致攻击者利用应用权限可以使用某些特殊的功能,如拨打电话、访问摄像头、利用麦克风录音、编写并植入木马等。可能导致隐私数据泄露,钓鱼扣费等风险。
建议开发者自查,删除AndroidMainfest.xml文件中不必要的权限配置,自定义权限添加权限保护等级配置。
1.2 越权行为检测
检测应用中是否包含企业或者监管机构禁止的越权行为。
权限是一种安全机制,主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组件访问。Android通过在AndroidManifest.xml中增加权限来控制限制性功能的使用和组件访问。恶意应用利用已申请权限可以在未被授权的情况下读取、修改通讯录,拨打电话,发送地理位置,访问浏览器历史记录等。可能导致隐私数据泄露,钓鱼扣费等风险。企业或者监管机构从安全性考虑,禁止应用申请某些权限,采取最小权限的原则。
1.3 资源文件中包含APK检测
检测应用资源文件中是否包含APK。
应用的资源文件中包含的APK文件可能会携带恶意程序或造成其他不可预知的风险。
1.4 其他内容
- 第三方SDK列表
整理出应用使用的第三方SDK信息,及在应用中的作用。 - 应用权限列表
整理出应用中声明的权限信息,及在应用为和使用该权限。 - 恶意程序排查
2. 内容风险
2.1 特定图片检测
检测应用中是否含有色情、暴力等类型的图片。
应用中包含色情、暴力等类型的图片,可能会给企业带来法律、声誉以及其他不可预知的影响。
2.2 特定词汇检测
检测应用中是否含有企业关注的特定词汇。
应用中包含企业关注的特定词汇,特定词汇的范围由企业定义。在应用中如果包括这些词汇,可能会给企业带来法律、声誉以及其他不可预知的影响。
3. 行为检测
3.1 应用行为检测
整理当前应用的敏感行为,并说明其原因。
如:获取精准的GPS位置、开机时自动启动、直接安装应用程序等。
4. 数据库存储风险
4.1 测试信息泄露风险检测
检测应用是否存在测试信息,例如内网URL、手机号码等。
如果APK文件中存在内网URL地址,可能会被盗取并恶意利用在正式服务器上进行攻击如重放攻击,或者攻击安全薄弱的测试服务器以获取安全漏洞或者逻辑漏洞等。
应用正式发布前删除全部测试数据。
4.2 数据库注入漏洞
检测应用是否存在数据库注入漏洞。
SQL注入攻击指通过构建特殊的输入作为SQL的查询参数传入应用程序,从而欺骗应用程序执行恶意的SQL命令。Android应用开发时,如果开发者使用拼接字符串形式构造的SQL语句去查询底层SQLite数据库时,则容易发生SQL注入。攻击者可以利用此漏洞攻击应用的本地数据库,导致存储的敏感数据信息被查询泄露,例如用户名、密码等,或者产生查询异常导致应用崩溃。
不要使用拼接字符串形式构造的SQL语句去查询底层SQLite数据库,建议使用参数化查询方式来查询数据库。 修复代码示例如下: String sql = “SELECT * FROM table where name=?” ; sqldb.rawQuery(sql, new String[]{et_name.getText().toString()});
4.3 日志数据泄露风险检测
检测应用是否存在日志数据泄露风险。
调试信息函数可能输出重要的调试信息,其中包含的信息可能导致用户信息泄露,泄露核心代码逻辑等,为发起攻击提供便利,例如:Activity的组件名;通信交互的日志;跟踪的变量值等。
在发布程序之前关闭所有调试日志函数的调用,或者使用统一的Log控制类,这样可以更加方便的控制Log的输出打印。
4.4 URL硬编码风险检测
检测应用是否存在URL硬编码风险。
URL硬编码是指将URL地址信息以硬编码的方式写在应用代码中。攻击者反编译应用包后,可以获取应用包中的URL地址信息,并攻击其所在服务器。如果服务器的安全防范能力薄弱,攻击者可以破解服务器的安全防护措施,从而获取服务器上存储的敏感信息。
建议开发者自查,删除存在敏感信息的URL地址;采用动态生成的方式请求URL地址,不要硬编码在程序代码中。
4.5 RSA加密算法不安全使用风险检测
检测应用中是否存在RSA加密算法不安全使用情况。
RSA加密算法是一种非对称加密算法,是第一个既能用于数据加密也能用于数字签名的算法。当其密钥长度过短,通常认为长度小于512位时,就会存在较高的被破解风险;没有使用正确的工作模式和填充方式,将会存在重放攻击的风险。因RSA加密算法不安全使用造成的加密方法失效,可能造成客户端隐私数据泄露、加密文件破解、传输数据被获取、中间人攻击等后果,导致用户敏感信息被窃取。
1.使用RSA算法进行数字签名时,建议密钥长不要低于512位,推荐1024位。
2.使用RSA加密时,如果设置工作模式为ECB,建议填充方式为OAEPWithSHA256AndMGF1Padding。
4.6 AES/DES加密算法不安全使用风险检测
检测应用中使用AES/DES加密算法时是否使用了不安全的加密模式。
AES/DES是Android程序中常用的两种对称加密算法,其工作模式有ECB、CBC、CFB和OFB。当其使用ECB或OFB工作模式时,加密数据可能被选择明文攻击CPA破解。加密方法失效可能造成客户端隐私数据泄露、加密文件破解、传输数据被获取、中间人攻击等后果,导致用户敏感信息被窃取。
使用AES/DES算法时,当使用CBC和CFB工作模式。
4.7 FFmpeg文件读取漏洞
检测应用中是否存在FFmpeg文件读取漏洞。
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它提供了录制、转换以及流化音视频的完整解决方案。FFmpeg可以处理HLS(HTTPLiveStreaming)播放列表,而HLS播放列表可以引用外部文件。通过在AVI文件中添加自定义的包含本地文件引用的HLS播放列表,可以在文件播放过程中显示本地文件的内容。该漏洞可能导致服务器端以及应用内存储的个人身份信息、密码等重要敏感信息泄露。
4.8 证书文件明文存储风险检测
检测应用资源文件中的证书文件是否为明文存储。
应用中的证书文件被用来验证服务器的合法性,以及在与服务器通信的过程中对传输数据进行加密、解密,保证数据传输的保密性、完整性。证书文件明文存储可能导致如下风险:
- 攻击者可以篡改明文存储的公钥证书,进行中间人攻击,解密通过HTTPS协议传输的数据,窃取用户的账号、密码等敏感信息。
- 攻击者可以利用泄露的明文证书,批量向服务器发送数据请求,进行注册、刷单等操作,导致服务器相应异常或者损害开发者的利益等。
4.9 SD卡数据泄露风险检测
检测应用是否使用SD卡存储数据。
使用外部存储实现数据持久化,这里的外部存储一般就是指SD卡。使用SD卡存储的数据,不仅本应用访问,任何有访问SD卡权限的应用均可以访问。如果在SD卡上存储账号、密码等敏感信息,容易导致信息泄漏。
对数据进行持久化存储的时候,尽量避免重要信息存放在外部设备(SD卡)上。
4.10 数据越权备份风险检测
检测应用是否存在数据越权备份风险。
Android 2.1以上的系统可为APP提供应用程序数据的备份和恢复功能,该功能由AndroidMainfest.xml文件中的allowBackup 属性值控制,其默认值为true。当该属性没有显式设置为false时,攻击者可通过adb backup和adb restore对APP的应用数据进行备份和恢复,从而可能获取明文存储的用户敏感信息,如用户的密码、证件号、手机号、交易密码、身份令牌、服务器通信记录等。利用此类信息攻击者可伪造用户身份,盗取用户账户资产,或者直接对服务器发起攻击。
4.11 Internal Storage数据全局可读写风险检测
检测应用是否存在Internal Storage数据全局可读写风险。
Internal Storage是Android系统的本地数据存储方式之一,可将应用数据直接存储于设备的内置存储器中。当使用Internal Storage方式存储本地数据时,如果使用了MODE_WORLD_READABLE模式者MODE_WORLD_WRITEABLE模式,可能导致储存于Internal Storage文件中的敏感信息被其他应用读写,泄露文件中明文存储的账户密码、身份信息等敏感信息,或者篡改存在的用户信息、诱导用户误操作等。
4.12 密钥硬编码风险检测
检测应用是否存在密钥硬编码风险。
密钥硬编码是指在代码中直接将加密算法的密钥设置为一个固定值。加密算法本身都是公开的,加密内容的安全主要依赖于加密密钥。当密钥被硬编码在代码中时,攻击者可以通过反编译得到密钥,从而破解加密数据,获取加密前的明文信息。密钥硬编码,可直接造成加密数据被破解,客户端与服务器之间的通信内容被破解,导致应用内的加密文件被破解,或是用户的敏感信息泄露。
- 使用算法生成密钥。
- 若不使用算法生成密钥,则使用参数的形式传递密钥,使密钥与加密算法不在同一函数中。
4.13 WebView明文存储密码风险检测
检测应用的WebView组件中是否使用明文保存用户名及密码。
WebView组件默认开启了密码保存功能,会提示用户是否保存密码,当用户选择保存在WebView中输入的用户名和密码,则会被明文保存到应用数据目录的databases/webview.db中。攻击者可能通过root的方式访问该应用的WebView数据库,从而窃取本地明文存储的用户名和密码。
建议开发者通过WebView.getSettings().setSavePassword(false)来关闭WebView组件的密码保存功能。
5. 内部数据交互风险
5.1 动态注册Receiver风险检测
检测应用是否存在动态注册Receiver风险。
BroadcastReceiver组件可动态注册,即在代码中使用registerReceiver()方法注册BroadcastReceiver,只有当registerReceiver()的代码执行到了才进行注册,取消时则调用unregisterReceiver()方法。但registerReceiver()方法注册的BroadcastReceiver是全局的并且默认可导出的,如果没有限制访问权限,可以被任意外部APP访问,向其传递Intent来执行特定的功能。因此,动态注册的BroadcastReceive可能导致拒绝服务攻击、APP数据泄漏或是越权调用等风险。
1.在 AndroidManifest.xml 文件中静态注册 BroadcastReceiver,同时设置 exported=“false”。
2.必须动态注册 BroadcastReceiver时,使用registerReceiver(BroadcastReceiver, IntentFilter, broadcastPermission,android.os.Handle)函数注册。
5.2 PendingIntent错误使用Intent风险
检测应用是否存在PendingIntent调用隐式Intent或空Intent风险。
PendingIntent提供特殊的异步处理机制,实现跨APP的功能调用。PendingIntent可以将原始APP的权限临时赋予其他APP,这些权限用于执行PendingIntent的行为。即使原始APP已经关闭,其他APP也能继续执行PendingIntent的行为。使用PendingIntent时,如果使用了一个空Intent或者隐式Intent,会导致攻击者劫持并修改Intent的内容。这样可能导致原始APP的用户数据泄漏,攻击者可以利用原始APP执行恶意操作,例如恶意关闭系统、短信劫持、删除系统数据、篡改用户数据等。
5.3 拒绝服务攻击风险检测
检测应用中是否存在拒绝服务攻击的风险。
攻击者向Intent中传入其自定义的序列化类对象,当调用组件收到此Extra序列化类对象时,应用开发者没有对传入的数据做异常判断,导致应用崩溃。本地拒绝服务漏洞不仅可以导致应用的防护功能被绕过或失效(如杀毒应用、安全卫士、防盗锁屏等),也可以导致应用被大面积攻击而崩溃,造成不同程度的经济利益损失。
5.4 Content Provider数据泄露风险检测
检测应用是否存在Content Provider数据泄露风险。
Content Provider被用于在不同应用程序或者进程之间共享数据,而应用程序的不同数据内容应该具有严格的访问权限。如果权限设置不当,应用程序的Content Provider数据可能被其他程序直接访问或者修改,导致用户的敏感数据泄露,或者应用数据被恶意篡改,例如盗取账号信息,修改支付金额等。
5.5 Intent隐式调用风险检测
检测应用是否存在Intent组件隐式调用风险。
隐式调用Intent能够在不同应用间传递数据,但并未对Intent消息接收端进行限制,没有指明哪些接收方有权限接收该Intent。恶意程序指定相同的Action标识后,可以获取Intent中的数据,导致数据泄露、Intent劫持、仿冒应用、钓鱼应用等风险。
建议开发者自查,使用显示调用方式发送Intent,使用Intent.setPackage、Intent.setComponent、Intent.setClassName、Intent.setClass、new Intent(context,Receivered.class)中任一种方法明确指定Intent接收方。
6. 通讯传输风险
6.1 TTPS允许任意服务器主机名漏洞
检测应用使用HTTPS协议传输数据时是否允许任意服务器主机名。
使用HTTPS协议进行通信时,客户端需要对服务器身份进行完整性校验,以确认服务器是真实合法的目标服务器。如果没有校验,客户端可能与仿冒的服务器建立通信链接,即“中间人攻击”。Android允许开发者重定义证书的验证方法,当调用的setHostnameVerifier方法被配置为接受任何服务器主机名(ALLOW_ALL_HOSTNAME_VERIFIER)或者空的HostnameVerifier时,客户端可以与任意主机名的服务器(包括仿冒的服务器)建立通信链接,存在发生“中间人攻击”的风险。发生“中间人攻击”时,仿冒的中间人可以冒充服务器和客户端通信,也可以冒充客户端与服务器通信,从而截获通信内容,获取用户隐私信息。
6.2 联网环境检测
检测应用是否对联网环境进行检测。
使用代理服务器具有以下风险:突破中国电信的IP封锁,访问国外网站;隐藏真实IP;通信数据被监听或者篡改。应用使用代理服务器联网,可能导致客户端与服务器端通信的数据被监听和篡改,导致用户敏感数据泄露或者服务器被恶意攻击。
6.3 访问境外服务器风险检测
检测应用中ip、域名是否访问境外服务器。
应用程序访问境外服务器造成网络请求延迟、卡顿,被防火墙屏蔽网络请求出现访问无响应。
6.4 HTTPS未校验服务器主机名漏洞
检测应用使用HTTPS协议传输数据时是否校验主机名。
使用HTTPS协议进行通信时,客户端需要对服务器身份进行完整性校验,以确认服务器是真实合法的目标服务器。如果没有校验,客户端可能与仿冒的服务器建立通信链接,即“中间人攻击”。Android允许开发者重定义证书验证方法,使用HostnameVerifier类检查证书中的主机名与使用该证书的服务器的主机名是否一致。如果重写的HostnameVerifier不对服务器的主机名进行验证,即验证失败时也继续与服务器建立通信链接,存在发生“中间人攻击”的风险。发生“中间人攻击”时,仿冒的中间人可以冒充服务器和客户端通信,也可以冒充客户端与服务器通信,从而截获通信内容,获取用户隐私信息。
6.5 启用VPN服务检测
检测应用是否启动了VPN服务。
VPN(虚拟专用网络)的功能是在公用网络上建立专用网络,进行加密通讯。VPN网关通过对数据包的加密和数据包目标地址的转换实现远程访问。翻墙,指绕过相应的IP封锁、内容过滤、域名劫持、流量限制等,实现对海外敏感网站或邮件的访问。提供“翻墙”服务的VPN软件又叫“翻墙”软件,提供“翻墙”服务属于违法行为。同时使用恶意VPN联网时,通过网络请求的数据容易被劫持,造成用户敏感信息泄露。
6.6 HTTP传输通道风险检测
检测应用是否使用HTTPS协议对传输通道进行加密。
由于HTTP数据传输是明文传输的,导致HTTP数据容易被抓取、篡改,泄露用户的敏感数据,如账号、密码等。甚至通过中间人劫持将原有信息替换成恶意链接或恶意代码程序,以达到远程控制、恶意扣费等攻击意图。
6.7 SSL证书有效性风险检测
检测应用是否对客户端和服务端证书进行有效性校验。
使用HTTPS协议时,客户端必须对服务器证书进行完整性校验,以验证服务器的合法性。如果未校验,客户端可能与仿冒的服务器建立通信链接,同时服务端也可能与仿冒的客户端建立通信链接,即“中间人攻击”。Android允许开发者重定义证书验证方法,使用X509TrustManager类检查证书是否合法并且是否过期。如果重写X509TrustManager时,checkServerTrusted()方法对证书校验结果未做任何处理,即在证书验证失败时,仍然与服务器建立通信链接,存在发生“中间人攻击”的风险。当发生中间人攻击时,仿冒的中间人可以冒充服务器与客户端进行交互,同时冒充客户端与服务器进行交互,在充当中间人转发信息的时候,窃取手机号码、账号、密码等敏感信息,甚至可能对通信内容进行篡改。
7. 身份验证风险
7.1 输入监听风险检测
检测应用在敏感数据输入时是否使用不安全的系统键盘。
客户端的敏感界面如登录界面、注册界面、支付界面等,用户在输入敏感信息与显示(输出)时,如果未使用安全键盘,而使用第三方未知键盘或系统键盘的话可能存在数据被拦截与监听的风险,导致账号、密码等敏感数据泄露。
7.2 使用调试证书发布应用风险检测
检测应用是否使用了调试证书发布应用。
签名证书是验证APP开发者身份的关键标识,可用于判断APP是否是正版APP,是防止APP被二次打包的重要措施。调试证书是adt插件或者ant工具生成的,名字和密码已经预先定义、不能修改的签名证书。使用调试证书发布正式APP,可能导致APP无法在应用市场上架;调试证书有效期仅有一年,一旦此调试证书失效,则使用该调试证书的APP将无法更新升级;使用调试证书,可能导致签名校验失效,导致APP被二次打包。
7.3 截屏攻击风险检测
检测应用界面是否允许被录屏或截图。
截屏攻击是指在APP运行过程中,界面被监控并且截屏或者录屏。截屏攻击主要发生在APP登录、身份认证、资金操作等界面。Android5.0中增加了一个MediaProjection接口,它提供截屏或者录屏的服务,准许APP拥有截取屏幕或者记录系统音频的能力。同时系统允许其他消息窗口覆盖在系统的录制提示上,从而在用户无感知的情况下启动录屏或者截屏工具。通过此方式,攻击者可以获取APP关键界面的截图或者录像,从而获取用户的敏感信息。
在Activity的oncreate()方法中调用getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);或者getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);达到防止截屏攻击的目的。
8. 组件风险
8.1 WebView远程代码执行漏洞
检测应用是否存在WebView远程代码执行漏洞。
Android API level 17以及之前的版本,由于程序没有正确限制使用addjavascriptInterface方法,远程攻击者可通过使用Java Reflection API利用该漏洞执行任意Java对象的方法。通过addJavascriptInterface给WebView加入一个 JavaScript桥接接口,JavaScript通过调用这个接口可以直接与本地的Java接口进行交互。导致手机被安装木马程序,发送扣费短信,通信录或者短信被窃取,甚至手机被远程控制。
如果一定要使用addJavascriptInterface接口,需使用以下方法:
- 设置minSdkVersion值大于或等于17,使应用不能在4.2以下系统上运行。
- 允许被JavaScript调用的函数必须以@JavascriptInterface进行注解。
8.2 Service组件导出风险检测
检测应用Service组件是否存在导出风险。
Service组件的最小化特权是指组件只能自身调用,其他应用无权访问,即组件不导出。Service执行的操作比较敏感,比如更新数据库、提供事件通知等,如果设置了导出权限,可能被系统或者第三方的App直接调出并使用。Service导出可能导致拒绝服务攻击,程序功能被第三方恶意调用等风险。
开发者自查,设置AndroidManifest.xml文件中Service组件EXPORTED属性为false,对于必须导出的组件必须限制于授权用户或者特定应用组件,并且不要给未知名的Service传递Intent。
8.3 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.4 WebView跨域访问漏洞
检测应用是否存在跨域访问漏洞。
在Android应用中,WebView开启了file域访问,允许file域访问http域,且未对file域的路径进行严格限制。攻击者通过URL Scheme的方式,可远程打开并加载恶意html文件,远程获取用户隐私数据(包括手机应用数据、照片、文档等敏感信息),还可窃取用户登录凭证,在受害者毫无察觉的情况下实现对APP用户账户的完全控制。
- 若file域访问为非功能需求时,手动配置setAllowFileAccessFromFileURLs或setAllowUniversalAccessFromFileURLs两个API为false。(Android4.1版本之前这两个API默认是true,需要显式设置为false)
- 若需要开启file域访问,则设置file路径的白名单,严格控制file域的访问范围,具体如下:
a. 固定不变的HTML文件可以放在assets或res目录下,file:///android_asset和file:///android_res 在不开启API的情况下也可以访问。
b. 可能会更新的HTML文件放在/data/data/(app) 目录下,避免被第三方替换或修改。
c. 对file域请求做白名单限制时,需要对“…/…/”特殊情况进行处理,避免白名单被绕过。- 避免App内部的WebView被不信任的第三方调用。排查内置WebView的Activity是否被导出、必须导出的Activity是否会通过参数传递调起内置的WebView等。
8.5 未移除有风险的WebView系统隐藏接口漏洞
检测应用是否移除有风险的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这三个接口。
8.6 Activity组件导出风险检测
检测应用Activity组件是否存在导出风险。
Activity的最小化特权是指组件只能自身调用,其他应用无权访问,即组件不导出。Activity组件设置导出权限,则该组件能够被外部的其他组件直接调用,这样就可能导致泄露隐私数据或者应用程序崩溃等风险。Activity被恶意应用调用,可能有以下威胁描述:修改程序的状态或者数据;被调用的Activity可能返回隐私信息给恶意应用,造成数据泄露;可能使应用程序崩溃,造成拒绝服务等漏洞。
开发者自查,设置AndroidManifest.xml文件中Activity组件EXPORTED属性为false,对于必须导出的组件必须限制于授权用户或者特定应用组件,并且尽量不包含任何的Intent Filter。
8.7 Intent Scheme URL攻击风险检测
检测应用中是否存在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个策略。
8.8 Fragment注入攻击漏洞
检测应用中是否存在Fragment注入攻击漏洞。
Activity可包含多个Fragment来分区域展示界面,PreferenceActivity是支持Fragment的基类Activity,其根据传入的参数动态创建Fragment实现界面展示。当PreferenceActivity的Activity是属性为export,攻击者可以调用此PreferenceActivity并为其提供构造的特定数据,如果数据没有正确处理或者未经目标应用验证,就可以绕过权限限制任意调用应用内部的任意Fragment。Fragment注入攻击可导致应用的敏感信息泄露、远程代码执行或者应用崩溃。
8.9 Broadcast Receiver组件导出风险检测
检测应用Broadcast Receiver组件是否存在导出风险。
Broadcast Receiver组件的最小化特权是指组件只能自身调用,其他应用无权访问,即组件不导出。从全局考虑Broadcast Receiver可以方便应用程序和系统、应用程序之间、应用程序内的通信,对单个应用程序而言Broadcast Receiver是存在安全性问题的,比如恶意程序可以不断的去发送你所接收的广播,这样会造成应用被攻击,导致应用直接退出、处理逻辑出错等风险。
开发者自查,设置AndroidManifest.xml中的Broadcast Receiver组件EXPORTED属性为false,对于必须导出的组件必须限制于授权用户或者特定应用组件。
8.10 Content Provider组件导出风险检测
检测应用Content Provider组件是否存在导出风险。
Content Provider组件的最小化特权是指组件只能自身调用,其他应用无权访问,即组件不导出。Content Provider组件对外导出后可被第三方恶意程序调用,会产生本地SQL注入、文件遍历等风险,造成用户敏感信息泄露。
8.11 WebView组件忽略SSL证书验证错误风险检测
检测WebView组件是否存在忽略SSL证书验证错误。
Android WebView组件加载使用HTTPS协议加密的网页时,如果服务端校验证书错误,客户端应该拒绝加载网页。但是如果发生证书认证错误时,调用WebViewClient类的onReceivedSslError方法,并在该方法实现中调用了handler.proceed()来忽略该证书错误,则客户端会绕过证书校验错误继续加载此网页。这样会导致“中间人攻击”,攻击者可以冒充中间人,在客户端和服务端中间转发信息,窃取账号、密码等敏感信息。
当发生证书认证错误时,采用默认的处理方法handler.cancel(),停止加载问题页面。
9. 源文件风险
9.1 篡改和二次打包风险检测
检测应用是否进行完整性验证保护。
应用完整性验证即验证APK中的文件是否被修改或者删除。对于未进行完整性验证的APP,攻击者可以通过反编译工具对APK反编译后,随意修改或删除APK中的资源文件、源码文件、配置文件等,二次打包成其他应用,导致大量盗版应用的出现,损害开发者的利益;还能添加恶意代码,实现应用钓鱼,窃取登录账号密码、支付密码等等。
9.2 仅使用Java代码风险检测
检测应用是否仅使用了Java代码。
Android开发本地代码时,有两种方式,一种是使用javah生成头文件,然后编辑源代码;另一种不用生成头文件,直接编辑代码后,使用RegisterNatives方法进行注册,是运行在JVM外的Native代码。针对第一种方式,使用javah生成头文件,枚举Java声明的Native方法,事实上可以查找到对应的函数,使用工具可以轻易获取到源代码,造成源代码泄露。
9.3 Java代码反编译风险检测
检测应用是否存在被反编译后泄露源代码的风险。
Android应用如果未采用有效的保护措施,可能面临被反编译的风险。反编译是将二进制程序转换成人们易读的一种描述语言的形式,是逆向工程中的常见手段。反编译的结果是易读的应用程序代码,这样就暴露了Android应用客户端的所有逻辑,比如与服务端的通讯方式、加解密算法、密钥、转账业务流程、软键盘技术实现等等。攻击者可以利用这些信息窃取客户端的敏感数据,包括手机号、密码;绕过业务安全认证流程,直接篡改用户账号信息等。
9.4 代码未混淆风险检测
检测应用程序中Java代码是否进行过混淆。
由于Java代码容易被工具反编译,反编译后可用jd_gui工具查看到源码。如果Java代码未进行混淆,会导致应用源代码清晰的呈现在工具上,这样就暴露了客户端所有逻辑,比如与服务端的通讯方式、加解密算法、密钥等。攻击者可以利用这些信息窃取客户端的敏感数据,包括手机号、密码;绕过业务安全认证流程,直接篡改用户账号信息等。
9.5 IPV6检测
检测应用代码中是否硬编码了IPV6地址。
将IP地址硬编码在代码中,使得变量不易改变,一旦服务器主机IPV6地址变化,对应也要把代码中所有变化的硬编码的IPV6地址修改,维护起来比较繁琐。
9.6 资源文件泄露风险检测
检测应用中的资源文件是否存在被查看分析风险。
APK中包含多种类型的资源文件,例如图片、ICON、H5文件等,直接对APK进行解压缩就可以查看APK中的资源文件,窃取应用图标,篡改H5文件,植入钓鱼页面或者恶意代码,造成用户的敏感信息泄露。
9.7 SO文件破解风险检测
检测应用程序中的SO文件是否进行加固。
SO文件为APK中包含的动态链接库文件,Android利用NDK技术将C/C++语言实现的核心代码编译为SO库文件供Java层调用。SO文件被破解可能导致应用的核心功能代码和算法泄露。攻击者利用核心功能与算法可轻易抓取到客户端的敏感数据,并对其解密,导致用户的隐私泄露或直接财产损失。
建议使用专业安全加固方案,对APK中的SO文件进行加固保护。
9.8 单元测试配置风险检测
检测应用是否存在单元测试配置。
应用Androidmainfest.xml文件保留有单元测试配置项或者源码中保留有单元测试代码,容易导致客户端功能暴露,可能导致泄露客户端关键业务逻辑。
9.9 H5文件泄露风险检测
检测应用资源文件中的H5文件是否加固。
应用中如果存在明文存储的H5资源文件,则会泄露页面基本布局和一些重要的信息,如登录界面、支付界面等。攻击者可篡改H5资源文件,可能植入钓鱼页面或者恶意代码,导致用户账号、密码、支付密码等敏感信息泄露。更有甚者,通过H5代码暴露相关活动的业务逻辑,可能被黑产团队用来刷红包、薅羊毛等,造成经济损失。
建议使用专业安全加固方案,对应用中的H5文件进行加固保护。
9.10 应用签名未校验风险检测
检测应用是否进行签名校验保护。
签名证书是APP开发者身份的唯一标识,开发者可利用签名证书有效降低APP的盗版率。未进行签名证书校验的APP,被反编译进行二次打包后,仍可以正常运行。可能导致APP被仿冒盗版,甚至可能被添加钓鱼代码、病毒代码、恶意代码,导致用户敏感信息泄露或者恶意攻击。
10. 安全防护风险
10.1 从SD卡加载DEX风险检测
检测应用是否动态加载外部代码。
Android4.1之前的系统版本允许Android应用动态加载存储在SD卡中的DEX文件。如果DEX文件被注入恶意代码或被恶意程序替换,同时客户端未对DEX文件进行有效校验时,将会导致攻击者的恶意代码被自动执行,可以实现窃取输入的账号、密码、通讯数据等。
10.2 Janus签名机制漏洞
检测应用是否存在Janus漏洞。
Google在2017年12月发布的安卓系统安全公告中披露“Janus”漏洞(漏洞编号:CVE-2017-13156)。该漏洞可以让攻击者绕过安卓系统的signature scheme V1签名机制,直接对APP进行篡改。由于安卓系统的其他安全机制也是建立在签名和校验基础之上,该漏洞相当于绕过了安卓系统的整个安全机制。攻击者可以在正常应用中植入恶意代码,可替代原有的APP做下载、更新。安装这些仿冒APP后,攻击者可以窃取用户的账号、密码等敏感信息;或者植入木马病毒,导致手机被ROOT,甚至被远程操控。
10.3 ZipperDown风险检测
检测应用中是否存在ZipperDown漏洞。
当前大量应用均会读取zip压缩包进行相关业务,最常见的场景就是从服务器下载压缩包,进行资源、代码热更新。在解压zip包时,如果对文件名没有进行限制,通过在文件名加上“…/…/”前缀的方式,可以将文件解压到任意路径。如果攻击者用远程劫持或者本地替换等方式将APP将要加载的正常zip包替换为带有路径前缀的恶意zip包,而APP又未对解压文件的文件名称进行处理,则攻击者可以对应用资源、代码进行任意篡改、替换,从而实现远程代码劫持等。
10.4 模拟器运行风险检测
检测应用是否允许在终端模拟器中运行。
Android模拟器是指运行在电脑中的虚拟设备,可以预览、开发和测试APP。在模拟器中运行,可能带来如下安全风险:模拟多个设备,进行虚假注册、刷单、薅羊毛等;模拟虚假位置,发送位置欺骗信息;适用于大多数的外挂程序,导致用户挂机刷任务,破坏APP的公平性;存在后台程序,导致用户在模拟器中输入的敏感数据(APP账号和密码等)被窃取。
10.5 从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文件替换,将导致恶意代码执行,导致用户敏感信息泄漏、恶意扣费、病毒注入等风险。
建议使用System.loadLibrary()函数动态加载SO文件,不要使用System.load()函数。
10.6 随机数不安全使用风险检测
检测应用是否存在随机数不安全使用风险。
SecureRandom随机性是通过它的seed来保证的,输入相同的seed会导致生成相同的随机数。在默认情况下,SecureRandom会从系统中找到一个默认随机源,每次生成随机数时都会从这个随机源中取seed,这种方式是安全的。当我们调用setSeed方法指定seed替代系统的默认随机源时,例如指定当前系统时间作为种子,如果同一毫秒连续调用,则得到的随机数是相同的。该漏洞存在于Android系统随机生成数字串安全密钥的环节中,这会导致使用的随机数或加密算法被破解。
10.7 终端ROOT状态检测
检测应用运行时对终端是否ROOT进行检测。
终端在ROOT条件下,可能被攻击者获取ROOT权限。攻击者获取了ROOT权限可以随意访问任意应用储存的任何数据,造成数据泄露、数据非法篡改等风险。
10.8 Java层代码动态调试风险检测
检测应用是否允许Java层代码动态调试。
应用配置文件AndroidManifest.xml中的调试标记开启,可被Java调试工具如JDB进行调试,获取和篡改用户敏感信息,甚至可以分析并且修改代码实现的业务逻辑,例如窃取用户密码、绕过验证码防护等。
10.9 动态注入攻击风险检测
检测应用是否存在动态注入攻击风险。
Android动态代码注入是不修改源程序只修改目标进程的寄存器、内存值等就能控制程序实现既定目标的一种方法。通过动态注入,攻击者可以劫持目标进程函数、窃取目标进程数据、篡改目标进程数据等,从而监控程序运行、获取敏感信息等。常见的动态注入,可以获取登录账号、密码等。
10.10 C层代码动态调试风险检测
检测应用是否存在C层代码动态调试风险。
Android C 层代码动态调试漏洞是指在程序运行过程中,恶意程序或者人工可以通过动态调试技术,对程序进行内存调试跟踪,可以窃取目标进程的数据信息,从而获取用户的隐私数据信息。
10.11 启动隐藏服务风险检测
检查应用中是否启动隐藏服务。
一般的应用会以界面形式启动程序,隐藏程序启动Activity的应用易被安全检测工具误识别为恶意应用木马、病毒等,也可能存在感染恶意木马和病毒的风险。
10.12 未使用编译器堆栈保护技术风险检测
检测应用是否使用编译器堆栈保护技术。
缓冲区溢出指程序对接收的输入数据长度没有进行有效检测,向缓冲区内填充数据超过了缓冲区本身的容量,导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他合法的数据。利用缓冲区溢出漏洞发起攻击,可以导致程序运行失败、系统关机、重新启动,或者执行攻击者的命令,比如非法提升权限等,窃取用户的敏感信息等。Stack Canaries漏洞探测技术,可以对缓冲区溢出进行有效预警。在所有函数调用发生时,系统通过检测栈帧中的canary数值来判断是否发生了栈溢出漏洞。发生缓冲区溢出时,程序将输出错误消息并终止执行。
建议开发者使用gcc编译时,使用以下参数gcc -o demo demo.c -fstack -protector -all;或者使用NDK编译SO文件时,在Android.mk文件中增加以下参数LOCAL_CFLAGS := -Wall -O2 -U_FORTIFY_SOURCE -fstack-protector-all。
10.14 私有函数调用风险检测
检测应用是否存在私有函数反射调用风险。
Android系统级API中包含大量的类,这些底层类共有的API可以直接被调用。调用系统未开放的私有API需要突破系统的限制,使用反射调用能够做到。Google之所以将有些API隐藏,可能是因为这些API属于内部逻辑,不能对外暴露;也有可能是API接口还未最终确定下来。所以在低版本Android系统上的隐藏API不一定能在高版本的Android上使用,也就说隐藏API的兼容性比较差,调用私有函数可能导致应用兼容性、稳定性方面的问题。
检测依据
*《GB∕T 34978-2017 信息安全技术 移动智能终端个人信息保护技术要求》
*《GB∕T 34975-2017 信息安全技术 移动智能终端应用软件 安全技术要求和测试评价方法》
*《GAT 1390.3-2017 信息安全技术 网络安全等级保护基本要求 第3部分:移动互联安全扩展要求》
*《JR/T 0092-2019 中国金融移动支付客户端技术规范》
*《JR/T 0095-2012 中国金融移动支付应用安全规范》
*《电子银行业务管理办法》
*《电子银行安全评估指引》
以上是关于Android应用安全检测项目的主要内容,如果未能解决你的问题,请参考以下文章
带有 angularJS web 应用程序和 android 应用程序的 spring 安全性
Android Multi-tracker 示例项目运行但未显示任何形式的检测
错误记录Android 应用安全检测漏洞修复 ( StrandHogg 漏洞 | 设置 Activity 组件 android:taskAffinity=““ )