Atomic Edge analysis of CVE-2026-14327:
This vulnerability allows unauthenticated attackers to read arbitrary files on the server through the AR for WordPress plugin versions up to and including 8.40. The affected component is the secure download functionality in ar-secure-download.php and ar-secure-url-generate.php. The vulnerability carries a CVSS score of 7.5, indicating high severity.
The root cause lies in the encryption key management and path validation. In the vulnerable version, ar_validate_and_serve_file() at line 54 of ar-secure-download.php used get_option(‘ar_licence_key’) as the decryption secret. However, on default installations where ar_licence_key is unset, this returns an empty string. An attacker can obtain a valid nonce and secure nonce via the publicly accessible ar_get_fresh_nonce and ar_process_user_image AJAX handlers. The attacker can then locally reproduce the encryption key (empty string) and craft a malicious encrypted file parameter containing directory traversal sequences like ‘../../wp-config.php’. The ar_decrypt_file_path() function decrypts the path without validating its contents, and the subsequent file path concatenation at line 62 ($full_file_path = $allowed_directory . ‘/’ . $file_path) allows traversal outside the uploads directory. The ar_is_within_wordpress_install() check in ar-secure-url-generate.php also accepted any URL under the home_url(), not just uploads, broadening the attack surface.
To exploit, an attacker first obtains a nonce via the AJAX handlers. The attacker then crafts an encrypted file path using an empty key. The attacker sends a request to /wp-content/plugins/ar-for-wordpress/includes/ar-secure-download.php?file=[ENCRYPTED_PATH]&_wpnonce=[OBTAINED_NONCE]. The encrypted path for a file like ‘../../../../wp-config.php’ is computed using base64 encoding with AES-256-CBC encryption using an empty key. The attacker can use existing plugin functions or a local PHP script to generate this encrypted value. Because the plugin uses the same weak key for encryption and decryption, the attacker simply reproduces the encryption process locally.
The patch introduces three key improvements. First, ar_get_secure_download_secret() generates and stores a cryptographically random 64-character secret via wp_generate_password() in the WordPress options table. This replaces the empty licence_key. Second, the new ar_validate_secure_download_path() function validates the decrypted path using realpath(), rejecting directory traversal sequences (../), checking for null bytes, enforcing allowed extensions (gltf, glb, usdz), and ensuring the resolved path stays within the uploads directory. Third, ar_is_within_wordpress_install() now strictly requires the URL to start with the uploads base URL, removing the home_url() acceptance. The nonce action also changed from ‘ar_secure_nonce’ to ‘ar_secure_download_nonce’.
Successful exploitation allows an unauthenticated attacker to read arbitrary files from the server filesystem. This includes reading the wp-config.php file which contains database credentials, authentication salts, and secret keys. An attacker can also read other sensitive files like backups, log files, or PHP source code. With database credentials, the attacker can escalate to full database access, potentially leading to complete site compromise including remote code execution through SQL injection or direct administrative access.

