[论文解读] Debloating Software through Piece-Wise Compilation and Loading
本文提出了一种基于编译器的去膨胀框架,支持软件组件的分段编译与加载,使基准程序的代码膨胀减少高达86%,coreutils的代码膨胀减少超过79%,且无功能回归。该方法消除了未使用的代码——包括存在漏洞和可重用的gadget代码——同时仅带来极低的加载时间开销,在Firefox和curl等真实世界应用中显著提升了安全性和性能。
Programs are bloated. Our study shows that only 5% of libc is used on average across the Ubuntu Desktop environment (2016 programs); the heaviest user, vlc media player, only needed 18%. In this paper: (1) We present a debloating framework built on a compiler toolchain that can successfully debloat programs (shared/static libraries and executables). Our solution can successfully compile and load most libraries on Ubuntu Desktop 16.04. (2) We demonstrate the elimination of over 79% of code from coreutils and 86% of code from SPEC CPU 2006 benchmark programs without affecting functionality. We show that even complex programs such as Firefox and curl can be debloated without a need to recompile. (3) We demonstrate the security impact of debloating by eliminating over 71% of reusable code gadgets from the coreutils suite and show that unused code that contains real-world vulnerabilities can also be successfully eliminated without adverse effects on the program. (4) We incur a low load time overhead.
研究动机与目标
- 为解决软件膨胀这一普遍问题,即在实际应用中,库中仅有一小部分代码被使用。
- 设计并实现一个编译器工具链,支持程序组件的选择性编译与运行时加载,以消除未使用的代码。
- 评估去膨胀对真实世界应用程序和系统库的功能正确性、性能开销以及安全影响。
- 证明去膨胀可应用于复杂程序如Firefox和curl,且无需重新编译,同时保持功能完整。
- 量化通过消除包含真实世界漏洞的未使用代码,对攻击面减少的程度。
提出的方法
- 利用修改后的编译器工具链,分析并仅提取库和可执行文件中的必要代码段。
- 实现分段编译与加载,仅在运行时加载所需函数和数据。
- 使用静态与动态分析,在Ubuntu Desktop 16.04环境下的多种程序中识别已使用和未使用的代码路径。
- 应用二进制插桩与运行时加载机制,按需仅加载必要的代码段。
- 与现有构建系统和运行时环境集成,确保向后兼容性并最小化干扰。
- 通过在coreutils、SPEC CPU 2006基准测试以及Firefox和curl等生产级应用上的广泛测试,验证功能正确性。
实验结果
研究问题
- RQ1在不破坏功能的前提下,能多大程度安全地从真实世界程序中移除未使用代码?
- RQ2分段编译与加载在减少多样化软件工作负载的代码大小方面有多有效?
- RQ3运行时加载机制引入的性能开销有多大?
- RQ4去膨胀在多大程度上减少了可重用代码gadget和已知漏洞的数量?
- RQ5去膨胀能否应用于复杂、预编译的二进制文件(如Firefox和curl)而无需重新编译?
主要发现
- 在2016年Ubuntu Desktop程序中,平均仅有5%的libc被使用,v请播放器中最高使用率达18%。
- 该框架成功将coreutils去膨胀超过79%,SPEC CPU 2006基准测试去膨胀86%,且无功能回归。
- 该方法在coreutils套件中消除了超过71%的可重用代码gadget,显著减少了潜在攻击面。
- 包含真实世界漏洞的未使用代码被成功移除,且未对程序行为产生任何不良影响。
- 运行时加载开销保持较低水平,证明其在生产环境中部署的实际可行性。
- 该方法实现了对复杂预编译二进制文件(如Firefox和curl)的去膨胀,且无需重新编译。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。