上文咱们说过,《针对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版。
现在,让咱们假定有人想快速了解这个缝隙是怎么作业的。要做到这一点,最快的办法是在发现到这个缝隙之后查看开发人员运用的安全补丁。它应该会引导咱们拜访易受进犯的代码并阻挠咱们查看整个运用程序代码。
在本文中,咱们会介绍怎么运用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 {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: ChromeBrowserInitializer$2 - ChromeBrowserInitializer.java -> 0.9771[1][2][3][4][5]黑客接单网