DBI-Go:动态插桩定位Go二进制的非法内存引用
DBI-Go:Dynamic Binary Instrumentation for Pinpointing Illegal Memory References in Go Binaries作者机构:中国科学技术大学计算机科学与技术学院安徽合肥230026
出 版 物:《软件学报》 (Journal of Software)
年 卷 期:2024年第35卷第6期
页 面:2585-2607页
核心收录:
学科分类:08[工学] 0835[工学-软件工程] 081202[工学-计算机软件与理论] 0812[工学-计算机科学与技术(可授工学、理学学位)]
主 题:二进制分析 动态二进制插桩 静态分析 Go 编译器测试 逃逸分析
摘 要:Go语言,也称Golang,由于其语法简单、原生支持并发、自动内存管理等特性,近年受到很多开发者的欢迎.Go语言期望开发者不必了解变量或对象是分配在栈上还是在堆中,而由Go编译器的逃逸分析来决定分配位置,再由Go垃圾收集器自动回收无用的堆对象.Go的逃逸分析必须正确决定对象的分配位置以保证内存状态的正确性.然而,目前Go社区中逃逸相关问题频发,潜在导致程序崩溃等致命问题,而目前对该方面的研究缺失.为有效检测编译器生成的代码是否存在可能引起运行时崩溃的非法内存引用,填补研究空白,对Go程序执行进行抽象建模,并提出两条判定写入违例的规则.基于这两条规则,克服Go二进制中高层语义缺失、运行时信息不便获取等挑战,设计一个轻量化的分析工具***-Go采用静态分析加动态二进制插桩的分析方式,基于动态二进制分析框架Pin来实现,可以识别Go二进制中违例的store指令.实验结果表明,DBI-Go可以检测出Go社区中所有已知的逃逸相关Issues;DBI-Go还发现一个目前Go社区未知的问题,该问题已经得到确认.在实际项目上的应用则表明DBI-Go可以帮助开发人员找出逃逸算法的错误.测试结果还表明DBI-Go采取的措施可以有效降低误报率且在93.3%的情况下带来的额外运行时开销小于原先的2倍.同时,DBI-Go无需修改Go的编译运行时,可以适配不同版本的Go,有较高的适用性.