字节跳动终端技术

字节Android Native Crash治理之Memory Corruption工具原理与实践 原创

最新推荐文章于 2025-02-16 14:27:33 发布
最新推荐文章于 2025-02-16 14:27:33 发布

阅读量963

收藏 1


作者:字节跳动终端技术——庞翔宇

内容摘要

​ MemCorruption工具是字节跳动AppHealth (Client Infrastructure - AppHealth) 团队开发的一款用于定位野指针(UseAfterFree)、内存越界(HeapBufferOverflow)、重复释放(DoubleFree)类问题检测工具。广泛用于字节跳动旗下各大 App 线上问题检测。本文将通过方案原理和实践案例来介绍此工具。

背景

​ 随着 Android App 开发的技术栈不断向Native层扩展,带来的线上Native稳定性问题日趋严重。Android中有超过半数的漏洞都来源于Memory Corruption问题。分析定位线上此类问题的难点在于,首先线下难复现,其次问题发生时已经不是第一案发现场,且此类问题调用栈表现类型多样化。这就导致了此类问题短期内难分析、难定位、难解决的现状。

什么是Memory Corruption问题

UseAfterFree

UseAfterFree下面简称UAF,野指针类问题;

void HeapUseAfterFree() { int *ptr1 = (int*)malloc(4); if(ptr1 != NULL){ *ptr1 = 0xcccc; free(ptr1); //free ptr1 *ptr1 = 0xabcd; //free后write ptr1 mem这里不会崩溃 } } 

​ 这里以UAF问题说明Native崩溃后不是第一现场的场景。假设上面代码运行在线程A,第2行申请4byte大小的一块堆内存,第5行释放这块堆内存,执行第6行前线程A时间片执行完,切换到线程B执行,线程B此时申请4byte大小的内存块,内存管理器会概率性的分配之前已经释放的ptr1指向的内存块分配给线程B使用,线程B给ptr2指向内存赋值0xff,之后线程B时间片执行完让出CPU,切换线程A执行,ptr1被赋值0xabcd,之后切换回线程B进行条件判断,ptr2内存值不为0xff触发异常逻辑。不是线程B预期的值。这样的场景在大型的App程序运行过程中时有发生。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-os3EN3eo-1635736391205)( http://lf3-client-infra.bytetos.com/obj/client-infra-images/memCorruption/Android_mem_1.png)]

DoubleFree

DoubleFree下面简称DF,堆内存二次释放类问题;

void DoubleFree() {  int *ptr = (int*)malloc(4); free(ptr); free(ptr)
写评论
1
文章收藏成功
前往CSDN APP阅读全文
CSDN APP记录你的成长
微信小程序收藏浏览更方便
截图/长按 保存本地,用微信扫码打开
进入小程序随时浏览/收藏技术文章
需要前往CSDN APP登录即可继续互动
成就一亿技术人!
拼手气红包6.0元
发红包
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
前往CSDN APP阅读全文
阅读体验更佳

CSDN

成就一亿技术人

浏览器
分享
请升级应用版本