Skip to content

Commit fc480b4

Browse files
fix: prevent crash when provided with an invalid query param
A specially crafted request could lead to the following exception: > TypeError: Cannot read properties of undefined (reading 'handlesUpgrades') > at Server.onWebSocket (build/server.js:515:67) This bug was introduced in [1], released in version 5.1.0 and included in version 4.1.0 of the `socket.io` parent package. Older versions are not impacted. [1]: 7096e98
1 parent 0141951 commit fc480b4

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed

lib/server.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,7 @@ export class Server extends BaseServer {
682682

683683
const res = new WebSocketResponse(req, socket);
684684
const callback = (errorCode, errorContext) => {
685-
if (errorCode) {
685+
if (errorCode !== undefined) {
686686
this.emit("connection_error", {
687687
req,
688688
code: errorCode,

lib/userver.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ export class uServer extends BaseServer {
165165
req.res = res;
166166

167167
const callback = async (errorCode, errorContext) => {
168-
if (errorCode) {
168+
if (errorCode !== undefined) {
169169
this.emit("connection_error", {
170170
req,
171171
code: errorCode,

test/server.js

+46
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const { ClientSocket, listen, createPartialDone } = require("./common");
1111
const expect = require("expect.js");
1212
const request = require("superagent");
1313
const cookieMod = require("cookie");
14+
const { WebSocket } = require("ws");
1415

1516
/**
1617
* Tests.
@@ -197,6 +198,51 @@ describe("server", () => {
197198
});
198199
});
199200
});
201+
202+
it("should disallow `__proto__` as transport (polling)", (done) => {
203+
const partialDone = createPartialDone(done, 2);
204+
205+
engine = listen((port) => {
206+
engine.on("connection_error", (err) => {
207+
expect(err.req).to.be.ok();
208+
expect(err.code).to.be(0);
209+
expect(err.message).to.be("Transport unknown");
210+
expect(err.context.transport).to.be("__proto__");
211+
partialDone();
212+
});
213+
214+
request
215+
.get(`http://localhost:${port}/engine.io/`)
216+
.query({ transport: "__proto__", EIO: 4 })
217+
.end((err, res) => {
218+
expect(err).to.be.an(Error);
219+
expect(res.status).to.be(400);
220+
expect(res.body.code).to.be(0);
221+
expect(res.body.message).to.be("Transport unknown");
222+
partialDone();
223+
});
224+
});
225+
});
226+
227+
it("should disallow `__proto__` as transport (websocket)", (done) => {
228+
const partialDone = createPartialDone(done, 2);
229+
230+
engine = listen((port) => {
231+
engine.on("connection_error", (err) => {
232+
expect(err.req).to.be.ok();
233+
expect(err.code).to.be(0);
234+
expect(err.message).to.be("Transport unknown");
235+
expect(err.context.transport).to.be("__proto__");
236+
partialDone();
237+
});
238+
239+
const socket = new WebSocket(
240+
`ws://localhost:${port}/engine.io/?EIO=4&transport=__proto__`
241+
);
242+
243+
socket.onerror = partialDone;
244+
});
245+
});
200246
});
201247

202248
describe("handshake", () => {

0 commit comments

Comments
 (0)