AD

手机AV(防病毒应用)的安全性

概述

       德国的SIT是一个专门研究移动安全团队,他们对市面上的几个手机AVAntivirus)安全软件进行了测试研究。发现了安全软件自身存在的一些安全问题。

AndroHelm Antivirus

概述

       被测版本为1.6,运行在android5.0系统上,可以被远程利用成功。
1.       该应用存在多个缺陷,可以导致本地/远程攻击者利用这些缺陷,导致程序崩溃。
2.       该程序的支付严重存在问题,可以利用该问题免费使用PRO版本的所有功能。
3.       在设定好防盗功能后,该应用存在一个逻辑漏洞,可以让攻击者在远程无需任何身份验证下激活手机。
经过SIT团队的测试,可以利用短信触发漏洞进行攻击及获取在SharedPreferences中存储的敏感信息(缺少服务的验证)

通过不完整的短信进行攻击

       攻击者可以远程发送一个特殊构造的SMS来触发漏洞,也可以在本地模拟发送一个SMS或者payload来触发漏洞。一个不含有正常/常规电话号码的使用字符串替代的短信,会导致AndroHelm崩溃并且/或绕过短信黑名单过滤功能。
       针对手机防盗功能,AndroHelmSMSMonitor类中有以下逻辑处理过程:如果没有设置好友/紧急联系电话号码,攻击者可以利用预先设置好的短信激活该功能/场景。一般情况下,接收到的防盗短信大概这样:
短信密码 wipe 或者
短信密码lock PIN密码
在源代码中,这个防盗短信将会和带有空格参数的split函数(split(" "))进行比较,如果防盗功能是禁用状态,则密码将和一个空字符串进行比较。所有可以设置一个空字符串作为密码,可以构造一个以空格开头的短信,如下:
[空格] wipe[空格]其他字符
如果攻击者发送一个空内容和空白数字的短信,则对应的命令(wipelock)即可执行。如下:
[空格]command[空格] 其他字符 

通过Shared Preferences中存储的敏感信息进行攻击

       存储在Shared Preferences中的敏感信息存在缺陷,首先是防盗密码,被明文存储在Shared Preferences文件中。存储结构如下:
sd
password
friendpassword
test
       其次,无效的支付信息也可以激活AndroHelmPRO功能,因为PRO功能的验证仅仅在手机端本地进行,并且SharedPreferences中的文件,用户无需root权限即可修改。使用RE文件打开 “com.androhelm.antivirus.free.preferences.xml”文件,将其中的“isPro”字段的值改为”true” ),或者使用adb将配置文件备份到本地,修改后重新更新到手机,即可激活PRO的所有高级功能。

Avira

概述

       被测版本为4.2,运行在android5.0系统上,可以被远程利用成功。
1.       该应用存在某些问题,可以导致中间人攻击及本地攻击。
2.       该应用在安装时或者用户手动触发时进行检查更新,更新数据采用http模式,未进行加密。
攻击者可以利用中间人攻击,修改该应用的请求和响应数据,重定向流量到指定的服务器替换文件。更新进程会检查签名信息,Avira也会验证下载文件的数字签名,但可以通过一些手段绕过这两个安全措施。
经过SIT团队验证,可以实现如下攻击:
1.       攻击者可以替换下载的病毒识别库文件;
2.       使用一个受损的/特殊构造的文件覆盖程序自身的二进制(.so)文件,在用户不知情的情况下停用病毒扫描引擎,造成拒绝访问攻击;
3.       本地拒绝访问攻击。

替换病毒识别库文件

       可以通过中间人攻击,重定向流量,使用特殊构造的axvdf-common-int.info,让一个空的文件代替正常的病毒识别库文件。
通过修改标签入口模块中包含的文件信息(md5校验和、zip md5校验和、文件大小等),可以让更新程序下载攻击者指定的空.vdf文件。更新程序只考虑到了下载文件的md5值,但没考虑到文件完整性的校验保护。修改的文件或者新增加的文件并不进行完整性校验,这些新增的文件从重定向到服务器下载到手机中的临时文件夹中,位于“/data/data/com.avira.android/bin/antivirus”目录。扫描引擎以及用户接口也不会向用户提供任何错误信息。

停用扫描引擎

       攻击者可以使用一个非二进制文件覆盖Avira的扫描引擎文件(libaescn.so),使扫描功能失效。扫描功能挂掉后,会在log接口产生一个日志。
       E/Avira Mobile Security( 2257): Antivirus - Failed to initialize scan
engine - Error = 121
E/Avira Mobile Security( 2257): Antivirus - Rolling to backup
但是应用层面的用户接口并不会显示扫描引擎那边的错误日志信息,从而导致Avira会显示一个没有任何病毒发现的扫描任务。
因为aengine-arm_linux_androideabi-int.info缺少对文件的完整性校验,所以可以在其中添加一个区块,如下:

更新程序会检查下载文件的签名信息,所以无法远程注入的代码无法正常工作。但可以通过修改Avira签名过的文件的内容(例如aevdf.dat),然后将其重命名为libaescn.so文件,即可绕过签名验证,覆盖掉原来的libaescn.so文件。
另外还有libmavapi.so文件会被扫描引擎调用,可以被本地二进制程序修改。但暂时还没找到在不打破沙箱的情况下(获取root权限)如何远程注入。

本地决绝服务攻击

       Avira的源代码中,广播接受器没有对NULL值做检查,导致可以通过发送一个空的SMS广播,引起Avira崩溃。命令如下:
       am broadcast -a android.provider.Telephony.SMS_RECEIVED
       注意,在最新的android棒棒糖版本中,已经对这种NULL值做了限制,但在该版本之前的Avira,均会受到这个问题的影响。

金山手机毒霸国际版

概述

       被测版本为2.7.32.8.5,运行在android系统上,可以被远程利用成功。
       金山手机毒霸国际版(以下简称CM)存在中间人攻击问题,以及多种不同的点击劫持。另外,还有一个导出服务(ks.cm.antivirus.defend.DefendService)没有权限校验,可以被本地应用利用。

     中间人攻击/代码注入/签名文件替换

       更新程序走未加密的HTTP流量。攻击者可以利用无线热点,重定向流量到伪造的升级服务器。
       CM的更新过程如下:
1.CM加载version_data.ini文件,该文件包含程序更新版本信息,以及info_data.ini文件的路径。info_data.ini文件包含其他文件信息,该文件存储在一个以.MD5值为文件名的zip文件中。
2.info_data.ini包含更新程序需要下载的文件的路径和名称,这些文件包含防火墙规则数据库、病毒库、执行参数以及本地执行.so文件。info_data.ini却没有完整性保护措施,导致攻击者可以任意修改该文件。
攻击者可以使用空文件替换.db文件,从而导致CM无法检测到病毒。最危险的是攻击者可以加载执行,本地二进制文件,攻击者可以注入/替换一个二进制文件。在2.7.3及以前的版本,可以找到存在如下下载:
       匹配到info_date.ini文件中对应的md5值和文件大小后,可以触发更新下载。导致从假冒更新服务器下载文件。
       攻击者可以将更新中的二进制文件(ibavlm.so)替换为其他恶意文件,更新程序将会下载并执行。
       注意,在2.8.5中已经无法下载二进制文件。

     点击劫持

       CM导出的大量activate和应用接口可以被第三方程序调用。其他恶意程序可以调用程序的部分功能,然后在上面放置一个其他遮挡页面,诱导用户关闭CM的一些安全防护功能。

ESET手机版防病毒软件

概述

       被测版本为3.2.4.0,运行在android4.2.2系统上,可以被远程利用成功。
       ESET手机版防病毒软件(以下简称MSA)使用了不正确的SSL证书验证,可以导致攻击者解密其流量。攻击者可以窃取MSA的证书信息或者用户的用户名及密码。
       MSA的扫描器在手机设备本地代码实现了加密方案,但违反了Kerkhoffs 原理(隐藏密钥,而不是隐藏算法)。其使用的加密方案很容易被攻破,使密文可以转换成为明文内容,SIK编写提供了一个POC脚本进行了测试。

不正确的SSL证书验证

       MSA的源代码进行了混淆,所以下面的类及方法的名称都是混淆后的名称。
       J1类实现了X509TrustManager接口,checkServerTrusted方法定义了这个接口,用于处理服务器证书验证。在实际情况下,这个方法是空的,意味着并没有验证服务器证书以及整个证书链。
       攻击者可以利用无线热点,窃听SSL流量,因为MSA信任所有的证书。使用中间人攻击,窃取注册时的流量如下:

TYPE="STRING"/>
LicenseUsername" VALUE="Fdax6a7wj/I+ZEet" TYPE="STRING"/>
LicensePassword" VALUE="Fdax6a7wj/I=" TYPE="STRING"/>
12
VALUE="JNaV6Yvw1vJrZAStgsgqddgxE7x6+OkMc9013Q==" TYPE="STRING"/>
TYPE="STRING"/>



       通过中间人攻击,攻击者也可以窃取到AV证书中的用户名密码,在上面的流量中,可以看到用户凭证采取的是BASE64方法弱加密。攻击者甚至无需进行解密,直接转发该XML文件即可获得该用户的认证权限。

选择密文攻击和解密算法

       SIT团队的成员,并没有完全反向出来应用的源代码,但通过选择密文攻击的方法攻破了加密方案。
       MSA的对输入的值使用一个随机数key进行XOR加密,为了获取密钥,例如一个25‘a’组成的用户名,经过MSA的加密后再进行base64 那可以先解码base64,然后异或25次字符‘a’,每次异或第二个byte,使其成为50byte的字符。即可获取到一个长度为25bytekey
       SIT团队开发了一个POC脚本,可以将解密25及字符内的户名及密码。
       POC代码如下:
      
#!/usr/bin/python2.7
"""
Created on Mon Nov 30 16:39:39 2015
@author:
"""
key = [97, 212, 221, 251, 91, 53, 183, 25, 236, 43, 66, 217, 75, 7, 198, 8,
17, 81, 212, 184, 191, 169, 203, 45, 123]
def decrypt(inString, key):
    inString = bytearray( inString.decode("base64") ) # decode as base64
    inString = inString[::2] # take every second char
    result = list()
    for i, c in enumerate( inString ):
        cipher = c ^ key[i]
        result.append( chr(cipher) )
    return result

print("Type 'q' to quit")

while True:
    inputString = raw_input("Enter base64 string to decrypt: ")
    if inputString == "q":
        exit()
       
    try:
        res = decrypt( inputString, key )
        print("Input: " + inputString)
        print("Encrypted: " + ''.join(res) + "\n")
    except:
        print("* Cannot decode base64 string!")

Kerkhoffs 原理

加密系统在攻击者已知加密原理和算法、但不知道相应密钥 时仍是安全。

Kaspersky Internet Security

概述

被测版本为1.9.4.1294,运行在android系统上,可以被远程利用成功。
KIS使用不加密的HTTP数据流下载广告信息,http://ipm.kaspersky.com/600eb07a-2926-4407-b014-d3e8c77b0086.ziphttp://ipm.kaspersky.com/eeea9321-5eac-4709-9046-8475ee951c82.zip这两个。其下载的这两个ZIP文件中包含有一些HTMLCSS文件,用于向使用者显示广告信息。攻击者可以利用中间人攻击,替换ZIP文件。

文件替换及执行

KIS会将下载的ZIP文件解压至KIS目录下的/app_ipm/文件夹中,如果攻击者替换掉的ZIP文件中包含有一个pdm.jar文件,则KIS会执行pdm.jar文件。一旦KIS执行该文件,则原本位于/app_bases/目录下的同名pdm.jar会被覆盖。可以利用解压缩到特性,将文件解压至指定的文件夹。构造一个特殊的解压路径如下:
../../../../../../../../../../../../../../../../../../../../../../data/data/com.kms.free/app_bases/pdm.jar”
pdm.jar会被KIS执行,并且覆盖app_bases/目录下的同名pdm.jar

Malwarebytes Anti-Malware

概述

       被测版本为2.00.3.9000,运行在android5.1.1系统上,可以被远程利用成功。
       MAM使用不加密及无需认证的的HTTP数据流下载更新。更新程序下载的文件使用对称加密算法进行加密,密钥存储在手机设备本地。
       其次,MAM证书检查存在缺陷,导致SSL加密算法存在缺陷。
       最后,本地广播消息可以导致MAM崩溃。

未保护的更新

       MAM更新使用HTTP流量,并且没有认证及完整性保护措施,文件签名使用在程序中硬编码的静态key,使用gzip压缩算法。该key“TI028Z%th5Y'uX4>dQz|26ULy+.z5$;w)YG2G8ac!9\"{T!W*lp92k@CltD29+(W”zlib压缩仿冒签名文件使用一个静态keyxf4kfh9dlk483jmfbn5ujf8dj46m7i8fj4mf96adfh543)进行md5
       攻击者提取到key可以操控升级文件。此外,RC4这个加密算法不应继续使用。

SSL可被解密

       MAM对源代码进行了混淆,在类ara中,checkServerTrusted方法被重载,但并没有验证SSL证书链。
public void checkServerTrusted(X509Certificate[] chain, String s){
int v1 = chain.length;
for(int v0 = 0; v0 < v1; ++v0) {
chain[v0].checkValidity();
}
}
       该方法仅仅验证了证书链的有效期(有效区间),攻击者可以使用一个在有效期内的自签名证书解密SSL流量。

本地拒绝访问攻击

       MAM的发ScAppInstallReceiver.class类没有对NULL值进行校验,发送一个空白的安装包广播可以引起MAM崩溃。例如使用如下命令:
       am broadcast –n org.malwarebytes.antimalware/org.malwarebytes.antimalware.security.scanner.
receiver.ScAppInstallReceiver
       Avira一样,在最新的android棒棒糖版本中,已经对这种NULL值做了限制,但在该版本之前的MAM,均会受到这个问题的影响。

McAfee (Intel Security)

概述

       被测版本为4.5.0.601,运行在android5.0.1系统上,可以被远程利用成功。
       MIS的安全浏览器模块包含一个XSS漏洞。其次应用存在漏洞,本地恶意程序可以停止/退出MIS

XSS漏洞

       MIS的安全浏览器模块是为了隔离恶意网页,如果用户访问一个恶意页面,则该模块会阻止访问该页面,并且弹出McAfee站点保护提示告警页面。但是这个提示页面本事存在XSS漏洞:
      

评论

此博客中的热门博文

简单粗暴导出小米便签

我——终于一个人了

Ubiquiti_Networks_UniFi_Cloud_Key_authed_rce