fix(network): one malformed signaling frame crashes the UDP game server

Offen Anfängerfreundlich
#476 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
76/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
bun, typescript
Bereich
networking, security

Rechercherichtung

Beginne in modules/network/src/server/udp.server.network.ts ungefähr bei den Zeilen 158–176 und lies shared/signaling.ts wegen des vorhandenen Hilfsprogramms parseSignal. Sieh dir dann die Signalisierungstests in test/server/udp.server.spec.ts an und füge neben dem Erfolgsfall einen Fall mit einem fehlerhaften Frame hinzu. Fertig ist die Aufgabe, wenn ungültige Frames den Server nicht mehr zum Absturz bringen und der Test bestätigt, dass der Socket mit Code 1008 geschlossen wird.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

bug modules:network
Which package is this bug report for?

network

Issue description

The async message handler of the UDP signaling WebSocket calls JSON.parse on raw input and then awaits setRemoteDescription / addIceCandidate with unvalidated data, with no try/catch. Neither the engine nor the loader installs an unhandled-rejection handler, so the rejection is unhandled and the Bun process exits. Any client that connects over TCP gets the session token this socket needs, so any player can stop the game server with a single frame. A null payload also throws on data.type, and pendingCandidates grows without limit.

Where:

Evidence:

message: async (webSocket, message) => {
  ...
  const data = JSON.parse(typeof message === "string" ? message : new TextDecoder().decode(message));
  if (data.type === "offer") { await this.receiveClientOffer(peerConnection, data.offer, webSocket); }

Reproduced with the same handler shape on Bun 1.3.14: ws.send("{") → SyntaxError: JSON Parse error: Expected '}' → process exits with code 1.

Suggested fix: Parse with the existing parseSignal (shared/signaling.ts), check the types of type / offer / candidate, wrap the body in try/catch and close the socket with 1008 on failure. Add a malformed-frame test next to the "signaling" happy path in test/server/udp.server.spec.ts.

Found during a code audit of main at be72076.

Code sample
// Same handler shape as UDPServer's signaling socket
const server = Bun.serve({
  port: 0,
  fetch: (req, srv) => (srv.upgrade(req) ? undefined : new Response("no")),
  websocket: { message: async (_ws, m) => { const d = JSON.parse(String(m)); console.log(d.type); } },
});
const ws = new WebSocket(`ws://localhost:${server.port}`);
ws.onopen = () => ws.send("{");
// → SyntaxError: JSON Parse error, process exits with code 1
Versions
  • Engine main at be72076
  • pnpm 12.0.0, Node.js 26, Bun 1.3.14
Issue priority

High (immediate attention needed)

I have tested this issue on a development release

be72076

Vorherrschende Sprache
TypeScript
Sterne
7
Forks
2
Ø Merge
1 T. 17 Std.
Gemergte PRs (30 T.)
17

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus NanoForge-dev/Engine

Alle Issues in NanoForge-dev/Engine

Ähnliche Issues

Weitere Issues zu TypeScript

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.