开发一个基于Dalvik字节码的相似性检测引擎,比较同一款Android应用程序的不同版本之间的代码差异(二)

本文介绍了如何利用Dalvik字节码和Redex工具分析Android应用不同版本间的代码差异,以揭示漏洞和篡改。通过案例分析CVE-2019-10875,展示了如何检测URL欺骗漏洞及其补丁效果。同时,通过Redex去除混淆代码,提高代码对比的准确性,以检测被修改的应用。
摘要由CSDN通过智能技术生成

上文我们说过,《针对Dalvik字节码的相似性检测引擎,比较同一款Android应用程序的不同版本之间的代码差异》这篇文章计划分两个部分来讲解,上文只介绍了如何利用Quarkslab公司开发的diff引擎。本文我们将介绍一个用例:URl欺骗漏洞(CVE-2019-10875) ,另外还会介绍如何将Redex与diff工具相结合,检测被混淆处理的应用程序中到底发生了哪些修改?

CVE-2019-10875漏洞及缓解措施的分析

CVE-2019-10875漏洞介绍

mint browser(薄荷浏览器)是小米专门为安卓手机用户设计的一款轻量级浏览器应用,这款软件内存很小,设计的十分简洁,但是该有的功能一应俱全,支持语音搜索,能够带给用户更好的浏览体验。不过就在2019年4月,研究人员曝出小米薄荷浏览器存在URL欺骗漏洞,攻击者可把恶意链接伪装成权威网站的URL,对受害者进行钓鱼攻击。之后虽然小米公司迅速发布了安全补丁,但有人发现安全补丁存在严重的问题,只需要简单添加几个字母,就可绕过。该漏洞是CVE-2019-10875。粗略地说,小米薄荷浏览器为了提升用户体验,在当你打开某个网络链接时,若链接类似于https://www.google.com/?q=www.domain.com时,则网址栏就只会显示www.domain.com,也就是只显示?q=后面的字段。因此,一旦攻击者构造https://www.evil.com/?q=www.google.com这类的链接进行钓鱼攻击,受害者则只会在网址栏看到www.google.com,相信任何人都不会怀疑谷歌是钓鱼网站。当攻击者输入https://www.andmp.com/?q=www.google.com时,跳转成功后,可看到地址栏显示www.google.com,但页面其实是www.andmp.com的内容,这种URl欺骗漏洞攻击者利用起来毫无难度,仅仅只需要编造一个简单的恶意链接。

这就会造成,攻击者可以利用此安全漏洞作为网络钓鱼活动的一部分。该漏洞会影响1.6.1或更低版本,所以为了安全,请尽快升级到1.6.3版。PHP大马

现在,让我们假设有人想快速理解这个漏洞是如何工作的。要做到这一点,最快的方法是在发现到这个漏洞之后查看开发人员应用的安全补丁。它应该会引导我们访问易受攻击的代码并阻止我们检查整个应用程序代码。

在本文中,我们会介绍如何使用diff分析来找出代码的哪些实际部分被修改,以保护用户免受漏洞影响。请注意,由于JNI特性,根据不同的情况,还可以在嵌入式本机库中进行一些修改。如果是这样,则必须在本机代码级别执行互补的diff进程。

选择要比较的类

首先,我们必须减少要进行比较的类的集合,以便只保留由小米开发团队实际开发的类。这一步非常重要,因为它使得比较过程更快,结果更准确。位于APK根目录的AndroidManifest.xml可以为我们提供有关其开发包的一些有用信息,这些开发包通常包含它们的大部分活动、服务、广播接收器等。

这样,我们很快就会发现manifest文件中介绍的一个名为com.miui.org.chromium.chrome.browser的资源包,该包含有root权限,被大量类共享。因此,我们会首先比较其中包含的类。以下Python代码展示了具体工作过程:

lhs_app = load("com.mi.globalbrowser.mini-1.6.1.apk.apk") # Loading left handside application
rhs_app = load("com.mi.globalbrowser.mini-1.6.3.apk.apk") # Loading right handside application

condition = {"package_filtering": "com.miui.org.chromium.chrome.browser"}
lhs_classes = filter(lhs_app.classes, condition)
rhs_classes = filter(rhs_app.classes, condition)

查找修改过的类

一旦得到类,我们就需要知道哪些类已经被修改。为此,我们必须事先优化选项。

optimizations = {
  "inner_skipping": False,
  "external_skipping": False,
  "synthetic_skipping": True,
  "find_obfuscated_packages": False,
  "min_inst_size_threshold": 5,
  "top_match_threshold": 3
}

diff_results = diff(lhs_classes, rhs_classes, 0.8, optimizations)

这些优化选项分别配置了diff引擎:

1.不要跳过内部和外部类:内部类和外部类很可能包含修改过的代码。

2.跳过合成类:合成类是由编译器自动生成的,因此不太可能嵌入修改过的代码。

3.不要试图找到已经被混淆的包名:如前所述,包名称似乎没有混淆。设置此选项后,diff引擎将不会考虑由混淆引起的潜在问题。

4.不要考虑嵌入少于5条命令的类:应用程序通常包含所有看起来相似的小类(例如,一些只返回属性值的方法)。然而,在大多数情况下,它们在比较版本的diff方面毫无价值。大多数情况下,他们只会进行一些误报,不过,这些结果可以通过设置合适的值来消除。

5.在三个高级类中进行彻底的比较:如果我们处理的类在结构级别上大致相同,则必须增加此选项。不过这超出了本文所讲的范围。

此外,我们将匹配阈值设置为0.8,因为在寻找修复的漏洞时,我们只期望寻找那些进行较小修改的漏洞。这意味着,匹配距离低于此值的类,将在结果中直接被删除。

此时,我们得到了diff()函数的结果,可以用下面的Python代码对它们进行迭代:

for match in diff_results:
  if match.distance < 1.0: # Skipping perfect matches, that is unmodified classes
    print(f"[+] {match.lhs.info} | {match.rhs.info} -> {match.distance:1.4f}")

执行完整个脚本后,会输出大量结果。

[+] com/miui/org/chromium/chrome/browser/widget/progress: ToolbarProgressBar - ToolbarProgressBar.java | com/miui/org/chromium/chrome/browser/widget/progress: ToolbarProgressBar - ToolbarProgressBar.java -> 0.9994
[+] com/miui/org/chromium/chrome/browser/update: HomePageDataUpdator - HomePageDataUpdator.java | com/miui/org/chromium/chrome/browser/update: HomePageDataUpdator - HomePageDataUpdator.java -> 0.9794
[+] com/miui/org/chromium/chrome/browser/init: ChromeBrowserInitializer$2 - ChromeBrowserInitializer.java | com/miui/org/chromium/chrome/browser/init: ChromeBrowserInitiali
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值