Stubbifier: debloating dynamic server-side JavaScript applications
JavaScript is an increasingly popular language for server-side development, thanks in part to the Node.js runtime environment and its vast ecosystem of modules. With the Node.js package manager npm, users are able to easily include external modules as dependencies in their projects. However, npm ins...
Uložené v:
| Vydané v: | Empirical software engineering : an international journal Ročník 27; číslo 7 |
|---|---|
| Hlavní autori: | , , , , |
| Médium: | Journal Article |
| Jazyk: | English |
| Vydavateľské údaje: |
New York
Springer US
01.12.2022
Springer Nature B.V |
| Predmet: | |
| ISSN: | 1382-3256, 1573-7616 |
| On-line prístup: | Získať plný text |
| Tagy: |
Pridať tag
Žiadne tagy, Buďte prvý, kto otaguje tento záznam!
|
| Shrnutí: | JavaScript is an increasingly popular language for server-side development, thanks in part to the Node.js runtime environment and its vast ecosystem of modules. With the Node.js package manager npm, users are able to easily include external modules as dependencies in their projects. However, npm installs modules with
all
of their functionality, even if only a fraction is needed, which causes an undue increase in code size. Eliminating this unused functionality from distributions is desirable, but the sound analysis required to find unused code is difficult due to JavaScript’s extreme dynamicity. We present a fully automatic technique that identifies unused code by constructing static or dynamic call graphs from the application’s tests, and replacing code deemed unreachable with either file- or function-level
stubs
. Due to JavaScript’s highly dynamic nature, call graph construction may suffer from unsoundness, i.e., code identified as unused may in fact be reachable. To handle such cases, if a stub is called, it will fetch and execute the original code on-demand to preserve the application’s behavior. The technique also provides an optional
guarded execution mode
to guard application against injection vulnerabilities in untested code that resulted from stub expansion. This technique is implemented in an open source tool called
Stubbifier
, designed to help package developers to produce a minimal production distribution.
Stubbifier
supports the ECMAScript 2019 standard. In an empirical evaluation on 15 Node.js applications and 75 clients of these applications,
Stubbifier
reduced application size by 56% on average while incurring only minor performance overhead. The evaluation also shows that
Stubbifier
’s guarded execution mode is capable of preventing several known injection vulnerabilities that are manifested in stubbed-out code. Finally,
Stubbifier
can work alongside
bundlers
, popular JavaScript tools for bundling an application with its dependencies. For the considered subject applications, we measured an average size reduction of 37% in bundled distributions. |
|---|---|
| Bibliografia: | ObjectType-Article-1 SourceType-Scholarly Journals-1 ObjectType-Feature-2 content type line 14 |
| ISSN: | 1382-3256 1573-7616 |
| DOI: | 10.1007/s10664-022-10195-6 |