Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

fix(server): add read deadline and size limit to control plane handshake

Aperta Adatta ai principianti
#56 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
78/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
go

Direzione di ricerca

Inizia in internal/server/server.go, in corrispondenza di handleControlConnection, e controlla il percorso esistente di decodifica dell’handshake. Aggiungi la scadenza e il limite di dimensione descritti nell’issue, poi cerca o aggiungi test unitari per la gestione dell’handshake. Il lavoro è completato quando gli handshake lenti e troppo grandi vengono rifiutati correttamente e la scadenza viene reimpostata per le connessioni di lunga durata.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

bug

Description

In internal/server/server.go (handleControlConnection), the control plane listener accepts raw TCP sockets on port 7890 and immediately decodes the handshake payload:

func (s *Server) handleControlConnection(conn net.Conn) {
    var req protocol.TunnelRequest
    if err := json.NewDecoder(conn).Decode(&req); err != nil {
        conn.Close()
        return
    }

Problem & Impact

  1. Slowloris DoS: There is no read deadline on conn (conn.SetReadDeadline). A client can open a TCP connection and send 1 byte every few minutes. The server goroutine will remain blocked on Decode indefinitely, leaking goroutines and file descriptors.
  2. Unbounded Memory Allocation (OOM): There is no limit on the bytes read from conn before parsing JSON. A malicious actor can stream an infinite string (e.g. {"Subdomain": "aaaa...) without closing quotes, forcing the server to buffer into RAM until an Out-Of-Memory (OOM) crash occurs.

Proposed Solution

  1. Set a reasonable read deadline (e.g. 5 seconds) before decoding the initial handshake.
  2. Wrap conn in an io.LimitReader (e.g. 4KB maximum handshake size) to reject oversized or streaming payloads:
_ = conn.SetReadDeadline(time.Now().Add(5 * time.Second))
limitedReader := io.LimitReader(conn, 4096)
if err := json.NewDecoder(limitedReader).Decode(&req); err != nil {
    conn.Close()
    return
}
_ = conn.SetReadDeadline(time.Time{}) // reset deadline for long-lived control connection

Acceptance Criteria

  • Add 5-second read timeout on initial handshake on port 7890.
  • Restrict handshake payload size to 4KB with io.LimitReader.
  • Add unit test verifying timeouts and oversized payloads are rejected cleanly.
Lingua principale
Go
Stelle
9
Fork
1
Merge medio
5h 57m
PR unite (30g)
15

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di kernelshard/expose

Tutte le issue di kernelshard/expose

Issue simili

Altre issue su Go

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.