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
   24   25   26   27   28   29   30   31   32   33   34