Securing Akka.NET Clusters: Understanding CVE-2025-61778 and mTLS
A deep dive into the critical TLS authentication bypass vulnerability in Akka.NET and how mutual TLS (mTLS) fixes it
Aaron Stannard
/ November 24, 2025
What We'll Cover Today
The Vulnerability: CVE-2025-61778
Understanding Mutual TLS (mTLS)
How Akka.NET Fixed It
Real-World Implementation (DrawTogether.NET)
Security Best Practices
Why Cluster Security Matters
Akka.NET Clusters in the Wild
Financial services processing transactions
Gaming backends managing player state
IoT platforms coordinating devices
Microservices communicating across cloud networks
The Risk: Unauthorized nodes joining your cluster
Data exfiltration
Command injection
Cluster disruption
The Vulnerability
CVE-2025-61778: What Went Wrong?
CVE-2025-61778 Overview
Critical Severity
Advisory: GHSA-jhpv-4q4f-43g5
Published: October 6, 2025
Affected: v1.2.0 - v1.5.51
CWE Classifications
CWE-290: Auth Bypass by Spoofing
CWE-295: Improper Cert Validation
CWE-306: Missing Auth for Critical Function
The Broken Handshake
What the original TLS implementation looked like
Client Node Connecting...
❌ No Certificate
- - - - →
Server Node Listening on :5055
✓ Has Certificate
⚠️ Anyone Can Connect! Server never requests client certificate
Attack Scenario
How an attacker could exploit this vulnerability
Node-1 Seed 🔒
Node-2 Worker 🔒
Node-3 Worker 🔒
Attacker ❌ No Cert
📤 Data Theft
💉 Injection
💥 Disruption
Result: Attacker joins cluster without valid credentials
What Was Wrong?
One-Way Authentication
"The TLS implementation was fundamentally incomplete. While it enforced server-side certificate validation for inbound connections, it never asked the outbound-connecting client to present its certificate."
Technical Details
Server validated its own certificate ✓
Server never requested client certificate ❌
Asymmetrical security posture
No mutual authentication
Who Was Affected?
⚠️ High Risk
Internet-exposed clusters
Cloud/multi-tenant deployments
Environments requiring TLS
Untrusted network boundaries
ℹ️ Lower Risk
Fully isolated private networks
Air-gapped environments
Trusted network perimeters
No TLS needed/configured
Key Point: This vulnerability affected environments where TLS was needed - exposed to the internet or untrusted networks.
Understanding mTLS
Mutual Transport Layer Security
Traditional TLS vs Mutual TLS
🌐 Traditional TLS
🔐 Mutual TLS (mTLS)
Direction
Server → Client
Server ↔ Client
Server Certificate
✓ Presents
✓ Presents
Client Certificate
✗ Anonymous
✓ Presents
Validation
Client validates server
Both validate each other
Use Case
Websites, public APIs
Internal APIs, clusters
The Correct Handshake
How mTLS provides mutual authentication
Client Node Authenticated
✓ Has Certificate
Client Cert →
← Server Cert
Server Node Authenticated
✓ Has Certificate
✓ Secure Connection Established Both parties authenticated
Result: Only nodes with valid certificates can communicate
Certificate Validation: Layer 1
Chain Validation - Is this certificate trustworthy?
Configuration
new DotNettySslSetup(cert,
suppressValidation: false,
requireMutualAuthentication: true);
What It Validates
From trusted CA?
Chain complete?
Not expired?
Proper key usage?
✓ Enabled by default - Never set suppressValidation: true in production!
Certificate Validation: Layer 2
Hostname Validation - Is this certificate for this server?
Configuration
new DotNettySslSetup(cert,
suppressValidation: false,
requireMutualAuthentication: true,
validateCertificateHostname: true);
What It Validates
Hostname matches cert?
Alt names match?
Cert is for this server?
⚠️ Optional but recommended - Prevents MITM attacks with stolen certs
Before: Vulnerable Code
Akka.NET v1.5.51 and earlier
❌ Missing Mutual Authentication
// Old API - no mTLS support
var sslSetup = new DotNettySslSetup(
certificate: cert,
suppressValidation: false
);
// Client never had to present certificate!
The Problem
Server presents its certificate ✓
Client validates server ✓
Client never presents certificate ✗
Server never validates client ✗
After: Secure Code
Akka.NET v1.5.52+
✓ Mutual Authentication Enabled
// New API with mTLS support
var sslSetup = new DotNettySslSetup(
certificate: cert,
suppressValidation: false,
requireMutualAuthentication: true // NEW!
);
The Fix
Server presents its certificate ✓
Client validates server ✓
Client presents certificate ✓
Server validates client ✓
Advanced Validation (v1.5.55+)
Programmatic certificate validation helpers
CertificateValidation Methods
ValidateChain() - OS trust store
ValidateHostname() - CN/SAN check
PinnedCertificate() - Thumbprint pin
ValidateSubject() - Subject match
ValidateIssuer() - Issuer match
Combine() - Multiple validators
Example: Certificate Pinning
var validator = CertificateValidation.Combine(
CertificateValidation.ValidateChain(),
CertificateValidation.PinnedCertificate(
"2531c78c51e5041...") // thumbprint
);
var ssl = new DotNettySslSetup(
cert, false, true, validator);