抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

调研

什么是ebpf

eBPF(extended Berkeley Packet Filter)可以在Linux内核中运行沙盒程序,而无需更改内核源代码或加载内核模块。换句话说,eBPF 是一种内核中的轻量级虚拟机,可以动态加载和运行经过验证的用户定义程序。

对比web端,eBPF扮演了JavaScript的相似角色,由于HTML和Linux的内核都不太可制定,eBPF的出现,为linux提供了一种安全稳定的内核扩展方法。

官方社区:eBPF - Introduction, Tutorials & Community Resources

详细介绍:eBPF 完全入门指南.pdf(万字长文) - 知乎

当前ebf与安卓现状:

Android还未对eBPF程序的动态加载做出较好的支持(),但Android内核本身对eBPF的支持已较为全面

目前方法,大多基于 adeb/eadb 在 Android 内核基础上构建 Linux 沙箱使用 eBPF 扩展内核 | Android Open Source Project

一些成果

电子科技大学的专利:

一种基于eBPF的Android恶意流量实时捕获和检测的方法及系统-CN118540143A - 专利顾如

一种基于eBPF的Android软件脱壳方法及系统-CN117852037A - 专利顾如

香港理工大学的 Xiapu Luo 老师,2022论文

NCScope: hardware-assisted analyzer for native code in Android apps | Proceedings of the 31st ACM SIGSOFT International Symposium on Software Testing and Analysis

一种基于ebf的恶意软件检测框架

[2105.14344] BPFroid: Robust Real Time Android Malware Detection Framework

加州大学的论文

Sifter | Proceedings of the 28th Annual International Conference on Mobile Computing And Networking

一些开发者项目:

eBPF - SeeFlowerX-插桩

旁观者 - eBPF技术强力驱动,无需CA证书即可捕获HTTPS/TLS明文数据包。 | eCapture

eBPF初体验:Android设备网络优化实践 - 魅族内核团队

tiann/eadb: eBPF Android Debug Bridge

eBPF 能干什么?

系统调用监控

应用程序插桩

抓包

在 Android 中使用 eBPF:开篇 | Weishu’s Notes

论文阅读

概述

本文使用ETM和eBPF,实现以较低的开销,高保真执行跟踪的native层代码检测方法。

介绍

静态分析,以及动态分析的动态二进制插装,模拟器(QEMU),debug调试方法具有局限性:

1.不能准确高效的识别指令。

2.很难绕过反分析代码,由于他们的特征。(市面上还未大范围使用针对eBPF的反调试)

3.这些方法有很大的开销,从而导致误差,恶意软件也可以此做出反侦察(定时检查)。

论文的优点

1.通过ETM收集ARM指令的开销非常低

2.eBPF高效的获得app的内存数据

实现:

ETM是ARM平台的一项硬件功能。它通过监控指令总线跟踪CPU执行的指令。

eBPF(extended Berkeley Packet Filter)可以在Linux内核中运行沙盒程序,而无需更改内核源代码或加载内核模块。换句话说,eBPF 是一种内核中的轻量级虚拟机,可以动态加载和运行经过验证的用户定义程序。

NCScope构成:

1.一个基于ARMv8的数据收集模块,运行加载了eBPF程序的安卓系统。

2.分析模块:自保护识别,反分析检测,内存崩溃bug诊断,性能分析(单独PC运行)

运行流程:

基于APP无Root权限的假设,NCScope 指示 ETM 记录应用程序执行的指令,并调用 eBPF 程序从应用程序的虚拟内存中检索数据并保存。

trace

ETM 记录 CPU 执行的每个间接分支指令的目标地址

亮点:NCScope实现了 ETM 的上下文 ID 跟踪和分支广播跟踪。

收集内存数据

NCScope 利用 eBPF 在运行时收集应用程序的内存数据,(hook住系统调用函数)

  1. 获取将数据存储在内存中的基址。
  2. 通过eBPF的bpf_probe_read读取数据。

亮点:

1.通过eBPF实现内存数据的过滤,只保存所要分析的app数据。

2.对 eBPF 获取的数据添加时间戳,然后根据时间戳对获取到的内存数据进行排序,以此推断调用顺序。

分析模块

恢复运行时函数调用

为 NCScope 开发了一个新的 ETM 流解析器。

构建指令-函数映射

NCScope 首先通过分析应用程序的内存映射以及系统库和框架 OAT 文件的反汇编信息,构建系统函数与其指令地址之间的映射。

查找调用的系统函数。

NCScope 可以通过将 ETM 流中记录的指令地址映射到系统函数来恢复应用程序的运行时函数调用。

确定native代码调用的系统函数

NCScope 按如下方式确定这两种类型的native函数调用的系统函数。

1.由于 JNI_OnLoad 由系统库 libart.so 中定义的系统函数 JavaVMExt::LoadNativeLibrary 调用,因此 NCScope 利用此观察结果来查找 JNI_OnLoad 执行的系统函数。

2.由于 Android 框架会在执行每个 JNI 函数之前调用系统库 libart.so 中定义的系统函数 art::artQuickGenericJniTrampoline,然后在执行 JNI 函数之后调用函数 art::artQuickGenericJniEndTrampoline,因此 NCScope 会利用此观察结果来查找由常见原生函数执行的系统函数。

检测自我保护方法

root检测,Root Detection (RTD)和篡改检测,Tampering Detection (TPD)方法总结

检测反分析机制

Debugger 检测Debugger Detection (DBD)、仿真器检测Emulator Detection (EMD)、DBI 框架检测DBI Framework Detection (DFD)、计时检查Timing Check (TCK)和动态代码加载Dynamic Code Loading (DCL)。

内存奔溃bug检测

NCScope 可以通过恢复其运行时数据流来诊断应用程序原生代码中的两种类型的内存损坏错误,包括 CWE-416(use-after-free) 和 CWE-415(double-free)

NCScope 采用离线符号执行,通过跟踪执行跟踪中每条指令的数据值,恢复应用程序的运行时数据流。

扩展 NCScope

添加新的检测规则,可以执行三个步骤来添加新规则,以检测新的自我保护方法和/或反分析机制。

1.决定可用于检测它们的必要系统函数和参数值

2.开发eBPF 程序来指示 eBPF 记录此类内存数据

3.检查是否访问了系统函数的必要参数值。

或者增加新的规则在离线符号执行中。

可以通过扩展分析模块来检查调用的系统函数和应用程序本机代码在运行时访问的内存数据,从而向 NCScope 添加新功能

评估

NCScope 部署在 Juno r2 开发板上,运行带有 4.14.59 Android 通用内核的 Android 9.0 系统。

开销

NCScope 带来的额外开销来自两个方面:跟踪已执行的指令(使用 ETM);以及检索内存数据(利用 eBPF)。

表 4 显示了结果,其中 Slowdown 列提供了 NCScope 带来的减速时间。我们观察到 ETM(即指令跟踪)不会减慢被分析应用程序的执行速度,而 eBPF(即内存数据检索)只给总分带来了 1.175 倍的减速。

NCScope 会给执行所分析的应用程序带来非常小的额外开销。

自我保护方法的检测效率

我们从 Google Play 下载 900 多个随机选择的金融应用程序,并挑选出 500 个具有原生代码的示例,包括 170 个手机银行应用程序、152 个数字钱包应用程序、21 个汇款应用程序、41 个加密货币应用程序、31 个个人贷款应用程序、20 个保险应用程序和 65 个股票交易应用程序。

NCScope 可以精确识别应用程序在本机代码中的自我保护行为。它发现,在接受评估的金融应用程序中,只有 26.8% 在原生代码中实现了自我保护方法,这意味着它们的安全性远非预期

反分析方法的检测效率

我们从一家安全公司获取了 450 个恶意应用程序,发现其中 300 个具有原生代码,可以在 NCScope 上正常运行

NCScope 可以精确识别本机代码中的反分析行为。它发现,至少 78.3% 的被评估恶意软件在本机代码中实施了反分析方法。

内存崩溃诊断

从 NIST C/C++ Juliet 套件 [23](CWE 的开源测试用例集合)中,我们将 CWE-416(释放后使用)和 CWE-415(双重释放)的 20 个有缺陷和 40 个无错误的测试用例改编为 60 个 Android 应用程序的原生代码。然后,我们应用 NCScope 来诊断这些应用程序原生代码中的内存损坏错误。

NCScope 可以通过识别本机代码中的 use-after-free 和 double-free 来帮助诊断内存损坏。

性能分析

NCScope 发现,使用系统函数 fwrite 将大量数据写入文件比使用 write 花费的时间更少,这两者都在 libc.so 中定义。

NCScope 可以通过收集噪声很小的准确数据来帮助对本机代码进行性能分析。

有效性的威胁

首先,由于动态分析的内在问题,NCScope 可能无法触发被分析应用程序的所有指令,因此可能会错过尚未执行的行为。

其次,NCScope 可能会错过新的自我保护和反分析行为,这些行为不包括检测规则。

第三,应用程序可能会通过侧信道检测 NCScope 以逃避分析。

相关工作

对于native的代码检测,只有少数静态检测方法,部分动态检测基于QEMU,无法分析具有仿真器检测行为的反分析应用程序。

部分动态检测基于App执行重量级操作(例如信息流跟踪)时,会带来大量开销,因此他们无法分析具有计时检查行为的反分析应用

ptrace 和 DBI 框架 Valgrind 分别用于分析应用程序。因此,它们受到 Debugger 检测 或DBI 框架检测 行为的阻碍

Ninja [ 和 Happer 使用 ETM 跟踪应用程序和硬件断点来检索内存数据。但是,它们都不是为分析本机代码的行为而设计的,并且不会恢复数据流。

总结

NCScope通过 ETM 收集执行跟踪,通过 eBPF 收集相关内存数据,并配备了新的方法来检查native代码,额外开销非常低。使用 NCScope,我们分别对金融应用程序和恶意应用程序中基于原生代码的自我保护方法和反分析方法进行了系统研究,观察到金融应用程序没有得到很好的保护,但恶意软件采用了各种反分析方法。此外,NCScope 可以帮助诊断内存损坏错误和对应用程序本机代码进行性能分析。

评论