CVE-2025-0714
Executive Summary
CVE-2025-0714 exposes a critical cryptographic weakness in Mobatek MobaXterm versions below 25.0. The application uses a static initialization vector (IV) consisting entirely of zero bytes and a master key derived from the user's login password to encrypt stored session passwords via AES-CFB mode. Because both the IV and the master key remain constant across all encrypted passwords, the ciphertext depends solely on the plaintext password. This makes the stored passwords highly susceptible to offline decryption attacks if an attacker gains access to the encrypted password file. The vulnerability is classified as a CWE-329 (Generation of Predictable IV with CBC Mode) and is assigned a CVSS score of 6.5 (Medium). No public exploit code or patch is currently available.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability is not related to NPM, PyPI, Go, or Ruby packages. It is a desktop application (MobaXterm) vulnerability.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N
- Base Score: 6.5 (Medium)
- Attack Vector (AV): Local (L) – The attacker must have local access to the system or the encrypted password file.
- Attack Complexity (AC): Low (L) – The attack does not require special conditions beyond access to the encrypted data.
- Privileges Required (PR): None (N) – No privileges are required to exploit the vulnerability once the encrypted file is obtained.
- User Interaction (UI): Required (R) – The user must have previously saved passwords in MobaXterm.
- Scope (S): Unchanged (U) – The vulnerability does not affect other components.
- Confidentiality Impact (C): High (H) – All stored passwords can be decrypted.
- Integrity Impact (I): None (N) – No data integrity is affected.
- Availability Impact (A): None (N) – No denial of service.
Threat Level: Medium. The vulnerability requires local access to the encrypted password file, but the static IV and master key make decryption trivial once that access is obtained.
Deep Dive & Mechanics
MobaXterm stores user credentials (SSH, Telnet, RDP, etc.) in an encrypted format. The encryption process uses AES in CFB (Cipher Feedback) mode. The vulnerability stems from two critical flaws:
Static Initialization Vector (IV): The IV is hardcoded as 16 zero bytes (
0x00000000000000000000000000000000). In CFB mode, the IV is XORed with the first plaintext block before encryption. A static IV means that identical plaintexts will produce identical ciphertexts, and it also removes the randomness needed to prevent pattern analysis.Static Master Key: The master key used for encryption is derived from the user's MobaXterm login password. This master key is the same for all encrypted passwords within a single user's session. If an attacker can obtain the master key (e.g., by knowing the user's MobaXterm password or by extracting it from memory), they can decrypt all stored passwords.
Attack Scenario:
- An attacker gains access to the encrypted password file (e.g.,
MobaXterm.inior a similar configuration file). - The attacker extracts the encrypted password blobs.
- Since the IV is known (all zeros) and the master key is derived from the user's MobaXterm password (which may be weak or guessable), the attacker can attempt to brute-force the master key.
- Once the master key is recovered, all stored passwords can be decrypted using AES-CFB with the zero IV.
Vulnerable vs. Patched Code
Vulnerable Code (Conceptual):
# Vulnerable implementation
import hashlib
from Crypto.Cipher import AES
master_key = hashlib.sha256(user_password.encode()).digest()[:16] # Static key derived from user password
iv = b'\x00' * 16 # Static IV of all zeros
def encrypt_password(plaintext_password):
cipher = AES.new(master_key, AES.MODE_CFB, iv=iv)
return cipher.encrypt(plaintext_password.encode())
def decrypt_password(ciphertext):
cipher = AES.new(master_key, AES.MODE_CFB, iv=iv)
return cipher.decrypt(ciphertext).decode()
Patched Code (Conceptual):
# Patched implementation
import hashlib
import os
from Crypto.Cipher import AES
master_key = hashlib.sha256(user_password.encode()).digest()[:16] # Still derived from user password
def encrypt_password(plaintext_password):
iv = os.urandom(16) # Random IV per encryption
cipher = AES.new(master_key, AES.MODE_CFB, iv=iv)
ciphertext = cipher.encrypt(plaintext_password.encode())
return iv + ciphertext # Prepend IV to ciphertext
def decrypt_password(data):
iv = data[:16]
ciphertext = data[16:]
cipher = AES.new(master_key, AES.MODE_CFB, iv=iv)
return cipher.decrypt(ciphertext).decode()
The patched version generates a random IV for each password and stores it alongside the ciphertext. This ensures that even if the master key is compromised, the IV provides per-password randomness, making decryption of all passwords from a single key leak impossible.
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- Access to the encrypted password file (e.g.,
MobaXterm.iniorMobaXterm.enc). - Knowledge of the user's MobaXterm login password (or ability to brute-force it).
Exploitation Steps:
Locate the encrypted password file. Typically found in:
%APPDATA%\MobaXterm\(Windows)~/.MobaXterm/(Linux/WSL)
Extract encrypted password blobs. The file contains base64-encoded ciphertexts.
Recover the master key. If the user's MobaXterm password is known, derive the key using SHA-256 and take the first 16 bytes.
Decrypt passwords. Use AES-CFB with the zero IV and the recovered master key.
Proof-of-Concept (Python):
import hashlib
from Crypto.Cipher import AES
# Known user password (example)
user_password = "victim_password"
master_key = hashlib.sha256(user_password.encode()).digest()[:16]
# Encrypted blob from MobaXterm.ini (base64 decoded)
encrypted_blob = bytes.fromhex("...") # Replace with actual hex
# Decrypt
iv = b'\x00' * 16
cipher = AES.new(master_key, AES.MODE_CFB, iv=iv)
plaintext = cipher.decrypt(encrypted_blob).decode()
print(f"Decrypted password: {plaintext}")
Blue Team (Defense)
Detection:
- Monitor for unauthorized access to
MobaXterm.inior similar configuration files. - Use file integrity monitoring (FIM) to detect changes to these files.
- Look for processes attempting to read the MobaXterm configuration directory.
Mitigation:
- Upgrade to MobaXterm version 25.0 or later (once patched).
- Use a strong, unique password for MobaXterm to make master key derivation harder.
- Store MobaXterm configuration files in encrypted volumes (e.g., BitLocker, VeraCrypt).
- Implement application whitelisting to prevent unauthorized tools from reading the configuration files.
Indicators of Compromise (IOCs)
File Paths:
%APPDATA%\MobaXterm\MobaXterm.ini%APPDATA%\MobaXterm\MobaXterm.enc~/.MobaXterm/
Registry Keys (Windows):
HKEY_CURRENT_USER\Software\Mobatek\MobaXterm
Network Traffic: None (local vulnerability).
Process Anomalies:
- Unauthorized processes reading
MobaXterm.ini(e.g.,cmd.exe,powershell.exe,python.exe).
- Unauthorized processes reading
YARA Rule (see Detection Engineering): Detects attempts to read the encrypted password file.
Detection Engineering
YARA Rule
rule Detect_MobaXterm_Password_File_Access {
meta:
description = "Detects access to MobaXterm encrypted password file"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-0714"
strings:
$file_path = "MobaXterm.ini" nocase
$file_path2 = "MobaXterm.enc" nocase
$encrypted_marker = "Password" nocase
condition:
(uint16(0) == 0x5A4D or uint32(0) == 0x464c457f) and // PE or ELF header
for any of ($file_path, $file_path2) : ($ in (0..filesize))
}
Sigma Rule
title: MobaXterm Password File Access
id: 12345678-1234-1234-1234-123456789012
status: experimental
description: Detects attempts to read MobaXterm encrypted password files
author: Valters IT
date: 2025/04/10
references:
- https://nvd.nist.gov/vuln/detail/CVE-2025-0714
logsource:
category: file_event
product: windows
detection:
selection:
TargetFilename|contains:
- 'MobaXterm.ini'
- 'MobaXterm.enc'
condition: selection
falsepositives:
- Legitimate MobaXterm process
level: medium
Suricata Rule
alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-0714 MobaXterm Password Exfiltration Attempt"; flow:to_server,established; content:"MobaXterm.ini"; nocase; classtype:attempted-user; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Upgrade MobaXterm: Update to version 25.0 or later as soon as a patch is released. Check Mobatek's official website for updates.
- Change All Stored Passwords: After upgrading, change all passwords that were stored in MobaXterm, as they may have been compromised.
- Use Strong MobaXterm Password: Ensure the MobaXterm login password is strong and unique to make master key derivation difficult.
Long-Term Mitigations:
- Encrypt Configuration Files: Store MobaXterm configuration files in encrypted volumes (e.g., BitLocker, VeraCrypt).
- Monitor File Access: Implement file integrity monitoring (FIM) on
MobaXterm.iniandMobaXterm.enc. - Least Privilege: Run MobaXterm with the least privileges necessary to reduce the impact of a compromise.
- Application Control: Use application whitelisting to prevent unauthorized tools from reading MobaXterm configuration files.
Patch Status: UNKNOWN / UNPATCHED. Monitor Mobatek's advisory page for updates.
Valters IT