Skip to content

Commit 830e364

Browse files
fix(cluster-engine): guard client lookups against prototype pollution
1 parent 64066c3 commit 830e364

1 file changed

Lines changed: 11 additions & 5 deletions

File tree

  • packages/socket.io-cluster-engine/lib

packages/socket.io-cluster-engine/lib/engine.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ function randomId() {
3030
return randomBytes(3).toString("hex");
3131
}
3232

33+
function safeGet<T>(obj: Record<string, T>, key: string): T | undefined {
34+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
35+
return obj[key];
36+
}
37+
}
38+
3339
enum MessageType {
3440
ACQUIRE_LOCK = 0,
3541
ACQUIRE_LOCK_RESPONSE,
@@ -185,7 +191,7 @@ export abstract class ClusterEngine extends Server {
185191
switch (message.type) {
186192
case MessageType.ACQUIRE_LOCK: {
187193
const sid = message.data.sid;
188-
const client = this.clients[sid];
194+
const client = safeGet(this.clients, sid);
189195
if (!client) {
190196
return;
191197
}
@@ -257,7 +263,7 @@ export abstract class ClusterEngine extends Server {
257263
}
258264

259265
case MessageType.PACKET: {
260-
const client = this.clients[message.data.sid];
266+
const client = safeGet(this.clients, message.data.sid);
261267
if (!client) {
262268
return;
263269
}
@@ -272,7 +278,7 @@ export abstract class ClusterEngine extends Server {
272278

273279
case MessageType.UPGRADE: {
274280
const sid = message.data.sid;
275-
const client = this.clients[sid];
281+
const client = safeGet(this.clients, sid);
276282
if (!client) {
277283
return;
278284
}
@@ -331,7 +337,7 @@ export abstract class ClusterEngine extends Server {
331337
}
332338

333339
case MessageType.CLOSE: {
334-
const client = this.clients[message.data.sid];
340+
const client = safeGet(this.clients, message.data.sid);
335341
if (!client) {
336342
return;
337343
}
@@ -553,7 +559,7 @@ export abstract class ClusterEngine extends Server {
553559

554560
override onWebSocket(req: any, socket: any, websocket: any) {
555561
const sid = req._query.sid;
556-
if (!sid || this.clients[sid]) {
562+
if (!sid || safeGet(this.clients, sid)) {
557563
// @ts-expect-error onWebSocket() is private
558564
return super.onWebSocket(req, socket, websocket);
559565
}

0 commit comments

Comments
 (0)