CVE-2026-102339
Telepresence: Tunnel endpoint accepts caller-supplied session ID with no ownership proof — active client sessions hijackable
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.
- 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
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
github.com/telepresenceio/telepresence/v2Go | before 2.31.0 | 2.31.0 |
What each source reports
CVE List Score used 8.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 High
CVSS: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-117078 8.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 High
CVSS: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-6rvf 8.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 High
CVSS: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
NVD 8.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 High
CVSS: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
OSV 8.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 High
CVSS: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-6rvf 8.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 High
CVSS: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
| Recorded | Changed | Sources |
|---|---|---|
| published | EUVD | |
| published | EUVD | |
| affected, references | OSV | |
| affected, facts, references | CVE List, EUVD, GitHub Advisories, NVD, OSV | |
| aliases, references | NVD, OSV | |
| aliases, products, published | EUVD | |
| first indexed | CVE List |
Dates are when Every CVE recorded each change. Upstream dates may differ.
References
github.com/telepresenceio/telepresence/security/advisories/GHSA-6j3h-rp73-6rvf
github.com/telepresenceio/telepresence/pull/4217
github.com/telepresenceio/telepresence/commit/1312482488b771742dbedd3015f9a81a27532de6
github.com/telepresenceio/telepresence/commit/36458b65a010d2b316af48cd90e193ba190785d9
github.com/telepresenceio/telepresence/releases/tag/v2.31.0
nvd.nist.gov/vuln/detail/CVE-2026-102339
github.com/advisories/GHSA-6j3h-rp73-6rvf
github.com/CVEProject/cvelistV5/tree/main/cves/2026/102xxx/CVE-2026-102339.json
github.com/telepresenceio/telepresence