Every CVESearch/Get API key

CVE-2026-102339

Telepresence: Tunnel endpoint accepts caller-supplied session ID with no ownership proof — active client sessions hijackable

8.2 HighFix available

CVE-2026-102339 is a high vulnerability (CVSS 8.2) in Cisco Telepresence, published November 4, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.29%, the 21st percentile. Fixed in github.com/telepresenceio/telepresence/v2 2.31.0.

What does this mean?
Severity
8.2 HighCVSS 3.1, CVE List
Exploit chance
0.29%EPSS, 21st percentile
Exploitation
None knownNot on CISA’s or ENISA’s lists
Fixed in
2.31.0github.com/telepresenceio/telepresence/v2

Description

Telepresence enables local development against a remote Kubernetes or OpenShift cluster. Prior to 2.31.0, the Traffic Manager Tunnel gRPC streaming endpoint parses a session ID from the first bytes of a caller-controlled message in pkg/tunnel/message.go and passes it to state.Tunnel without verifying that the caller owns the active session. An attacker who obtains a valid active session ID through log leakage, cluster-internal channels, or the unauthenticated ArriveAsClient endpoint can attach a routed tunnel to that session and gain its network routing capabilities. UUID4 session IDs make cold brute force impractical. This vulnerability is fixed in 2.31.0.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
High
Privileges needed
Low
User interaction
None

What an attacker can affect

Confidentiality
High
Integrity
High
Availability
None

Exploit likelihood

0.29%Unchanged since Nov 5, 2026
90%50%10%1%

Affected products

Affected packages

Affected packages
PackageAffectedFixed
github.com/telepresenceio/telepresence/v2
Go
before 2.31.0
2.31.0

What each source reports

CVE List Score used8.2

Telepresence: Tunnel endpoint accepts caller-supplied session ID with no ownership proof — active client sessions hijackable

Telepresence enables local development against a remote Kubernetes or OpenShift cluster. Prior to 2.31.0, the Traffic Manager Tunnel gRPC streaming endpoint parses a session ID from the first bytes of a caller-controlled message in pkg/tunnel/message.go and passes it to state.Tunnel without verifying that the caller owns the active session. An attacker who obtains a valid active session ID through log leakage, cluster-internal channels, or the unauthenticated ArriveAsClient endpoint can attach a routed tunnel to that session and gain its network routing capabilities. UUID4 session IDs make cold brute force impractical. This vulnerability is fixed in 2.31.0.

Record
CVE-2026-102339
CVSS 3.1
8.2 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:N
Weakness
CWE-639
Updated
2026-11-09
EUVDEUVD-2026-1170788.2

Telepresence enables local development against a remote Kubernetes or OpenShift cluster. Prior to 2.31.0, the Traffic Manager Tunnel gRPC streaming endpoint parses a session ID from the first bytes of a caller-controlled message in pkg/tunnel/message.go and passes it to state.Tunnel without verifying that the caller owns the active session. An attacker who obtains a valid active session ID through log leakage, cluster-internal channels, or the unauthenticated ArriveAsClient endpoint can attach a routed tunnel to that session and gain its network routing capabilities. UUID4 session IDs make cold brute force impractical. This vulnerability is fixed in 2.31.0.

Record
EUVD-2026-117078
CVSS 3.1
8.2 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:N
Updated
2026-11-10
GitHub AdvisoriesGHSA-6j3h-rp73-6rvf8.2

Telepresence: Tunnel endpoint accepts caller-supplied session ID with no ownership proof — active client sessions hijackable

Summary

The Traffic Manager Tunnel gRPC streaming endpoint accepts a session ID from the first bytes of the client-controlled message payload. No verification confirms the caller owns the session. An attacker supplying a valid active session ID receives a fully routed tunnel for that session, gaining the network routing capabilities of the legitimate Telepresence client. Tested on HEAD v2.28.0, commit b2231a4.

Details

The Tunnel handler reads identity from a client-provided binary payload rather than from a verified credential or prior authenticated gRPC call:

// cmd/traffic/cmd/manager/service.go:1057-1063
func (s *service) Tunnel(server grpc.BidiStreamingServer[...]) error {
    stream, err := tunnel.NewServerStream(ctx, tunnel.ClientToManager, server)
    return s.state.Tunnel(ctx, stream)  // stream.SessionID() is client-controlled
}

state.Tunnel looks up the session ID in the sessions map with no ownership proof:

// cmd/traffic/cmd/manager/state/state.go:698-703
func (s *State) Tunnel(ctx context.Context, stream tunnel.Stream) error {
    id := stream.SessionID()   // from client payload bytes
    if cs, ok := s.clients.Load(id); ok {
        return s.clientTunnel(ctx, cs, stream)  // full dialer granted
    }
    return grpcErrors.Errorf(codes.NotFound, ...)
}

The session ID is parsed from the wire message with no binding to the transport-level identity of the caller (pkg/tunnel/message.go:209-214).

Proof of Concept

Precondition: a valid active session ID (obtainable via ArriveAsClient, which has no auth either).

conn, _ := grpc.NewClient("traffic-manager.ambassador:8081",
    grpc.WithTransportCredentials(insecure.NewCredentials()))
mgr := rpc.NewManagerClient(conn)

tunnelStream, _ := mgr.Tunnel(ctx)

// Send StreamInfo with victim session ID in payload
tunnelStream.Send(&rpc.TunnelMessage{Payload: buildStreamInfo(victimSessionID, ...)})

// Traffic Manager routes tunnel traffic for victimSessionID
// through this attacker-controlled bidirectional stream

Impact

A caller supplying a valid session ID of an active Telepresence client obtains a tunnel endpoint for that session's network routing context. Session IDs are UUID4s, making cold brute-force impractical; exploitation materialises when session IDs are obtainable via log leakage or cluster-internal channels. Combined with the unauthenticated ArriveAsClient endpoint, an attacker can create their own sessions and pivot to impersonate active developer sessions.

Record
GHSA-6j3h-rp73-6rvf
CVSS 3.1
8.2 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:N
Weakness
CWE-639
Updated
2026-11-09
NVD8.2

Telepresence enables local development against a remote Kubernetes or OpenShift cluster. Prior to 2.31.0, the Traffic Manager Tunnel gRPC streaming endpoint parses a session ID from the first bytes of a caller-controlled message in pkg/tunnel/message.go and passes it to state.Tunnel without verifying that the caller owns the active session. An attacker who obtains a valid active session ID through log leakage, cluster-internal channels, or the unauthenticated ArriveAsClient endpoint can attach a routed tunnel to that session and gain its network routing capabilities. UUID4 session IDs make cold brute force impractical. This vulnerability is fixed in 2.31.0.

Record
CVE-2026-102339
CVSS 3.1
8.2 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:N
Weakness
CWE-639
Updated
2026-11-09
OSV8.2

Telepresence: Tunnel endpoint accepts caller-supplied session ID with no ownership proof — active client sessions hijackable

Telepresence enables local development against a remote Kubernetes or OpenShift cluster. Prior to 2.31.0, the Traffic Manager Tunnel gRPC streaming endpoint parses a session ID from the first bytes of a caller-controlled message in pkg/tunnel/message.go and passes it to state.Tunnel without verifying that the caller owns the active session. An attacker who obtains a valid active session ID through log leakage, cluster-internal channels, or the unauthenticated ArriveAsClient endpoint can attach a routed tunnel to that session and gain its network routing capabilities. UUID4 session IDs make cold brute force impractical. This vulnerability is fixed in 2.31.0.

Record
CVE-2026-102339
CVSS 3.1
8.2 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:N
Weakness
CWE-639
Updated
2026-11-10
OSVGHSA-6j3h-rp73-6rvf8.2

Telepresence: Tunnel endpoint accepts caller-supplied session ID with no ownership proof — active client sessions hijackable

Summary

The Traffic Manager Tunnel gRPC streaming endpoint accepts a session ID from the first bytes of the client-controlled message payload. No verification confirms the caller owns the session. An attacker supplying a valid active session ID receives a fully routed tunnel for that session, gaining the network routing capabilities of the legitimate Telepresence client. Tested on HEAD v2.28.0, commit b2231a4.

Details

The Tunnel handler reads identity from a client-provided binary payload rather than from a verified credential or prior authenticated gRPC call:

// cmd/traffic/cmd/manager/service.go:1057-1063
func (s *service) Tunnel(server grpc.BidiStreamingServer[...]) error {
    stream, err := tunnel.NewServerStream(ctx, tunnel.ClientToManager, server)
    return s.state.Tunnel(ctx, stream)  // stream.SessionID() is client-controlled
}

state.Tunnel looks up the session ID in the sessions map with no ownership proof:

// cmd/traffic/cmd/manager/state/state.go:698-703
func (s *State) Tunnel(ctx context.Context, stream tunnel.Stream) error {
    id := stream.SessionID()   // from client payload bytes
    if cs, ok := s.clients.Load(id); ok {
        return s.clientTunnel(ctx, cs, stream)  // full dialer granted
    }
    return grpcErrors.Errorf(codes.NotFound, ...)
}

The session ID is parsed from the wire message with no binding to the transport-level identity of the caller (pkg/tunnel/message.go:209-214).

Proof of Concept

Precondition: a valid active session ID (obtainable via ArriveAsClient, which has no auth either).

conn, _ := grpc.NewClient("traffic-manager.ambassador:8081",
    grpc.WithTransportCredentials(insecure.NewCredentials()))
mgr := rpc.NewManagerClient(conn)

tunnelStream, _ := mgr.Tunnel(ctx)

// Send StreamInfo with victim session ID in payload
tunnelStream.Send(&rpc.TunnelMessage{Payload: buildStreamInfo(victimSessionID, ...)})

// Traffic Manager routes tunnel traffic for victimSessionID
// through this attacker-controlled bidirectional stream

Impact

A caller supplying a valid session ID of an active Telepresence client obtains a tunnel endpoint for that session's network routing context. Session IDs are UUID4s, making cold brute-force impractical; exploitation materialises when session IDs are obtainable via log leakage or cluster-internal channels. Combined with the unauthenticated ArriveAsClient endpoint, an attacker can create their own sessions and pivot to impersonate active developer sessions.

Record
GHSA-6j3h-rp73-6rvf
CVSS 3.1
8.2 HighCVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:N
Weakness
CWE-639
Updated
2026-11-09

History

History
RecordedChangedSources
publishedEUVD
publishedEUVD
affected, referencesOSV
affected, facts, referencesCVE List, EUVD, GitHub Advisories, NVD, OSV
aliases, referencesNVD, OSV
aliases, products, publishedEUVD
first indexedCVE List

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

References

MoveEnter Open