JShrink:深入研究如何对现代 Java 应用程序去臃肿

渗透技巧 1年前 (2022) admin
359 0 0

JShrink:深入研究如何对现代 Java 应用程序去臃肿

原文标题:JShrink: In-Depth Investigation into Debloating Modern Java Applications
原文作者:Bobby R. Bruce, Tianyi Zhang, Jaspreet Arora, Guoqing Harry Xu, Miryung Kim
原文链接:https://dl.acm.org/doi/pdf/10.1145/3368089.3409738
发表期刊:FSE/ESEC’20
笔记作者:NING@SecQuan
笔记小编:ourren@SecQuan

1 研究介绍

软件开发不可避免的会引入或写入一些不必要、未使用的代码,这就是软件臃肿(bloated software)。这种称为软件膨胀的现象会导致软件消耗比原本需要的资源更多的资源。如何有效自动地对软件进行去膨胀是软件工程中长期存在的问题。自 1990 年代后期以来,已经提出了各种去肿胀技术。然而,其中许多技术都是建立在纯静态分析的基础上的,并且尚未在动态语言功能普遍存在的现代 Java 应用程序的上下文中进行扩展和评估,需要引入一定的动态分析技术。

2 研究框架

JShrink:深入研究如何对现代 Java 应用程序去臃肿
图 1 框架图

该图来源于论文 PPT 讲解视频(原论文并未提供框架图),由图可以清楚的看到整个论文的研究思路和主要模块:

  • 模型输入 Java Bytecode
  • 分析模块 Extend Call Graph Analysis
  • 转化模块 Bytecode Transformation

Extend Call Graph Analysis

该模块主要包括静态可达分析、动态可达分析、类型依赖分析。

  • 静态分析(这里主要使用 SOOT)就是生成调用图,然后对给定方法进行切入点接着构建有向图,进而覆盖所有路径;
  • 动态分析(这里主要使用自开发的 JMtrace),主要是利用 JVM TI API 监督每个方法的出入口,从而弥补静态分析不能解决的 Java 反射问题。
  • 类型依赖分析,这一步是解决当下编程中有些方法和类并不需要实例化,仅使用声明和继承就进行访问,因此这种直接删除会导致程序错误,因此对方法分为了一些特定类。

Bytecode Transformation

主要是去臃肿的过程,主要包含如下过程:去除未使用的方法去除未使用的字段方法内联处理处理类层次结构崩溃检查

3 研究问题及结果

实验主要与 Jax[1]JRed[2]ProGuard[3] 进行对比,另外 TamiFlex 为另一种动态路径分析工具,主要与本文的 JMtrace 对比,Jshrink-C 代表开启检查机制。

JShrink:深入研究如何对现代 Java 应用程序去臃肿
图 2 主要实验结果

其中 MR、FR、CC、MI 分别代表 Method Removal、Field Removal、Class hierarchy Collapsing 和 Method Inline。

  • RQ1:去臃肿转换时可减少多少 Java 字节码?

由图 2 中可以看到,Jshrink 平均缩小比例为 14.2%,相比其他可能效果不算很高,但是代码去臃肿更重要的要保持语义。

  • RQ2:去臃肿软件时,程序语义能在多大程度上得以保留?

由图 2 中可以看到,Jshrink 的效果达到 98.5% 的正确性,对比41.6%(JRed),37.3%(Jax),和 91%(Proguard)均有很大提升,并且开启检查机制的 Jshrink 可以达到 100% 的语义保留。

  • RQ3:去臃肿和软件语义保留之间的权衡结果如何?

当仅使用 main 作为调用图切入点(对比分析软件 TamiFlex)时,软件体积更新,但必然会导致出现大量的语义错误;当使用所有可达路径时,语义正确有保障,但是软件去臃肿的体积会比前者大。

  • RQ4:去臃肿当面临新例子的健壮性如何?

由图 2 中可以看到,当面对新测试用例时,jshrink 在 26 个中只有 4 个出错,效果对比其他有着明显提升。

4 个人思考

  • 每次修改都会进行检查,感觉效率肯定会下降很多?论文并没提及这些问题。
  • 这套系统更多的是针对一个项目的 bytecode 缩减,与第一篇论文 A Longitudinal Analysis of Bloated Java Dependencies 好像还不太一样?第一篇感觉更像是打包的时候避免对无用库的打包。

5 对比实验引申论文

[1]: Tip F, Laffra C, Sweeney P F, et al. Practical experience with an application extractor for Java[C]//Proceedings of the 14th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications. 1999: 292-305.
[2]: Jiang Y, Wu D, Liu P. Jred: Program customization and bloatware mitigation based on static analysis[C]//2016 IEEE 40th annual computer software and applications conference (COMPSAC). IEEE, 2016, 1: 12-21.
[3]: [n.d.]. ProGuard: Java and Android Apps Optimizer. https://www.guardsquare.com/en/products/proguard. Accessed: 2019-12-13.

安全学术圈招募队友-ing 
有兴趣加入学术圈的请联系 secdr#qq.com

原文始发于微信公众号(安全学术圈):JShrink:深入研究如何对现代 Java 应用程序去臃肿

版权声明:admin 发表于 2022年12月20日 下午3:28。
转载请注明:JShrink:深入研究如何对现代 Java 应用程序去臃肿 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...