VYPR
High severityNVD Advisory· Published Jan 12, 2022· Updated Apr 23, 2025

Uncaught Exception in engine.io

CVE-2022-21676

Description

Engine.IO is the implementation of transport-based cross-browser/cross-device bi-directional communication layer for Socket.IO. A specially crafted HTTP request can trigger an uncaught exception on the Engine.IO server, thus killing the Node.js process. This impacts all the users of the engine.io package starting from version 4.0.0, including those who uses depending packages like socket.io. Versions prior to 4.0.0 are not impacted. A fix has been released for each major branch, namely 4.1.2 for the 4.x.x branch, 5.2.1 for the 5.x.x branch, and 6.1.1 for the 6.x.x branch. There is no known workaround except upgrading to a safe version.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
engine.ionpm
>= 4.0.0, < 4.1.24.1.2
engine.ionpm
>= 5.0.0, < 5.2.15.2.1
engine.ionpm
>= 6.0.0, < 6.1.16.1.1

Affected products

1

Patches

3
c0e194d44933

fix: properly handle invalid data sent by a malicious websocket client

https://github.com/socketio/engine.ioDamien ArrachequesneJan 11, 2022via ghsa
2 files changed · +40 3
  • lib/server.ts+0 3 modified
    @@ -609,9 +609,6 @@ export class Server extends BaseServer {
             client.maybeUpgrade(transport);
           }
         } else {
    -      // transport error handling takes over
    -      websocket.removeListener("error", onUpgradeError);
    -
           const closeConnection = (errorCode, errorContext) =>
             abortUpgrade(socket, errorCode, errorContext);
           this.handshake(req._query.transport, req, closeConnection);
    
  • test/server.js+40 0 modified
    @@ -157,6 +157,46 @@ describe("server", () => {
             }
           );
         });
    +
    +    it("should not throw when the client sends invalid data during the handshake (ws only)", done => {
    +      listen(port => {
    +        // will throw "RangeError: Invalid WebSocket frame: RSV2 and RSV3 must be clear"
    +        request
    +          .get(`http://localhost:${port}/engine.io/`)
    +          .set("connection", "upgrade")
    +          .set("upgrade", "websocket")
    +          .set("Sec-WebSocket-Version", "13")
    +          .set("Sec-WebSocket-Key", "DXR4dX615eRds8nRmlhqtw==")
    +          .query({ transport: "websocket", EIO: 4 })
    +          .send("test")
    +          .end(() => {});
    +
    +        setTimeout(done, 50);
    +      });
    +    });
    +
    +    it("should not throw when the client sends invalid data during the handshake (upgrade)", done => {
    +      listen(port => {
    +        request
    +          .get(`http://localhost:${port}/engine.io/`)
    +          .query({ transport: "polling", EIO: 4 })
    +          .end((err, res) => {
    +            const sid = JSON.parse(res.text.substring(1)).sid;
    +
    +            request
    +              .get(`http://localhost:${port}/engine.io/`)
    +              .set("connection", "upgrade")
    +              .set("upgrade", "websocket")
    +              .set("Sec-WebSocket-Version", "13")
    +              .set("Sec-WebSocket-Key", "DXR4dX615eRds8nRmlhqtw==")
    +              .query({ transport: "websocket", EIO: 4, sid })
    +              .send("test")
    +              .end(() => {});
    +
    +            setTimeout(done, 50);
    +          });
    +      });
    +    });
       });
     
       describe("handshake", () => {
    
a70800d7e96d

fix: properly handle invalid data sent by a malicious websocket client

https://github.com/socketio/engine.ioDamien ArrachequesneJan 11, 2022via ghsa
2 files changed · +40 3
  • lib/server.js+0 3 modified
    @@ -372,9 +372,6 @@ class Server extends EventEmitter {
             client.maybeUpgrade(transport);
           }
         } else {
    -      // transport error handling takes over
    -      socket.removeListener("error", onUpgradeError);
    -
           this.handshake(req._query.transport, req);
         }
     
    
  • test/server.js+40 0 modified
    @@ -107,6 +107,46 @@ describe("server", () => {
             }
           );
         });
    +
    +    it("should not throw when the client sends invalid data during the handshake (ws only)", done => {
    +      listen(port => {
    +        // will throw "RangeError: Invalid WebSocket frame: RSV2 and RSV3 must be clear"
    +        request
    +          .get(`http://localhost:${port}/engine.io/`)
    +          .set("connection", "upgrade")
    +          .set("upgrade", "websocket")
    +          .set("Sec-WebSocket-Version", "13")
    +          .set("Sec-WebSocket-Key", "DXR4dX615eRds8nRmlhqtw==")
    +          .query({ transport: "websocket", EIO: 4 })
    +          .send("test")
    +          .end(() => {});
    +
    +        setTimeout(done, 50);
    +      });
    +    });
    +
    +    it("should not throw when the client sends invalid data during the handshake (upgrade)", done => {
    +      listen(port => {
    +        request
    +          .get(`http://localhost:${port}/engine.io/`)
    +          .query({ transport: "polling", EIO: 4 })
    +          .end((err, res) => {
    +            const sid = JSON.parse(res.text.substring(1)).sid;
    +
    +            request
    +              .get(`http://localhost:${port}/engine.io/`)
    +              .set("connection", "upgrade")
    +              .set("upgrade", "websocket")
    +              .set("Sec-WebSocket-Version", "13")
    +              .set("Sec-WebSocket-Key", "DXR4dX615eRds8nRmlhqtw==")
    +              .query({ transport: "websocket", EIO: 4, sid })
    +              .send("test")
    +              .end(() => {});
    +
    +            setTimeout(done, 50);
    +          });
    +      });
    +    });
       });
     
       describe("handshake", () => {
    
66f889fc1d96

fix: properly handle invalid data sent by a malicious websocket client

https://github.com/socketio/engine.ioDamien ArrachequesneJan 11, 2022via ghsa
2 files changed · +40 3
  • lib/server.js+0 3 modified
    @@ -454,9 +454,6 @@ class Server extends EventEmitter {
             client.maybeUpgrade(transport);
           }
         } else {
    -      // transport error handling takes over
    -      websocket.removeListener("error", onUpgradeError);
    -
           const closeConnection = (errorCode, errorContext) =>
             abortUpgrade(socket, errorCode, errorContext);
           this.handshake(req._query.transport, req, closeConnection);
    
  • test/server.js+40 0 modified
    @@ -157,6 +157,46 @@ describe("server", () => {
             }
           );
         });
    +
    +    it("should not throw when the client sends invalid data during the handshake (ws only)", done => {
    +      listen(port => {
    +        // will throw "RangeError: Invalid WebSocket frame: RSV2 and RSV3 must be clear"
    +        request
    +          .get(`http://localhost:${port}/engine.io/`)
    +          .set("connection", "upgrade")
    +          .set("upgrade", "websocket")
    +          .set("Sec-WebSocket-Version", "13")
    +          .set("Sec-WebSocket-Key", "DXR4dX615eRds8nRmlhqtw==")
    +          .query({ transport: "websocket", EIO: 4 })
    +          .send("test")
    +          .end(() => {});
    +
    +        setTimeout(done, 50);
    +      });
    +    });
    +
    +    it("should not throw when the client sends invalid data during the handshake (upgrade)", done => {
    +      listen(port => {
    +        request
    +          .get(`http://localhost:${port}/engine.io/`)
    +          .query({ transport: "polling", EIO: 4 })
    +          .end((err, res) => {
    +            const sid = JSON.parse(res.text.substring(1)).sid;
    +
    +            request
    +              .get(`http://localhost:${port}/engine.io/`)
    +              .set("connection", "upgrade")
    +              .set("upgrade", "websocket")
    +              .set("Sec-WebSocket-Version", "13")
    +              .set("Sec-WebSocket-Key", "DXR4dX615eRds8nRmlhqtw==")
    +              .query({ transport: "websocket", EIO: 4, sid })
    +              .send("test")
    +              .end(() => {});
    +
    +            setTimeout(done, 50);
    +          });
    +      });
    +    });
       });
     
       describe("handshake", () => {
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

11

News mentions

0

No linked articles in our index yet.