CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-39835

CVE-2026-39835: Remote Denial of Service via Null Pointer Dereference in Go SSH CertChecker

Amit Schendel
Amit Schendel
Senior Security Researcher

Jun 26, 2026·7 min read·21 visits

Executive Summary (TL;DR)

An unauthenticated remote attacker can crash Go SSH servers using CertChecker by presenting certificates during the handshake, exploiting uninitialized function pointers.

A Denial of Service (DoS) vulnerability exists in the Go SSH implementation package (golang.org/x/crypto/ssh). The vulnerability is caused by a null pointer dereference (runtime panic) when CertChecker is utilized as a public key callback but its validation fields, IsUserAuthority or IsHostAuthority, are uninitialized.

Vulnerability Overview and Technical Context

The Go programming language provides a standard library subrepository golang.org/x/crypto/ssh for building custom secure shell (SSH) servers and clients. In enterprise ecosystems, custom Go-based SSH endpoints are widely deployed to handle automated tasks, secure file transfer interfaces, developer gateways, and infrastructure control planes. The cryptographic library relies on modular structures and callback functions to delegate authority verification to application-level logic.

One such critical structure is the CertChecker utility, which implements standard SSH certificate validation rules. It contains specific field hooks for validating user authorities and host authorities, namely the IsUserAuthority and IsHostAuthority callback functions. When an incoming client presents a certificate to a server or host validation occurs, the server relies on these hooks to decide whether the signing entity is trusted.

The vulnerability designated as CVE-2026-39835 is a classic null pointer dereference weakness (CWE-476) residing in the core certificate verification routines. Because Go allows partial structure initialization, applications can instantiate CertChecker without defining these function variables, leaving them with default nil values. When a remote, unauthenticated connection attempts to perform certificate authentication, the package dereferences the nil variable, causing an unhandled panic that terminates the entire host program.

Root Cause Analysis and Code Path Execution

To understand the root cause, one must examine the behavior of structure allocation and zero-values in Go. In the ssh package, CertChecker is designed as a modular validator. It defines function fields such as IsUserAuthority which returns a boolean. If an application developer initializes CertChecker as part of an SSH server's public key callback configuration but fails to populate the callback fields, Go sets these pointers to nil.

The library lacks prior defensive validation before invoking these callback functions. During the handshake sequence, when a user presents an SSH certificate, the execution flow is routed into the CertChecker.Authenticate method. This method extracts the signature key of the certificate and immediately attempts to call c.IsUserAuthority(cert.SignatureKey).

In Go, invoking a function variable that contains a nil address initiates an immediate runtime panic. While normal errors are returned as values, a panic is an exceptional control flow event. Because individual SSH connections are executed inside separate, concurrent background goroutines managed by the Go runtime, an unrecovered panic in any single goroutine is not isolated. Instead, it propagates upwards and crashes the entire application process, leading to immediate denial of service.

Code Analysis

The vulnerable implementation inside ssh/certs.go failed to perform guard checks prior to dispatching validation parameters to application-defined function pointers. The functions CheckHostKey and Authenticate directly invoke c.IsHostAuthority and c.IsUserAuthority respectively. Below is a conceptual representation of the vulnerable pathways:

// Vulnerable implementation in ssh/certs.go
func (c *CertChecker) CheckHostKey(addr string, remote net.Addr, key PublicKey) error {
    // ... cert type validation checks ...
    // The following call is executed without a nil safety guard
    if !c.IsHostAuthority(cert.SignatureKey, addr) {
        return fmt.Errorf("ssh: no authorities for hostname: %v", addr)
    }
    // ... rest of validation ...
}

The following patch introduces structural safety guards within ssh/certs.go under CL 781660. The modification checks the validity of the function pointers before execution and returns standard error objects:

// Patched implementation in ssh/certs.go
if cert.CertType != HostCert {
    return fmt.Errorf("ssh: certificate presented as a host key has type %d", cert.CertType)
}
// Explicit safety check added to prevent null pointer dereference
if c.IsHostAuthority == nil {
    return errors.New("ssh: cannot verify certificate, IsHostAuthority not set")
}
if !c.IsHostAuthority(cert.SignatureKey, addr) {
    return fmt.Errorf("ssh: no authorities for hostname: %v", addr)
}

A parallel guard block was introduced within CertChecker.Authenticate to secure the IsUserAuthority callback. These checks successfully transform an unhandled runtime crash vector into a manageable, loggable error state. The patch is considered highly complete as it thoroughly resolves both vulnerable execution pathways inside the package.

Exploitation Methodology

Exploitation of CVE-2026-39835 requires minimal sophistication and can be initiated by a remote, unauthenticated attacker. The target server must be configured to use CertChecker within its SSH server configuration, and the fields must be left uninitialized. This scenario occurs when developers assume that leaving fields blank acts as a default rejection rather than an unhandled code path.

An attacker begins by establishing a raw TCP connection to the exposed SSH listener port of the target. Once the TCP socket is open, the client sends an SSH identification string to negotiate the protocol version. After completing the initial key exchange, the client transitions to the user authentication phase by sending an SSH_MSG_USERAUTH_REQUEST message specifying public key authentication.

Instead of offering a traditional RSA or Ed25519 public key, the attacker offers an SSH certificate. When the server processes this certificate, it delegates verification to CertChecker.Authenticate. The Go runtime immediately attempts to execute the nil pointer, generating a fatal panic on the server console and terminating the process. No state changes, file writes, or memory corruption occur; the attack is purely focused on service disruption.

Impact Assessment and Downstream Exposure

The severity of CVE-2026-39835 is classified as Medium, with a CVSS v3.1 base score of 5.3. The impact is limited strictly to system availability, with no risk of confidentiality breach or unauthorized modifications. However, in modern cloud-native environments, the actual operational impact can be severe depending on application monitoring and restart configurations.

Because many critical operations rely on Go-based infrastructure utilities like HashiCorp Vault, Docker registries, or Gitea code servers, crashing the service disrupts dependent continuous integration and deployment pipelines. If the target application lacks a reliable container orchestrator or process supervisor to restart the crashed binary, the denial of service remains permanent until manual administrator intervention.

Even if an automated system restarts the service, repeated exploitation attempts can generate a continuous loop of process restarts. This continuous loop degrades hardware performance, floods log streams with unhandled core dumps, and prevents legitimate connections. The ease of remote execution makes it a high-priority target for automated denial of service scripts.

Detection and Remediation

The primary and recommended solution is to upgrade the golang.org/x/crypto package to version v0.52.0 or higher. Developers can execute the standard dependency update commands to pull the latest version of the subrepository. This update integrates the safety verification guards into the application compilation tree automatically.

In environments where upgrading the library is not immediately possible, application-level workarounds can prevent the panic. Developers must audit their SSH configurations to guarantee that CertChecker instances never contain nil fields. Even if certificate verification is not supported, the fields should be explicitly defined with safe fallback functions that reject all inputs.

// Application-level safety workaround
checker := &ssh.CertChecker{
    IsUserAuthority: func(auth ssh.PublicKey) bool {
        return false
    },
    IsHostAuthority: func(auth ssh.PublicKey, address string) bool {
        return false
    },
}

Additionally, integration of automated detection tooling such as govulncheck helps security teams locate vulnerable references during compilation or automated continuous integration builds. Network-level controls, such as rate limiting and IP access lists, should be deployed to restrict SSH port exposure to trusted actors.

Official Patches

GoGerrit Change CL 781660

Technical Appendix

CVSS Score
5.3/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
EPSS Probability
0.21%
Top 89% most exploited

Affected Systems

Docker / MobyHashiCorp VaultPrometheusGiteacontainerdPodmanTrivyAmazon CloudWatch AgentAWS Systems Manager Agent (SSM)SOPSAtlantisCloudflaredSplunk OpenTelemetry Collector

Affected Versions Detail

Product
Affected Versions
Fixed Version
golang.org/x/crypto
Go
< 0.52.00.52.0
AttributeDetail
CWE IDCWE-476
Attack VectorNetwork
CVSS Severity5.3 (Medium)
Exploit StatusProof of Concept
Affected Packagegolang.org/x/crypto/ssh
Fixed Versionv0.52.0

MITRE ATT&CK Mapping

T1499.003Endpoint Denial of Service: Application Denial of Service
Impact
CWE-476
NULL Pointer Dereference

The application attempts to dereference a pointer that it expects to be valid, but is NULL, typically causing a crash or exit.

Vulnerability Timeline

Security patch authored and submitted to Gerrit
2026-01-25
Private issue tracking completed under case b/503003289
2026-05-21
Public announcement and CVE disclosure
2026-05-22

References & Sources

  • [1]Go Issue 79563
  • [2]Go Announce Mailing List
  • [3]Go VulnDB Entry GO-2026-5015

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•2 days ago•CVE-2026-54068
5.9

CVE-2026-54068: Unauthenticated Server-Side Template Injection and SQLite Exfiltration in SiYuan PKM

An authentication bypass in the SiYuan personal knowledge management system before version 3.7.0 exposes a dynamic icon rendering endpoint. This endpoint processes client-supplied Go template directives. By submitting a crafted request, an unauthenticated remote attacker can leverage registered database template functions to execute arbitrary read-only SQL queries and exfiltrate workspace contents.

Amit Schendel
Amit Schendel
14 views•5 min read
•2 days ago•CVE-2026-54069
9.1

CVE-2026-54069: Authentication Bypass in SiYuan Note via Origin Header Spoofing

CVE-2026-54069 is a critical authentication bypass vulnerability in the SiYuan Note personal knowledge management system. The flaw is located in the HTTP server's middleware handling API authorization, which unconditionally trusts requests carrying a 'chrome-extension://' scheme in the Origin HTTP header, granting administrative access without validating API tokens.

Alon Barad
Alon Barad
12 views•5 min read
•2 days ago•CVE-2026-54089
9.1

CVE-2026-54089: Authentication Bypass by Spoofing in File Browser

CVE-2026-54089 is a critical authentication bypass vulnerability in File Browser affecting instances configured with proxy-based authentication. An unauthenticated remote attacker with direct network access can impersonate arbitrary users or register new accounts by spoofing configured HTTP headers.

Amit Schendel
Amit Schendel
11 views•7 min read
•2 days ago•GHSA-99J7-FHR2-XFJ4
10.0

GHSA-99J7-FHR2-XFJ4: Malicious Remote Code Execution Payload in 'exploration' Cargo Crate

The malicious Cargo package 'exploration' was uploaded to the crates.io registry. During compilation or package import, the crate executes code designed to establish an outbound TCP/HTTP connection, download an external second-stage binary, and execute the binary locally on the host machine. This creates an unauthenticated remote code execution vector impacting developer environments and continuous integration pipelines.

Amit Schendel
Amit Schendel
13 views•6 min read
•2 days ago•CVE-2026-54088
9.3

CVE-2026-54088: Pre-Authentication Remote Code Execution in File Browser Hook Authentication

CVE-2026-54088 is a critical command injection vulnerability in File Browser prior to version 2.63.6. When Hook Authentication is enabled, the application interpolates unsanitized credentials into a shell command, allowing unauthenticated remote code execution.

Alon Barad
Alon Barad
13 views•6 min read
•2 days ago•GHSA-QV4M-M73M-8HJ7
8.8

GHSA-qv4m-m73m-8hj7: Authenticated Arbitrary File Upload leading to Remote Code Execution in NotrinosERP

An authenticated remote code execution vulnerability exists in NotrinosERP (versions up to and including 1.0.0) within the Human Resource Management (HRM) module. Users with employee management permissions can upload arbitrary file types, including PHP scripts, which are written directly to a web-accessible directory. This allows for arbitrary code execution in the context of the web-server user.

Alon Barad
Alon Barad
8 views•6 min read