Software complexity has increased over the years. One common way to tackle this complexity during development is to encapsulate features into a shared library. This allows developers to reuse already implemented features instead of reimplementing them over and over again. However, not all features provided by a shared library are actually used by an application. As a result, an application using shared libraries loads unused code into memory, which an attacker can use to perform code-reuse and similar types of attacks. The same holds for applications written in a scripting language such as PHP or Ruby: The interpreter typically offers much more functionality than is actually required by the application and hence provides a larger overall attack surface. In this paper, we tackle this problem and propose a first step towards automated application-specific software stacks. We present a compiler extension capable of removing unneeded code from shared libraries and---with the help of domain knowledge---also capable of removing unused functionalities from an interpreter's code base during the compilation process. Our evaluation against a diverse set of real-world applications, among others Nginx, Lighttpd, and the PHP interpreter, removes on average 71.3% of the code in musl-libc, a popular libc implementation. The evaluation on web applications show that a tailored PHP interpreter can mitigate entire vulnerability classes, as is the case for OpenConf. We demonstrate the applicability of our debloating approach by creating an application-specific software stack for a Wordpress web application: we tailor the libc library to the Nginx web server and PHP interpreter, whereas the PHP interpreter is tailored to the Wordpress web application. In this real-world scenario, the code of the libc is decreased by 65.1% in total, thereby reducing the available code for code-reuse attacks.
翻译:多年来,软件的复杂性增加了。 开发过程中处理这种复杂性的一个常见方法就是将功能包含在共享的图书馆中。 这样可以让开发者重新使用已经安装的功能, 而不是一次又一次地重新实施这些功能。 但是, 共享的图书馆所提供的所有功能实际上并非都被应用程序所使用。 结果, 一个使用共享的图书馆的应用程序将未使用的代码装入记忆中, 攻击者也可以在编译过程中将未使用的功能从口译员的代码库中删除。 使用像 PHP 或 Ruby 这样的脚本语言编写的应用程序同样适用: 口译员通常提供比应用程序实际需要的功能要多得多, 从而提供一个更大的总体攻击性表面。 在本文件中, 我们解决这个问题, 并提议向自动应用的应用程序自动应用软件库提供第一个步骤。 因此, 我们提出了一个编译器的编译扩展扩展功能, 也可以在编译员的代码库中删除未使用的功能。 我们用多种格式的版本来评估, 除其他外, Nhinx, Lighttptppric 和 PHP 解释员, 在平均的版本应用中, 将网络代码中, 缩缩缩缩化应用 显示我们的版本的版本的版本的版本。