Page 29 - 《软件学报》2024年第6期
P. 29
陈金宝 等: DBI-Go: 动态插桩定位 Go 二进制的非法内存引用 2605
unsafe 包的不安全使用. Wang 等人 [59] 设计了 HERO, 用于检测 Go 中依赖管理导致的问题. Liu 等人 [18] 提出了
GCatch, 用于自动检测和修复 Go 中的并发问题. Chabbi 等人 [31] 使用现有的数据竞争检测器在 Uber 项目中发现
了超过 2000 个数据竞争. Li 等人 [60] 设计了 CryptoGo, 用于检测 Go 中和加解密相关 API 的误用. Zhong 等人 [17]
首次提出了使用动态二进制插桩的方式检测 Go 中的并发问题. 目前与 Go 漏洞检测相关的工作多数集中在对用
户代码的漏洞的检测, 且多与并发有关. 本文提出的 DBI-Go 是首个验证 Go 编译器生成的代码的是否满足 Go 逃
逸不变式的工具.
6.4 Go 的逃逸分析
目前 Go 中和逃逸分析的相关工作较少. Google 曾在 2015 年总结了当时 Go 逃逸分析的缺陷, 指出了其分析
的保守之处 [61] . Wang 等人 [20] 则注意到了 Go 逃逸分析的一些保守之处, 其工作使得一些对象可以绕过 Go 的逃逸
分析, 从而节省堆内存的使用.
7 总结与展望
本文主要提出了 DBI-Go, 一个用于 Go 应用程序的新型漏洞检测工具. DBI-Go 使用静态分析辅助动态二进
制插桩的分析方法, 以 Go 二进制文件为输入, 检测 Go 编译器生成的代码中是否有违反 Go 逃逸不变式的 store.
DBI-Go 使用静态分析的方法, 结合 Go 的 gcWriteBarrier 机制恢复 Go 的 store 语义. DBI-Go 的运行时回调函数在
运行时结合 Go 的 ABI 约定获得 Go 的运行时栈信息来辅助分析. DBI-Go 使用约 1 000 行 C++代码实现, 为比较
轻量的检测工具.
实验表明, DBI-Go 可以检测出目前 Go 社区已经确认的问题, 呈现了较高的漏洞覆盖率, 同时 DBI-Go 还成功
检测出一个之前未知的问题, 目前该问题已经得到 Go 官方的确认并在等待进一步修复. 在实际项目上的应用还
表明 DBI-Go 可以辅助开发人员对内存优化相关算法, 如逃逸分析算法, 进行优化和重构, 验证算法的正确性. 对
误报率的测试则表明 DBI-Go 所采取的措施可以有效地降低误报. 实验结果还表明, DBI-Go 在不同版本的 Go 编
译器编译出的二进制上都能正常工作 (Go1.11 至 Go1.20.5), 体现了较高的可扩展性. 额外开销的测试结果则表明
DBI-Go 会产生在可接受范围内的约常数倍的开销.
本文还分析了 DBI-Go 的不足之处. 未来将继续改进 DBI-Go, 以期实现更高的代码覆盖率、更高的精度以及更
小的额外开销, 并将进行更大规模, 更大范围的测试, 以期找到更多漏洞, 帮助改善 Go 语言软件的可靠性和安全性.
References:
[1] Go. The Go programming language. 2023. https://go.dev/
[2] TIOBE. Programming language hall of fame. 2023. https://www.tiobe.com/tiobe-index
[3] Taylor N. 2022 Hiring report: Golang developers. 2022. https://sgp.technology/2022-hiring-report-golang-developers/
[4] Salgado PG. Garbage collector design. 2023. https://devguide.python.org/internals/garbage-collector/
[5] Schatzl T. Java garbage collection: The 10-release evolution from JDK 8 to JDK 18. 2022. https://blogs.oracle.com/javamagazine/post/
java-garbage-collectors-evolution?source=:em:nw:mt::::RC_WWMK200429P00043C0061:NSL400242337
[6] Ghemawat S, Menage P. TCMalloc: Thread-caching Malloc, 2009. http://goog-perftools.sourceforge.net/doc/tcmalloc.html
[7] Fua P, Lis K. Comparing Python, Go, and C++ on the N-queens problem. arXiv:2001.02491, 2020.
[8] Blanchet B. Escape analysis for object-oriented languages: Application to Java. ACM SIGPLAN Notices, 1999, 34(10): 20–34. [doi: 10.
1145/320385.320387]
[9] Whaley J, Rinard M. Compositional pointer and escape analysis for Java programs. In: Proc. of the 14th ACM SIGPLAN Conf. on Object-
oriented Programming, Systems, Languages, and Applications. Denver: ACM, 1999. 187–206. [doi: 10.1145/320384.320400]
[10] Choi JD, Gupta M, Serrano MJ, Sreedhar VC, Midkiff SP. Stack allocation and synchronization optimizations for java using escape
analysis. ACM Trans. on Programming Languages and Systems, 2003, 25(6): 876–910. [doi: 10.1145/945885.945892]
[11] Kotzmann T, Mössenböck H. Escape analysis in the context of dynamic compilation and deoptimization. In: Proc. of the 1st
ACM/USENIX Int’l Conf. on Virtual Execution Environments. Chicago: ACM, 2005. 111–120. [doi: 10.1145/1064979.1064996]
[12] Kotzmann T, Wimmer C, Mössenböck H, Rodriguez T, Russell K, Cox D. Design of the Java HotSpot™ client compiler for Java 6. ACM