slackhq / csp-html-webpack-plugin

A plugin which, when combined with HTMLWebpackPlugin, adds CSP tags to the HTML output.
MIT License
164 stars 39 forks source link

Nonce seems to be static - recommanded conf is dangerous for static website generators #121

Open quadristan opened 8 months ago

quadristan commented 8 months ago

Description

Trying to use this plugin within a static website is opening security holes by default. For example if we follow https://github.com/slackhq/csp-html-webpack-plugin/issues/53, it will add static nonces on a static website.

I would recommend to disable nonces by default, and let the user enable them on when they know that they wont pack a static website

What type of issue is this? (place an x in one of the [ ])

Requirements (place an x in each of the [ ])


Bug Report

Filling out the following details about bugs will help us solve your issue sooner.

Reproducible in:

slackhq/csp-html-webpack-plugin version: 5.1.0

Steps to reproduce:

  1. create static website, such with as npx create-react-app my-app --template typescript
  2. Install and wire the plugin npm install react-app-rewired csp-html-webpack-plugin --save-dev
  3. Configure webpack overrides in config-overrides.js
    
    const CspHtmlWebpackPlugin = require("csp-html-webpack-plugin");

module.exports = function override(config, env) { config.plugins.push( new CspHtmlWebpackPlugin({ "script-src": "", "style-src": "", }) ); return config; };

4. Build with `react-app-rewired build`
5. Check `build/index.html` file

#### Expected result:

Nonces are not static. At the very least, they should be generated by an inline script and injected

#### Actual result:

Static nonces are generated.
Uploading this to a CDN will allow anyone to grab the nunce and re-use it, bypassing the CSP

```html
  <meta http-equiv="Content-Security-Policy"
    content="base-uri 'self'; object-src 'none'; script-src 'nonce-csu9vwLV51tCaN6biAAJFg=='; style-src 'nonce-vAVCeRTmI/cROWHcZcycQA=='">
LoganKells commented 2 months ago

I've used webpack to programmatically generate nonce values during each build.