Skip to content

chore(deps): update dependency socket.io to v4.6.2 [security] - #93

Open
renovate[bot] wants to merge 1 commit into
developfrom
renovate/npm-socket.io-vulnerability
Open

chore(deps): update dependency socket.io to v4.6.2 [security]#93
renovate[bot] wants to merge 1 commit into
developfrom
renovate/npm-socket.io-vulnerability

Conversation

@renovate

@renovaterenovateBot commented Jun 19, 2024

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeConfidence
socket.io (source)4.1.24.6.2ageconfidence

socket.io has an unhandled 'error' event

CVE-2024-38355 / GHSA-25hc-qcg6-38wj

More information

Details

Impact

A specially crafted Socket.IO packet can trigger an uncaught exception on the Socket.IO server, thus killing the Node.js process.

node:events:502
throw err; // Unhandled 'error' event
^
Error [ERR_UNHANDLED_ERROR]: Unhandled error. (undefined)
at new NodeError (node:internal/errors:405:5)
at Socket.emit (node:events:500:17)
at /myapp/node_modules/socket.io/lib/socket.js:531:14
at process.processTicksAndRejections (node:internal/process/task_queues:77:11) {
code: 'ERR_UNHANDLED_ERROR',
context: undefined
}
Affected versions
Version rangeNeeds minor update?
4.6.2...latestNothing to do
3.0.0...4.6.1Please upgrade to socket.io@4.6.2 (at least)
2.3.0...2.5.0Please upgrade to socket.io@2.5.1
Patches

This issue is fixed by socketio/socket.io@15af22f, included in socket.io@4.6.2 (released in May 2023).

The fix was backported in the 2.x branch today: socketio/socket.io@d30630b

Workarounds

As a workaround for the affected versions of the socket.io package, you can attach a listener for the "error" event:

io.on("connection",(socket)=>{socket.on("error",()=>{// ...});});
For more information

If you have any questions or comments about this advisory:

  • Open a discussion here

Thanks a lot to Paul Taylor for the responsible disclosure.

References

Severity

  • CVSS Score: 6.9 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

socketio/socket.io (socket.io)

v4.6.2

Compare Source

Bug Fixes
Links

v4.6.1

Compare Source

Bug Fixes
  • properly handle manually created dynamic namespaces (0d0a7a2)
  • types: fix nodenext module resolution compatibility (#​4625) (d0b22c6)
Links

v4.6.0

Compare Source

Bug Fixes
Features
Promise-based acknowledgements

This commit adds some syntactic sugar around acknowledgements:

  • emitWithAck()
try{constresponses=awaitio.timeout(1000).emitWithAck("some-event");console.log(responses);// one response per client}catch(e){// some clients did not acknowledge the event in the given delay}io.on("connection",async(socket)=>{// without timeoutconstresponse=awaitsocket.emitWithAck("hello","world");// with a specific timeouttry{constresponse=awaitsocket.timeout(1000).emitWithAck("hello","world");}catch(err){// the client did not acknowledge the event in the given delay}});
  • serverSideEmitWithAck()
try{constresponses=awaitio.timeout(1000).serverSideEmitWithAck("some-event");console.log(responses);// one response per server (except itself)}catch(e){// some servers did not acknowledge the event in the given delay}

Added in 184f3cf.

Connection state recovery

This feature allows a client to reconnect after a temporary disconnection and restore its state:

  • id
  • rooms
  • data
  • missed packets

Usage:

import{Server}from"socket.io";constio=newServer({connectionStateRecovery: {// default valuesmaxDisconnectionDuration: 2*60*1000,skipMiddlewares: true,},});io.on("connection",(socket)=>{console.log(socket.recovered);// whether the state was recovered or not});

Here's how it works:

  • the server sends a session ID during the handshake (which is different from the current id attribute, which is public and can be freely shared)
  • the server also includes an offset in each packet (added at the end of the data array, for backward compatibility)
  • upon temporary disconnection, the server stores the client state for a given delay (implemented at the adapter level)
  • upon reconnection, the client sends both the session ID and the last offset it has processed, and the server tries to restore the state

The in-memory adapter already supports this feature, and we will soon update the Postgres and MongoDB adapters. We will also create a new adapter based on Redis Streams, which will support this feature.

Added in 54d5ee0.

Compatibility (for real) with Express middlewares

This feature implements middlewares at the Engine.IO level, because Socket.IO middlewares are meant for namespace authorization and are not executed during a classic HTTP request/response cycle.

Syntax:

io.engine.use((req,res,next)=>{// do somethingnext();});// with express-sessionimportsessionfrom"express-session";io.engine.use(session({secret: "keyboard cat",resave: false,saveUninitialized: true,cookie: {secure: true}}));// with helmetimporthelmetfrom"helmet";io.engine.use(helmet());

A workaround was possible by using the allowRequest option and the "headers" event, but this feels way cleaner and works with upgrade requests too.

Added in 24786e7.

Error details in the disconnecting and disconnect events

The disconnect event will now contain additional details about the disconnection reason.

io.on("connection",(socket)=>{socket.on("disconnect",(reason,description)=>{console.log(description);});});

Added in 8aa9499.

Automatic removal of empty child namespaces

This commit adds a new option, "cleanupEmptyChildNamespaces". With this option enabled (disabled by default), when a socket disconnects from a dynamic namespace and if there are no other sockets connected to it then the namespace will be cleaned up and its adapter will be closed.

import{createServer}from"node:http";import{Server}from"socket.io";consthttpServer=createServer();constio=newServer(httpServer,{cleanupEmptyChildNamespaces: true});

Added in 5d9220b.

A new "addTrailingSlash" option

The trailing slash which was added by default can now be disabled:

import{createServer}from"node:http";import{Server}from"socket.io";consthttpServer=createServer();constio=newServer(httpServer,{addTrailingSlash: false});

In the example above, the clients can omit the trailing slash and use /socket.io instead of /socket.io/.

Added in d0fd474.

Performance Improvements
  • precompute the WebSocket frames when broadcasting (da2b542)
Links:

v4.5.4

Compare Source

This release contains a bump of:

Links:

v4.5.3

Compare Source

Bug Fixes
  • typings: accept an HTTP2 server in the constructor (d3d0a2d)
  • typings: apply types to "io.timeout(...).emit()" calls (e357daf)
Links:

v4.5.2

Compare Source

Bug Fixes
  • prevent the socket from joining a room after disconnection (18f3fda)
  • uws: prevent the server from crashing after upgrade (ba497ee)
Links:

v4.5.1

Compare Source

Bug Fixes
  • forward the local flag to the adapter when using fetchSockets() (30430f0)
  • typings: add HTTPS server to accepted types (#​4351) (9b43c91)
Links:

v4.5.0

Compare Source

Bug Fixes
Features
  • add support for catch-all listeners for outgoing packets (531104d)

This is similar to onAny(), but for outgoing packets.

Syntax:

socket.onAnyOutgoing((event, ...args)=>{console.log(event);});
  • broadcast and expect multiple acks (8b20457)

Syntax:

io.timeout(1000).emit("some-event",(err,responses)=>{// ...});
  • add the "maxPayload" field in the handshake details (088dcb4)

So that clients in HTTP long-polling can decide how many packets they have to send to stay under the maxHttpBufferSize
value.

This is a backward compatible change which should not mandate a new major revision of the protocol (we stay in v4), as
we only add a field in the JSON-encoded handshake data:

0{"sid":"lv_VI97HAXpY6yYWAAAC","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000,"maxPayload":1000000}
Links:

v4.4.1

Compare Source

Bug Fixes
Links:

v4.4.0

Compare Source

Bug Fixes
  • only set 'connected' to true after middleware execution (02b0f73)
Features
  • add an implementation based on uWebSockets.js (c0d8c5a)
const{ App }=require("uWebSockets.js");const{ Server }=require("socket.io");constapp=newApp();constio=newServer();io.attachApp(app);io.on("connection",(socket)=>{// ...});app.listen(3000,(token)=>{if(!token){console.warn("port already in use");}});
socket.timeout(5000).emit("my-event",(err)=>{if(err){// the client did not acknowledge the event in the given delay}});
interfaceSocketData{
name: string;
age: number;}constio=newServer<ClientToServerEvents,ServerToClientEvents,InterServerEvents,SocketData>();io.on("connection",(socket)=>{socket.data.name="john";socket.data.age=42;});
Links:

v4.3.2

Compare Source

Bug Fixes
Links:

v4.3.1

Compare Source

Bug Fixes
Links:

v4.3.0

Compare Source

For this release, most of the work was done on the client side, see here.

Bug Fixes
  • typings: add name field to cookie option (#​4099) (033c5d3)
  • send volatile packets with binary attachments (dc81fcf)
Features
Links:

v4.2.0

Compare Source

Bug Fixes
  • typings: allow async listener in typed events (ccfd8ca)
Features
  • ignore the query string when serving client JavaScript (#​4024) (24fee27)
Links:

v4.1.3

Compare Source

Bug Fixes
Links:

Configuration

📅 Schedule: (in timezone Europe/Paris)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch from ea7145a to a6e80faCompareJanuary 23, 2025 18:07
@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch from a6e80fa to 74ed30fCompareMay 24, 2025 23:51
@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch from 74ed30f to 670ef14CompareJune 22, 2025 14:33
@renovaterenovateBot changed the title fix(deps): update dependency socket.io to v4.6.2 [security]chore(deps): update dependency socket.io to v4.6.2 [security]Sep 26, 2025
@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch 4 times, most recently from de6d4a0 to f22a0a4CompareOctober 7, 2025 18:54
@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch from f22a0a4 to 15a1213CompareOctober 11, 2025 11:15
@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch from 15a1213 to 5a49f36CompareOctober 11, 2025 11:24
@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch from 5a49f36 to 78baea3CompareOctober 21, 2025 09:36
@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch from 78baea3 to 3c3bfaeCompareNovember 10, 2025 19:39
@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch from 3c3bfae to 1c4f782CompareDecember 31, 2025 17:00
@renovaterenovateBot changed the title chore(deps): update dependency socket.io to v4.6.2 [security]chore(deps): update dependency socket.io to v4.6.2 [security] - autoclosedMar 27, 2026
@renovaterenovateBot closed this Mar 27, 2026
@renovate
renovateBot deleted the renovate/npm-socket.io-vulnerability branch March 27, 2026 01:08
@renovaterenovateBot changed the title chore(deps): update dependency socket.io to v4.6.2 [security] - autoclosedchore(deps): update dependency socket.io to v4.6.2 [security]Mar 30, 2026
@renovaterenovateBot reopened this Mar 30, 2026
@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch 2 times, most recently from 1c4f782 to f0db0a2CompareMarch 30, 2026 18:32
@renovaterenovateBot changed the title chore(deps): update dependency socket.io to v4.6.2 [security]chore(deps): update dependency socket.io to v4.6.2 [security] - autoclosedApr 27, 2026
@renovaterenovateBot closed this Apr 27, 2026
@renovaterenovateBot changed the title chore(deps): update dependency socket.io to v4.6.2 [security] - autoclosedchore(deps): update dependency socket.io to v4.6.2 [security]Apr 27, 2026
@renovaterenovateBot reopened this Apr 27, 2026
@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch 2 times, most recently from f0db0a2 to 02cf3feCompareApril 27, 2026 22:16
@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch from 02cf3fe to bef088fCompareMay 28, 2026 17:09
@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch from bef088f to 995e36dCompareJuly 12, 2026 12:38
@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch 2 times, most recently from 995e36d to 5ad4124CompareJuly 16, 2026 15:09
@renovate
renovateBotforce-pushed the renovate/npm-socket.io-vulnerability branch from 5ad4124 to 18f8c98CompareAugust 11, 2026 21:38
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants