安卓Native层共享库fuzzing技术思路及实践

Android系统服务Fuzz测试 两年前写的东西,现在发一下。写了个最简单的fuzz脚本:基于adb的fuzzer,仅供学习,请勿作不良用途。 一、背景知识 二、Fuzz原理   Android为用户提供的很多功能是通过系统服务实现的。截至Android 6.0,系统服务数量已经达到60多个。系统服务的底层是system_server(以下简称ss),我们知道,Android存在watchdog程序,当系统服务长时间不响应时... 阅读详情

一、前言

fuzzing技术在漏洞挖掘领域是一个无法绕开的话题,无恒实验室也一直在使用fuzzing技术发现产品的问题。虽然fuzzing不是万能的,但是没有它是万万不能的。说它不是万能的其实也是相对的说法,理想状态下,例如在可接受的时间范围内,计算资源足够丰富且系统复杂度足够低的情况下,fuzzing就能够给你任何想要的结果。这就好像是让一台计算机去随机的print一些文字,只要时间足够长,随机字符产生的效率足够快,那么早晚有一天会print出一部《三体》出来。

然而理论是丰满的,现实是骨感的,虽然人类社会的计算资源和效率在不断增长,但是软件系统的复杂度却以更快的幅度在增长着,以往通过近乎于dumb fuzz就能找到漏洞的情况几乎绝迹了。所以fuzzing技术必然要朝着更高覆盖率的样本生成、更高效的代码路径移动算法(变异)、更合理的计算资源分配调度等方向去发展。

不敢妄言未来fuzzing技术能发展到什么程度,这要靠学术界和工业界的共同努力,但是如果我们有一天见到了一个AI在面对大部分未知系统的时候都能自己solve出bug,那么毫无疑问,它一定用到了fuzzing!情怀的部分就到这里,下面来脚踏实地的实践一下安卓的一些native binary如何去fuzz。

二、技术背景:

fuzzing二进制目前有很多流派,但都大同小异,目的都是以最快的速度产生样本覆盖更多的code path,显然在这个过程中以code coverage作为整个fuzzer的驱动导向是最科学的,也就是覆盖率引导的灰盒模糊测试技术CGF(Coverage-based Greybox Fuzzing),这里有必要对这个最为核心的技术背景做些介绍。

统计coverage信息的方法通常有以下几种:

1、Compiler Instrumentation:如果存在源码的情况下,这种方式做代码覆盖率统计和fuzz是最可靠且高效的,例如利用LLVM、GCC等,但可惜很多情况下拿不到源码。

gcc.gnu.org/onlinedocs/… llvm.org/docs/Comman…

2、Execute Simulation:例如基于QEMU、Unicorn模式的AFL就会在QEMU准备翻译执行基本块之前插入覆盖率统计的代码,缺点是执行效率有点低。

github.com/edgarigl/qe… andreafioraldi.github.io/articles/20…

3、Runtime Trace:这种形式的代码路径覆盖比较灵活,实现形式也比较多样化,也是本文所用到的主要方法。较为常见的方式例如使用frida动态插桩、调试启动、或者直接改造手机ROM等方式都可以实现,缺点是由于架构复杂稳定性很难保证,很多时候还没等target crash,fuzzer自己先crash了。文章后面会详细一些的介绍用到的frida stalker工具。

frida.re/docs/stalke…

4、Binary Rewrite:这种方法主要是针对二进制disassemble的每个基本语句块进行插桩,如果做的比较理想,效果可能仅次于Compiler Instrumentation,但缺点是它太难了,如果仅仅是个比较简单的binary问题倒还不大,但如果是个复杂度很高的系统实现起来就会困难重重,例如有些binary自带VM的情况、binary存在runtime rewrite自身的机制、binary使用了一些CPU的特殊Architecture Feature、各种binary重定位问题等等,这些处理不好都会让rewriten binary无法顺利执行。

github.com/GJDuck/e9pa… github.com/utds3lab/mu… github.com/talos-vulnd…

5、Hardware Trace:这可能成为未来binary fuzzing的主流方向,硬件对软件天然就处在上帝视角中,这里要明确一下我所说的Hardware Trace这个范畴,并不是真的需要搞个专用于fuzzing的硬件,这里主要是说利用硬件与操作系统之间的那一层的能力去完成fuzz的目的,这对fuzz操作系统自身尤其有效,例如利用hypervisor、硬件调试器等的能力,当然也不排除有一天会有人搞出个FPGA甚至ASIC来跑fuzz,哈哈,那简直太硬核了!

github.com/gamozolabs/… the-elves.github.io/Ajinkya-GSo…

三、目标选择:

关于如何选择fuzzing目标这点,主要从安卓so库的安全风险角度分享一下我的经验和思路:

1、有攻击面:这是最先要确认的一个点,虽然理论上说任何程序都有攻击面,但是有大有小,有多有少,我们倾向于选择攻击面大的目标,这样才更有价值,例如有些so库可能会直接接收用户的外部数据进行处理,例如视频播放器、图片解析引擎、js解析引擎等等,这些so库如果出现漏洞,大概率上比较容易直接利用。 2、高频应用:更高频被用到的so库也是值得重点考量的,越是高频被用到,就越易于攻击利用,风险也就越大,例如有些工具util性质的so库,可能会被好多其他库调用,出问题的概率很大。 3、复杂度高:理论上说,漏洞的产生的概率与系统复杂度成正比,越是复杂就越是容易出问题。 4、消减措施缺失:某些so库在编译过程中可能没有考虑到安全性,没有开启安全编译选项,这就会导致其上的漏洞很容易被利用,风险也很大。

四、样本生成:

确认了目标以后,就要开始考虑目标的业务逻辑了,越是能清晰的了解测试目标,就越是能准确的构造出好的样本,提升fuzz的效率。这个过程就好像导弹在击中目标之前的制导过程,需要明确击中目标所要经过的各个路径和需要绕过哪些障碍等。落实到业务上就是需要了解目标会接收什么样的输入数据、对数据处理的过程是怎样的、是否需要交互、是同步还是异步等等,越准确清晰越好。例如,现在要fuzz的目标是一个视频解码引擎的H265解码算法,那么就要考虑如何去基于H265的编码算法生成一些视频样本,如果样本使用其他一些MPEG、AVS、WMV等的编码,那可能fuzz到天荒地老也未必能找出一个H265解码器的问题。 “精确制导”之后我们也需要去做一些类似“火力覆盖”的事情,因为生成一个单一样本很难做到最大化的code coverage,所以我们需要在目标接收数据范围内做一些多样性的变化,产生一个样本集,通过大量多样性的样本达到一个比较满意的代码覆盖率。 本文使用ffmpeg库对H265的视频样本进行生成,示例部分代码逻辑。 对原始帧做一些随机变化:

视频参数也进行些随机多样化的设置:

还可以选择性的在视频流封装前搞点事情:

这样生成出来的视频文件其实已经经过一定程度的变异,甚至可以直接fuzz出一些crash了。

覆盖率引导:

样本集有了,我们需要进行一些裁剪工作,主要根据样本对被测目标的覆盖率进行筛选,选出能够最大化coverage的最小集合,然后再对这个最小样本集进行变异,这样可以避免生成一些重复性的测试cases。

技术背景中提到过的stalker是这个环节的核心,stalker是frida系列神器的代码tracer,可以做到函数级、基本块级、指令集的代码tracing。不过这个工具之前一直对arm支持的不够好,目前frida 14.0的版本也仅支持arm64。

stalker的主要原理是dynamic recompilation,这里我们简单介绍一些stalker中的专有名词概念:

Blocks:基本块,与编译原理中的概念相同,不再赘述。

Probes:Probes就是一个基本块的桩点,如果你用过interceptor的话,他们很类似。

Trust Threshold:这个概念稍微有点绕,它实际主要是为了优化编译执行效率,但是设置它却和一些带有self-modifying功能的程序有关,例如某些加过壳或者做了anti-disassembly的binary在runtime期间会对自身的代码进行rewrite,这个过程stalker就必须要对代码重新进行dynamic recompilation,这将会是个非常耗时且麻烦的过程。所以stalker为blocks设置了一个阈值N,当blocks执行过N次之后,这个block将会被标记为可信的,以后就不会再对它进行修改了。

了解了这些概念后,继续来看一下stalker在dynamic recompilation过程中的基本操作。stalker会申请一块内存,以基本块为单位写入instrumented后的block copy并插入Probes,重定位位置相关的指令例如ADR Address of label at a PC-relative offset.,对于函数调用,保存lr相关的上下文信息,建立这个块的索引并且进行count计数,达到Trust Threshold的设定阈值的就不再进行重新编译,接下来执行一个基本块然后继续开始下一个。这个过程限于篇幅只能说个大概,实际的处理过程比较复杂,感兴趣的同学可以自行去读一下stalker的代码加深理解。

通过stalker的能力,我们可以在trace target的过程中清晰的拿到coverage,后续通过coverage来优化样本集,引导变异过程等就都很轻松了。例如我们可以通过建立bitmap的方式记录覆盖状态,根据coverage的高低来对样本进行筛选,还可以通过coverage来确定每次样本变异后的的效果等。

最后截几小段关键代码示例一下:

结束语:

fuzzing技术作为漏洞挖掘的经典手段,一直受到安全从业人员的喜爱,无恒实验室也一直致力于使用fuzzing技术发现产品的安全缺陷,提升产品质量。在这个过程中我们发现了大量安全性及稳定性问题,但是路漫漫其修远兮,未来无恒实验室会继续在fuzzing的智能化、高效化、精准化等方向持续投入研究,并且向业界贡献成果。

了解无恒实验室:security.bytedance.com/static/lab/…

文章由字节跳动无恒实验原创,在安全客首发
深入浅出:libFuzzer在安卓平台上的Fuzz测试实践指南 本文深入探讨了在安卓平台上使用libFuzzer进行Fuzz测试的完整实践指南。从环境搭建、测试用例编写到真机运行与问题定位,详细介绍了如何利用libFuzzer高效发现原生代码中的崩溃、内存泄漏等隐蔽缺陷,并结合AddressSanitizer(ASAN)精准定位问题根源,有效提升安卓应用的稳定性与安全性。 阅读详情

相关推荐

honggfuzz-android:通用honggfuzz模糊器的Android端口

honggfuzz安卓 !!! 项目已弃用。 请改用。 通用工具的Android端口。 基本信息 选择POSIX / SIGNAL架构是为了与大多数Android生态系统兼容。 尽管PTRACE拱形接口需要大量的设计(可以随意调整和测试),但它们可能也应该起作用。 根据您的硬件和模糊测试目标,特别注意并行任务的数量。 变更日志 版本3.1(2014年7月17日) 添加对内部数据生成器相对于文件开始位置的模糊区域的偏移量的支持 在模糊目标中添加对--<arg>=___FILE___类型的参数的支持 版本3.0(2014年7月14日) 来自原始仓库的初始端口 在arch-posix.c中进行编辑以支持Android NDK构建 建造 从官方安装Android NDK(最好使用最新版本)。 调整系统路径以包含NDK根目录, build/tools和prebuilt/<target>/b

android上的漏洞挖掘方式和Fuzz

https://www.blackhat.com/docs/asia-16/materials/asia-16-He-Hey-Your-Parcel-Looks-Bad-Fuzzing-And-Exploiting-Parcelization-Vulnerabilities-In-Android-wp.pdf 感觉翻译的有点怪异,凑乎的看哇。 Binder简介 Binder是andori...

inquisiter 2782

AndroidNative层文件解析漏洞挖掘指南

导语 本文以手Q的一次文件解析类漏洞分析为例,叙述了Android Native层文件解析类型漏洞分析的过程 手Q这个应用从功能来说十分的庞大,如果使用类似MFFA的框架去挖掘文件解析类漏洞,效率低,而且文件入口在哪儿、如何利用脚本进行自动化都是非常大的问题。本文在一次手Q的文件解析类漏洞的过程中,提出了一种可能的解决问题的方案,妄称指南不吝赐教。

Android Fuzz 漏洞挖掘初探

1 简介 最近因为某些原因,主要看了几乎能找到的安卓相关的fuzz脚本。当然时间原因具体实际测试的并不是特别多,下面就发现的一些问题,以及个人想法分享一下。 2 实际应用过程中的收获 2.1 binder fuzz的基础 (1) binder 机制 Android的Binder机制 Binder其实也不是Android提出来的一套新的进程间通信机制,它是基于OpenBinder来实现...

u014715599的博客 2270

谈Fuzz技术挖掘Android漏洞

Android系统服务在为用户提供便利的同时,也存在着一些风险。在使用系统服务的过程中,异常的外部数据,有可能会导致系统服务崩溃,甚至是远程代码执行,内存破坏等严重后果。Android系统服务的安全问题需要重视。Android系统服务即由Android提供的各种服务,比如WiFi、多媒体、短信等,几乎所有的Android应用都要使用到系统服务。但系统服务也并非绝对的安全,例如一个应用获取到了系统服务中的短信服务,那么就可能会查看用户的短信息,用户隐私就有可能暴露。在工作中我们发现主要的漏洞和攻击包括特权提升攻击、恶意软件攻击、重打包、组件劫持攻击等类型。尽管安全研究人员已经针对Android上

VMD-CNN-BiLSTM-Attention预测模型 —— 数学模型介绍&完整实例代码

想解决电力负荷预测中的非线性、非平稳难题?这篇博客介绍了一种创新混合模型,结合变分模态分解(VMD)和CNN-BiLSTM-Attention深度学习架构,实现超高精度预测! ✨ 核心亮点: ✅ VMD分解:有效分离复杂负荷信号,提取关键频率特征 ✅ 混合深度学习:CNN捕捉局部模式 + BiLSTM学习长时序依赖 + 注意力机制聚焦关键时段 ✅ 端到端优化:从数据预处理(滑动窗口、归一化)到模型训练(MSE损失+Adam优化),完整流程公开! ✅ 工业级评估:提供MSE、MAE、MAPE、R²多指标验证

qq_42924330的博客 1652

android-afl模糊测试android环境下的so文件

描述了如何在ubuntu环境下交叉编译android so文件,以及如何使用android-afl模糊测试so文件

beizishaizi的博客 1517

IEC61850客户端连接实战:CMS vs MMS协议抓包对比与性能初探(基于YX-PIS协议栈)

本文深入探讨了IEC61850客户端连接中CMS与MMS协议的抓包对比与性能优化。通过Wireshark抓包分析、协议栈配置实战和性能基准测试,揭示了两种协议在连接建立、数据交互和性能调优方面的关键差异,为智能电网自动化系统的协议选择提供了实用指南。

weixin_29209805的博客 214

移动端的模糊测试-应用安全和系统安全

模糊测试是一种通过自动生成大量随机或半随机的输入数据,向目标应用程序或系统注入这些数据,测试其处理能力和健壮性的方法。其主要目的是通过异常输入触发程序中的缺陷,如崩溃、内存泄漏、缓冲区溢出等,从而发现潜在的安全漏洞。

远方雪的专栏 2287

c#源码,将矩阵(二维数组)渲染成云图,强度图,热力图,均匀性图,伪彩图

优快云软件0积分下载链接:https://download.youkuaiyun.com/download/wanghuannihao1992/86656759。6、渲染效果良好,颜色均匀分布,不存在等高线,交叉点。3、纯粹的C#代码编写,不含第三方dll或者控件。4、支持ColorBar显示,强度值颜色坐标显示。2、渲染时间60ms左右,速度快,1、二维数据最小支持2*2,7、采样全新数据插值算法。先直接上C#软件效果图。5、整图保存为单个图片。

业余程序员小徐的博客 6879

idea出现 EXCEPTION_ACCESS_VIOLATION (0xc0000005) 的解决方法

idea启动的时候出现如下问题,以为没啥事,就索性关闭 后面再打开idea的时候发现直接闪退,之后打开其他软件,直接蓝屏

码农研究僧的博客 4813

android漏洞检测工具,Android漏洞检测——模糊测试

前言Android在目前的市场上占有率很高,用户数量庞大,而在该平台下的应用程序开发成本低,开发难度低,发布容易,缺少监管和审查,导致大量低质量App流入市场,这些App由于开发者缺乏安全编程技能或缺乏测试和审查,可能存在着一些严重的漏洞,对用户的隐私以及财产安全造成巨大风险。因此,移动应用尤其是Android平台下的应用的开发应该对此引起高度重视。Android常见漏洞越权绕过:没有对调用act...

weixin_31119221的博客 1404

Harmony:C# 动态代码补丁的5大秘密武器

Harmony 是一个开源库,它允许你在运行时修改托管代码(即使用 .NET 或 Mono 编译的语言编写的应用程序)。它通过利用 AOP(面向切面编程)的思想,可以在不重新编译代码的情况下添加、替换或修改方法的行为。这对于游戏模组(Modding)、插件开发以及调试工具非常有用。安装 Harmony要使用 Harmony,你需要首先安装它。Harmony 作为一个 NuGet 包,可以直接通过 Visual Studio 的 NuGet 包管理器进行安装。安装步骤打开 Visual Studio。

java专栏 1191

[Fuzz]Android模糊测试

fuzz模糊测试理论应用于android端 1.单独调用Activity 2.发布针对性广播 3.调用查看Apps数据库 等... 方法: 1.反编译apk,可以使用apktool 2.查找AndroidManifest.xml文件内activity,service等,修改Export=“true”,意味着可以由第三方程序调用该服务 3.修改过配置文件后,重新打包成apk ...

自娱《测试开发》专栏 1009

Spring Boot 与 Redisson 版本适配深度解析

Spring Boot 与 Redisson 的版本适配是一个动态演进的过程。开发者需要密切关注两者官方的版本更新日志,建立完善的版本验证机制。本文提供的适配方案基于当前最新技术状态(2024年1月),建议在实际生产环境中通过灰度发布策略验证版本兼容性。只有深入理解底层技术原理,才能在分布式系统的星辰大海中稳健航行。延伸阅读Spring Boot 官方迁移指南。

fudaihb的博客 1078

11、CUDA 内存优化:平铺矩阵乘法技术解析

本文深入解析了CUDA中的平铺矩阵乘法技术,重点介绍了如何利用共享内存和线程协作减少全局内存访问,提升计算效率。通过矩阵乘法实例,详细阐述了平铺算法的执行流程、内核代码实现及性能优化策略,包括平铺大小选择、线程同步机制和代码优化建议。文章还分析了该技术在深度学习、图像处理和科学计算等领域的应用价值,为CUDA程序的内存优化提供了系统性指导。

peace的博客 69

符号执行android,Android的fuzz测试技术之符号执行浅谈-android学习之旅(82)

简单的漏洞越来越少,需要改进目前的方法 :通过符号执行,得出执行路径,然后在进行fuzzy是较为有效的方法之一1)为待测单元自动地生成可到达的测试数据,即提高测试目标的覆盖率2)根据特定的漏洞模式和路径条件,缩小 Fuzzing 测试范围,减少Fuzzing盲目性 符号执行(symbolic execution)是一种代码执行空间遍历技术。枚举了程序所有可能的路径,穷尽所有执行空间,给定漏洞特征,...

weixin_29534399的博客 555

RedCap:一种通信技术的概述

总结起来,RedCap是一种基于数据包交换的通信技术,它提供了一种高效、可靠的数据传输机制。通过使用RedCap,我们可以轻松地发送和接收数据包,并确保数据的完整性和正确性。在上面的示例中,我们首先导入了RedCap库,并创建了一个RedCap实例。然后,我们定义了目标地址和源地址,并创建了一个数据包,其中包含了目标地址、源地址和要发送的数据。本文将介绍RedCap的基本原理和使用方法,并提供一些相关的源代码示例。RedCap还提供了其他一些功能,如数据包的重传机制、流量控制和拥塞控制等。

YgjWeb的博客 899

Android漏洞挖掘工具收集与整理

收集了android各个漏洞挖掘工具,给出了其简介、功能和参考资料,供大家查阅。

phoebe的专栏 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

一篇毫不负责的afl-fuzz源码学习指北

read_testcases nl_cnt是统计inputs目录下的目录数,然后从这些目录中读取测试用例加入 cull_queue 这个函数好像也没看懂是啥。。 先把队列中的实体favored全置为0 然后。。。 好像是精简输入数目 calculate_score 计算得分(对于输入的fuzz次数) run_target 执行目标应用,监控timeouts。返回状态信息,调用的程序会...

1866

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

android app系统的测试_Android系统Server自动化安全测试

Android中有些应用APP会用到系统Server提供的服务,其中有些Server是android 原生自带的,有些是OEM厂商定制添加的,可以使用service list 命令查看,怎么评估其安全性呢?这些Server是注册在ServiceManager中,使用android binder机制进行通信,厂商定制的Server常用AIDL的方式编写服务,所以先对android bind...

weixin_39895283的博客 358

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Fuzzing技术总结(Brief Surveys on Fuzz Testing)- wcventure

Fuzzing survey Static analysis Dynamic analysis Symbolic execution Fuzzing White box fuzzing Grey box fuzzing Black box fuzzing Generation-based Fuzzing Mutation-based Fuzzing Fuzzing技术的对比 F...

wcventure的博客 3万+

直付通申请资质安全吗?靠谱吗?

风控规则的运行效果要定期复盘,拦截记录、误伤情况、处理时效都要看,规则持续优化,防护效果才能保持,动态调整的风控,比一成不变的规则更可靠,安全保障更到位,动态调整的风控更可靠,更有效,风控常复盘,规则常优化,防护更有效。资金记录的完整保存很重要,流水明细定期归档,账目随时可查,配合日常核对,资金安全尽在掌握,完善的记录习惯,既是风控要求,也是管理规范,长期坚持受益良多,更放心,流水留存好,随时可对账,管理更规范。方向更清晰,资质看清楚,边界问明白,判断更准确。更稳固,职责边界清,配合更默契,安全更有底。

qq_15110143的博客 344
上一篇: 安卓 https 证书校验和绕过
下一篇: 安卓开发开发规范手册V1.0
gool奇米
博客等级 码龄4年 16粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值