Every CVE Search/ Get API key

CVE-2022-2421

Socket.io - Improper type validation in attachment parsing

10.0 CriticalFix available

Due to improper type validation in attachment parsing the Socket.io js library, it is possible to overwrite the _placeholder object which allows an attacker to place references to functions at arbitrary places in the resulting query object.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
Low
Privileges needed
None
User interaction
None

What an attacker can affect

Confidentiality
High
Integrity
High
Availability
High

Exploit likelihood

1.43%Up 0.5 points since Oct 27, 2022
90%50%10%1%

What each source reports

CVE List Score used 10.0

Socket.io - Improper type validation in attachment parsing

Due to improper type validation in attachment parsing the Socket.io js library, it is possible to overwrite the _placeholder object which allows an attacker to place references to functions at arbitrary places in the resulting query object.

Record
CVE-2022-2421
CVSS 3.1
10.0 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Weakness
CWE-89
Updated
2026-11-02
EUVDEUVD-2022-7153 10.0

Due to improper type validation in attachment parsing the Socket.io js library, it is possible to overwrite the _placeholder object which allows an attacker to place references to functions at arbitrary places in the resulting query object.

Record
EUVD-2022-7153
CVSS 3.1
10.0 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Updated
2026-11-02
GitHub AdvisoriesGHSA-qm95-pgcg-qqfq 9.8

Insufficient validation when decoding a Socket.IO packet

Due to improper type validation in the socket.io-parser library (which is used by the socket.io and socket.io-client packages to encode and decode Socket.IO packets), it is possible to overwrite the _placeholder object which allows an attacker to place references to functions at arbitrary places in the resulting query object.

Example:

const decoder = new Decoder();

decoder.on("decoded", (packet) => {
 console.log(packet.data); // prints [ 'hello', [Function: splice] ]
})

decoder.add('51-["hello",{"_placeholder":true,"num":"splice"}]');
decoder.add(Buffer.from("world"));

This bubbles up in the socket.io package:

io.on("connection", (socket) => {
 socket.on("hello", (val) => {
 // here, "val" could be a function instead of a buffer
 });
});

:warning: IMPORTANT NOTE :warning:

You need to make sure that the payload that you received from the client is actually a Buffer object:

io.on("connection", (socket) => {
 socket.on("hello", (val) => {
 if (!Buffer.isBuffer(val)) {
 socket.disconnect();
 return;
 }
 // ...
 });
});

If that's already the case, then you are not impacted by this issue, and there is no way an attacker could make your server crash (or escalate privileges, ...).

Example of values that could be sent by a malicious user:

  • a number that is out of bounds

Sample packet: 451-["hello",{"_placeholder":true,"num":10}]

io.on("connection", (socket) => {
 socket.on("hello", (val) => {
 // val is `undefined`
 });
});
  • a value that is not a number, like undefined

Sample packet: 451-["hello",{"_placeholder":true,"num":undefined}]

io.on("connection", (socket) => {
 socket.on("hello", (val) => {
 // val is `undefined`
 });
});
  • a string that is part of the prototype of Array, like "push"

Sample packet: 451-["hello",{"_placeholder":true,"num":"push"}]

io.on("connection", (socket) => {
 socket.on("hello", (val) => {
 // val is a reference to the "push" function
 });
});
  • a string that is part of the prototype of Object, like "hasOwnProperty"

Sample packet: 451-["hello",{"_placeholder":true,"num":"hasOwnProperty"}]

io.on("connection", (socket) => {
 socket.on("hello", (val) => {
 // val is a reference to the "hasOwnProperty" function
 });
});

This should be fixed by:

Dependency analysis for the socket.io package

| socket.io version | socket.io-parser version | Covered? | |---------------------|---------------------------------------------------------------------------------------------------------|------------------------| | 4.5.2...latest | ~4.2.0 (ref) | Yes :heavy_check_mark: | | 4.1.3...4.5.1 | ~4.0.4 (ref) | Yes :heavy_check_mark: | | 3.0.5...4.1.2 | ~4.0.3 (ref) | Yes :heavy_check_mark: | | 3.0.0...3.0.4 | ~4.0.1 (ref) | Yes :heavy_check_mark: | | 2.3.0...2.5.0 | ~3.4.0 (ref) | Yes :heavy_check_mark: |

Dependency analysis for the socket.io-client package

| socket.io-client version | socket.io-parser…

Record
GHSA-qm95-pgcg-qqfq
CVSS 3.1
9.8 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Weakness
CWE-20, CWE-89, CWE-1287
Updated
2026-11-02
NVD 10.0

Due to improper type validation in attachment parsing the Socket.io js library, it is possible to overwrite the _placeholder object which allows an attacker to place references to functions at arbitrary places in the resulting query object.

Record
CVE-2022-2421
CVSS 3.1
10.0 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
CVSS 3.1
9.8 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Weakness
CWE-89
Updated
2026-11-02
OSV 10.0

Socket.io - Improper type validation in attachment parsing

Due to improper type validation in attachment parsing the Socket.io js library, it is possible to overwrite the _placeholder object which allows an attacker to place references to functions at arbitrary places in the resulting query object.

Record
CVE-2022-2421
CVSS 3.1
10.0 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Weakness
CWE-89
Updated
2026-11-02
OSVGHSA-qm95-pgcg-qqfq 9.8

Insufficient validation when decoding a Socket.IO packet

Due to improper type validation in the socket.io-parser library (which is used by the socket.io and socket.io-client packages to encode and decode Socket.IO packets), it is possible to overwrite the _placeholder object which allows an attacker to place references to functions at arbitrary places in the resulting query object.

Example:

const decoder = new Decoder();

decoder.on("decoded", (packet) => {
 console.log(packet.data); // prints [ 'hello', [Function: splice] ]
})

decoder.add('51-["hello",{"_placeholder":true,"num":"splice"}]');
decoder.add(Buffer.from("world"));

This bubbles up in the socket.io package:

io.on("connection", (socket) => {
 socket.on("hello", (val) => {
 // here, "val" could be a function instead of a buffer
 });
});

:warning: IMPORTANT NOTE :warning:

You need to make sure that the payload that you received from the client is actually a Buffer object:

io.on("connection", (socket) => {
 socket.on("hello", (val) => {
 if (!Buffer.isBuffer(val)) {
 socket.disconnect();
 return;
 }
 // ...
 });
});

If that's already the case, then you are not impacted by this issue, and there is no way an attacker could make your server crash (or escalate privileges, ...).

Example of values that could be sent by a malicious user:

  • a number that is out of bounds

Sample packet: 451-["hello",{"_placeholder":true,"num":10}]

io.on("connection", (socket) => {
 socket.on("hello", (val) => {
 // val is `undefined`
 });
});
  • a value that is not a number, like undefined

Sample packet: 451-["hello",{"_placeholder":true,"num":undefined}]

io.on("connection", (socket) => {
 socket.on("hello", (val) => {
 // val is `undefined`
 });
});
  • a string that is part of the prototype of Array, like "push"

Sample packet: 451-["hello",{"_placeholder":true,"num":"push"}]

io.on("connection", (socket) => {
 socket.on("hello", (val) => {
 // val is a reference to the "push" function
 });
});
  • a string that is part of the prototype of Object, like "hasOwnProperty"

Sample packet: 451-["hello",{"_placeholder":true,"num":"hasOwnProperty"}]

io.on("connection", (socket) => {
 socket.on("hello", (val) => {
 // val is a reference to the "hasOwnProperty" function
 });
});

This should be fixed by:

Dependency analysis for the socket.io package

| socket.io version | socket.io-parser version | Covered? | |---------------------|---------------------------------------------------------------------------------------------------------|------------------------| | 4.5.2...latest | ~4.2.0 (ref) | Yes :heavy_check_mark: | | 4.1.3...4.5.1 | ~4.0.4 (ref) | Yes :heavy_check_mark: | | 3.0.5...4.1.2 | ~4.0.3 (ref) | Yes :heavy_check_mark: | | 3.0.0...3.0.4 | ~4.0.1 (ref) | Yes :heavy_check_mark: | | 2.3.0...2.5.0 | ~3.4.0 (ref) | Yes :heavy_check_mark: |

Dependency analysis for the socket.io-client package

| socket.io-client version | socket.io-parser…

Record
GHSA-qm95-pgcg-qqfq
CVSS 3.1
9.8 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Weakness
CWE-1287, CWE-20, CWE-89
Updated
2026-11-02
Show 5 moreShow less
OSVCLSA-2026-1772496675 No score

TuxCare security update for socket.io-parser (3 CVEs)

TuxCare rebuilt socket.io-parser to address 3 CVEs. Fixed in 3.2.0-tuxcare.1.

Record
CLSA-2026-1772496675
Updated
2026-11-02
OSVCLSA-2026-1776731787 No score

TuxCare security update for socket.io-parser (3 CVEs)

TuxCare rebuilt socket.io-parser to address 3 CVEs. Fixed in 3.1.3-tuxcare.1.

Record
CLSA-2026-1776731787
Updated
2026-11-02
OSVCLSA-2026-1791899634 No score

TuxCare security update for socket.io-parser (5 CVEs)

TuxCare rebuilt socket.io-parser to address 5 CVEs. Fixed in 2.3.1-tuxcare.1.

Record
CLSA-2026-1791899634
Updated
2026-11-02
OSVCLSA-2026-1792599106 No score

TuxCare security update for socket.io-parser (5 CVEs)

TuxCare rebuilt socket.io-parser to address 5 CVEs. Fixed in 2.2.2-tuxcare.1.

Record
CLSA-2026-1792599106
Updated
2026-11-02
OSVCLSA-2026-1792665531 No score

TuxCare security update for socket.io-parser (5 CVEs)

TuxCare rebuilt socket.io-parser to address 5 CVEs. Fixed in 2.2.4-tuxcare.1.

Record
CLSA-2026-1792665531
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
socket.io-parser
npm
4.1.0 up to 4.2.1
4.2.1
socket.io-parser
npm
4.0.0 up to 4.0.5
4.0.5
socket.io-parser
npm
before 3.3.3
3.3.3
socket.io-parser
npm
3.4.0 up to 3.4.2
3.4.2
socket.io-parser
TuxCare:npm
From an advisory covering 3 CVEs
3.2.0-tuxcare.0 up to 3.2.0-tuxcare.1, plus listed versions
3.2.0
3.2.0-tuxcare.1
socket.io-parser
TuxCare:npm
From an advisory covering 3 CVEs
3.1.3-tuxcare.0 up to 3.1.3-tuxcare.1, plus listed versions
3.1.3
3.1.3-tuxcare.1
socket.io-parser
TuxCare:npm
From an advisory covering 5 CVEs
2.3.1-tuxcare.0 up to 2.3.1-tuxcare.1, plus listed versions
2.3.1
2.3.1-tuxcare.1
socket.io-parser
TuxCare:npm
From an advisory covering 5 CVEs
2.2.2-tuxcare.0 up to 2.2.2-tuxcare.1, plus listed versions
2.2.2
2.2.2-tuxcare.1
socket.io-parser
TuxCare:npm
From an advisory covering 5 CVEs
2.2.4-tuxcare.0 up to 2.2.4-tuxcare.1, plus listed versions
2.2.4
2.2.4-tuxcare.1

History

History
RecordedChangedSources
affected, facts
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2022-2421 is a critical vulnerability (CVSS 10.0) in Socket Socket.io-parser, published October 25, 2022. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 1.43%, the 73rd percentile. Fixed in socket.io-parser 4.2.1.

References

Show 6 moreShow less
This page doesn't list everything

Left out here: the rest of 2 source descriptions. The JSON record has them.

MoveEnter Open